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

SpringMVC学习笔记---SpringMapping修饰类_第1张图片

  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";
    }
}

  • 此时HelloWorld类处理的请求路径就是:http://localhost:8080/SpringMVCModule1/hello/HelloWorld
  • 格式为:
项目跟路径/类映射路径/方法映射路径

RequestMapping请求方式

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

SpringMVC学习笔记---SpringMapping修饰类_第2张图片

使用@RequestMapping映射请求方法

SpringMVC学习笔记---SpringMapping修饰类_第3张图片

示例:

    @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>

SpringMVC学习笔记---SpringMapping修饰类_第4张图片

SpringMVC学习笔记---SpringMapping修饰类_第5张图片

请求参数和请求头

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

SpringMVC学习笔记---SpringMapping修饰类_第6张图片

  • 示例:
//请求必须包含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注解

SpringMVC学习笔记---SpringMapping修饰类_第7张图片

  • 示例:
    //在映射路径中设置一个占位符"{var}"
    //在方法参数中接收这个占位符作为方法的参数值
    @RequestMapping(value = "/testPathVariable/{var}")
    public String testPathVariable(@PathVariable("var") String var) {
        System.out.println("testPathVariable - var =  "+var);
        return "success";
    }
  • 测试访问路径:http://localhost:8080/SpringMVCModule1/testPathVariable/empAdd?eid=1
  • 后台输出

在这里插入图片描述

HiddenHttpMethodFilter过滤器

  • 什么是REST?

SpringMVC学习笔记---SpringMapping修饰类_第8张图片

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

SpringMVC学习笔记---SpringMapping修饰类_第9张图片
SpringMVC学习笔记---SpringMapping修饰类_第10张图片

配置HiddenHttpMethodFilter过滤器

  • 可以在web.xml文件中配置HiddenHttpMethodFilter过滤器
<filter>
    <filter-name>hiddenHttpMethodFilterfilter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
filter>
<filter-mapping>
    <filter-name>hiddenHttpMethodFilterfilter-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";
    }
  • 定义测试页面,创建四个表单,使用 标签来区分请求
<%--
  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">testGeta>
body>
html>

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

SpringMVC学习笔记---SpringMapping修饰类_第11张图片

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

SpringMVC学习笔记---SpringMapping修饰类_第12张图片

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

  • 解决思路有:

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

你可能感兴趣的:(java尚硅谷学习笔记,SpringMVC学习笔记)