1.@RequestMapping
一个请求到达 dispatchServlet 之后,dispatchServlet 将根据 RequestMapping 来查找谁来处理这个请求,具体查找过程由 HandlerMapping 和 HandlerAdapter 来实现。
@RequestMapping(method = RequestMethod.GET,value = "/hello", produces = "text/html;charset=UTF-8")
public ModelAndView hello() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message","hello world");
modelAndView.setViewName("welcome");
return modelAndView;
}
2.@GetMapping
Spring4.x新增的 GET 请求映射注解,与 @RequestMapping(method = RequestMethod.GET) 作用相同。
3.@PostMapping
Spring4.x新增的 POST 请求映射注解,与 @RequestMapping(method = RequestMethod.POST) 作用相同。
4.@RequestParam
获取请求路径的参数及表单中的参数。
如何实现?由Spring中的HttpMessageConverter<T>接口来实现,它负责将一个请求信息转换成为一个对象(类型为T),将对象(类型为T)输出为响应信息。
何时调用?我们知道一个请求到达dispatchServlet之后,会由HandlerMapping和HandlerAdapter来查找合适的请求处理器,RequestMappingHandlerAdapter即为HandlerAdapter组件的默认实现类,HttpMessageConverter就是被RequestMappingHandlerAdapter调用的。
@RequestMapping("/test")
public String test(@RequestParam String a, Model model) {
model.addAttribute("a",a);
return "test";
}
5.@ResponseBody
响应时不使用视图进行响应,而是使用方法的返回类型作为响应。
如何实现?还是由Spring中的HttpMessageConverter<T>接口来实现。
何时调用,即将响应时选择合适的HttpMessageConverter实现类进行调用,以产生合适的响应信息。
@ResponseBody
@RequestMapping(path = "/getjson", produces = "application/json;charset=UTF-8")
public String responseJson() {
User user = new User();
user.setUsername("goudan");
user.setPassword("123123");
String json = JSON.toJSONString(user);
System.out.println(json);
//返回JSON需在xxx-servlet.xml中开启<mvc:annotation-driven/>
return json;
}
6.@PathVariable
获取请求路径中的参数。
@RequestMapping("/test")
public String test(@PathVariable String a, Model model) {
model.addAttribute("a",a);
return "test";
}
7.@ModelAttribute
两种用法。
- 写在方法前。在响应的Handler处理请求之前,将某个对象装入某个model中。作用是什么?在同一个控制器中,常用来填充一些model所需的公共的属性,比如下拉菜单的元素以及表单的属性。
- 写在方法参数中。在某个Handler被调用之前该请求信息的某个信息提前装入到model中。
两种用法乍一看作用都相同,主要的区别就在于写在方法前是对整个控制器的每个Handler都生效,写在方法入参只针对这个Handler生效。
@Controller
public class TestController {
@AutoWired
private FoodService foodService;
@ModelAttribute("foodList")
public List<Food> getFoodList() {
return foodService.getFoodList();
}
@GetMapping("/userlogin")
public String userLogin(@ModelAttribute("user") User user) {
return "user/userlogin";
}
}
8.SessionAttributes
两种用法
- 写在类前。写在一个控制器前时,该控制器内部的任何一个方法只要将该注解对应的属性装入至model中时,会自动将该属性同步到session中。
- 写在方法入参中。写成这种形式的目的是从session中取出想要的属性。
@Controller
@SessionAttributes("user")
//可以指定多值
//@SessionAttributes(value={"user1","user2"})
public class Test {
@GetMapping("/testsession")
public String testSession(Model model) {
User user = new User("Jetty","111");
//发现user属性被装入的model中,立即将user对象同步至session中
model.addAttribute("user",user);
return "test/session";
}
@GetMapping("/getsession")
//取出session中的user属性
public String getSession(@SessionAttribute("user") User user) {
System.out.println(user);
return "test/session";
}
}
9.@DateTimeFormat @NumberFormat
SpringMVC不仅能将请求数据转换为一个对象,还可以根据pojo中包含上述两个注解的属性完成数据的格式化。
public class User {
//省略诸多属性
//将请求参数中的String类型自动转换为Date类型
//需导入joda-time包
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date loginTime;
//将请求参数中的String类型自动转换为long类型
@NumberFormat(pattern = "#,###.##")
private long salary;
}
数据校验@Valid
SpringMVC可以对请求传过来的参数进行校验,JSR-303(或更高)是Java为Bean数据合法性校验提供的框架,Spring本身没有提供JSR-303的实现,需要依赖第三方的JSR-303的实现(如Hibernate Validator).
依赖的包
//pojo类
public class User {
//正则表达式验证,message为校验失败的自定义信息
@Pattern(regexp = "w{4,30}",message = "用户名必须为4-30个字符")
private String username;
@Pattern(regexp = "w{3,16}",message = "密码长度为3-16个字符")
private String password;
@Min(value = 8,message = "年龄介于8-100之间")
@Max(value = 100)
private int age;
//getter and setter...
}
//controller类
@GetMapping("/tag/register")
public String register(Model model) {
User user = new User();
model.addAttribute("user",user);
return "tag/register";
}
@PostMapping("/tag/register")
public String afterRegister(@Valid @ModelAttribute("user") User user, BindingResult bindingResult) {
//数据校验失败
if(bindingResult.hasErrors()) {
return "tag/register";
}
return "tag/registersuc";
}
//jsp
//添加两个标签
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<form:form ModelAttribute="user">
<spring:bind path="username">
//如果该属性校验失败,添加has-error的class属性
<div class="form-group ${status.error ? "has-error" : ""}">
<label for="">用户名: </label>
//校验规则在这里显示
<form:errors path="username" cssClass="text-danger" />
<form:input path="username" cssClass="form-control"/>
</div>
</spring:bind>
<spring:bind path="password">
<div class="form-group ${status.error ? "has-error" : ""}">
<label for="">密码: </label>
//校验规则在这里显示
<form:errors path="password" cssClass="text-danger" />
<form:password path="password" cssClass="form-control"/>
</div>
</spring:bind>
</form:form>