我就做了四个基类
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);
}
}
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 End
一直不知道这两种方法有什么区别
这个架构有什么问题吗?
还有什么可以优化的地方吗?
另外
我要注入父类然后,子类可以调用父类的方法啊,我应该怎么配置啊!
就是下面这里
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>
开发过程中你心里要时刻挂念着它,时刻为change做好准备,
即使开发完毕你不再接手,也要让系统为以后的扩展做好准备,这还是change!
这样会高亮显示,而且也会有耐心看下去,而我现在看到的就是乱哄哄的一堆。