Spring MVC HiddenHttpMethodFilter 实现 REST风格的URL

同样接着上一篇的来,我们首先去web.xml中配置HiddenHttpMethodFilter

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<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_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>springmvc1</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <!-- 配置org.springframework.web.filter.HiddenHttpMethodFilter:可以把POST请求转为DELETE或POST请求 -->
    <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>

    <!-- 配置  DispatcherServlet-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置DispatcherServlet的一个初始化参数:配置SprngMVC配置文件的位置和名称 -->
        <!--
            实际上也可以不通过contextConfigLocation来配置SpringMVC的配置文件,而使用
            默认的配置文件:/WEB-INF/<servlet-name>-servlet.xml
         -->
         <!--
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
         -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

index.jsp中加上以下的超链接测试用。

<form action="springmvc/testRest/1" method="post">
        <input type="hidden" name="_method" value="PUT">
        <input type="submit" value="TestRest PUT">
    </form>
    <br />
    <form action="springmvc/testRest/1" method="post">
        <input type="hidden" name="_method" value="DELETE">
        <input type="submit" value="TestRest DELETE">
    </form>
    <br />
    <form action="springmvc/testRest/1" method="post">
        <input type="submit" value="TestRest POST">
    </form>
    <br />
    <a href="springmvc/testRest/1">Test Rest Get</a>
    <br />
package com.hust.springmvc1;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

@SessionAttributes(value={"user"}, types={String.class})
@Controller
@RequestMapping("/springmvc")
public class SpringMVCTest { 

    private static final String SUCCESS = "success";

    /*
     * Rest 风格的 URL
     * 以 CRUD 为例:
     * 新增: /order POST
     * 修改: /order/1 PUT      update?id=1
     * 获取: /order/1 GET      get?id=1
     * 删除: /order/1 DELETE   delete?id=1
     *
     * 如何发送 PUT 请求和 DELETE 请求呢?
     * 1. 需要配置 HiddenHttpMethodFilter
     * 2. 需要发送POST请求
     * 3. 需要在发送POST请求时携带一个 name="_method" 的隐藏域, 值为 DELETE 或 PUT
     *
     * 在SpringMVC 的目标方法中如何得到 id 呢?
     * 使用 @PathVariable 注解
     */
    @RequestMapping(value = "/testRest/{id}", method = RequestMethod.PUT)
    public String testRestPut(@PathVariable Integer id) {
        System.out.println("testRest Put: " + 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.POST)
    public String testRest() {
        System.out.println("testRest POST ");
        return SUCCESS;
    }

    @RequestMapping(value = "/testRest/{id}", method = RequestMethod.GET)
    public String testRest(@PathVariable Integer id) {
        System.out.println("testRest GET: " + id);
        return SUCCESS;
    }
}

这样就能实现DELETE、PUT、POST、GET请求。

重复啰嗦一下。

如何发送 PUT 请求和 DELETE 请求呢?
* 1. 需要配置 HiddenHttpMethodFilter
* 2. 需要发送POST请求
* 3. 需要在发送POST请求时携带一个 name=”_method” 的隐藏域, 值为 DELETE 或 PUT

时间: 2024-10-26 14:07:07

Spring MVC HiddenHttpMethodFilter 实现 REST风格的URL的相关文章

spring MVC工作机制与设计模式总结

spring MVC的总体设计 在一个工程中如果想要使用 spring MVC的话,只需要两个步骤     在web.xml中配置一个DispatcherServlet. 需要配置一个org.springframework.web.servlet.DispatcherServlet的servlet.     再定义一个dispatcherServlet-servlet.xml配置文件. 在这个配置文件里面我们只需要扩展一个路径映射关系,定义一个视图解析器,再定义一个业务逻辑的处理流程规则. 这样

Spring MVC url提交参数和获取参数

普通URL提交参数 该格式url为:url.do?param1=mahc&param2=8888.00 需要在上文中的HelloController对象添加方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 /**      * Spring MVC URL提交参数      * @param name      * @return      */     @RequestMapping(/param)     public ModelAndView getInfo(@Request

Spring MVC 基于URL的映射规则(注解版)

好几天没有跟进Spring MVC的学习了,之前看了点源码都忘的差不多了.这次就跟着之前的问题,继续总结下Spring MVC中的小知识. 关于SpringMVC的小demo可以参考这里! url-pattern 如果看过前一篇入门的帖子,应该了解到spring mvc在启动前必须要在web.xml中配置servlet,这样才能拦截到想要映射的url地址. <servlet> <servlet-name>SpringMVC</servlet-name> <serv

spring mvc开发公众号-spring mvc开发的微信公众号怎么设置验证时的URL

问题描述 spring mvc开发的微信公众号怎么设置验证时的URL 您好. 我想咨询一下用spring mvc开发的微信公众号,在填写服务器配置时的url时应该写哪些?我的项目名是:weixinGo RequestMapping是valid.do 解决方案 就写上域名/valid.do就行,然后把你这个应用的token写上,在把剩下的填完就行了 解决方案二: http://域名/valid.do/? 这样吗?

springmvc-页面中js跳转URL,与spring mvc中返回视图重定向,先后问题

问题描述 页面中js跳转URL,与spring mvc中返回视图重定向,先后问题 页面中有javascript函数: function mySubmitFn() { /*formname是页面form表单的名字,表单提交后由spring mvc处理,返回一个重定向视图'return new ModelAndView(new RedirectView("A.jsp"));'*/ formname.submit(); //代码1 window.location.href='B.jsp';/

Spring MVC 3 项目中的URL如何导出

问题描述 项目采用Spring MVC3实现的RESTFUL风格的访问模式,我想将所有通过@RequestMapping注入的URL导出,在Spring Tools中可以全部查看到项目中的所有URL(入下图),但是没有导出功能.请问各位有没有什么好的处理方式? 解决方案 要不就自己写一个?写一个servlet继承DispatcherServlet,在初始化方法中添加代码,循环DispatcherServlet中的private List<HandlerMapping> handlerMappi

spring mvc redirect转发后的url,怎么去掉?后面一堆信息

问题描述 spring mvc redirect转发后的url,怎么去掉?后面一堆信息 例如上图中的代码,转发后的url变为了 http://localhost:8081/mobile/fund/tzyy_success.html?scripts=%2Fmobile%2Fscripts%2Fportal&res=%2Fmobile%2Fres&fundId=949e3727-11fa-4082-a2b6-6ff6cad6ec47&now=20150803+17%3A46%3A14&

spring MVC 根据URL获取Controller

问题描述 spring MVC 可以根据URL获取所有匹配的Controller吗? 如:/hello --> ***.HelloController 解决方案 AbstractUrlHandlerMappinglookupHandlerprotected Object lookupHandler(String urlPath, HttpServletRequest request) throws ExceptionLook up a handler instance for the given

Spring Mvc Url和参数名称忽略大小写

在开发过程中Spring Mvc 默认 Url和参数名称都是区分大小写的 比如:www.a.com/user/getUserInfo?userId=1  www.a.com/user/getuserInfo?userId=1     www.a.com/user/getUserInfo?userid=1             www.a.com/user/getuserinfo?userid=1  这些都认为不同的地址和参数,在实际中用户根本不区分这些,所以我们要忽略大小写 URL忽略大小写