@RestController
可以用来实现 REST API,是一个结合@Controller和@ResponseBody注解
@RestController
public class GreetingController {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
@ModelAttribute
1、注解在方法上,controller类的所以handler方法都起作用。提交数据到model中,然后在视图中使用。这个注解是执行在@RequestMapping之前。
@Controller @RequestMapping(value = "/model") public class ModelController { // @ModelAttribute // public User getUser(){ // return new User("2", "jack", 23); // } @ModelAttribute public void getUser(Model model){ model.addAttribute("user", new User("2", "jack", 23)); } @RequestMapping(value = "/user") public String user(){ return "model"; } @RequestMapping(value = "/student") public String student(){ return "model"; } }
如果@ModelAttribute和@RequestMapping同时使用,handler方法返回的数据就不是视图逻辑名,而是添加到model的数据。返回的视图是SpringMVC视图约定决定的。
下面这个例子返回的视图是/model/user
@RequestMapping(value = "/user")
@ModelAttribute
public User user(){
return new User("2", "jack", 23);
}
还不知道视图配置,在beans中添加
<!--视图对应关系配置-->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
在jsp中引用model数据,用EL表达式引用, 注意一定要加这句<%@page isELIgnored="false" %>,否则EL表达式无效
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isELIgnored="false" %>
<html>
<head>
<title>model例子</title>
</head>
<body>
<p>${user.id}</p>
<p>${user.name}</p>
<p>${user.age}</p>
</body>
</html>
2、在参数上使用。
@RequestMapping(value = "/setUser")
public String user(@ModelAttribute User user){
System.out.println(user.id+","+user.name+","+user.age);
return "user";
}
1、user参数会从model检索,如果model不存在,先初始化添加到model中。2、user中字段会填充匹配其名称的请求参数3、可以从模板和类型转换器获取4、使用默认构造初始化
@RequestMapping(value = "/user/{id}")
public String setUserId(@ModelAttribute User user){
user.name = "devin";
user.age = 12;
return "user";
}
绑定数据是,可能发现错误,我们可以BindingResult来接受错误信息
@RequestMapping(value = "/user/bind")
public String user(@ModelAttribute User user, BindingResult result){
if (result.hasErrors()) {
return "error";
}
System.out.println(user.id+","+user.name+","+user.age);
return "user";
}
@SessionAttribute
同步属性到session中@Controller
@RequestMapping(value = "name")
@SessionAttributes(value = "user", types = User.class)
public class AttributeController {
@RequestMapping("/session")
@ResponseBody
public String hello(@RequestParam String name){
return String.format("hello %s", name);
}
}
@RequestAttribute
访问request attribute中的属性值,例如:其他请求传过来的值
@CookieValue
访问Cookie属性值
@RequestHeader
访问请求中header信息
@ControllerAdvice
增强控制器,可以统一配置控制器的一些共同方法。例如:
@ExceptionHandler
、
@InitBinder
, 和
@ModelAttribute
@ControllerAdvice(basePackages = "com.java.web.controller")
public class AdviceCotroller {
}
注解中字段:配置应用到那些控制器,可以指定类名,包名等
@InitBinder
从请求中提取字符串,转换成handler方法对应参数的类型。我们通过WebDataBinder来自定义这个转换过程。
自定义转换类,继承PropertyEditorSupport类,实现getAsText和setAsText方法。setAsText方法复杂把字符串转换成需要的类型,getAsText方法把对象转换成字符串用户显示在视图中。
public class UserEditor extends PropertyEditorSupport {
@Override
public String getAsText() {
User user = (User) getValue();
return user.getId();
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
User user = new User(text, "掌上", 23);
setValue(user);
}
}
在Controller中通过@InitBinder配置转换器,它注解的方法返回为void,参数有个WebDataBinder对象
@InitBinder
public void initBinder(WebDataBinder binder){
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyyMMdd"), false));
binder.registerCustomEditor(User.class, new UserEditor());
}
public class DataBindingController {
@RequestMapping(value = "/date/{date}")
@ResponseBody
public String getUserById(@PathVariable("date") Date date){
return date.toString();
}
@RequestMapping(value = "/user/{id}", produces = "application/json; charset=utf-8")
@ResponseBody
public String getUserById(@PathVariable("id") User user){
return user.toString();
}
@InitBinder
public void initBinder(WebDataBinder binder){
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyyMMdd"), false));
binder.registerCustomEditor(User.class, new UserEditor());
}
}
源代码https://github.com/duansiman/SpringMVC