07-Annotation

1. @RequestMapping

  1. 作用:用于建立请求URL、处理请求方法之间的对应关系
  2. 位置
    • 类上:请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录
    • 方法上:请求URL的第二级访问目录
  3. 属性
    • value:指定请求的 URL。和path属性的作用是一样的
    • method:指定请求的方式
    • params:指定限制请求参数的条件。支持简单的表达式。要求请求参数的key、value必须和配置的一模一样
    • headers:指定限制请求消息头的条件
// 1. 类、方法上皆可
@Controller
@RequestMapping("/myRequestMapping")
public class MyRequestMappingCtl {

    // 2. 路径"/"可有可无
    @RequestMapping("one")
    public String one() {
        return "second";
    }

    // 3. 多对一
    @RequestMapping(value = {"/hi", "/hello"})
    public String multi() {
        return "second";
    }

    // 4. method设置请求方式
    @RequestMapping(value = "/mtd", method = {RequestMethod.GET, RequestMethod.POST})
    public String mtd() {
        System.out.println("mtd = " + true);
        return "second";
    }

    // 5. 请求参数控制
    // @RequestMapping(value = "/params", params = {"name", "!pwd"})
    // @RequestMapping(value = "/params", params = {"name==root", "pwd!=123"})
    @RequestMapping(value = "/params", params = {"name!=root", "pwd"})
    public String params() {
        System.out.println("params = " + true);
        return "second";
    }

    // 6. 请求头控制
    @RequestMapping(value = "/headers", headers = {"Host=localhost:8080"})
    public String headers() {
        System.out.println("headers = " + true);
        return "second";
    }

    // 7. 路径参数
    @RequestMapping(value = "/pathVariable/{id}/{name}")
    public String pathVariable(@PathVariable("id") Integer id1, @PathVariable("name") String name1) {
        System.out.println("id1 = " + id1);
        System.out.println("name1 = " + name1);
        return "second";
    }

}


 



 





 





 








 






 






 







<%-- 解决中文乱码 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>RequestMapping.jsp</h2>

<hr/>

<form action="multi" method="get">
    <input type="submit" value="multi">
</form>

<hr/>

<form action="myRequestMapping/mtd" method="get">
    <input type="submit" value="/myRequestMapping/mtd">
</form>

<hr/>

<form action="myRequestMapping/params" method="get">
    <input type="text" name="name"/>
    <input type="text" name="pwd"/>
    <input type="submit" value="/myRequestMapping/params">
</form>

<hr/>

<form action="myRequestMapping/headers" method="get">
    <input type="submit" value="/myRequestMapping/headers">
</form>

<hr/>

<form action="myRequestMapping/pathVariable/10/listao" method="get">
    <input type="submit" value="@PathVariable">
</form>

</body>
</html>

















 





 







 





 





1. @GetMapping

  • 作用:指定当前单元方法的请求方式只可以是get请求
  • 属性:和@RequestMapping中属性一致

2. @PostMapping

  • 作用:指定当前单元方法的请求方式只可以是post请求
  • 属性:和@RequestMapping中属性一致

2. @RequestParam

  1. 作用:把请求中指定名称的参数给控制器中的形参赋值
  2. 属性
    • value:请求参数中的名称
    • required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错
/**
 * mvc获取参数。解耦合参数注入
 * 1. 形参名必须和实参名一致
 * 2. 不一致用`@RequestParam`获取
 * 3. 类型自动转换
 */
@RequestMapping("/mvc")
public String mvc(String name, @RequestParam("password") Integer pwd) {
    System.out.println("name = " + name);
    System.out.println("pwd = " + pwd);
    return name + ", " + pwd;
}







 




3. @PathVariable

  • 作用
    • 用于绑定url中的占位符。eg:请求 url 中/delete/{id}。 Spring3.0之后url支持占位符。是SpringMVC支持REST风格URL的一个重要标志
  • 属性
    • value:用于指定url中占位符名称
    • required:是否必须提供占位符
@RequestMapping(value = "/restFul/{id}", method = RequestMethod.GET)
public String get(@PathVariable(value = "id") Integer id) {
    System.out.println("testGET, id:" + id);
    return "get_RESTful";
}

 



4. @RequestHeader

  • 作用:用于获取请求消息头
  • 属性
    • value:提供消息头名称
    • required:是否必须有此消息头
@RequestMapping("/requestHeader")
public String requestHeader(@RequestHeader(value = "Accept", required = false) String requestHeader) {
    System.out.println("requestHeader = " + requestHeader);
    return requestHeader;
}

 



5. @RequestBody

  • 作用:用于获取请求体json字符串。get请求方式不适用
$(function () {
    $("#btn").click(function () {
        var jsonObj = {pname: "jsonObj", petName: "petName"};
        var jsonObjStr = JSON.stringify(jsonObj);

        var formData = new FormData();
        formData.append('pname', 'formData')
        formData.append('petName', 'petName')

        console.error(jsonObj)
        console.error(jsonObjStr)
        console.error(formData)

        $.ajax({
            type: "post",
            url: "requestBody",
            // data: jsonObj,
            data: jsonObjStr,

            // data: formData,
            // processData: false,
            // contentType: false,

            contentType: "application/json",
            // contentType: "application/x-www-form-urlencoded",
            // contentType: "multipart/form-data; boundary=<calculated when request is sent>",
        })

    })
})



 













 





 






@RequestMapping("/requestBody")
public String requestBody(@RequestBody Person person, Pet pet) {
    System.out.println("person = " + person);
    System.out.println("pet = " + pet);
    return person + " ------- " + pet;
}

 




6. @RestController

  • 作用:只可以类上。该类中所有单元方法均是json响应。相当于@ResponseBody + @Controller
  • 属性:和@Controller中一样

7. @JsonFormat

  • 作用:响应json数据处理
  • 属性
    • pattern:指定响应时间日期的格式
    • Timezone:指定响应时区,否则有8小时时差
// 请求日期格式化
@DateTimeFormat(pattern = "yyyy-MM-dd")
// 响应日期格式化
@JsonFormat(pattern = "yyyy-MM-dd", timezone="GMT+8")
private Date birth;



 

8. @CookieValue

  • 作用:用于把指定cookie名称的值传入控制器方法参数
  • 属性
    • value:指定cookie中的key
    • required:是否必须有此cookie
    @RequestMapping("/cookie")
    public String cookie(@CookieValue(value = "JSESSIONID", required = false) String cookieValue) {
        System.out.println(cookieValue);
        return cookieValue;
    }

 



9. @CrossOrigin

什么是跨域?

  • 同源策略(SameOriginPolicy)是一种约定,是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现
  • 同源策略会阻止一个域的 JS 脚本和另外一个域的内容进行交互
  • 所谓同源(即指在同一个域)就是两个页面具有相同
    • 协议(protocol)
    • 主机(host)
    • 端口号(port)

  • http://127.0.0.1:8080/listao/index.jsp (基础)
  • https://127.0.0.1:8080/listao/index.jsp (协议不一样)
  • http://127.0.0.2:8080/listao/index.jsp (IP不一致)
  • http://127.0.0.1:8888/listao/index.jsp (端口不一致)
  • http://localhost:8080/listao/index.jsp (IP不一致)

  • 作用:解决ajax请求之间的跨域问题
  • 属性:
    • origins:允许可访问的域列表
    • maxAge:准备响应前的缓存持续的最大时间(以秒为单位)
@CrossOrigin(origins = "http://domain.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @GetMapping("/{id}")
    public Account receive(@PathVariable Long id) {

    }

}