02-SpringMVC_获得用户请求

问题:用户的请求,是如何被后台获得的,即用户的请求信息是怎么分配给不同的处理器?后台又是如何获得用户数据的?这些问题会后面的课程中一一解答

一、 使用@RequestMapping映射请求

  • SpringMVC使用@RequestMapping注解,为控制器指定可以处理哪些URL请求
  • DispathcherSevle截获请求后,就通过控制器上@RequestMapping提供的映射信息确定请求所对应的处理方法
  • 查看@RequestMapping源码,可以知道它可以修饰方法,也可以修饰类

1、@RequestMapping修饰方法

  • 测试类
@Controllerpublic class SpringMVCTest {@RequestMapping("/testMappingMethod")public String testRequestMapping(){System.out.println("testMappingMethod");return "success";}}
  • URL
<a href="testMappingMethod"></a>

2 @RequestMapping修饰类

  • 测试类
@RequestMapping("/mappingClass")@Controllerpublic class MappingClassTest {@RequestMapping("/testMappingMethod")public String testRequestMapping(){System.out.println("testRequestMapping");return "success";}}

    • 请求的url
    <a href="mappingClass/testMappingMethod">testMappingClass</a>

    3 总结

    • @RequestMapping可以标注在控制器类的定义或方法定义处。

      • 类定义:提供初步的请求映射信息,相对于WEB应用的根目录
      • 方法处:提供进一步细分映射信息,相对于类定义处的URL;若类定义处未标注@RequestMapping,则方法处标注的URL相对WEB应用的根目录

    二、映射请求参数、请求方式或请求头

    • @RequestMapping除了可以使用请求Url映射请求以外,还可以使用请求方法、请求参数及请求头映射请求.对应的@RequestMapping源码如下
    @Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@[email protected] @interface RequestMapping {   ...    RequestMethod[] method() default {};    ...    String[] params() default {};    String[] headers() default {};    ...}
    • @RequestMapping的vaule、method、params及headers分别表请求URL、请求方法、请求参数及请求头的映射条件,他们之间是“与”的关系,联合使用多个条件可让请求映射更加精确化

    1、method的属性

    • 控制器
          @RequestMapping(value="/testMethod",method=RequestMethod.POST)	  public String testMethod(){System.out.println("testMethod");return "success";}
    • 超链接是使用get请求,所以不会成功
    <a href="mappingOther/testMethod">测试请求方式</a>
    • form请求
    <form action="mappingOther/testMethod" method="post">    	<input type="submit" value="提交"></form>

    2、params的属性

    2.1 params支持简单的表达式

    • param1:表示请求必须包含名为param1的请求参数
    • !param1:表示请求不能包含名为param1的请求参数
    • param1!=value1:表示请求包含名为param1的参数,但其值不能为value1
    • {"param1=value1",param2}:请求必须包含名为param1和param2的两个请求参数,且param1的参数的值必须是value1

    2.2 测试

    • 控制器
    @RequestMapping(value="/testParams",params={"username","age!=10"})public String testParams(){System.out.println("testParams");return "success";}

    含义:必须包含参数username和age,且age的值不能为10

    • 请求
     <a href="mappingOther/testParams?username=imentor&age=10">测试参数</a>

    不能成功,因为age的值为10

    3、header

    • 获得headers的值,可以通过firebug来查看

    • 控制器中的编写如下
    @RequestMapping(value="/testHeaders",headers={"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"})public String testHeaders(){System.out.println("testHeader");return "success";}

    三、映射请求路径

    • @RequestMapping支持Ant风格的请求路径,见源码

    1、 Ant风格资源地址支持3种匹配符

    • ?:匹配文件名中的一个字符
    • *  :匹配文件名中的任意字符
    • ** :匹配多层路径

    2 @RequestMapping支持Ant风格的URL

    • /user/*/createUser   :匹配/user/aaa/createUser
    • 匹配/user/bbb/createUser
    • /user/**/createUser   :匹配/user/createUser
    • 匹配/user/aaa/bbb/createUser
    • /user/createUser??   :匹配/user/createUseraa
    • 匹配/user/createUserbb

    3、测试

    • 控制器
    @RequestMapping(value="/user/*/createUser")public String createUser(){System.out.println("createUser");return "success";}
    • 请求
    a href="mappingOther/user/aaa/createUser">ant风格</a>

    四、REST

    1、知识点

    • 浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求,该过滤器为HiddenHttpMethodFilter。
    • HiddenHttpMethodFilter的父类是OncePerRequestFilter,它继承了父类的doFilterInternal方法,工作原理是将jsp页面的form表单的method属性值在doFilterInternal方法中转化为标准的Http方法,即GET,、POST、 HEAD、OPTIONS、PUT、DELETE、TRACE,然后到Controller中找到对应的方法。例如,在使用注解时我们可能会在Controller中用于@RequestMapping(value = "list", method = RequestMethod.PUT),所以如果你的表单中使用的是<form method="put">,那么这个表单会被提交到标了Method="PUT"的方法中。
    • REST:Representational State Transfer.即(资源)表现层状态转化。

      • 资源(Resources):网络上的一个实体,它可以是一段文本、一张图片、一首歌曲、一种服务等。可以用一个URI指向它。第一种资源对应一个特定的URI.也就是说,URI即为每个资源的独一无二的识别符。
      • 表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层。比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式。
      • 状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器一次交互过程。HTTP协议,是一个无状态协议,即所有的状态都保存在服务端。因此,如果客户想要操作服务器,必须通过某种手段,让服务端发生“状态转化”。而这种转化是建立在表现之上的。具体来说,就是HTTP协议里面,四个表示操作方式的动词
        • GET:获取资源
        • POST:新建资源
        • PUT:更新资源
        • DELETE:删除资源
    • 示例
      • /order/1    HTTP GET:得到id=1的order
      • /order/1    HTTP DELETE:删除id=1的order
      • /order/1    HTTP PUT:更新id=1的order
      • /order/1    HTTP POST:新增id=1的order
    • HiddenHttpMethodFilter
      • 浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持
      • Spring3.0添加一个过滤器,可以将这些请求转换为标准的http方法,使其支持GET、POST、PUT与DELETE请求

    2、测试

    • 在web.xml文件中HiddenHttpMethodFilter
    <filter>  	<filter-name>hiddenHttpMethodFilter</filter-name>  	<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>  </filter>    <filter-mapping>  	<filter-name>hiddenHttpMethodFilter</filter-name><url-pattern>/*</url-pattern>  </filter-mapping>
    • 控制器
    @RequestMapping("/testREST")@Controllerpublic class TestREST {@RequestMapping(value="/testRest/{id}",method=RequestMethod.GET)public String testRestGet(@PathVariable Integer id){System.out.println("testRest GET:"+id);return "success";}@RequestMapping(value="/testRest/{id}",method=RequestMethod.POST)public String testRestPost(@PathVariable Integer id){System.out.println("testRest POST:"+id);return "success";}@RequestMapping(value="/testRest/{id}",method=RequestMethod.DELETE)public String testRestDelete(@PathVariable Integer id){System.out.println("testRest Delete:"+id);return "success";}@RequestMapping(value="/testRest/{id}",method=RequestMethod.PUT)public String testRestPut(@PathVariable Integer id){System.out.println("testRest Put:"+id);return "success";}}
    • 请求
    <a href="testREST/testRest/1">测试Get</a>     <form action="testREST/testRest/1" method="post">     	<input type="submit" value="测试post">     </form>      <form action="testREST/testRest/1" method="post">     	<input type="hidden" name="_method" value="DELETE">     	<input type="submit" value="测试DELETE">     </form>      <form action="testREST/testRest/1" method="post">     	<input type="hidden" name="_method" value="PUT">     	<input type="submit" value="测试PUT">     </form>

    3、注意

    1. 如果用tomcat8作为服务器,在测试DELETE和Put的时候,会报405错误

    解决方法有三种

    • 一是将Tomcat8改为Tomcat7,在Tomcat7下运行是正常的.或者升级到tomcat 8.0.9以上版本
    • 二是将请求转发(forward)改为redirect
    • 三是自己手动写一个Filter来包装HttpRequest中的getMethod方法

    下面主要介绍一下第三种方法:也就是自己写一个Filter来包装从服务器发回来的HttpRequest请求:

    大致说一下流程,

    1. 在第1步中,客户端发送请求至服务器,这时如果发送的是POST请求且带有以_method为名的参数会被Spring的HiddenHttpMethodFilter给拦截。

    2. HiddenHttpMethodFilter内有一个静态内部类通过继承HttpServletRequestWrapper类并重写getMethod()方法,将该方法返回值设为_method隐藏域的值。

    3. HiddenHttpMethodFilter在包装好Request后,将请求发往服务器的控制器中对应的方法处理器,这时的请求变成了图中的 3、WrapperRequest by SpringFilter

    4. 服务器处理完请求后,产生了一个forward请求,产生相应的请求处理信息发往客户端,注意这时的request的getMethod()方法仍然是HiddenHttpMethodFilter包装过的

    5. 我们需要在服务器的响应请求到达客户端前进行拦截,这也是最关键的一步,通过自定义过滤器MyMethodConvertingFilter  进一步包装请求,将getMethod()方法返回值改成POST或GET即可

    public class MyMethodConvertingFilter implements Filter {@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {		chain.doFilter(wrapRequest((HttpServletRequest) request), response);}@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}private static HttpServletRequestWrapper wrapRequest(HttpServletRequest request) {        return new HttpServletRequestWrapper(request) {            @Override            public String getMethod() {                return "GET";            }        };}}

    6. 在web.xml中配置该filter,注意dispatcher结点值必须为FORWARD。

    <filter-mapping>    <filter-name>myFilter</filter-name>    <url-pattern>/*</url-pattern>    <dispatcher>FORWARD</dispatcher></filter-mapping>

    关注我们

        师享空间的宗旨是分享知识,传播价值。关注我们,及时获得更多信息。




    捐赠我们
        如果您对我们的成果表示认同并且觉得对你有所帮助,欢迎您对我们捐赠^_^。

    时间: 2024-10-12 16:21:11

    02-SpringMVC_获得用户请求的相关文章

    Oracle是如何工作的?实例是如何响应用户请求?一条SQL的执行过程~

    Oracle 是如何工作的? Select id,name from t order by id ; – SQL 解析(查看语法是否错误,如果没有错误,分析语意,执行此语句的权限) – 执行计划(ORACLE如何访问数据,按照执行计划取数据) – 执行SQL • 从磁盘中读取数据(如果数据在内存中没有,就去磁盘读取) • 数据处理(数据读到内存后,就进行处理.排序,组合等处理) • 返回结果(把结果返回给用户) Insert into t values(1,‘tigerfish’); – SQL

    [ Laravel 5.5 文档 ] 处理用户请求 —— HTTP 请求的过滤器:中间件

    [ Laravel 5.5 文档 ] 处理用户请求 -- HTTP 请求的过滤器:中间件 http://laravelacademy.org/post/7812.html 简介 中间件为过滤进入应用的 HTTP 请求提供了一套便利的机制.例如,Laravel 内置了一个中间件来验证用户是否经过认证(如登录),如果用户没有经过认证,中间件会将用户重定向到登录页面,而如果用户已经经过认证,中间件就会允许请求继续往前进入下一步操作. 当然,除了认证之外,中间件还可以被用来处理很多其它任务.比如:COR

    django views.py视图 获取用户请求相关信息以及请求头

    请求的其他信息 用户发来请求时候,不仅发来数据,也把请求头也发过来 在views.py 怎么找请求数据? request是一个对象,这个对象封装很多信息,可以先查这个对象的类 print(type(request)) from django.shortcuts import reverse def index(request): v = reverse('author:index') print(v) print(type(request)) # 找到这个类 导入这个类 <class 'djan

    sql server 性能调优之 当前用户请求分析 (1)

    原文:sql server 性能调优之 当前用户请求分析 (1) 一. 概述 在生产数据库运行期间,有时我们需要查看当前用户会话状态或者是说数据库当前是否运行良好, 应用的场景比如:当运行的应用系统响应突然变慢时需要分析数据库的.或想分析当前的数据库是否繁忙,是否有长时间的等待, 又或者执行一个sql的回滚状态查看,想手动kill掉一个会话时 等等.都需要从当前的会话状态去分析. 这篇主要介绍sys.sysprocesses 函数,这里面包含了当前用户大量的信息,如会话进程有多少,等待时间,op

    02. 爬取get请求的页面数据

    目录 02. 爬取get请求的页面数据 一.urllib库 二.由易到难的爬虫程序: 02. 爬取get请求的页面数据 一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib.parse,在Python2中是urllib和urllib2. 二.由易到难的爬虫程序: 1.爬取百度首页面所有数据值 1 #!/usr/bin/env python 2 # -*

    SQL state [72000]; error code [1013]; ORA-03111: 通信通道收到中断; java.sql.SQLException: ORA-01745: 无效的主机/绑定变量名;java.sql.SQLException: ORA-01013: 用户请求取消当前的操作

    1.oracle批量插入 2.java.sql.SQLException: ORA-01745: 无效的主机/绑定变量名(数据太多的时候出现解决方法限制条数插入) /** * 按指定大小,分隔集合,将集合按规定个数分为n个部分 * @param <T> * * @param list * @param len * @return */ public static <T> List<List<T>> splitList(List<T> list,

    微信开发系列----02:实现POST请求响应

    继续昨天的,现在我们的微信测试成功了,可以开发实现微信的各种功能,今天主要实现微信的简单交互,比如发送语音,图片,文本等请求,网站服务器发送对应的响应. 项目GitHub地址:  https://github.com/Andyahui/xgyxsh_WeiXin 一:微信XML的POST请求处理 昨天我们已经成为了开发者,说明get请求时可以到底,且是得到了相应的处理,下面是我们通过浏览器我们配置的URL浏览到的. 我们可以发现在get请求中设置的返回值在这里出现了,说明我们的测试是成功的.下面

    Spring Boot实现一个监听用户请求的拦截器

    项目中需要监听用户具体的请求操作,便通过一个拦截器来监听,并继续相应的日志记录 项目构建与Spring Boot,Spring Boot实现一个拦截器很容易. Spring Boot的核心启动类继承WebMvcConfigurerAdapter // 增加拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new RequestLog()); } //这

    apache进程和用户请求的关系

    apache工作模式: beos工作模式(跟linux关系不大,或者暂时用不上) 在Beos系统上的工作模式,使用一个单独的控制线程来创建和控制处理请求的工作线程. event工作模式(不太稳定,或者说暂时用不上) event模式由于把服务进程从链接中分离出来,在开启KeepAlive场合下相对worker模式能够承受的了更高的负载.event模式为 worker开发的变种模式,配置以及指令与worker完全相同.不过event模式不能很好的支持https的访问,有时还会出现一系列的问题. wo