@Controller
- 作用: 标记控制器,将控制器交给spring容器管理
- 位置: 类上方
@RequestMappering
- **作用:**给控制器方法设置请求路径
- 位置: 方法或者类上方,用于类上,表示类中的所有控制器方法都是以该地址作为父路径
- 属性:
- value/path:请求路径
- method:指定请求方式 常见的属性值有RequestMethod.GET和RequestMethod.POT
- params:规定必须发送的请求参数
- headers:规定请求必须包含的请求头
@RequestParam
- 作用: 在控制器方法中获取请求参数 该注解主要解决的是请求参数名与方法参数名不一致而而导致的无法完成自动封装的问题,使用该注解可以解决此问题.
- 位置: 方法参数前
- 属性:
- name:指定请求参数名称
- defaultValue: 为参数设置默认值
- required:设置是否是必须要传入的参数
定义请求的参数名为username,默认值为sxt,不是必须的参数*/
@RequestMapping("/annotation2")
public String annotation2(@RequestParam(name
= "username",defaultValue = "sxt",required = false) String name){
System.out.println(name);
return "baizhan";
}
@RequestHeader
- 作用:在控制器方法中获取请求头数据
- 位置:方法参数前
@CookieValue
- 作用:在控制器方法中获取Cookie数据
- 位置:方法参数前
/*
获取User-Agent请求头
获取JSESSIONID的Cookie值
*/
@RequestMapping("/annotation3")
public String annotation3(@RequestHeader("User-Agent")String userAgent,
@CookieValue("JSESSIONID")String jSessionId){
System.out.println(userAgent);
System.out.println(jSessionId);
return "baizhan";
}
@SessionAttributes
- 作用:将Model模型中的数据存到session域中
- 位置:类上方
@Controller
@RequestMapping("/c4")
// 将模型中的name数据保存到session中
@SessionAttributes("name")
public class MyController4 {
@RequestMapping("/t1")
public String t1(Model model){
// model中保存name数据
model.addAttribute("name","北京尚学堂");
return "baizhan";
}
@RequestMapping("/t2")
public String t2(HttpSession session){
// 从session中获取name数据
System.out.println(session.getAttribute("name"));
return "baizhan";
}
}
@ModelAttribute
-
- 作用1:设置指定方法在控制器其他方法前执行
- 位置:方法上方
-
- 作用2:从Model模型中获取数据给参数赋值
- 位置:方法参数前
@Controller
@RequestMapping("/c6")
public class MyController6 {
// 前置方法向Model中设置数据
@ModelAttribute
public void before(Model model){
model.addAttribute("name","尚学堂");
}
// 该参数不是从请求中获取,而是从Model中获取
@RequestMapping("/t1")
public String t1(@ModelAttribute("name") String name){
System.out.println(name);
return "baizhan";
}
}
@RESTful风格支持
@Responsebody
- 作用:方法返回的对象转换为JSON格式,并将JSON数据直接写入到输出流中,使用此注解后不会再经过视图解析器。使用该注解可以处理Ajax请求
- 位置:方法上方或方法返回值前
@RestController
如果一个控制器类下的所有控制器方法都返回JSON格式数据且不进行跳转,可以使用@RestController代替@Controller,此时每个方法上的@ResponseBody都可以省略。
静态资源映射
当在DispatcherServlet的 中配置拦截 “/” 时,除了jsp文件不会拦截以外,其他所有的请求都会经过前端控制器进行匹配。此时静态资源例如css、js、jpg等就会被前端控制器拦截,导致不能访问,出现404问题。想要正常映射静态资源共有三种方案:
-
配置静态资源筛查器
在SpringMVC的配置文件中配置<mvc:default-servlet-handler />后,会在Spring容器中创建一个资源检查器,它对进入DispatcherServlet的URL进行筛查,如果不是静态资源,才DispatcherServlet处理。
修改SpringMVC核心配置文件:
<mvc:default-servlet-handler/> -
配置静态资源映射器
- 配置默认Servlet处理静态资源
@RequestBody
- 作用:将请求中JSON格式的参数转为JAVA对象
- 位置:写在方法参数前
<%@ page
contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ajax请求</title>
<script src="/js/jquery-2.1.1.min.js"></script>
<script>
$(function (){
$("#btn").click(function(){
varname=$("#name").val();
varsex=$("#sex").val();
var param =JSON.stringify({"name":name,"sex":sex});
$.ajax({ url:"/c8/addStudent2",
contentType:"application/json",
type:"post",
data:param,
success:function(data){
console.log(data);
}
})
})
})
</script>
</head>
<body>
姓名:<input id="name"><br />
性别:<input id="sex"><br />
<input type="button" value="提交" id="btn">
</body>
</html>
控制器
@PostMapping("/addStudent2")
@ResponseBody
public Result addStudent2(@RequestBody Student student) {
System.out.println(student);
// 返回添加结果
Result result = new Result(true, "添加学生成功!");
return result;
}