SpringMVC的注解关键词解释
SpringMVC的注解关键词解释
@Controller控制器定义
和Struts1一样,Spring的Controller是Singleton的。这就意味着会被多个请求线程共享。因此,我们将控制器设计成无状态类。
在spring 3.0中,通过@controller标注即可将class定义为一个controller类。为使spring能找到定义为controller的bean,需要在spring-context配置文件中增加如下定义:
1 <context:component-scan base-package="com.sxt.web"/>
注:实际上,使用@component,也可以起到@Controller同样的作用。
@RequestMapping
在类前面定义,则将url和类绑定。
在方法前面定义,则将url和类的方法绑定,如下所示:
package com.lhn.web; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.sxt.service.UserService; @Controller @RequestMapping("/user.do") public class UserController { @Resource private UserService userService; @RequestMapping(params="method=reg") public String reg(String uname) { System.out.println("HelloController.handleRequest()"); userService.add(uname); return "index"; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } }
@RequestParam
一般用于将指定的请求参数付给方法中形参。示例代码如下:
1 @RequestMapping(params="method=reg5") 2 3 public String reg5(@RequestParam("name")String uname,ModelMap map) { 4 5 System.out.println("HelloController.handleRequest()"); 6 7 System.out.println(uname); 8 9 return "index"; 10 11 }
这样,就会将name参数的值付给uname。当然,如果请求参数名称和形参名称保持一致,则不需要这种写法。
@SessionAttributes
将ModelMap中指定的属性放到session中。示例代码如下:
1 @Controller 2 @RequestMapping("/user.do") 3 @SessionAttributes({"u","a"}) //将ModelMap中属性名字为u、a的再放入session中。这样,request和session中都有了。 4 public class UserController { 5 6 @RequestMapping(params="method=reg4") 7 public String reg4(ModelMap map) { 8 System.out.println("HelloController.handleRequest()"); 9 10 map.addAttribute("u","uuuu"); //将u放入request作用域中,这样转发页面也可以取到这个数据。 11 12 return "index"; 13 14 } 15 }
<body> <h1>**********${requestScope.u.uname}</h1> <h1>**********${sessionScope.u.uname}</h1> </body>
注:名字为”user”的属性再结合使用注解@SessionAttributes可能会报错。
@ModelAttribute
这个注解可以跟@SessionAttributes配合在一起用。可以将ModelMap中属性的值通过该注解自动赋给指定变量。
示例代码如下:
1 package com.lhn.web; 2 3 import javax.annotation.Resource; 4 import org.springframework.stereotype.Controller; 5 import org.springframework.ui.ModelMap; 6 import org.springframework.web.bind.annotation.ModelAttribute; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.SessionAttributes; 9 10 @Controller 11 @RequestMapping("/user.do") 12 @SessionAttributes({"u","a"}) 13 public class UserController { 14 15 @RequestMapping(params="method=reg4") 17 public String reg4(ModelMap map) { 19 System.out.println("HelloController.handleRequest()"); 20 map.addAttribute("u","张三"); 21 return "index"; 22 } 23 24 @RequestMapping(params="method=reg5") 25 public String reg5(@ModelAttribute("u")String uname,ModelMap map) { 27 System.out.println("HelloController.handleRequest()"); 28 System.out.println(uname); 29 return "index"; 30 } 31 }
先调用reg4方法,再调用reg5方法。我们发现控制台打印出来:张三
@ResponseBody
@RequestMapping("/login")
public @ResponseBody User login(User user){ return user; }
User字段:userName pwd
那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'
效果等同于如下代码:
@RequestMapping("/login") public void login(User user, HttpServletResponse response){ response.getWriter.write(JSONObject.fromObject(user).toString()); }