@RequestMappering可以作用在类上(类注解)、也可以作用在方法上(方法注解)。
@RequestMappering后面的括号中:双引号的值会赋值给value这个属性。只有一个属性且属性名为value时这个属性名可以省略不写。
@RequestMappering默认支持get/post请求,可以使用method属性来限制请求方式。
@RequestMapping(value = "/hello/t1", method = RequestMethod.GET) public String hello(){ return "hello"; }
@RequestMapping("/r1") public String r1(String name){ return "接收到参数 name:"+name; } @RequestMapping("/r2") public String r2(Integer age){ return "接收到参数 age:"+age; }
@RequestMapping("/r3") public String r3(String name,Integer age){//注意参数类型要写Integer不要写int,因为请求中没有传参数时则传的参数是null,int类型的变量不能接收null return "name:"+name+",age:"+age; }
public class UserInfo {//假设代码中定义了UserInfo类 private int id; private String name; private Integer age; public UserInfo() { } public UserInfo(int id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } ... }
@RequestMapping("/r4") public String r4(UserInfo user){ return user.toString(); }
从请求中获取name参数的值并赋值给代码中的username参数。@RequestParam注解里加required = false则表示这个注解修饰的参数可以不传(否则这个注解修饰的参数一定要传),不传时这个参数的值为null。required默认为true。
@RequestMapping("/r5") public String r5(@RequestParam(value = "name",required = false) String username, @RequestParam("age") Integer userage){ return "username:"+username+",age:"+userage; }
@RequestMapping("/r6") public String r6(String[] arr){ return Arrays.toString(arr)+",length:"+arr.length; }
默认情况下,请求中参数名相同的多个值,是封装到数组中的。如果要封装到集合,要使⽤@RequestParam绑定参数关系。
以下为绑定参数关系的同时对参数中的集合名进行重命名:
@RequestMapping("/r7") public String r7(@RequestParam(value = "list", required = false) Listlist1){ if (list1!=null){ return list1.toString()+",size:"+list1.size(); } return "list为空"; }
以下这种转换方式:拿到json字符串把这个json字符串转换为java对象的时候,会调用java对象无参的构造函数构造成一个空的对象,再对字符串进行解析对空对象的属性进行赋值。所以java对象所属的类中如果我们自己写了有参的构造方法则要把无参的构造方法加上。
public static void main(String[] args) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); UserInfo userInfo = new UserInfo(); userInfo.setName("lingliang"); userInfo.setAge(16); userInfo.setId(1); //对象转json String s = objectMapper.writeValueAsString(userInfo); System.out.println(s); //json字符串转成Java对象 UserInfo userInfo1 = objectMapper.readValue(s, UserInfo.class); System.out.println(userInfo1); }
@RequestMapping("/r8") public String r8(@RequestBody UserInfo userInfo){ return userInfo.toString(); }
@RequestMapping("/r9/{articleId}") public String r9(@PathVariable Integer articleId){ return "articleId:"+articleId; }
将url中的参数name重命名为userName:
@RequestMapping("/r10/{name}/{age}") public String r10(@PathVariable("name") String userName, @PathVariable Integer age){ return "name:"+userName+",age:"+age; }
即获取请求中的文件。@RequestPart这个注解不写也行,这个注解可以对file进行重命名。
@RequestMapping("/r11") public String r11(@RequestPart MultipartFile file) throws IOException { String fileName = file.getOriginalFilename(); file.transferTo(new File("D:/temp/"+fileName)); return "获取上传文件: "+file.getOriginalFilename(); }
@RequestMapping("/getCookie1") public String getCookie(HttpServletRequest request){ Cookie[] cookies = request.getCookies(); //Arrays.stream(cookies).forEach(x -> System.out.println(x.getName()+":"+x.getValue())); if (cookies!=null){ for (Cookie c: cookies){ System.out.println(c.getName()+":"+c.getValue()); } return "获取Cookie成功"; } return "Cookie 为空"; }
@RequestMapping("/getCookie2") public String getCookie2(@CookieValue("byte") String byte){ return "byte:" + byte; }
@RequestMapping("/setSession") public String setSession(HttpServletRequest request){ HttpSession session = request.getSession(); session.setAttribute("userName","zhangsan"); return "设置Session成功"; } @RequestMapping("/getSession1") public String getSession(HttpServletRequest request){ HttpSession session = request.getSession(); String userName = (String)session.getAttribute("userName"); return "登录用户:"+ userName; }
简洁方式1获取session:
@RequestMapping("/getSession2") public String getSession(HttpSession session){//如果后端还没有session则HttpSession session会帮我们创建一个session,只是这个session里面没有内容。这预防了空指针异常的出现。 String userName = (String)session.getAttribute("userName"); return "登录用户:" + userName; }
简洁方式2获取session:
@RequestMapping("/getSession3") public String getSession(@SessionAttribute(value = "userName", required = false) String userName){ return "登录用户:" + userName; }
@RequestMapping("/getHeader") public String getHeader(HttpServletRequest request){ String userAgent = request.getHeader("User-Agent"); return "userAgent:"+userAgent; }
这种方式想获取到全部header则参数声明要写得非常长。
@RequestMapping("/getHeader2") public String getHeader2(@RequestHeader("User-Agent") String userAgent){ return "userAgent:"+userAgent; }
(1)返回静态页面。
(2)返回数据。
(3)返回HTML片段。
(4)返回json。
(5)设置状态码、编码方式、header。
元注解(即可以注解到其它注解的注解):
1)@Target({ElementType}.TYPE):表示注解的使用范围,TYPE表示注解的使用范围是类。
2)@Retention(RetentionPolicy.RUNTIME):表示注解的生命周期。
3)@Documented。
@RestController=@Controller+@ResponseBody。
@Controller是在告诉Spring,Spring要帮我们管理哪些程序,用@Controller修饰则默认返回的是页面。
@ResponseBody表示返回数据,其既可以修饰类又可以修饰方法,修饰类表示该类内的所有方法返回的都是数据,修饰方法表示该方法返回的是数据。
@Controller //@RestController @RequestMapping("/return") public class ReturnController { @RequestMapping("/r1") public String r1(){ return "/index.html";//返回静态页面 } @ResponseBody @RequestMapping("/r2") public String r2(){ return "hello, spring";//返回数据 } @ResponseBody @RequestMapping("/r3") public String r3(){ return "我是返回的html片段
";//返回html片段 } @ResponseBody @RequestMapping("/r4") public UserInfo r4(){ UserInfo userInfo = new UserInfo(); userInfo.setId(1); userInfo.setName("lingliang"); userInfo.setAge(16); return userInfo;//返回json。当方法返回值类型为对象的时候,Spring会把响应的Content-Type自动设置为application/json。当返回的是数据,方法返回值类型为String的时候,默认情况下,Spring会把响应的Content-Type自动设置为text/html。 } @ResponseBody @RequestMapping("/r5") public Mapr5(){ HashMap map = new HashMap(); map.put("k1","v1"); map.put("k2","v2"); return map;//Spring会把响应的Content-Type自动设置为application/json。 } @RequestMapping("/r6") public String r6(){ return "/a.js";//Spring会把响应的Content-Type自动设置为application/javascript。 } @RequestMapping("/r7") public String r7(){ return "/b.css";//Spring会把响应的Content-Type自动设置为text/css。 } @ResponseBody @RequestMapping("/r8") public String r8(HttpServletResponse response){ response.setStatus(401); return "设置状态码成功";//设置状态码。状态码不影响界面的展示。 } @ResponseBody //@RequestMapping("/r9") @RequestMapping(value = "/r9", produces = "application/json; charset=utf8")//设置响应的Content-Type,因为当返回的是数据,方法返回值类型为String的时候,默认情况下,Spring会把响应的Content-Type自动设置为text/html。 public String r9(){ return "{\"OK\":1}";//返回的是一个json数据。 } @ResponseBody @RequestMapping(value = "/r10") public String r10(HttpServletResponse response){ response.setHeader("myHeader","myHeaderValue");//设置自定义的header。 return "设置header成功"; } }