a.新建一个表单控制器EmpFormController继承extends SimpleFormController,并实现onSubmit方法
表单控制器的流程较复杂
和前面命令控制器的区别是表单控制器里面的onSubmit方法需要有Post方式提交才能执行到,Get方法不行
//可以处理表单流程
public class EmpFormController extends SimpleFormController
{
protected ModelAndView onSubmit(Object command) throws Exception
{
Emp emp=(Emp)command;
System.out.println(emp);
return new ModelAndView("success");
}
}
public class EmpFormController extends SimpleFormController
{
//当用get请求时,绑定的模型就会发送到页面上来.
protected Map referenceData(HttpServletReqest request) throws Exception
{
Map<String,Object> model=new HashMap<String,Object>();
model.put("deptList",new String[]{"sales","manage"});
return model;
}
protected ModelAndView onSubmit(Object command) throws Exception
{
Emp emp=(Emp)command;
System.out.println(emp);
return new ModelAndView("success");
}
}
b.使用formController只需一个提交路径不像上面的命令控制器需要2个
test-servlet.xml中修改
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="add_emp.do">addEmpController</prop>
</props>
</property>
</bean>
<bean id="addEmpController" class="com.yw.controller.EmpFormController">
<property name="commandClass" value="com.yw.controller.Emp" />
<property name="formView" value="add_emp" />
<property name="successView" value="success" />
</bean>
完整的xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!--HandleMapping根据 用户发出start.do的请求 找到对应的控制器Controller进行处理 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- <prop key="start.do">startController</prop> -->
<!-- 发送login.do的请求,转到loginController控制器 ,该控制器返回login视图名 -->
<!-- <prop key="login.do">loginController</prop> <prop key="login2.do">loginController2</prop> -->
<prop key="add_emp.do">addEmpController</prop>
<!-- <prop key="add_success.do">addEmpSuccessController</prop> -->
</props>
</property>
</bean>
<!-- 控制器的实现类以及包 -->
<!-- <bean id="startController" class="com.yw.controller.StartController"></bean> -->
<!-- <bean id="loginController" class="org.springframework.web.servlet.mvc.ParameterizableViewController"> -->
<!-- <property name="viewName" value="login"></property>-->
<!--</bean> -->
<!-- <bean id="loginController2" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"></bean> -->
<!-- <bean id="addEmpController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"></bean> -->
<!-- <bean id="addEmpSuccessController" class="com.yw.controller.EmpContoller"></bean> -->
<!-- <bean id="addEmpSuccessController" class="com.yw.controller.EmpContoller2"> -->
<!-- <property name="commandClass" value="com.yw.controller.Emp"></property> </bean> -->
<bean id="addEmpController" class="com.yw.controller.EmpFormController">
<property name="commandClass" value="com.yw.controller.Emp" />
<property name="formView" value="add_emp" />
<property name="successView" value="success" />
</bean>
<!-- 视图解析器 加前缀和后缀,隐藏jsp,放在web-inf目录, -->
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<!-- viewResovle view 需要加,否则报错国际化时使用JstlView -->
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
c.在Emp类里面添加一个属性String dept部门在页面add_emp.jsp选择一个部门department:<select name="dept"> <option>a</option> <option>b</option> </select>a b应该是数据库返回的需要一个模型的部门列表model.deptListdepartment:<select name="dept"> <c:forEach items="${deptList}" var="dept"> <option value="${dept}">${dept}</option> </c:forEach></select>
<form action="" method="post">
name:<input type="text" name="name">
phone:<input type="text" name="phone">
birthday:<input type="text" name="birthday">
department:<select name="dept">
<c:forEach items="${deptList}" var="dept">
<option value="${dept}">${dept}</option>
</c:forEach>
</select>
</form>
form的action为空,因为从哪里进来还回到哪里去
和前面一样因为有日期格式所以需要覆盖baseController中的initBinder
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) throws Exception
{
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}