目录
SpringMVC一些常用注解
@RequestMapping
@RequestParam
@RequestBody
@PathVariable
@RequestHeader
@CookieValue
@SessionAttributes、@SessionAttribute
@ModelAttribute
@ResponseBody
注解:@RequestMapping
属性:value:和path属性作用是一样的,而且只有这一个属性且只有一个值的时候可以省略
method:用于指定方法的具体的请求方式,请求方式不同则不执行方法
headers:用于指定限制请求消息头的条件
params:指定限制请求参数的条件
|-params = {"username"} 要求必须传入一个username的参数
|-params = {"username=kris"} 要求必须传入一个username的参数,且username的值为kris
|-params = {"money!100"} 要求请求的money参数不能为100
以上四个属性只要出现2个或以上时,它们的关系是与的关系
package com.bran.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping(path = "/test")
public class RequestMappingController {
//@RequestMapping("/testRequestMapping")
//@RequestMapping(path = "/testRequestMapping")
@RequestMapping(value = "/testRequestMapping",method = {RequestMethod.GET})//要求必须用GET方式请求
public String testRequestMapping(){
System.out.println("测试RequestMapping");
return "success";
}
@RequestMapping(value = "/testRequestMapping2",params = {"username"} )//要求必须传入一个username的参数
public String testRequestMapping2(){
System.out.println("测试RequestMapping2");
return "success";
}
}
注解:@RequestParam
作用:把请求中指定名称的参数给控制器中的形式参数赋值
属性:value:请求参数的名称
name:和value一样
required:请求参数中是否提供此参数。默认值:true。表示必须提供,不提供会出错
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name = "name") String username) {
System.out.println(username);
return "success";
}
注解:@RequestBody
作用:用于获取请求体的内容。直接使用得到是key=value&key=value...结构的数据。
GET请求方式不适用(没有请求体)
属性:required:是否必须有请求体。默认值为true。
当取值为true时,GET请求方式会报错。
当取值为false时,GET请求得到的是null。
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println(body);
return "success";
}
注解:@PathVariable
作用:用于绑定URL中的占位符,例如:请求URL中的/delete/{id},这个{id}就是URL占位符。
URL支持占位符是Spring3.0之后加入的。是SpringMVC支持REST风格URL的一个重要标志。
属性:value:用于指定URL中占位符名称
required:是否必须提供占位符。
@RequestMapping("/testPathVariable/{sid}")
public String testPathVaribale(@PathVariable(name = "sid")String id){
System.out.println(id);
return "success";
}
注解:@RequestHeader
作用:用于获取请求消息头
属性:value:提供消息头名称
required:是否必须有此消息头
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String header){
System.out.println(header);
return "success";
}
注解:@CookieValue
作用:用于把指定的cookie名称的值传入控制器方法参数
属性:value:指定cookie的名称
required:是否必须有此cookie
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookie){
System.out.println("JSESSIONID = "+cookie);
return "success";
}
注解:@SessionAttributes
作用:用于多次执行控制器方法间的参数共享
属性:value:用于指定存入属性名称
type:用于指定存入数据类型
注解:@SessionAttribute
作用:获取预先存在的全局会话属性
属性:value:要获取的属性的名称
name:和value属性一样
required:是否必须有该属性
package com.bran.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
/**
* 常用注解练习
*/
@Controller
@RequestMapping("/anno")
@SessionAttributes(value={"message"}) //model的属性message会被存到session中
public class AnnotationController {
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Model model){
model.addAttribute("message","大家好啊");
return "message";
}
@RequestMapping("/testSessionAttribute")
public String testSessionAttribute(@SessionAttribute("message") String message){
System.out.println(message);
return "message";
}
}
注解:@ModelAttribute
作用:可以用于修饰方法和参数。
出现在方法上,表示当前所在类的方法会在控制器的方法执行之前先执行, 可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值
属性:value:用于获取数据的key,key可以是POJO的属性名称,也可以是map结构的key
运用场景:当表单提交数据不是完整的实体类数据时,保证没有提交数据字段使用数据库对象原来的数据
注意:被@ModelAttribute注释的方法会在当前的Controller每个方法执行前被执行,因此对于一个Controller映射多个URL的用法来说,要谨慎使用。
新建一个实体类Book
package com.bran.domain;
import lombok.Data;
import java.util.Date;
@Data
public class Book {
private String name;
private String author;
private Date date;
}
接着新建一个Controller,用来接收前端表单传来的两个数据name和author,没有传入date数据,传入的实体类型数据不是完整的
package com.bran.controller;
import com.bran.domain.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.Map;
@Controller
@RequestMapping("/anno2")
public class Annotation2Controller {
/**
* 表单提交数据不是完整的实体数据时,无返回值的处理步骤
*/
@RequestMapping("/testModelAttribute")
public String ModelAttribute(@ModelAttribute(value = "book") Book book) {
System.out.println(book);
return "success";
}
/**
* 该方法会先执行,无返回值
*/
@ModelAttribute
public void showBook(String name, String author, Map map) {
Book book = new Book();
book.setName(name);
book.setAuthor(author);
book.setDate(new Date());
System.out.println("showBook执行了");
map.put("book", book);
}
}
package com.bran.controller;
import com.bran.domain.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.Map;
/**
* 常用注解练习2
*/
@Controller
@RequestMapping("/anno2")
public class Annotation2Controller {
/**
* 表单提交数据不是完整的实体数据时,有返回值的处理步骤
*
*/
@RequestMapping("/testModelAttribute")
public String ModelAttribute(Book book){
System.out.println(book);
return "success";
}
/**
* 该方法会先执行,有返回值
*/
@ModelAttribute
public Book showBook(String name,String author){
//模拟用户查询数据库
Book book = new Book();
book.setName(name);
book.setAuthor(author);
book.setDate(new Date());
System.out.println("showBook执行了");
return book;
}
}
注解:@ResponseBody
作用:把返回的对象转换成指定格式的数据(json、xml)响应给客户端
@ResponseBody
@RequestMapping("/testJson")
public User testJson(@RequestBody User user){
System.out.println("testJson方法执行了");
//客户端发送ajax请求,传的是json字符串,后端把json字符串封装到user对象
System.out.println(user);
//做响应,模拟数据库操作
user.setAge(12);
user.setUname("管理员");
return user;
}