标签:
上面文章时普通的业务那个方法中收集一个实体类,这篇文章想收集两个实体类。
文本要做的是:在person.jsp页面上,有两个表单。分别是普通用户和管理员用户的表单(普通用户的表单和管理员用户的表单里面的标签的name都是一样的)。当输入一些数据之后按提交,不管是普通用户的表单还是管理员用户的表单都会提交到后台的同一个Action(控制器)的同一个方法去处理。然后由这个方法里面的两个实体类参数去收集数据,然后Action处理好之后再回到person.jsp把收集到的数据再显示到这个页面上。person.jsp:
第一步:peson.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP ‘index.jsp‘ starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <hr> 普通用户 <form action="${pageContext.request.contextPath}/user/register.action" method="post"> <table border="2" align="center"> <tr> <th>姓名</th> <td> <input type="text" name="username" value="${user.username }" /></td> </tr> <tr> <th>薪水</th> <td> <input type="text" name="salary" value="${!empty user.salary?user.salary:‘2012‘}" /> </td> </tr> <tr> <th>入职时间</th> <!-- ${!empty user.hiredate?user.hiredate:‘2015-4-3 12:12:12‘} 表示user.hiredate不是为空的话就给他赋user.hiredate的值 如果是空的就给他赋‘2015-4-3 12:12:12‘这个值。 --> <td> <input type="text" name="hiredate" value="${!empty user.hiredate?user.hiredate:‘2015-4-3 12:12:12‘} "/></td> </tr> <tr> <td> <input type="submit" value="普通用户注册"> </td> </tr> </table> </form> </hr> <hr> 管理员用户 <form action="${pageContext.request.contextPath}/user/register.action" method="post"> <table border="2" align="center"> <tr> <th>姓名</th> <td> <input type="text" name="username" /></td> </tr> <tr> <th>薪水</th> <td> <input type="text" name="salary" value="2012" /> </td> </tr> <tr> <th>入职时间</th> <!-- ${!empty user.hiredate?user.hiredate:‘2015-4-3 12:12:12‘} 表示user.hiredate不是为空的话就给他赋user.hiredate的值 如果是空的就给他赋‘2015-4-3 12:12:12‘这个值。 --> <td> <input type="text" name="hiredate" value="2015-4-3 12:12:12"/></td> </tr> <tr> <td> <input type="submit" value="管理员注册"> </td> </tr> </table> </form> </hr> </body> </html>
第二步:编写web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>SpringMvc_10day_self</display-name> <!-- Spring提供了一个Filter专门用来解决Post提交中文的乱码问题 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter </filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <!--这个名字可以随便取得,但是这个名字取了之后,以后在 WEB-INF下面创建SpirngMVC的配置文件是,命名必须以这个开头, 所以这里取名叫做DispatcherServlet,那么之后的xml文件取名必须为DispatcherServlet-servlet.xml(一个字都不能差) --> <servlet-name>DispatcherServlet</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 通知DispatcherServlet去指定目录下找到springmvc.xml配置文件 --> <!-- 注意这里的 <param-name>contextConfigLocation</param-name>一个字母都不能有错 一旦有错就会去WEB-INF下面去找 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
第三步:编写spring.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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" > <import resource="com/guigu/shen/Action8/springmvc_008.xml"/> </beans>
第四步:编写springmvc_008.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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" > <!-- 控制器(程序员)(必须配置) --> <context:component-scan base-package="com.guigu.shen.Action8"/> <!-- 基于注解的映射器(可选) 这个类和以前的xml方式的类不同,专门是注解用的 --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> <!-- 基于注解的适配器(可选) 这个类和以前的xml方式的类不同,专门是注解用的 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> <!-- 视图解析器(可选) 这个类和以前的xml方式的类一样 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> </bean> </beans>
第五步:编写Admin和User的实体类。
Admin实体类:
package com.guigu.shen.Action8; import java.util.Date; /* 用户 */ public class Admin { private Integer id=1; private String username; private Double salary; private Date hiredate; /** * */ public Admin() { } /** * @return the id */ public Integer getId() { return id; } /** * @param id the id to set */ public void setId(Integer id) { this.id = id; } /** * @return the username */ public String getUsername() { return username; } /** * @param username the username to set */ public void setUsername(String username) { this.username = username; } /** * @return the salary */ public Double getSalary() { return salary; } /** * @param salary the salary to set */ public void setSalary(Double salary) { this.salary = salary; } /** * @return the hiredate */ public Date getHiredate() { return hiredate; } /** * @param hiredate the hiredate to set */ public void setHiredate(Date hiredate) { this.hiredate = hiredate; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return this.id+this.username+this.salary+this.hiredate.toString(); } }
User的实体类:
package com.guigu.shen.Action8; import java.util.Date; /* 用户 */ public class User { private Integer id=1; private String username; private Double salary; private Date hiredate; /** * */ public User() { } /** * @return the id */ public Integer getId() { return id; } /** * @param id the id to set */ public void setId(Integer id) { this.id = id; } /** * @return the username */ public String getUsername() { return username; } /** * @param username the username to set */ public void setUsername(String username) { this.username = username; } /** * @return the salary */ public Double getSalary() { return salary; } /** * @param salary the salary to set */ public void setSalary(Double salary) { this.salary = salary; } /** * @return the hiredate */ public Date getHiredate() { return hiredate; } /** * @param hiredate the hiredate to set */ public void setHiredate(Date hiredate) { this.hiredate = hiredate; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return this.id+this.username+this.salary+this.hiredate.toString(); } }
第六步:编写Action类(两个form的提交都会提交到这类里面的一个方法中):
package com.guigu.shen.Action8; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * * 请求路径可以拆分为:根模块的名字+分模块的名字 就是相当于当访问http://127.0.0.1:8080:项目名/user/register时就会进入到 registerMethod方法。 */ @Controller @RequestMapping(value="/user")//根模块的请求名字 public class UserAction { /* * 员工注册 * */ @RequestMapping(method=RequestMethod.POST,value="/register")//分模块的请求名字 /* 采用模型的方式(User)来收集从页面传来的参数。 方法里面的参数user和以前的参数一样会被用反射的方式去赋值。 */ public String registerMethod(User user,Admin admin,Model model) { //打印出user里面的信息 System.out.println("员工的信息是"+user.toString()); //打印出Admin的信息 System.out.println("管理员的信息"+admin); //将user和admin绑定到model对象中去。 model.addAttribute("user", user); model.addAttribute("admin", admin); //数据回显到person.jsp页面 return "/person.jsp"; } /** * 自定义类型转换器 * 就是说当Date类型的数据不能得到时,会自动查找@InitBinder注解过的方法 * */ @InitBinder protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception { binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true)); } }
第七步:测试;
测试1:
在普通用户中输入:
然后点击“普通用户注册”,成功,回显都是正确的。
测试:接下来在管理员用户表单里输入数据并提交:
结果:
很明显出问题了,原本应该在管理员用户表单回显的数据,却跑到了普通用户表里面。
这个问题在下一篇博客中解决。
16SpringMvc_在业务控制方法中写入User,Admin多个模型收集参数——引出问题
标签:
原文地址:http://www.cnblogs.com/shenxiaoquan/p/5754274.html