SpringMVC注解

@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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值