springMVC学习 表单提交之数据封装

来源:互联网 发布:win7 删除网络驱动器 编辑:程序博客网 时间:2024/05/16 14:58

我们可以让服务器启动时,首先访问hello.jsp,然后页面提交后到TestController中,接着返回到hello.jsp页面。项目结构如下:

配置如下:

①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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">   <servlet>   <servlet-name>dispatcherServlet</servlet-name>   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>   <init-param>   <description>指定配置文件路径</description>   <param-name>contextConfigLocation</param-name>   <param-value>/WEB-INF/applicationContext.xml</param-value>   </init-param>   <!-- 服务器启动时创建该servlet实例 -->   <load-on-startup>1</load-on-startup>   </servlet>   <servlet-mapping>   <servlet-name>dispatcherServlet</servlet-name>   <url-pattern>*.do</url-pattern>   </servlet-mapping>  <welcome-file-list>    <welcome-file>hello.do</welcome-file>  </welcome-file-list></web-app>

②applicationContext.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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="        http://www.springframework.org/schema/beans        classpath:/org/springframework/beans/factory/xml/spring-beans-3.0.xsd         http://www.springframework.org/schema/context         classpath:/org/springframework/context/config/spring-context-3.0.xsd         http://www.springframework.org/schema/mvc         classpath:/org/springframework/web/servlet/config/spring-mvc-3.2.xsd ">                <!-- 根据我们请求的不同来选择调用相对应的controller -->        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">        <property name="mappings">        <props>        <prop key="testController.do">testController</prop>        <prop key="hello.do">urlPageDirect</prop>        </props>        </property>        </bean>        <bean id="urlPageDirect" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>                <bean id="testController" class="com.zhongqian.controller.TestController"></bean>                <!-- 视图解析器,用来指定返回后的页面 .如返回aa,则对于的页面为/WEB-INF/jsp/aa.jsp -->        <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">        <!-- 返回的视图模型数据需要经过jstl来处理 -->        <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>

③hello.jsp页面如下:
<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title></head><body><form method="post" action="testController.do">employeeID:<input type="text" name="empId"/><br/>empName:<input type="text" name="empName"/><br/>empAge:<input type="text" name="empAge"/><br/>emphireDate:<input type="text" name="empHireDate"/><br/><input type="submit" value="submit"/> <input type="reset" value="cancel"/></form></body></html>

④TestController代码如下:
public class TestController implements Controller{@Overridepublic ModelAndView handleRequest(HttpServletRequest arg0,HttpServletResponse arg1) throws Exception {String name = arg0.getParameter("empName");System.out.println(name);return new ModelAndView("hello");}}

启动项目后页面显示如下:

暂且只输入empName(后台现在只对empName的值进行了接收),然后点击submit提交,后台打印输入的内容。

由后台可知,是通过request.getParameter("name")来接收数据的,当表单数据过多时,这种方式显然不够好。现在TestController进行改进,如下:

public class TestController extends AbstractCommandController{@Overrideprotected ModelAndView handle(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, BindException arg3)throws Exception {Employee emp = (Employee)arg2;System.out.println(emp);return new ModelAndView("hello");}}

Employee类代码如下:
public class Employee {private int empId;private String empName;private int empAge;private Date emphireDate;@Overridepublic String toString() {return empId+" ,"+empName+", "+empAge;}        。。。//get/set方法省略}
对于页面hello.jsp,表单中name属性值要与employee对象属性名称一致,这里先要将empHiredate的name属性去掉,避免报错,后面会讲到解决方案。现在问题是,表单提交时,对象封装到改进后的TestController中handler方法的第二个参数,那么spring在进行封装时,是如何知道arg2对于的对象是Employee呢?因此在创建TestController对应的bean时,要作如下改动:
         <bean id="testController" class="com.zhongqian.controller.TestController">            <property name="commandClass" value="com.zhongqian.entities.Employee" />        </bean>
这是重新发布项目,输入id,age,name三个输入框后提交,在后台会打印输入的数据。说明数据成功封装到了arg2中。

下面来处理对于最后一个输入框empHireDate的处理,将它的name属性添加上,运行输入数据后,提交将出现一个奇怪的结果无论输入什么emphireDate的值都为空!这是为什么?在spring进行数据封装即数据绑定时,提交到后台的数据都是String类型,对于基本的数据类型会自动的进行转化,即将String类型转化int,float等。但是当我们对int的数据类型输入时,输入的不是全数字,这个时候转化就会失败,但是程序并不报错,而是将对应的值设为0,即取其默认值.

     那么如何解决输入时间的为空的问题呢?这个时候我们就要自定义属性编辑器了!这里我们就不自定义了属性编辑器了,使用springmvc提供一个自定义时间编辑器。接着就要使用这个编辑器了,在TestController中重写initBinder方法。如下:

@Overrideprotected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {System.out.println("oooo");binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));}

配置好后,重启发布,不知道为何,我这里还是为null。╮(╯▽╰)╭。。。。这里不再深究了。应为在spring3.0后,已经不推荐这样做了,这里学习只是为了更好理解springmvc。

除了AbstractCommandController外,spring还提供了FormController来对表单数据进行封装。那么两者之间有什么不同呢?请看如下:

创建一个TestFormController如下:

public class TestFormController extends SimpleFormController {//用于将页面需要的数据传送到页面protected Map referenceData(HttpServletRequest request) throws Exception {Map<String,String[]> map = new HashMap<String,String[]>();map.put("deptList", new String[]{"sale","oa","it"});return map;}@Overrideprotected ModelAndView onSubmit(Object command) throws Exception {Employee emp = (Employee)command;System.out.println(emp);return new ModelAndView(getSuccessView());}@Overrideprotected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));}}

对应bean的配置:
 <bean id="testFormController" class="com.zhongqian.controller.TestFormController">            <property name="commandClass" value="com.zhongqian.entities.Employee" />            <property name="formView" value="hello"/>            <property name="successView" value="hello"/>        </bean>

另外在handlerMapping需要添加
<prop key="testFormController.do">testFormController</prop>
当用户以get请求访问testFormController.do时,会直接跳转到formView对应的视图。并且在跳转到视图前,会调用reffrenceData方法,将页面需要的数据传送到页面。当用于以Post请求时,则会调用onSubmit()方法。
修改hello.jsp页面使用jstl标签,显示如下:

输入正确数据后提交,后台打印相应的信息。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老师说上课不专心怎么办 孩子不专心好动马虎怎么办 学生上课不认真听讲怎么办 一年级孩子上课不注意听讲怎么办 一年级孩子上课说话不听课怎么办 一年级孩子上课不听课怎么办 小学一年级学生上课不专心怎么办? 小孩听课注意力不集中怎么办 小孩子上课精神不集中怎么办 孩子说我不画了怎么办 幼儿园小朋友上课不专心怎么办 孩子写作业不专心怎么办 小孩做作业不专心怎么办 孩子上课精力不集中怎么办 四岁宝宝吃饭慢怎么办 5岁宝宝吃饭慢怎么办 小学一年级上课不专心怎么办 5岁儿童不专心怎么办 小孩子做作业不专心怎么办 孩子做作业不专心怎么办 小孩学了就忘怎么办 小孩学过就忘了怎么办 做事老是注意力不集中怎么办 做事无法专注注意力不集中怎么办 幼儿园孩子上课不认真听讲怎么办 孩子在课间打闹家长应该怎么办 孩子打闹家长额钱怎么办 我又打孩子了怎么办 打排卵针不排卵怎么办 总是控制不住打骂孩子怎么办 叛逆期的孩子打骂妈妈怎么办 孩子屁股打青了怎么办 父亲把孩子屁股打流血怎么办 孩子屁股长了湿疹怎么办 宝宝发脾气摔东西躺地上怎么办 生气拿棍子打了孩子怎么办 小宝宝被蚊虫咬了怎么办 小宝宝被蚊子咬了怎么办 衣架打小孩淤青怎么办 1岁宝宝有痰咳嗽怎么办 1岁宝宝咳嗽有痰怎么办