Spring映射器适配器解析器

Posted 光何

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring映射器适配器解析器相关的知识,希望对你有一定的参考价值。

1 springmvc的映射器和适配器

1.1springmvc的映射器

根据客户端请求的url,找到处理本次请求的handler(处理器),将url和controller关联起来

 

1.2springmvc的适配器

对映射器查找到的controller中的方法进行调用。

 

第一种:Controller适配

第二种:HttpRequestHandler适配

第三种:注解适配

不同的处理器,对应不同的适配器,但是所有适配器最终都返回ModelAndView对象,springmvc通过对ModelAndView对象进行解析,获得需要响应到客户端的数据和试图

1.3springmvc的默认配置

默认的映射器和默认的适配器

1 org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\\
2 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
3 org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\\
4 org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\\
5 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 

如果自己在springmvc.xml进行特殊的配置,会覆盖掉系统的默认配置

1.4springmvc的执行过程

 

第一步:客户端通过url发送请求

第二步:核心控制器DispatcherServlet接收到请求

第三步:通过系统的映射器找到对应的handler(处理器),并返回给核心控制器

第四步:通过核心控制器在找到handler(处理器)对应的适配器,

第五步:由找到的适配器,调用对应的handler(处理器),并将结果返回给适配器

第六步:适配器将ModelandView对象返回给核心控制器

第七步:由核心控制器将返回的ModelandView给视图解析器

第八步:有核心控制将解析的结果进行响应,最终将结果响应到客户端

2 自定义Hander的方法定义

2.1方法的参数问题

2.1.1默认参数

HttpServletRequest

HttpServletResponse

HttpSession

Model(默认作用范围就是request)

2.1.2客户端请求数据的绑定(重点)

使用处理本次请求的方法的形参,接收客户端发送的数据。

第一种:定义简单的类型的参数

String,基本类型对应的包装类型

 1 package org.guangsoft.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.ui.Model;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 
 7 @Controller
 8 public class UserController3
 9 {
10     /**
11      * 返回值:stirng表示跳转的路径
12      * username:接受客户端请求的username
13      * passowrd:接受客户端请求的password
14      * model:封装需要响应到客户端的数据
15      * 参数名称必须和客户端请求的参数名称一致
16      * @return
17      */
18     @RequestMapping("/userLogin")//客户端请求的url
19     public String userLogin(String username, String password, Model model)
20     {
21         if(username.equals("root") && password.equals("root"))
22         {
23             model.addAttribute("username",username);
24             return "success.jsp";//完成页面的跳转
25         }
26         else
27         {
28             model.addAttribute("msg", "您的用户名或密码错误!");
29             return "error.jsp";
30         }
31     }
32 }

第二种:定义javabean为形参

直接将请求的参数封装为javabean的对象。

l  定义javabean

 1 package org.guangsoft.controller;
 2 
 3 public class User
 4 {
 5     private String username;
 6     private String password;
 7     //定义集合属性接受客户端的数据
 8     private Integer age;
 9     public Integer getAge()
10     {
11         return age;
12     }
13     public void setAge(Integer age)
14     {
15         this.age = age;
16     }
17     public String getUsername()
18     {
19         return username;
20     }
21     public void setUsername(String username)
22     {
23         this.username = username;
24     }
25     public String getPassword()
26     {
27         return password;
28     }
29     public void setPassword(String password)
30     {
31         this.password = password;
32     }
33     
34

定义UserController4

 1 package org.guangsoft.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.ui.Model;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 
 7 @Controller
 8 public class UserController4
 9 {
10     @RequestMapping("/userLogin2")
11     public String userLogin2(Model model,User user,String hobbys[])
12     {
13         if(user.getUsername().equals("root") && user.getPassword().equals("root"))
14         {
15             model.addAttribute("username", user.getUsername());
16             return "success.jsp";
17         }
18         else
19         {
20             model.addAttribute("msg","用户名或密码错误!");
21             return "error.jsp";
22         }
23     }
24 }

建立视图页面

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE html>
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     <title>My JSP \'index.jsp\' starting page</title>
12     <meta http-equiv="pragma" content="no-cache">
13     <meta http-equiv="cache-control" content="no-cache">
14   </head>
15   
16   <body>
17       <div align="center">
18       <form action="userLogin.action" method="post">
19           <div>username:<input name="username"  /></div>
20           <div>password:<input name="password"  /></div>
21           <div>age:<input name="age" /></div>
22           <input name="hobbys" type="checkbox" value="1" />1
23           <input name="hobbys" type="checkbox" value="2" />2
24           <div><input type="submit" value="提交" /></div>
25       </form>
26       </div>
27   </body>
28 </html> 

第三种:定义集合形参  见上hobbies

2.2方法返回值

String 类型的返回值表示需要跳转路径

3 springmvc和struts2区别

Struts2的核心控制器是过滤器(filter),springmvc的核心控制器(Servlet)

Struts2的Action是多例的,springmvc的Handler(处理器)是单例的

Struts2用Action的属性接收客户端数据(必须多例才线程安全),springmvc使用方法的形参接收客户端数据(线程安全的)

Struts2是针对Action类型进行mapping(和url关联)

Springmvc是针对Handler中的处理请求的方法进行mappring(和url关联),

Springmvc在请求处理的控制上更精确,(粒度更小)

 

 

以上是关于Spring映射器适配器解析器的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC入门第1天--框架说明与快速入门

Spring MVC 详解

配置注解映射器和适配器。

第一场面试

非注解的处理器映射器和适配器

springMVC-配置