@Controller
用于标记一个类为控制器类
Spring会扫描所有基于注解的控制器类。然后,分发处理器会扫描各个控制器类下的所有@RequestMapping方法,该方法是真正的处理器。
为了保证Spring能找到控制器,需要完成两件事:
- 在SpringMVC配置文件中引入spring-context
- 使用<context:component-scan/>元素启动包扫描功能,将带有@Controller、@Service、@repository、@Component注解的类注册为Spring的bean
@RequestMapping
用于标记类或方法,若类上使用了@RequestMapping("myBase"),则需通过http://....../myBase/methodA来访问处理器methodA
@RequestMapping注解可用的属性
-
value:
@RequestMapping(value="hello")注解的方法会处理http://......./hello的请求
若@RequestMapping只包含该属性时,可省略属性名。 -
method:
@RequestMapping(value="hello", method={RequestMethod.POST, RequestMethod.GET)注解的方法只支持POST请求和GET请求。
若没有指定该属性,则表示该方法支持任意HTTP请求方式 -
consumes:
consumes="application/json"表示方法仅处理request Content-Type为"application/json"类型的请求 -
produces:
produces="application/json"表示方法仅处理request请求的Accept头中包含了"applicatino/json"的请求,同时指明了返回的类型为application/json -
params
params="myParam=myValue",表示方法仅处理request中包含名为"myParam"、值为myValue的请求 -
headers
headers="Referer=http://www.fkit.org/",表示方法仅处理request的header中包含"Referer"请求头和对应值为"http://www.fkit.org"的请求
处理器方法可接受的参数类型
包括ServletRequest、HttpServletRequest、HttpSession、Model、ModelMap等,Spring会正确的将对象传递给方法。
处理器方法可返回的类型
包括ModelAndView、Model、Map<k, v>、View、String、void等
Model、ModelMap
Spring MVC在调用处理方法之前会创建一个隐含的模型对象,作为模型数据的存储容器。如果处理方法的参数为Model或ModelMap类型,则SpringMVC会将隐含模型的引用传递给这些参数。在处理方法内部,开发者就可以通过这个参数对象访问模型中的所有数据,也可以向模型中添加新的属性数据。
//Model和ModelMap的使用方式一毛一样,这里以Modle举例
@Controller
public class MyController
{
//@ModelAttribute修饰的方法会先于login调用,该方法用于接收JSP页面传入的参数,并存储到Model
@Attribute
public void userModel(String loginname, String password, Model model)
{
User user = new User(loginname, password);
model.addAttribute("user", user);
}
@RequestMapping("/login")
public String login(Model model)
{
//从model中取出之前存入的名为user的对象
User user = (User) model.asMap().get("user");
return "result";
}
}
ModelAndView
处理器方法返回值如果时ModelAndView,则其既包含模型数据信息(通过.addObject()方法添加),也包括视图信息(通过.setViewName()方法添加),这样SpringMVC可以使用包含的视图对模型数据进行渲染。
//Model和ModelMap的使用方式一毛一样,这里以Modle举例
@Controller
public class MyController
{
//@ModelAttribute修饰的方法会先于login调用,该方法用于接收JSP页面传入的参数,并存储到Model
@Attribute
public void userModel(String loginname, String password, ModelAndView mv)
{
User user = new User(loginname, password);
mv.addObject("user", user);
}
@RequestMapping("/login")
public ModelAndView login(ModelAndView mv)
{
//从model中取出之前存入的名为user的对象
User user = (User) mv.getModel().get("user");
mv.setViewName("result");
return mv;
}
}
示例@Controller+@RequestMapping+配置文件
//Controller
@Controller
public class HelloWorldController{
@RequestMapping("/helloWorld")
public String helloWorld(Model model){
model.addAttribute("message", "Hello World!");
return "helloWorld";
}
}
//.../WEB-INF/springmvc-config
<?xml ...?>
<beans>
<!-- 启动包扫描功能,将带有特定注解的类注册为bean -->
<context:component-scan base-package="org.fkit.controller"/>
<!-- 视图解析器 -->
<bean id="viewResolver" class="...view.InternalResourceViewResovler"?
<!-- 前缀 -->
<property name="prefix">
<value>/WEB-INF/content</value>
</property>
<!-- 后缀 -->
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
说明
- helloWorld返回值:视图解析器会生成视图的完整路径——前缀+返回值+后缀,即/WEB-INF/content/helloWorld.jsp
- model对象:该对象可以在返回的视图当中通过request获取(用于显示等其它用途)
参数绑定注解
@RequestParam
//http://...../login?loginname=jack请求中的loginname("jack")会赋值给形参loginname
@RequestMapping
public ModelAndView login(@RequestParam("loginname") String loginname)
@RequestParam的可选参数:
- required,表明参数是否必须绑定,默认为true
- defaultValue,没有传递参数时的默认值
@PathVariable
//请求为http://.....pathVariableTest/1时,会将1赋值给行参userId
@RequestMapping(value="/pathVariableTest/{userId}")
public void pathVariableTest(@PathVariable Integer useId)
仅支持value一个属性,省略时,会将模版变量{userId}绑定到同名参数
@RequestHeader
//自动将请求头"User-agent"赋值给行参userAgent,将"Accept"请求头的值赋值给accepts
@RequestMapping("/requestHeaderTest")
public void requestHeaderTest(
@RequestHeader("User-agent") String userAgent,
@RequestHeader(value="Accept") String accepts
)
可选参数包括:value、required、defaultValue
@CookieValue
//将cookie中的JSESSION的值赋值给行参sessionId
@RequestMapping("/cookieValueTest")
public void cookieValueTest(@CookieValue(value="JSESSIONID") String sessionId)
可选参数包括:value、required、defaultValue
@SessionAttributes
只能声明在类上,不能声明在方法上
允许我们有选择地指定Model中的哪些属性需要转储到HttpSession当中
@Controller
//将Model中存储的属性名为user的属性放入HttpSession对象当中,可在Session范围内访问
@SessionAttributes("user")
public class SessionAttributesController
{
...
}
例如,后续可在网页中访问
${sessionScope.user.username}
//访问session作用域中的user对象
可选参数有type:如指定user对象的类型@SessionAttributes(types={User.class}, value="user")
@ModelAttribute
被@ModelAttribute注解的方法会在Controller每个方法被执行前被执行,并且只有
- 示例1_@ModelAttribute(value="")注释返回具体类的方法
//使用ModelAttribute注解的value属性,来指定Model的属性的名称,Model属性的值就是方法的返回值
//即,该注解的结果是:Model中将有一个属性loginname,它的值是方法返回值
@ModelAttribute("loginname")
public String userModel(@RequestParam("loginname") String loginname){
return loginname;
}
而后,可在其它jsp页面访问request作用域中的loginname
${requestScope.loginname}<br>
- 示例2_@ModelAttribute注释void返回值的方法
//model属性的名称和值通过addAttribute实现,前提是要在方法中加入一个model参数
//即,该注解的结果是,model中有两个属性loginname、password,值为addAttribute()时的值
@ModelAttribute
public void userModel(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password
Model model){
model.addAttribute("loginname", loginname);
model.addAttribute("password", password);
}
而后,可在其它jsp页面访问request作用域中的loginname、password
${requestScope.loginname}<br>
${requestScope.password}<br>
- 示例3_@ModelAttribute注释返回具体类的方法
//因为函数返回类型为User,因此model属性的名称为user
//即,该注解的结果是,model中含有属性user,值为函数的返回值
@ModelAttribute
public User userModel(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password){
return find(loginname, password);
}
而后,可在其它jsp页面访问request作用域中的user及user的属性loginname、password
${requestScope.user.username}
- 示例4_@ModelAttribute和@RequestMapping注释同一个方法
//此时方法的返回值并不是一个视图名称,而是Model属性的值,而视图名称是@RequestMapping中的value值login
//即,最终效果为,Model中包含名为username、值为方法返回值的属性;并且方法调用后会跳转到RequestMapping的value值所对应的login视图
@RequestMapping(value="login")
@ModelAttribute(value="username")
public String login(){
return "admin";
}
- 示例5_@ModelAttribute注释一个方法的参数
//表示方法的入参user就是Model中的user属性(该属性可能在之前已经设置好啦)
@RequestMapping(value="login")
public String login(@ModelAttribute("user") User user){
user.setUsername("管理员");
return "result5";
}
@RequestBody
最常用于将接收的Json数据绑定到或说转化为某个POJO类
该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把响应的数据绑定到Controller中方法的参数上
HttpMessageConverter<T>负责将请求信息转换为一个对象(类型为T),并将对象(类型为T)绑定到请求的方法参数中或输出为响应消息。它有多个实现类用于转换不同类型的数据(如XML、JSON),可通过配置指定HandlerAdapter可以使用使用哪些HttpMessageConverter的实现类(如转化Json的转化器就有Jackson、fastJson等)。
只需为HandlerAdapter装配处理 x类型 的HttpMessageConverter,并将请求的Accept指定为对应类型,Spring MVC就可以使用服务端的处理方法和客户端 X类型的消息进行通信了
当请求为POST或GET时,若数据编码格式为
- application/json、application/xml等格式的数据,必须使用@RequestBody处理。该注解最常用于接收json数据
- application/x-www-form-urlencoded时,此时的数据可由@RequestParam、@ModelAtrribute处理,并且很方便,当然@RequestBody也能处理。
- multipart/form-data,@RequestBody不能处理这种格式的数据
@ResponseBody
最常用于将对象转化为JSON数据并返回给客户端,如
//将List集合转换成Json格式,返回到客户端
@RequestMapping("testRequesBody")
@ResponseBody
puglic Object getJson(){
List<Book> list = new ArrayList<Book>();
list.add(new Book(1, "博客实战", "wxs"));
return list;
}
加上如下两个注解后,可通过@Requestbody和@ResponseBody接收和返回XML数据(暂时没用过:))
@XmlRootElement
作用于POJO类上表示XML文档的根元素
网友评论