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>



    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
   

原文地址:https://www.cnblogs.com/ivy-xu/p/5661677.html