一 测试项目搭建

(1)新建Java Web项目,并引入几个SpringMVC项目所需要的jar包,项目结构和所需要的jar包如下:

(2)web.xml与springmvc的相关配置:

i)web.xml:

<web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.html</url-pattern></servlet-mapping><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></web-app>

这里定义了SpringMVC拦截以.html结尾的url后缀并进行处理

ii)springmvc-servlet.xml:

<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"><context:component-scanbase-package="cn.zifangsky.**.controller"/><context:annotation-config/><!--激活Bean中定义的注解--><mvc:annotation-driven/><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="prefix"value="/WEB-INF/pages/"/><propertyname="suffix"value=".jsp"/></bean></beans>

在上面的配置文件中,<context:annotation-config />激活了Bean中定义的一些注解,而<mvc:annotation-driven />则启动了SpringMVC的一些默认配置。在配置文件的最后则定义了逻辑视图到实际视图之间的对应关系,一句话解释就是:给返回的逻辑视图加上上面定义的路径前缀和后缀就是实际视图的真正路径了。

二 使用SpringMVC处理Form表单

(1)在正式开始之前,先建立一个model和枚举类:

i)实体类User:

packagecn.zifangsky.model;importjava.time.LocalDate;importorg.springframework.format.annotation.DateTimeFormat;publicclassUser{privateStringname;privateStringpassword;privateStringjob;@DateTimeFormat(pattern="yyyy-MM-dd")privateLocalDatebirthDate;privateGendergender;privateStringcountry;privatebooleansmoking;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicStringgetJob(){returnjob;}publicvoidsetJob(Stringjob){this.job=job;}publicLocalDategetBirthDate(){returnbirthDate;}publicvoidsetBirthDate(LocalDatebirthDate){this.birthDate=birthDate;}publicGendergetGender(){returngender;}publicvoidsetGender(Gendergender){this.gender=gender;}publicStringgetCountry(){returncountry;}publicvoidsetCountry(Stringcountry){this.country=country;}publicbooleanisSmoking(){returnsmoking;}publicvoidsetSmoking(booleansmoking){this.smoking=smoking;}}

ii)表示“性别”的枚举类Gender:

packagecn.zifangsky.model;publicenumGender{MALE,FEMALE;}

下面将依照程序的执行流程来简单说明SpringMVC的Form表单处理,分别是前台的form表单填写 –>controller处理 –>处理结果视图页面

(2)测试项目的首页与form表单页面:

i)首页index.jsp:

<%response.sendRedirect("form.html");%>

可以看出,在这里我们的首页很简单,就是重定向到“form.html”,但是通过我们前面在web.xml中的配置,SpringMVC将会对这个请求转到一个具体的controller中进行处理,当然这里就是直接转到form表单页面。具体的controller里的处理逻辑下面再说

ii)form表单页面userForm.jsp:

<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@tagliburi="http://www.springframework.org/tags/form"prefix="mvc"%><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>SpringMVCFormHandling</title></head><body><h3>用户注册</h3><mvc:formmodelAttribute="user"action="result.html"><table><tr><td><mvc:labelpath="name">姓名:</mvc:label></td><td><mvc:inputpath="name"/></td></tr><tr><td><mvc:labelpath="password">密码:</mvc:label></td><td><mvc:passwordpath="password"/></td></tr><tr><td><mvc:labelpath="job">工作:</mvc:label></td><td><mvc:textareapath="job"/></td></tr><tr><td><mvc:labelpath="birthDate">生日:</mvc:label></td><td><mvc:inputpath="birthDate"/></td></tr><tr><td><mvc:labelpath="gender">性别:</mvc:label></td><td><mvc:radiobuttonspath="gender"items="${genders}"/></td></tr><tr><td><mvc:labelpath="country">居住地:</mvc:label></td><td><mvc:selectpath="country"items="${countries}"/></td></tr><tr><td><mvc:labelpath="smoking">吸烟吗:</mvc:label></td><td><mvc:checkboxpath="smoking"/></td></tr><tr><tdcolspan="2"><inputtype="submit"value="Submit"/></td></tr></table></mvc:form></body></html>

由于我们把这个页面放在了WEB-INF目录下,因此是不能直接通过URL对这个文件进行访问的,必须前面定义的“form.html”转到controller处理后显示这个视图页面,这样做的目的是防止一些私密的页面在未授权的情况下被其他人随意访问。在上面的文件中,需要注意的是:

为了简化form表单的写法,因此引入了SpringMVC的表单标签库,也就是文件顶部的:<%@taglib uri=”http://www.springframework.org/tags/form” prefix=”mvc”%>

modelAttribute表示手动绑定了一个名为“user”的实体类,该值与controller中处理转到这个form表单时设置的那个model值相对应

表单中的path特性则是实现了对model的绑定,如:<mvc:input path=”name” />将该输入值设置成model类中的“name”属性。如果没有显式指定id和name属性,那么在页面中呈现的HTML input标签就会使用path特性来设置它的id和name属性

(3)业务逻辑处理的controller类UserController.java:

packagecn.zifangsky.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.ModelAttribute;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.servlet.ModelAndView;importcn.zifangsky.model.Gender;importcn.zifangsky.model.User;@ControllerpublicclassUserController{privatestaticfinalString[]countries={"China","Japan","NorthKorea","UnitedStates"};@RequestMapping(value="/form.html")publicModelAndViewuser(){ModelAndViewmodelAndView=newModelAndView("userForm");modelAndView.addObject("user",newUser());modelAndView.addObject("genders",Gender.values());modelAndView.addObject("countries",countries);returnmodelAndView;}@RequestMapping(value="/result.html")publicModelAndViewprocessUser(@ModelAttribute(value="user")Useru){ModelAndViewmodelAndView=newModelAndView("userResult");modelAndView.addObject("u",u);returnmodelAndView;}}

可以看出,在上面定义了两个方法,它们的作用分别是针对“form.html”请求转到真实的form表单以及对form表单的处理。在对表单处理时通过@ModelAttribute注解接收了一个User类型的“u”,也就是前面填写的form表单,后面就是表单的显示因此不多说

(4)测试:

i)表单填写:

ii)结果显示:


附(2016-05-18):

userResult.jsp页面:

<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@tagliburi="http://www.springframework.org/tags/form"prefix="mvc"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>SpringMVCFormHandling</title></head><body><h3>注册结果</h3><table><tr><td>姓名:</td><td>${u.name}</td></tr><tr><td>密码:</td><td>${u.password}</td></tr><tr><td>工作:</td><td>${u.job}</td></tr><tr><td>生日:</td><td>${u.birthDate}</td></tr><tr><td>性别:</td><td>${u.gender}</td></tr><tr><td>居住地:</td><td>${u.country}</td></tr><tr><td>吸烟吗:</td><td>${u.smoking}</td></tr></table></body></html>