2、SpringMVC常用注解

@RequestMapping

/**
 * 控制器类
 */
@Controller
@RequestMapping("/user")//作用在类上:相当于一级访问目录
public class UserController {
    /**
     * value: 和path属性作用一样,指定通过什么样的请求才能方法该方法
     * method: 方法的请求方式必须是get请求
     * params: 指定访问该方法的请求必须携带username属性,属性值必须为xiaoming的参数才可访问
     * headers:指定请求同必须为Accept的才可以访问
     * @return
     */
    //RequestMapping作用于方法上相当于二级访问目录
    @RequestMapping(path={"/hello"}, method ={RequestMethod.GET}, params = {"username=xiaoming"}, headers = {"Accept"})
    public String hello(){
        return "success";
    }
}

以下的请求符合映射条件
@Params并没有指定age参数是必须的,所以符合映射条件

<a href="user/hello?username=xiaoming&age=18">点击</a>

path和value的作用一样

@AliasFor("path")
String[] value() default {};

@AliasFor("value")
String[] path() default {};  

method属性请求方式

public enum RequestMethod {
    GET,
    HEAD,
    POST,
    PUT,
    PATCH,
    DELETE,
    OPTIONS,
    TRACE;

    private RequestMethod() {
    }
}

@RequestParam

解决参数名不一致而导致不能封装问题

请求

<a href="user/requestParam?username=哈罗">提交</a>

Controller

@RequestMapping("/requestParam")
public String useRequestParam(@RequestParam("username")String name){
    System.out.println(name);
    return "success";
}

@RequestBody

用于获取请求体内容,get请求不适用
用于参数列表中的参数,form表单提交后,将所有携带的参数赋值给该参数,参数类型为String

form表单

<form action="user/requestBody" method="post">
姓名:<input type="text" name="username"><br>
年龄:<input type="text" name="age"><br>
日期:<input type="text" name="birthday">

<input type="submit" value="提交">
</form>

Controller方法

@RequestMapping("/requestBody")
public String useRequestBody(@RequestBody String body){
    System.out.println(body);
    return "success";
}

@PathVariable

用于绑定url中的占位符{}, 如/delete/{id}
占位符和@PathVariable中的name属性值必须保持一致

请求

 <a href="user/pathVariable/{'哈罗'}">提交</a>

方法

@RequestMapping("/pathVariable/{username}")
public String usePathVariable(@PathVariable("username") String name){
    System.out.println(name);
    return "success";
}

@RequestHeader

用于获取请求消息头
作用在controller方法的参数列表中的参数上
请求

<a href="user/requestHeader">提交</a>

方法

@RequestMapping("/requestHeader")
public String useRequestHeader(@RequestHeader("Accept") String header){
    System.out.println(header);
    return "success";
}

@CookieValue

获得cookie名称的值

请求

<a href="user/cookieValue">提交</a>

方法

@RequestMapping("/cookieValue")
public String useCookieValue(@CookieValue ("JSESSIONID") String cookie){
    System.out.println(cookie);
    return "success";
}

@ModelAttribute

标注于方法上,会在Controller的方法执行前执行
请求

<a href="user/selectUser">提交</a>

方法

@RequestMapping("/selectUser")
public String selectUser(){
    System.out.println("查询方法执行");
    return "success";
}

@ModelAttribute
public void useModelAttribute(){
    System.out.println("ModelAttribute先执行。。。");

}

标注着@ModelAttribute的方法会优先执行,然后再执行请求的目标方法

标注@ModelAttribute的方法因为优先执行,可以在映射到请求方法之前进行一些预处理的操作
常用于update环境下,当被单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象那个原来的数据

第一种,有返回值的写法
请求

<form action="user/selectUser" method="post">
    姓名:<input type="text" name="username"><br>
    年龄:<input type="text" name="age"><br>
    <input type="submit" value="提交">
</form>

方法

@RequestMapping("/selectUser")
public String selectUser(User user){
    System.out.println(user);
    return "success";
}

/**
 * 传入一个name是模拟通过name值查询出该对象
 * @param name
 * @return
 */
@ModelAttribute
public User useModelAttribute(String name){
    //这里创建user对象是模拟从数据库中查找出来的数据
    User user = new User();
    user.setUsername(name);
    user.setAge(30);
    user.setBirthday(new Date());

    return user;
}

第二种,无返回值的写法
@ModelAttribute作用于参数时,代表从容器中获取对象
将查询到的对象存放于Map集合中,通过@ModelAttribute(key)获取存在Map中的对象

/**
 * 通过@ModelAttribute获取存在Map中的数据
 * @param name
 * @return
 */
@RequestMapping("/selectUser")
public String selectUser(@ModelAttribute("user") User user){
    System.out.println(user);
    return "success";
}

/**
 * 传入一个name是模拟通过name值查询出该对象
 * @param name
 * @return
 */
@ModelAttribute
public void useModelAttribute(String name, Map<String, User> userMap){
    //这里创建user对象是模拟从数据库中查找出来的数据
    User user = new User();
    user.setUsername(name);
    user.setAge(30);
    user.setBirthday(new Date());

    userMap.put("user", user);
}

@SessionAttribute注解

用于多次执行控制器方法间的参数共享

1、利用Model将对象存于request域

请求

<a href="user/request">提交</a>

方法

@RequestMapping("/request")
public String userRequest(Model model){
    model.addAttribute("user", "小白");
    return "success";
}

返回页面

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Success</title>
</head>
<body>
    ${user}
</body>
</html>

@SessionAttribute只能作用于类上

@Controller
@RequestMapping("/user")//作用在类上:相当于一级访问目录
@SessionAttributes(value = {"user"})//将user属性存放于session域中
public class UserController {
      @RequestMapping("/request")
      public String userRequest(Model model){
          model.addAttribute("user", "小白");
          return "success";
      }
}

通过${sessionScope.user}获取session域中的值

存入session域主要的作用是方法间可以共享数据
请求

<a href="user/request">提交</a>
<a href="user/session">提交</a>
<a href="user/removeSession">提交</a>

方法

/**
 * 控制器类
 */
@Controller
@RequestMapping("/user")
@SessionAttributes(value = {"user"}) //将user属性的对象存放于session域中
public class UserController {
    /**
     * 将数据存放于request域
     * @param model
     * @return
     */
    @RequestMapping("/request")
    public String userRequest(Model model){
        //model可以将该对象存放到request域中
        model.addAttribute("user", "小白");
        return "success";
    }
    //获取request域中的数据
    @RequestMapping("/session")
    public String userSession(ModelMap modelMap){
        //可以通过Model获取session域中存放的对象
        modelMap.getAttribute("user");
        return "success";
    }

    /**
     * 清除session域中的对象
     * @param status
     * @return
     */
    @RequestMapping("/removeSession")
    public String userRemoveSession(SessionStatus status){
        status.setComplete();
        return "success";
    }
}
posted @ 2020-07-25 12:07  lawrence林  阅读(109)  评论(0编辑  收藏  举报