博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
胖哥学SpringMVC:请求方式转换过滤器配置
阅读量:5777 次
发布时间:2019-06-18

本文共 6036 字,大约阅读时间需要 20 分钟。

@RequestMapping

个人建议重新练习一遍搭建的过程,如果感觉麻烦你可以直接复制上一个工程,但是需要修改pom.xml中的一点信息

com.hanpang.springmvc
springmvc-demo02
0.0.1-SNAPSHOT
复制代码

1.请求路径相同问题

看下面的代码,我设置了相同的路径,那么会有说明错误呢?请自己查看控制台信息

package com.hanpang.web;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;@Controller//告知其是一个控制器@RequestMapping("/cms")public class Demo05Controller {	@RequestMapping(value="/user")	public ModelAndView test01() {		System.out.println("用于获取用户信息");		return null;	}	@RequestMapping(value="/user")	public ModelAndView test02() {		System.out.println("用于修改用户信息");		return null;	}}复制代码

错误信息如下:

Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'demo05Controller' method public org.springframework.web.servlet.ModelAndView com.hanpang.web.Demo05Controller.test02()to {[/cms/user]}: There is already 'demo05Controller' bean methodpublic org.springframework.web.servlet.ModelAndView com.hanpang.web.Demo05Controller.test01() mapped.复制代码

在一个控制器名字叫demo05Controller的中有一个映射路径"/cms/user"对应了两个方法,属于模糊映射

如果出现了这样的情况或者需求,如何处理呢? 我们可以设置requestMethod来区别相同路径的不同处理方式

2.method属性的设置

可以通过设置method设置可以处理,个人推荐这种方式.

package com.hanpang.web;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.servlet.ModelAndView;@Controller//告知其是一个控制器@RequestMapping("/cms")public class Demo05Controller {	@RequestMapping(value="/user",method=RequestMethod.GET)	public ModelAndView test01() {		System.out.println("用于获取用户信息");		return null;	}	@RequestMapping(value="/user",method=RequestMethod.POST)	public ModelAndView test02() {		System.out.println("用于修改用户信息");		return null;	}}复制代码

启动正常,区分你的请求方式执行相应的方法

问题:我们知道的是HTML发送的请求方式有且仅有GET和POST?

HTTP Method ConversionA key principle of REST is the use of the Uniform Interface. This means that all resources (URLs) can be manipulated using the same four HTTP methods: GET, PUT, POST, and DELETE. For each method, the HTTP specification defines the exact semantics. For instance, a GET should always be a safe operation, meaning that is has no side effects, and a PUT or DELETE should be idempotent, meaning that you can repeat these operations over and over again, but the end result should be the same. While HTTP defines these four methods, HTML only supports two: GET and POST. Fortunately, there are two possible workarounds: you can either use JavaScript to do your PUT or DELETE, or simply do a POST with the 'real' method as an additional parameter (modeled as a hidden input field in an HTML form). This latter trick is what Spring’s HiddenHttpMethodFilter does. This filter is a plain Servlet Filter and therefore it can be used in combination with any web framework (not just Spring MVC). Simply add this filter to your web.xml, and a POST with a hidden _method parameter will be converted into the corresponding HTTP method request.复制代码

来自官网的处理方案

REST的一个关键原则是使用统一接口。这意味着所有资源(url)都可以使用相同的4个HTTP方法进行操作:GET、PUT、POST和DELETE。对于每个方法,HTTP规范定义了精确的语义。例如,GET应该始终是一个安全的操作,这意味着没有副作用,PUT或DELETE应该是幂等的,这意味着您可以一次又一次地重复这些操作,但是最终结果应该是相同的。虽然HTTP定义了这四种方法,但是HTML只支持两种方法:GET和POST。幸运的是,有两种可能的解决方案:要么使用JavaScript进行PUT或DELETE,要么使用“real”方法作为附加参数(将其建模为HTML表单中的隐藏输入字段)。后一种技巧是Spring的HiddenHttpMethodFilter所做的。这个过滤器是一个普通的Servlet过滤器,因此它可以与任何web框架(不仅仅是Spring MVC)结合使用。只需将这个过滤器添加到您的web中。xml,以及带有隐藏方法参数的POST将被转换成相应的HTTP方法请求。复制代码

Spiring Web MVC 中提供了八种请求方式,但是常用的是官方推荐的四种,分别是

  • GET 查询操作
  • POST 添加操作
  • PUT 修改操作
  • DELETE 删除操作

3.配置测试过程

  • (1) 测试代码如下

    package com.hanpang.web;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.servlet.ModelAndView;@Controller//告知其是一个控制器@RequestMapping("/cms")public class Demo05Controller {	@RequestMapping(value="/user",method=RequestMethod.GET)	public ModelAndView test01() {		System.out.println("用于获取用户信息");		return null;	}	@RequestMapping(value="/user",method=RequestMethod.POST)	public ModelAndView test02() {		System.out.println("用于添加用户信息");		return null;	}	@RequestMapping(value="/user",method=RequestMethod.PUT)	public ModelAndView test03() {		System.out.println("用于修改用户信息");		return null;	}	@RequestMapping(value="/user",method=RequestMethod.DELETE)	public ModelAndView test04() {		System.out.println("用于删除用户信息");		return null;	}}复制代码
  • (2) 配置HiddenHttpMethodFilter过滤器

    注解配置:

    package com.hanpang.config;import javax.servlet.Filter;import org.springframework.web.filter.HiddenHttpMethodFilter;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {	@Override	protected Class
    [] getRootConfigClasses() { return new Class[] {WebConfig.class}; } @Override protected Class
    [] getServletConfigClasses() { return null; } @Override protected String[] getServletMappings() { return new String[] {
    "/"}; } //看这里重写方法,新增过滤器 @Override protected Filter[] getServletFilters() { HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter(); return new Filter[] {hiddenHttpMethodFilter}; }}复制代码

    XML配置:

    httpMethodFilter
    org.springframework.web.filter.HiddenHttpMethodFilter
    httpMethodFilter
    mvc
    mvc
    org.springframework.web.servlet.DispatcherServlet
    2
    mvc
    /
    default.jsp
    复制代码
  • (3)使用Postman测试

    POST是真正的请求方式,传递一个"_method"名的参数,赋值为PUT或者DELETE(不区分大小写),看控制台执行的方法

转载地址:http://vsuyx.baihongyu.com/

你可能感兴趣的文章
jsp页面修改后浏览器中不生效
查看>>
大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(四)高效的后台权限判断处理...
查看>>
Oracle HRMS,PeopleSoft HR,SAP HR区别
查看>>
信号量实现进程同步
查看>>
Spring4-自动装配Beans-通过构造函数参数的数据类型按属性自动装配Bean
查看>>
iPhone图标
查看>>
hdu 3308 LCIS
查看>>
Anterior and posterior commissures
查看>>
win10.64位wnmp-nginx1.14.0 + PHP 5. 6.36 + MySQL 5.5.59 环境配置搭建 结合Thinkphp3.2.3
查看>>
字符串-操作
查看>>
如何查看python selenium的api
查看>>
Python_Mix*random模块,time模块,sys模块,os模块
查看>>
iframe刷新问题
查看>>
数据解码互联网行业职位
查看>>
我所见的讲的最容易理解,逻辑最强的五层网络模型,来自大神阮一峰
查看>>
vue-cli项目打包需要修改的路径问题
查看>>
js实现复选框的操作-------Day41
查看>>
数据结构化与保存
查看>>
[SpringBoot] - 配置文件的多种形式及优先级
查看>>
chrome浏览器开发者工具之同步修改至本地
查看>>