SpringMVC 注解相关

来源:互联网 发布:msde和sql 编辑:程序博客网 时间:2024/05/18 01:36

@Controller注解

使用@Controller注解的类可以不需要集成特定的父类或者接口。 该注解标注的类就是一个SpringMVC Controller对象。为了让Spring能够自动找到控制器类,需要使用<context:component-scan../>元素,该元素指定一个包,这样Spring会自动扫描该包下的所有带有Spring注解的累,将其作为SpringBean。当然也要加上下面的元素:

    <!-- 配置annotation类型的处理映射器 -->    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>    <!-- 配置annotation类型的处理映射器适配器 -->    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

@RequestMapping注解

@Controller注解可以指定了Controller,但是并不能指定哪个方法处理请求。@RequestMapping注解指示Spring用哪个类的哪一个方法处理请求动作。该注解可以用于类、方法。

@Controller@RequestMapping(value = "/user")public class UserController {    private static final Log logger = LogFactory.getLog(UserController.class);    //该方法的请求为 http://localhost:8080/user/register GET请求    @RequestMapping(value = "/register", method = RequestMethod.GET)    public String registerForm() {        logger.info("   register GET 方法被调用");        return "registerForm";    }}
  • 用于类的@RequestMapping(value = "/user")注解表示该要访问该类下的路由都需要加上/user;
  • 用于方法registerForm的注解@RequestMapping(value = "/register", method = RequestMethod.GET)指定该方法处理http://localhost/user/register请求,同时该方法只能处理GET请求。
  • @RequestMapping默认属性是value

@RequestMapping注解的部分属性

属性 类型 是否必须 说明 value String[] 否 指定请求的地址映射到方法 name String 否 给映射地址一个别名 method RequestMethod[] 否 指定请求的方法类型 consumes String[] 否 指定处理请求的提交内容类型(Content-Type) produces String[] 否 指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中包含的类型 params String[] 否 指定request中必须包含某些参数时,才让该方法处理请求 headers String[] 否 指定request中必须包含某些指定header值,才能让该方法处理请求

@RequestParam注解

属性 类型 是否必须 说明 name String 否 指定请求头绑定的名称 value String 否 name属性的别名 required boolean 否 指定参数是否需要绑定 defaultValue String 否 指定默认值
    @RequestMapping(value = "/register", method = RequestMethod.POST)    public String register(            @RequestParam("loginname") String loginname,            @RequestParam("password") String password,            @RequestParam("username") String username) {        //...    }
  • @RequestParam("loginname") String loginname将请求中的loginname对应的值赋给loginname参数。

@PathVariable注解

@PathVariable注解只有一个value属性,表示请求中绑定到参数的值的名称。

    @RequestMapping(value = "/pathVariableTest/{userId}")    public void pathVariableTest(@PathVariable(value = "userId") Integer userId) {        //...    }
  • @RequestMapping(value = "/pathVariableTest/{userId}")这是一个动态的请求,{userId}对于不同的请求有不同的值,@PathVariable(value = "userId") Integer userId这里指定请求中的userId会赋值到参数userId中。

@RequestHeader注解

该注解用于将请求的头信息数据映射到参数上。

    @RequestMapping(value = "/requestHeaderTest")    public void requestHeaderTest(            @RequestHeader("User-Agent") String userAgent,            @RequestHeader(value = "Accept") String[] accepts) {        //...    }
  • @RequestHeader("User-Agent") String userAgent将请求头的User-Agent信息注入到userAgent参数中。

@CookieValue注解

该注解将请求的Cookie数据映射到参数中。

    public void cookieValueTest(            @CookieValue(value = "JSESSIONID", defaultValue = "") String sessionId) {        logger.info("通过@CookieValue获得数据: " + sessionId);    }
  • @CookieValue(value = "JSESSIONID", defaultValue = "") String sessionId)Cookie中的JSESSIONID值设置到sessionId参数中。

@SessionAttribute注解

该注解可以选择Model中哪些属性存入到HttpSession中。

@Controller@RequestMapping(value = "session")//将Model中的属性名为user的属性放入HttpSession对象当中@SessionAttributes("user")public class SessionAttributesController {    @RequestMapping(value = "/login")    public String login(            @RequestParam("loginname") String loginname,            @RequestParam("password") String password,            Model model    ) {        User user = new User();        user.setLoginname(loginname);        user.setPassword(password);        user.setUsername("admin");        model.addAttribute("user", user);        return "welcome";    }}
  • @SessionAttributes("user")指定将Model中属性为user的内容存到HttpSession中。

@ModelAttribute注解

被该注解注释的方法会在Controller每个方法执行前被执行。

1.第一种情况 ModelAttribute(value=”“)修饰返回具体类型的方法

ModelAttribute(value=”xx”),修饰的方法返回的值会被添加到Model中,键为ModelAttribute(value="")xx,值为方法返回的值。
控制器:

@Controller@RequestMapping(value = "/model")public class ModelAttributeController {    @ModelAttribute(value = "loginname")    public String userModel1(            @RequestParam("loginname") String name) {        return name;    }    @RequestMapping(value = "/login1")    public String login1() {        return "result1";    }}

表单

    <form action="/model/login1" method="post">        <table>            <tr>                <td><label>登录名: </label></td>                <td><input type="text" name="loginname"></td>            </tr>            <tr>                <td><input type="submit" value="登录"></td>            </tr>        </table>    </form>

表单点击登录后,调用ModelAttributeController控制器的login1方法,在调用该方法前会先调用userModel1方法,该方法的返回值会被添加到Model中,对应的键为loginname在视图中可以通过EL表达式获取。

第二种情况 ModelAttribute注释void方法

控制器:

@Controller@RequestMapping(value = "/model2")public class ModelAttribute2Controller {    @ModelAttribute    public void userModel2(            @RequestParam("loginname") String loginname,            @RequestParam("password") String password,            Model model) {        model.addAttribute("loginname", loginname);        model.addAttribute("password", password);    }    @RequestMapping(value = "/login2")    public String login2() {        return "result2";    }}
  • ModelAttribute修饰没有返回值的方法,这时候如果要将数据添加到Model中,就需要在参数中添加Model参数。同样当访问.../login2路由时,userModel2方法会先于login2方法调用,将URL参数添加到Model中。最后在视图中通过EL表达式获取数据。

对应的视图是一个登录表单,不在给出。

第三种情况 ModelAttribute注释返回具体类的方法

控制器:

@Controller@RequestMapping("/model3")public class ModelAttribute3Controller {    //...    @ModelAttribute    public User userModel3(            @RequestParam("loginname") String loginname,            @RequestParam("password") String password    ) {        return find(loginname, password);    }    //...}
  • @ModelAttribute修饰在返回类的方法上,这里返回的是User类,那么Model中添加键为user,值为返回对象。

第四种情况 @ModelAttritube和@RequestMapping同时修饰一个方法

控制器:

@Controller@RequestMapping(value = "/model4")public class ModelAttribute4Controller {    @RequestMapping(value = "/login4")    @ModelAttribute(value = "username")    public String login4() {        return "admin";    }}
  • 此时请求的视图是/login4。并且Model键为username,值为返回的admin

第五种情况 @ModelAttribute注释一个方法的参数

控制器:

@Controller@RequestMapping(value = "/model5")public class ModelAttribute5Controller {    @ModelAttribute(value = "user")    public User userModel5(            @RequestParam(value = "loginname") String loginname,            @RequestParam(value = "password") String password    ) {        User user = new User();        user.setLoginname(loginname);        user.setPassword(password);        return user;    }    @RequestMapping(value = "/login5")    public String login5(@ModelAttribute("user") User user) {        user.setUsername("管理员");        return "result5";    }}
  • @ModelAttribute(value = "user")先修饰了一个方法,指定该方法返回的值插入到Model中,键为user
  • @ModelAttribute("user") User user修饰了参数,表示login5方法的参数user使用Model中键为user的值。
0 0
原创粉丝点击