我就做了四个基类
BaseController[继承 MultiActionController]
BaseDao[做DB的删除更新检索操作]
BaseService[所有的业务逻辑的接口都继承他]
BaseStruct[相当与frombean]
BaseValidator[继承Validator做验证]处理一个Client提交的的流程是!
先进入一个继承自BaseController的类,然后执行该类中,客户提交所对应的方法.
该方法先调用,继承自BaseValidator的check类,check提交的表单各项
如果有错误,返回一个记录错误内容的map,然后迁移到来本次提交的表单
如果没错误,就调用方法1或方法2方法1: 如果没有错误,继承自BaseService业务接口,的实现类里面的相应方法.返回需要渲染的map,迁移到渲染画面.
方法2: 如果没有错误,new一个继承自BaseDao类的DAO Bean,执行相应方法,返回需要渲染的map,迁移到渲染画面.即:
editInfoController---->bindObject(EditInfoValidator)如果验证失败--->迁移到失败画面
    如果验证成功--->EditInfoDao--->返回检索结果,迁移到显示画面
  <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
       default-autowire="no"
       default-lazy-init="false"
       default-dependency-check="none"
><!--Connection 想在基类DAO注入jdbcTemplate,让继承它的子类都可以通过调用父类方法执行SQL!-->
<bean id="baseDao" class="com.cn.springcomm.BaseDao">
<property name="jdbcTemplate">
<ref bean="jdbcTemplate"/>
</property>
</bean>
<!--看很多人都这样写,把一个模块的功能点抽象一个接口-->
<bean id="editInfoService" class="com.cn.springservice.springserviceimpl.EditInfoServiceImpl"/> 
<bean id="editInfoController" class="com.cn.springcontroller.EditInfoController">
        <property name="editInfoService">
<ref bean="editInfoService"/>
</property>

<property name="methodNameResolver">
<ref bean="propertiesMethodNameResolver"/>
</property>
</bean>
<!-- 下面都是定式基本没什么看的啊 -->
<!--按配置属性执行画面-->
<bean id="propertiesMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
        <property name="mappings">
            <props>
              <!--Url&方法-->
              <prop key="/searchx.do">searchLogic</prop>
              <prop key="/pageinit.do">initPage</prop>
              <prop key="/updateLogic.do">updateLogic</prop>
            </props>
        </property>
</bean>

<!--按配置属性执行画面映射-->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
    <property name="mappings">  
        <props>  
            <prop key="/searchx.do">editInfoController</prop>
            <prop key="/pageinit.do">editInfoController</prop>
            <prop key="/updateLogic.do">editInfoController</prop>
        </props>  
    </property>  
</bean> <!--Spring View显示层必要-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/" />
    <property name="suffix" value=".jsp" />
</bean>
<!--DB properties-->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="location">
    <value>/WEB-INF/classes/appdeploy/proxool.properties</value>
   </property>
</bean>
 
<!--Mysql DataSource-->
<bean id="proxoolDataSource"
        class="org.logicalcobwebs.proxool.ProxoolDataSource" >
        <property name="driver">
            <value>${proxool.dbDriver}</value>
        </property>
        <property name="driverUrl">
            <value>${proxool.dbUrl}</value>
        </property>
        <property name="user">
            <value>${proxool.dbUser}</value>
        </property>
        <property name="password">
            <value>${proxool.dbPassWord}</value>
        </property>
        <property name="alias">
        <value>springmvc</value>
      </property>
</bean>
<!-- jdbc template -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
     <property name="dataSource">
       <ref bean="proxoolDataSource"/>
     </property>
</bean> 

</beans>//Validator基类,所有的Validator都继承它
public abstract class BaseValidator implements Validator {
public abstract boolean supports(Class clazz) ;
}
//继承Validator负责Check页面输入
public class EditInfoValidator extends BaseValidator {
public boolean supports(Class clazz) {
return EditInfoStruct.class.equals(clazz);
}
public void validate(Object obj, Errors errors) {
EditInfoStruct fromBean = (EditInfoStruct) obj;
String _value1 = fromBean.getValue1();
String _value2 = fromBean.getValue2(); if (_value1.equals(_value2)) {
errors.rejectValue("value1", "value1", "不能与value2相等");
}
}
}
//Controller基类,所有的Controller都继承它
public abstract class BaseController extends MultiActionController {
//主要用于验证输入CHECK
protected BindException bindObject(HttpServletRequest request,
Object command, Validator validator) throws Exception {

ServletRequestDataBinder binder = createBinder(request, command);
binder.bind(request);
BindException errors = new BindException(command,
getCommandName(command));
if (validator.supports(command.getClass())) {
ValidationUtils.invokeValidator(validator, command, errors);
}
return errors;
}
//继承Controller负责实现业务逻辑页面迁移
public class EditInfoController extends BaseController {
public ModelAndView searchLogic(HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.out.println("EditInfoController.searchLogic");
// 验证失败迁移的页面
final String failurePage =  "Jsp/EditInfo";
// 验证成功执行业务逻辑
final String successPage =  "Jsp/successPage";
// Check输入数据---
BindException errorModule = bindObject(request,
new EditInfoStruct(), new EditInfoValidator()); if (errorModule.hasErrors()) {
// 渲染Jsp的数据
Map errormodel = errorModule.getModel();
return new ModelAndView(failurePage, Config.PAGEVIEW, errormodel);
} else {
/*一直不知道这种用法和下面的EditInfoDao用法有什么区别!
// 渲染Jsp的数据 接口方式
//List _searchList = editInfoService.searchInfo();
*/

//EditInfoDao 用法 Start
EditInfoDao _editInfoDao = new EditInfoDao();
List _searchList = _editInfoDao.searchInfo();
//EditInfoDao 用法 End

Map _successMap = new HashMap();
_successMap.put("successList", _searchList); // 迁移画面名称
return new ModelAndView(successPage, Config.PAGEVIEW, _successMap);
}
}
}/*方法1 Start
//所有DB操作的基类,所有操作DB的Bean都继承它
public class BaseDao {
/**
 * 通过Sql检索DB
 */
public List<Object> queryForList(String sql, Object parameter[]) {
return  jdbcTemplate.queryForList(sql, parameter);
}
/*
*注入jdbcTemplate,本来就想在这里注入然后其他子类都可以用了
*/
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
//继承BaseDao执行相关的sql
public class EditInfoDao extends BaseDao{
//检索Db中信息
public List searchInfo() {
return queryForList("SELECT * FROM SPRINGTEST", null);
}
}
*/方法1 End
/*方法1 Start
public interface EditInfoService {
  List searchInfo();
}
public class EditInfoServiceImpl extends BaseDao implements EditInfoService {
// 检索Db中信息
public List searchInfo() {
return  queryForList("SELECT * FROM SPRINGTEST", null);
}
}

解决方案 »

  1.   


    /*方法1 End
    一直不知道这两种方法有什么区别
      

  2.   

    我的问题是:
    这个架构有什么问题吗?
    还有什么可以优化的地方吗?
    另外
    我要注入父类然后,子类可以调用父类的方法啊,我应该怎么配置啊!
    就是下面这里
    public class BaseDao {
    /**
     * 通过Sql检索DB
     */
    public List<Object> queryForList(String sql, Object parameter[]) {
    return  jdbcTemplate.queryForList(sql, parameter);
    }
    /*
    *注入jdbcTemplate,其他子类都可以用了
    */
    private JdbcTemplate jdbcTemplate;
    public JdbcTemplate getJdbcTemplate() {
    return jdbcTemplate;
    }
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
    }
    }public class EditInfoDao extends BaseDao{
    //检索Db中信息
    public List searchInfo() {
    return queryForList("SELECT * FROM SPRINGTEST", null);
    }
    }<bean id="baseDao" class="com.cn.springcomm.BaseDao">
    <property name="jdbcTemplate">
    <ref bean="jdbcTemplate"/>
    </property>
    </bean>
      

  3.   

    你要是用UML来说话,该多有说服力啊。。
      

  4.   

    记住开发过程中一条永恒不变的真理:CHANGE!
    开发过程中你心里要时刻挂念着它,时刻为change做好准备,
    即使开发完毕你不再接手,也要让系统为以后的扩展做好准备,这还是change!
      

  5.   

    要让别人仔细地看,最起码得格式清晰吧,至少也应该用CSDN提供的Java和XML代码标签括起来,
    这样会高亮显示,而且也会有耐心看下去,而我现在看到的就是乱哄哄的一堆。
      

  6.   

    没有用过这种架构,我用的是Struts架构。