SpringMVC(一)
SpringMVC
Spring 提供的构建 Web 应用程序的全功能 MVC 模块,从而在使用Spring进行WEB开发时,可以选择使用 Spring 的 Spring MVC 框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2等。
处理请求流程:
特点:
1、清晰的角色划分。
2、和Spring 其他框架无缝集成,是其它Web框架所不具备的。
3、面向接口编程。
4、本地化、主题的解析的支持,利于国际化和主题的切换。
5、强大的JSP标签库,使JSP编写更容易,与真正的View层实现无关。
6、还有比如RESTful风格的支持。
7、约定大于配置的契约式编程支持,基于注解的零配置支持,灵活的配置功能。
步骤:
1.添加jar包
2.编写配置文件及其代码
a.web.xml
b.dispatherService-servlet.xml(SpringMVC的配置文件)
c.controller等代码实现
范例:
1.web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <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"> 3 <display-name>SpringMVCDemo1_ivy</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 13 <!-- 配置SpringMVC拦截器(servlet) --> 14 <servlet> 15 <servlet-name>SpringMVC</servlet-name> 16 <!-- 配置SpringMVC的前置拦截器,用于拦截匹配的请求 --> 17 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 18 <!-- 指定SpringMVC配置文件的路径 --> 19 <init-param> 20 <param-name>contextConfigLocation</param-name> 21 <!-- 指定SpringMVC的配置文件.默认读取在/WEB-INF/目录下的以DispatcherServlet的servlet-name拼接-servlet.xml的文件 --> 22 <!-- classpath前缀名字与servlet-name一致 --> 23 <param-value>classpath:SpringMVC-servlet.xml</param-value> 24 </init-param> 25 <!-- 启动web容器时,加载servlet并初始化。数字越小,启动速度越快 --> 26 <load-on-startup>1</load-on-startup> 27 28 </servlet> 29 <servlet-mapping> 30 <servlet-name>SpringMVC</servlet-name> 31 <!-- 指定需要拦截的URL地址。/:根路径下所有的文件 --> 32 <url-pattern>/</url-pattern> 33 </servlet-mapping> 34 </web-app>
2.SpringMVC的配置文件
a1.默认:BeanNameUrlHandlerMapping -- SpringMVC-servlet.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 7 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 8 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> 9 10 <!-- 配置SpringMVC url地址映射 --> 11 <!-- 配置hanldelMapping指定以何种方式实现映射 --> 12 <!-- 1.默认:BeanNameUrlHandlerMapping --> 13 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> 14 15 <!-- 配置指定的Controller --> 16 <bean name="/hello" class="com.Elastic.SpringMVCDemo1.ivy.controller.HelloController"></bean> 17 18 <!-- 配置视图解析器 --> 19 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 20 <!-- 视图解释的前缀名称 --> 21 <!-- /:项目根目录。加在HelloController的逻辑视图名称。 --> 22 <property name="prefix" value="/"></property> 23 <!-- 视图解析的后缀名称 --> 24 <property name="suffix" value=".jsp"></property> 25 </bean> 26 </beans>
a2.默认:BeanNameUrlHandlerMapping可省略不写 -- SpringMVC-servlet.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 7 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 8 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> 9 10 <!-- 配置SpringMVC url地址映射 --> 11 <!-- 配置hanldelMapping指定以何种方式实现映射 --> 12 <!-- 1.默认:BeanNameUrlHandlerMapping --> 13 <!-- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> --> 14 15 <!-- 配置指定的Controller --> 16 <bean name="/hello" class="com.Elastic.SpringMVCDemo1.ivy.controller.HelloController"></bean> 17 18 <!-- 配置视图解析器 --> 19 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 20 <!-- 视图解释的前缀名称 --> 21 <!-- /:项目根目录。加在HelloController的逻辑视图名称。 --> 22 <property name="prefix" value="/"></property> 23 <!-- 视图解析的后缀名称 --> 24 <property name="suffix" value=".jsp"></property> 25 </bean> 26 </beans>
a3.常见: ControllerClassNameHandlerMapping -- SpringMVC-servlet.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 7 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 8 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> 9 10 <!-- 配置SpringMVC url地址映射 --> 11 <!-- 配置hanldelMapping指定以何种方式实现映射 --> 12 <!-- 2.常见: ControllerClassNameHandlerMapping --> 13 <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean> 14 15 <!-- 配置指定的Controller --> 16 <bean name="/hello" class="com.Elastic.SpringMVCDemo1.ivy.controller.HelloController"></bean> 17 18 <!-- 配置视图解析器 --> 19 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 20 <!-- 视图解释的前缀名称 --> 21 <!-- /:项目根目录。加在HelloController的逻辑视图名称。 --> 22 <property name="prefix" value="/"></property> 23 <!-- 视图解析的后缀名称 --> 24 <property name="suffix" value=".jsp"></property> 25 </bean> 26 </beans>
a3.常见: ControllerClassNameHandlerMapping,name属性不写 -- SpringMVC-servlet.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 7 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 8 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> 9 10 <!-- 配置SpringMVC url地址映射 --> 11 <!-- 配置hanldelMapping指定以何种方式实现映射 --> 12 <!-- 2.常见: ControllerClassNameHandlerMapping --> 13 <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean> 14 15 <!-- 配置指定的Controller --> 16 <bean class="com.Elastic.SpringMVCDemo1.ivy.controller.HelloController"></bean> 17 18 <!-- 配置视图解析器 --> 19 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 20 <!-- 视图解释的前缀名称 --> 21 <!-- /:项目根目录。加在HelloController的逻辑视图名称。 --> 22 <property name="prefix" value="/"></property> 23 <!-- 视图解析的后缀名称 --> 24 <property name="suffix" value=".jsp"></property> 25 </bean> 26 </beans>
a4.常见: ControllerClassNameHandlerMapping,name="/test" -- SpringMVC-servlet.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 7 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 8 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> 9 10 <!-- 配置SpringMVC url地址映射 --> 11 <!-- 配置hanldelMapping指定以何种方式实现映射 --> 12 <!-- 2.常见: ControllerClassNameHandlerMapping --> 13 <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean> 14 15 <!-- 配置指定的Controller --> 16 <bean name="/test" class="com.Elastic.SpringMVCDemo1.ivy.controller.HelloController"></bean> 17 18 <!-- 配置视图解析器 --> 19 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 20 <!-- 视图解释的前缀名称 --> 21 <!-- /:项目根目录。加在HelloController的逻辑视图名称。 --> 22 <property name="prefix" value="/"></property> 23 <!-- 视图解析的后缀名称 --> 24 <property name="suffix" value=".jsp"></property> 25 </bean> 26 </beans>
★★注意:当用了ControllerClassNameHandlerMapping时,页面找到的是Controller类,与name属性无关
1.hello(后缀没有controller),那么SpringMVC会自动补全
2.helloController,SpringMVC会先寻找是否有匹配的controller类,再自动显示页面
3.controller包
a.HelloController
1 package com.Elastic.SpringMVCDemo1.ivy.controller; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import org.springframework.web.servlet.ModelAndView; 7 import org.springframework.web.servlet.mvc.AbstractController; 8 9 //相当于struts中的Action,用于接收用户的请求并响应结果 10 public class HelloController extends AbstractController{ 11 12 // 相当于struts中的execute 13 @Override 14 protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { 15 System.out.println("进入了HelloController"); 16 17 // 返回模型和试图 18 /*设置响应请求对应的页面 19 参数hello是一个逻辑视图名称 20 通过视图解析器指定真正的页面 21 */ 22 return new ModelAndView("jsp/hello"); 23 } 24 25 }
HandlerMapping:
a.BeanNameUrlHandlerMapping
根据控制器Bean的名字将控制器映射到URL
b.ControllerBeanNameHandlerMapping
c.ControllerClassNameHandlerMapping
d.SimpleUrlHandlerMapping
e.DefaultAnnotationHandlerMapping
将请求映射给使用@RequestMapping注解的控制器和控制方法
视图解析器:
1.将逻辑视图的名字与JSP等视图技术进行匹配
2.InternalResourceViewResolver
a.在Web应用程序的WAR文件中查找视图模板,视图模板的路径根据加完前缀和后缀的逻辑视图名称来确定
b.prefix
c.suffix
范例:
1 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" > 2 <property name="prefix" value="/WEB-INF/jsp/"/> 3 <property name="suffix" value=".jsp"/> 4 </bean>
使用SpringMVC实现登录功能
1.步骤:
1).controller类继承AbstractController重写handleRequestInternal方法
2).通过request获取参数
3).判断用户登录是否成功
范例:
1 public class LoginController extends AbstractController { 2 3 @Override 4 protected ModelAndView handleRequestInternal(HttpServletRequest request, 5 HttpServletResponse response) throws Exception { 6 String name = request.getParameter("loginName"); 7 String pass = request.getParameter("loginPass"); 8 if (name.equals("admin") && pass.equals("123456")) { 9 return new ModelAndView("index"); 10 } 11 return new ModelAndView("error"); 12 } 13 14 }
2.优化登陆
1)Spring提供了多功能控制器和地址解析器来处理
a.MultiActionController
a.支持多请求处理
b.可以自定义处理请求的方法
c.语法:public ModelAndView actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession session] [,AnyObject]);
actionName: 请求的方法名,可以和URL地址对应
request: 自动注入的HttpServletRequest对象
response: 自动注入的HttpServletResponse对象
session: 自动注入的HttpSession对象,可选参数
AnyObject: 可选参数,一般用于参数注入
b.InternalPathMethodNameResolver
c.ParameterMethodNameResolver
2)编写UserController -- 继承MultiActionController
范例:
1 public class UserController extends MultiActionController { 2 3 public ModelAndView login(HttpServletRequest request, 4 HttpServletResponse response) { 5 //绑定请求的参数到user对象中,表单元素:<input name="name">对应user中的name属性 6 User user = (User) newCommandObject(User.class); 7 bind(request, user); 8 // 省略登录部分代码 9 …… 10 } 11 }
3)使用默认设置配置bean
范例:
1 <!-- SpringMVC默认的地址映射,可以省略 --> 2 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> 3 4 <!-- MultiActionController默认使用InternalPathMethodNameResolver映射Controller中的方法,可以省略 --> 5 <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"></bean> 6 7 <!-- 对应Controller中的login方法 --> 8 <bean name="/login" class="com.xuetang9.demo.controller.UserController"> 9 <property name="methodNameResolver" ref="methodNameResolver"></property> 10 </bean>
4)使用SimpleUrlHandlerMapping映射
a.映射Controller
b.映射Controller中的方法
范例:
1 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 2 <property name="mappings"> 3 <props> 4 <!-- 以/user/开头的URL地址都访问id为userController的控制器,*--指定Controller中需要调用的方法 --> 5 <prop key="/user/*">userController</prop> 6 </props> 7 </property> 8 </bean> 9 10 <bean id="userController" class="com.xuetang9.demo.controller.UserController"></bean>
5)实现服务器端的验证
a.SpringMVC提供的Validator接口来实现验证
1.编写实现Validator接口验证器代码
2.注入验证器到MultiActionController中的validators属性中
b.实现自定义验证器
1.验证器中的方法
a.重写supports方法 -- 检查验证器是否匹配需要验证的实体
b.重写validate(Object target, Errors errors)方法 -- 实现验证逻辑
范例:
1 public class UserValidator implements Validator { 2 3 //用于SpringMVC检查是否是指定类型的验证器 4 //返回true执行后续验证,返回false跳过验证 5 @Override 6 public boolean supports(Class<?> clazz) { 7 return clazz == User.class; 8 } 9 @Override 10 public void validate(Object target, Errors errors) { 11 User user = (User) target; //需要验证的对象需要强转类型 12 /* 13 Spring提供用于非空验证的工具类 14 4个参数依次是: 15 保存验证信息的对象,验证的字段名, 验证信息的键值,验证信息的内容 16 */ 17 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", 18 "name.required", "用户名不能为空"); 19 ValidationUtils.rejectIfEmpty(errors, "pass", "pass.required", "密码不能为空"); 20 if (user.getPass().length() < 6 || user.getPass().length() > 12) { 21 //将验证信息放入到errors对象中 22 errors.rejectValue("pass", "pass.length", "密码长度必须在6-12位之间"); 23 } 24 } 25 }
2.注入验证器
a.将验证器注入到Controller -- Validators是一个数组
范例:
1 <!-- 配置验证器 --> 2 <bean id="userValidator" class="com.xuetang9.demo.validator.UserValidator"></bean> 3 4 <!-- 配置Controller--> 5 <bean id="userController" class="com.xuetang9.demo.controller.UserController"> 6 <property name="validators"> 7 <list> 8 <!-- 注入验证器 --> 9 <ref bean="userValidator"/> 10 </list> 11 </property> 12 </bean>
6)显示错误验证信息
1.处理绑定异常
范例:
1 User user = (User) newCommandObject(User.class); 2 try { 3 bind(request, user); 4 } catch (ServletRequestBindingException e) { 5 BindException bindException = (BindException) e.getCause(); 6 return new ModelAndView("login").addAllObjects(bindException.getModel()); 7 }
2.页面使用SpringMVC标签显示错误信息 -- 引入spring表单标签
a.<%@ taglib uri="http://www.springframework.org/tags/form" prefix="fm" %>
b.使用spring的form标签创建提交的表单
c.使用errors标签显示验证信息
范例:
1 <fm:form action="user/login" method="post"> 2 <input name="name" type="text"> 3 <fm:errors path="name"></fm:errors> 4 <input name="pass" type="password"> 5 <fm:errors path="pass"></fm:errors> 6 <input type="submit" value="登陆"> 7 </fm:form>
范例:
1.entity包
a.User
1 package com.Elastic.SpringMVCDemo1.ivy.entity; 2 3 import java.io.Serializable; 4 5 public class User implements Serializable { 6 private String name; 7 private String pass; 8 public String getName() { 9 return name; 10 } 11 public void setName(String name) { 12 this.name = name; 13 } 14 public String getPass() { 15 return pass; 16 } 17 public void setPass(String pass) { 18 this.pass = pass; 19 } 20 21 }
2.controller包
a.UserController
1 package com.Elastic.SpringMVCDemo1.ivy.controller; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import org.springframework.web.servlet.ModelAndView; 7 import org.springframework.web.servlet.mvc.multiaction.MultiActionController; 8 9 import com.Elastic.SpringMVCDemo1.ivy.entity.User; 10 11 public class UserController extends MultiActionController { 12 public ModelAndView login(HttpServletRequest request, HttpServletResponse response,User user) { 13 System.out.println("登录功能"); 14 System.out.println(user.getName()); 15 return new ModelAndView("index"); 16 } 17 18 public ModelAndView registe(HttpServletRequest request, HttpServletResponse response,User user) { 19 System.out.println("注册功能"); 20 System.out.println(user.getName()); 21 return new ModelAndView("index"); 22 } 23 }
a1.添加对象外的属性 -- UserController
1 package com.Elastic.SpringMVCDemo1.ivy.controller; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import org.springframework.web.servlet.ModelAndView; 10 import org.springframework.web.servlet.mvc.multiaction.MultiActionController; 11 12 import com.Elastic.SpringMVCDemo1.ivy.entity.User; 13 14 public class UserController extends MultiActionController { 15 private User user; 16 private String code; 17 18 public User getUser() { 19 return user; 20 } 21 22 public void setUser(User user) { 23 this.user = user; 24 } 25 26 public String getCode() { 27 return code; 28 } 29 30 public void setCode(String code) { 31 this.code = code; 32 } 33 34 public ModelAndView login(HttpServletRequest request, HttpServletResponse response, UserController controller) { 35 System.out.println("登录功能"); 36 System.out.println(this.hashCode()); 37 System.out.println(controller.hashCode()); 38 System.out.println(controller.code); 39 System.out.println(controller.user.getName()); 40 return new ModelAndView("index"); 41 } 42 43 public ModelAndView registe(HttpServletRequest request, HttpServletResponse response,User user) { 44 System.out.println("注册功能"); 45 System.out.println(user.getName()); 46 return new ModelAndView("index"); 47 } 48 }
a2.添加对象外的属性(手动绑定参数) -- UserController
1 package com.Elastic.SpringMVCDemo1.ivy.controller; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import org.springframework.web.servlet.ModelAndView; 10 import org.springframework.web.servlet.mvc.multiaction.MultiActionController; 11 12 import com.Elastic.SpringMVCDemo1.ivy.entity.User; 13 14 public class UserController extends MultiActionController { 15 private User user; 16 private String code; 17 18 public User getUser() { 19 return user; 20 } 21 22 public void setUser(User user) { 23 this.user = user; 24 } 25 26 public String getCode() { 27 return code; 28 } 29 30 public void setCode(String code) { 31 this.code = code; 32 } 33 34 public ModelAndView login(HttpServletRequest request, HttpServletResponse response) { 35 //手动绑定参数 36 try { 37 this.bind(request, this); 38 39 } catch (Exception e) { 40 e.printStackTrace(); 41 } 42 System.out.println("登录功能"); 43 System.out.println(this.hashCode()); 44 // System.out.println(controller.hashCode()); 45 System.out.println(this.code); 46 System.out.println(user.getName()); 47 return new ModelAndView("index"); 48 } 49 50 public ModelAndView registe(HttpServletRequest request, HttpServletResponse response,User user) { 51 System.out.println("注册功能"); 52 System.out.println(user.getName()); 53 return new ModelAndView("index"); 54 } 55 }
a3.添加对象外的属性(两次调用bind()方法) -- UserController
1 package com.Elastic.SpringMVCDemo1.ivy.controller; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import org.springframework.web.servlet.ModelAndView; 10 import org.springframework.web.servlet.mvc.multiaction.MultiActionController; 11 12 import com.Elastic.SpringMVCDemo1.ivy.entity.User; 13 14 public class UserController extends MultiActionController { 15 private User user; 16 private String code; 17 18 public User getUser() { 19 return user; 20 } 21 22 public void setUser(User user) { 23 this.user = user; 24 } 25 26 public String getCode() { 27 return code; 28 } 29 30 public void setCode(String code) { 31 this.code = code; 32 } 33 34 public ModelAndView login(HttpServletRequest request, HttpServletResponse response) { 35 //手动绑定参数 36 try { 37 this.bind(request, this); 38 user = new User(); 39 this.bind(request, user); 40 41 } catch (Exception e) { 42 e.printStackTrace(); 43 } 44 System.out.println("登录功能"); 45 System.out.println(this.hashCode()); 46 // System.out.println(controller.hashCode()); 47 System.out.println(this.code); 48 System.out.println(this.user.getName()); 49 return new ModelAndView("index"); 50 } 51 52 public ModelAndView registe(HttpServletRequest request, HttpServletResponse response,User user) { 53 System.out.println("注册功能"); 54 System.out.println(user.getName()); 55 return new ModelAndView("index"); 56 } 57 }
a4.
1 package com.Elastic.SpringMVCDemo1.ivy.controller; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import org.springframework.validation.BindException; 7 import org.springframework.validation.Errors; 8 import org.springframework.validation.ValidationUtils; 9 import org.springframework.validation.Validator; 10 import org.springframework.web.bind.ServletRequestBindingException; 11 import org.springframework.web.servlet.ModelAndView; 12 import org.springframework.web.servlet.mvc.multiaction.MultiActionController; 13 14 import com.Elastic.SpringMVCDemo1.ivy.entity.User; 15 16 public class UserController extends MultiActionController implements Validator{ 17 private User user; 18 private String code; 19 20 public User getUser() { 21 return user; 22 } 23 24 public void setUser(User user) { 25 this.user = user; 26 } 27 28 public String getCode() { 29 return code; 30 } 31 32 public void setCode(String code) { 33 this.code = code; 34 } 35 36 public ModelAndView login(HttpServletRequest request, HttpServletResponse response) throws Exception{ 37 //手动绑定参数 38 try { 39 this.bind(request, this); 40 //捕获绑定异常 41 } catch (ServletRequestBindingException e) { 42 BindException bindException = (BindException) e.getCause(); 43 System.out.println(bindException); 44 //方法一 45 // return new ModelAndView("login",bindException.getModel()); 46 //方法二 47 ModelAndView mv = new ModelAndView(); 48 mv.setViewName("login"); 49 mv.addAllObjects(bindException.getModel()); 50 return mv; 51 } 52 System.out.println("登录功能"); 53 System.out.println(this.hashCode()); 54 System.out.println(user.getName()); 55 System.out.println(this.code); 56 return new ModelAndView("index"); 57 } 58 59 public ModelAndView registe(HttpServletRequest request, HttpServletResponse response,User user) { 60 System.out.println("注册功能"); 61 System.out.println(user.getName()); 62 return new ModelAndView("index"); 63 } 64 65 @Override 66 public boolean supports(Class<?> clazz) { 67 return clazz == this.getClass(); 68 } 69 70 @Override 71 public void validate(Object target, Errors errors) { 72 UserController userController = (UserController) target; 73 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "code", null, "验证码必填"); 74 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "user.name", null, "用户名必填"); 75 ValidationUtils.rejectIfEmpty(errors, "user.pass", null, "密码必填"); 76 77 } 78 }
3.动态工程的配置文件
a1.web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <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"> 3 <display-name>SpringMVCDemo1_ivy</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 13 <!-- 配置SpringMVC拦截器(servlet) --> 14 <servlet> 15 <servlet-name>SpringMVC</servlet-name> 16 <!-- 配置SpringMVC的前置拦截器,用于拦截匹配的请求 --> 17 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 18 <!-- 指定SpringMVC配置文件的路径 --> 19 <init-param> 20 <param-name>contextConfigLocation</param-name> 21 <!-- 指定SpringMVC的配置文件.默认读取在/WEB-INF/目录下的以DispatcherServlet的servlet-name拼接-servlet.xml的文件 --> 22 <!-- classpath前缀名字与servlet-name一致 --> 23 <param-value>classpath:SpringMVC-servlet.xml</param-value> 24 </init-param> 25 <!-- 启动web容器时,加载servlet并初始化。数字越小,启动速度越快 --> 26 <load-on-startup>1</load-on-startup> 27 28 </servlet> 29 <servlet-mapping> 30 <servlet-name>SpringMVC</servlet-name> 31 <!-- 指定需要拦截的URL地址。/:根路径下所有的文件 --> 32 <url-pattern>/</url-pattern> 33 </servlet-mapping> 34 </web-app>
a2.验证 -- web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <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"> 3 <display-name>SpringMVCDemo1_ivy</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 <context-param> 13 <param-name>contextConfigLocation</param-name> 14 <param-value>classpath:applicationContext.xml</param-value> 15 </context-param> 16 17 <!-- 配置Spring的监听器 --> 18 <listener> 19 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 20 </listener> 21 22 <!-- 配置SpringMVC拦截器(servlet) --> 23 <servlet> 24 <servlet-name>SpringMVC</servlet-name> 25 <!-- 配置SpringMVC的前置拦截器,用于拦截匹配的请求 --> 26 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 27 <!-- 指定SpringMVC配置文件的路径 --> 28 <init-param> 29 <param-name>contextConfigLocation</param-name> 30 <!-- 指定SpringMVC的配置文件.默认读取在/WEB-INF/目录下的以DispatcherServlet的servlet-name拼接-servlet.xml的文件 --> 31 <!-- classpath前缀名字与servlet-name一致 --> 32 <param-value>classpath:SpringMVC-servlet.xml</param-value> 33 </init-param> 34 <!-- 启动web容器时,加载servlet并初始化。数字越小,启动速度越快 --> 35 <load-on-startup>1</load-on-startup> 36 37 </servlet> 38 <servlet-mapping> 39 <servlet-name>SpringMVC</servlet-name> 40 <!-- 指定需要拦截的URL地址。/:根路径下所有的文件 --> 41 <url-pattern>/</url-pattern> 42 </servlet-mapping> 43 </web-app>
4.SpringMVC的配置文件
a1.SimpleUrl映射 -- SpringMVC-servlet.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 7 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 8 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> 9 10 <!-- 配置SpringMVC url地址映射 --> 11 <!-- 配置hanldelMapping指定以何种方式实现映射 --> 12 <!-- 3.controller类中有多个方法:SimpleUrl映射 --> 13 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 14 <property name="mappings"> 15 <props> 16 <prop key="/user/*">userController</prop> 17 </props> 18 </property> 19 </bean> 20 21 <!-- 配置指定的Controller --> 22 <!-- login:UserController的方法 --> 23 <!-- <bean name="/login" class="com.Elastic.SpringMVCDemo1.ivy.controller.UserController"></bean> --> 24 <bean id="userController" name="/login" class="com.Elastic.SpringMVCDemo1.ivy.controller.UserController"></bean> 25 26 <!-- 配置视图解析器 --> 27 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 28 <!-- 视图解释的前缀名称 --> 29 <!-- /:项目根目录。加在HelloController的逻辑视图名称。 --> 30 <property name="prefix" value="/"></property> 31 <!-- 视图解析的后缀名称 --> 32 <property name="suffix" value=".jsp"></property> 33 </bean> 34 </beans>
5.Spring的配置文件
a.applicationContext.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 </beans>
6.jsp
a.login.jsp
1 <%--引入JSP页面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 3 <%-- 引入JSTL标签指令 --%> 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 5 <!DOCTYPE html> 6 <html language="zh-CN"> 7 <head> 8 <meta charset="utf-8"> 9 <!-- 设置浏览器渲染的引擎 --> 10 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 11 <!-- 设置支持移动设备 --> 12 <meta name="viewport" content="width=device-width, initial-scale=1"> 13 <title>网页标题</title> 14 <!-- 引入bootstrap的样式 --> 15 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 16 </head> 17 <body> 18 <div class="container"> 19 <div class="panel panel-primary center-block"> 20 <div class="panel-heading">登录</div> 21 <div class="panel-body"> 22 <form class="form-horizontal" action="user/login" method="post"> 23 <div class="form-group"> 24 <label class="col-md-3 control-label" for="loginName">用户名:</label> 25 <div class="col-md-6" > 26 <input class="form-control" id="loginName" name="name" type="text" autocomplete="off"/> 27 </div> 28 <div class="col-md-3"> 29 </div> 30 </div> 31 <div class="form-group"> 32 <label class="col-md-3 control-label" for="loginPass">密码:</label> 33 <div class="col-md-6" > 34 <input class="form-control" id="loginPass" name="pass" type="password"/> 35 </div> 36 <div class="col-md-3"> 37 38 </div> 39 </div> 40 41 <div class="form-group"> 42 <div class="col-md-offset-3 col-md-6"> 43 <input class="btn btn-primary btn-block" type="submit" value="登录" /> 44 </div> 45 </div> 46 </form> 47 </div> 48 </div> 49 </div> 50 51 <!-- 引入JS的样式 --> 52 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 53 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 54 55 </body> 56 </html>
a2.调用两次bind()方法 -- login.jsp
1 <%--引入JSP页面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 3 <%-- 引入JSTL标签指令 --%> 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 5 <!DOCTYPE html> 6 <html language="zh-CN"> 7 <head> 8 <meta charset="utf-8"> 9 <!-- 设置浏览器渲染的引擎 --> 10 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 11 <!-- 设置支持移动设备 --> 12 <meta name="viewport" content="width=device-width, initial-scale=1"> 13 <title>网页标题</title> 14 <!-- 引入bootstrap的样式 --> 15 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 16 </head> 17 <body> 18 <div class="container"> 19 <div class="panel panel-primary center-block"> 20 <div class="panel-heading">登录</div> 21 <div class="panel-body"> 22 <form class="form-horizontal" action="user/login" method="post"> 23 <div class="form-group"> 24 <label class="col-md-3 control-label" for="loginName">用户名:</label> 25 <div class="col-md-6" > 26 <input class="form-control" id="loginName" name="name" type="text" autocomplete="off"/> 27 </div> 28 <div class="col-md-3"> 29 </div> 30 </div> 31 <div class="form-group"> 32 <label class="col-md-3 control-label" for="loginPass">密码:</label> 33 <div class="col-md-6" > 34 <input class="form-control" id="loginPass" name="pass" type="password"/> 35 </div> 36 <div class="col-md-3"> 37 38 </div> 39 </div> 40 <div class="form-group"> 41 <label class="col-md-3 control-label" for="code">验证码:</label> 42 <div class="col-md-6" > 43 <input class="form-control" id="code" name="code" type="text"/> 44 </div> 45 <div class="col-md-3"> 46 47 </div> 48 </div> 49 50 <div class="form-group"> 51 <div class="col-md-offset-3 col-md-6"> 52 <input class="btn btn-primary btn-block" type="submit" value="登录" /> 53 </div> 54 </div> 55 </form> 56 </div> 57 </div> 58 </div> 59 60 <!-- 引入JS的样式 --> 61 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 62 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 63 64 </body> 65 </html>
a3.Spring标签 -- login.jsp
1 <%--引入JSP页面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 3 <%-- 引入JSTL标签指令 --%> 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 5 <%-- 引入Spring标签指令 --%> 6 <%@ taglib uri="http://www.springframework.org/tags/form" prefix="fm" %> 7 <!DOCTYPE html> 8 <html language="zh-CN"> 9 <head> 10 <meta charset="utf-8"> 11 <!-- 设置浏览器渲染的引擎 --> 12 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 13 <!-- 设置支持移动设备 --> 14 <meta name="viewport" content="width=device-width, initial-scale=1"> 15 <title>网页标题</title> 16 <!-- 引入bootstrap的样式 --> 17 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 18 </head> 19 <body> 20 <div class="container"> 21 <div class="panel panel-primary center-block"> 22 <div class="panel-heading">登录</div> 23 <div class="panel-body"> 24 <fm:form action="user/login" method="post"> 25 <div class="form-group"> 26 <label class="col-md-3 control-label" for="loginName">用户名:</label> 27 <div class="col-md-6" > 28 <input class="form-control" id="loginName" name="user.name" type="text" autocomplete="off"/> 29 </div> 30 <div class="col-md-3"> 31 <fm:errors path="user.name"></fm:errors> 32 </div> 33 </div> 34 <div class="form-group"> 35 <label class="col-md-3 control-label" for="loginPass">密码:</label> 36 <div class="col-md-6" > 37 <input class="form-control" id="loginPass" name="user.pass" type="password"/> 38 </div> 39 <div class="col-md-3"> 40 <fm:errors path="user.pass"></fm:errors> 41 </div> 42 </div> 43 <div class="form-group"> 44 <label class="col-md-3 control-label" for="code">验证码:</label> 45 <div class="col-md-6" > 46 <input class="form-control" id="code" name="code" type="text"/> 47 </div> 48 <div class="col-md-3"> 49 <fm:errors path="code"></fm:errors> 50 </div> 51 </div> 52 53 <div class="form-group"> 54 <div class="col-md-offset-3 col-md-6"> 55 <input class="btn btn-primary btn-block" type="submit" value="登录" /> 56 </div> 57 </div> 58 </fm:form> 59 </div> 60 </div> 61 </div> 62 63 <!-- 引入JS的样式 --> 64 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 65 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 66 67 </body> 68 </html>
b.reg.jsp
1 <?xml version="1.0" encoding="UTF-8"?> 2 <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"> 3 <display-name>SpringMVCDemo1_ivy</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 13 <!-- 配置SpringMVC拦截器(servlet) --> 14 <servlet> 15 <servlet-name>SpringMVC</servlet-name> 16 <!-- 配置SpringMVC的前置拦截器,用于拦截匹配的请求 --> 17 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 18 <!-- 指定SpringMVC配置文件的路径 --> 19 <init-param> 20 <param-name>contextConfigLocation</param-name> 21 <!-- 指定SpringMVC的配置文件.默认读取在/WEB-INF/目录下的以DispatcherServlet的servlet-name拼接-servlet.xml的文件 --> 22 <!-- classpath前缀名字与servlet-name一致 --> 23 <param-value>classpath:SpringMVC-servlet.xml</param-value> 24 </init-param> 25 <!-- 启动web容器时,加载servlet并初始化。数字越小,启动速度越快 --> 26 <load-on-startup>1</load-on-startup> 27 28 </servlet> 29 <servlet-mapping> 30 <servlet-name>SpringMVC</servlet-name> 31 <!-- 指定需要拦截的URL地址。/:根路径下所有的文件 --> 32 <url-pattern>/</url-pattern> 33 </servlet-mapping> 34 </web-app>