SpringMVC学习笔记---SpringMapping修饰类

在这里插入图片描述

  1. @RequestMapping除了可以修饰方法,还可以修饰类.
  • 类定义处:提供初步的请求映射信息,相对于web应用的根目录

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

  • 示例:使用@RequestMapping修饰类

package mao.shu.springmvc.action;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@RequestMapping("/hello")
@Controller
public class HelloWorld {
    
    @RequestMapping("/HelloWorld")
    public String execute(){
        System.out.println("Hello World");
        return "success";
    }
}

项目跟路径/类映射路径/方法映射路径

RequestMapping请求方式

  • 网页有不同的请求方法,其中常用的为:get和post两种请求

在这里插入图片描述

使用@RequestMapping映射请求方法

在这里插入图片描述

示例:

    @RequestMapping(value="/HelloWorld",method = RequestMethod.POST)
    public String execute(){
        System.out.println("Hello World");
        return "success";
    }
  • 在jsp页面中使用表单的方式请求该方法
<form method="post" action="hello">
  <input type="submit" value="提交"/>
</form>

在这里插入图片描述

在这里插入图片描述

请求参数和请求头

在"@RequestMapping"注解中使用params参数来描述请求中提交参数的控制,使用headers描述请求头的控制

在这里插入图片描述

  • 示例:
//请求必须包含uname和password两个参数
 //并且uname参数值必须是"admin"
 //age参数值必须是"123"
 //请求头中,Accept-Language 参数必须为 zh-CN
 @RequestMapping(value = "/testParamsAndHeaders",
         params = {"uname=admin", "age=22"},
         headers ="Accept-Language=zh-CN")
 public String testParamsAndHeaders() {
     return "success";
 }

Ant路径

  • Ant 风格资源地址支持 3 种匹配符:
  1. ?:匹配文件名中的一个字
  2. *:匹配文件名中的任意字符
  3. **:** 匹配多层路径

@RequestMapping 支持 Ant 风格的 URL:

  • /user/*/createUser: 匹配

    • /user/aaa/createUser
    • /user/bbb/createUser 等 URL
  • /user/**/createUser: 匹配

    • /user/createUser
    • /user/aaa/bbb/createUser 等 URL
  • /user/createUser??: 匹配

    • /user/createUseraa
    • /user/createUserbb 等 URL
  • 示例:

    @RequestMapping(value = "/testAntPath/**/abc")
    public String testAntPath() {
        return "success";
    }

PathVariable注解

在这里插入图片描述

  • 示例:
    //在映射路径中设置一个占位符"{var}"
    //在方法参数中接收这个占位符作为方法的参数值
    @RequestMapping(value = "/testPathVariable/{var}")
    public String testPathVariable(@PathVariable("var") String var) {
        System.out.println("testPathVariable - var =  "+var);
        return "success";
    }

在这里插入图片描述

HiddenHttpMethodFilter过滤器

  • 什么是REST?

在这里插入图片描述

  • html的基本表单<form>只支持"post"和"get"请求,而不支持"DELETE"和"put"请求,如果想要执行"Delete"和"put"请求可以利用SpringMVC框架中的"HiddenHttpMethodFilter"过滤器进行转换
  • 观察HiddenHttpMenthodFilter类中的处理源码
  • 在HiddenHttpMethodFilter类中从post请求中区分出"DELETE"和"Put"请求,区分的标识符是"_method".
  • 所以如果要进行"DELTE"或"Put"请求,则也需要由post请求转换,但是需要提交一个"_method"参数来区分.

在这里插入图片描述
在这里插入图片描述

配置HiddenHttpMethodFilter过滤器

  • 可以在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(value="/testDelete/{id}",method=RequestMethod.PUT)
    public String testPut(@PathVariable("id") Integer id){
        System.out.println("testPut请求处理 请求参数 id=" +id);
        return "success";
    }

    @RequestMapping(value="/testDelete/{id}",method=RequestMethod.DELETE)
    public String testDelete(@PathVariable("id") Integer id){
        System.out.println("testDelete请求处理 请求参数 id=" +id);
        return "success";
    }

    @RequestMapping(value="/testPost")
    public String testPost(){
        System.out.println("post请求");
        return "success";
    }

    @RequestMapping(value="/testGet/{id}",method=RequestMethod.GET)
    public String testGet(@PathVariable("id") Integer id){
        System.out.println("get请求处理 请求参数 id=" +id);
        return "success";
    }
  • 定义测试页面,创建四个表单,使用<input type=hidden> 标签来区分请求
<%--
  Created by IntelliJ IDEA.
  User: Xiemaoshu
  Date: 2019/3/6
  Time: 22:59
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
        <form method="post" action="testPut/">
            <input type="submit" value="提交"/>
            <%--使用隐藏域 提交"_method" 参数,表示delete请求--%>
            <input type="hidden" value="PUT" name="_method"/>

            <input type="hidden" value="1" name="id"/>
        </form>

        <br>
        <br>
        <form method="post" action="testDelete/">
            <input type="submit" value="提交"/>
            <%--使用隐藏域 提交"_method" 参数,表示delete请求--%>
            <input type="hidden" value="DELETE" name="_method"/>

            <input type="hidden" value="1" name="id"/>
        </form>

        <br>
        <br>

        <form method="post" action="testPost">
            <input type="submit" value="提交"/>
            <input type="hidden" value="1" name="id"/>
        </form>

        <br>
        <br>
        

        <a href="/testGet/1">testGet</a>
</body>
</html>

  • 依次测试之后,后台输出
  • 成功输出则表示配置成功.

在这里插入图片描述

  • 如果Tomcat的版本为8或以上,可能jsp页面中会出现错误,表示jsp页面无法处理除了get和post或者head请求之外的请求,但是后台可以正常输出.

在这里插入图片描述

  • 这是因为,HiddenMethodFilter将请求转换为了"delete"和"put"但是在返回的时候,没有将方法转换为"get"或 post",而jsp页面无法接收除了get或post之外的请求,所以出现了错误,

  • 解决思路有:

    1. 降低tomcat的版本
    2. 先跳转到其他页面,然后再跳转到jsp页面
    3. 在跳转的jsp页面头上 添加"isErrorPage"属性,属性值设置为"true"(感觉不是很好,不建议这样使用)
    4. 请求的方法上添加"@ResponseBody" 注解,表示该方法返回的是回应信息,于是会直接返回字符串不会跳转到指定的jsp页面(这种方式已经偏离了业务需求,也不建议这样使用)
  • 我也还未想到更好的方法,如果有哪位大侠有更好的办法,请告诉我,感谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值