使用基于注解的控制器,可以在一个控制器类内包含多个请求处理方法。本文将介绍在spring mvc中经常用到的注解类,包括:
我们在上一篇博客中,使用了下面的代码来声明Controller和Action,以及声明他们响应的URL地址
@Controller
@RequestMapping(value = "/home")
public class HomeController {
@RequestMapping(value = "/index")
public String Index(Model model) {
model.addAttribute("msg", "hello,springmvc");
return "index";
}
}
@Controller指明了当前类是一个控制器类,@RequestMapping注解用在方法上,表明该方法是一个Action方法,并且响应value所声明的URL请求。如果在Controller上也使用了@RequestMapping,如上面的代码,Index方法响应”/home/index”请求。
上面的代码model.addAttribute("msg", "hello,springmvc");
将一个字符串赋值给了一个org.springframework.ui.Model对象,spring mvc框架会将这个对象传递给视图文件,在视图文件中可以通过EL表达式来获取并输入org.springframework.ui.Model对象中的数据。
${msg}
下面的两个方法分别接收了请求参数和路径变量
@RequestMapping("/person")
public String Person(@RequestParam int id) {
System.out.println("id=" + id);
return "person";
}
@RequestMapping("/person/{name}")
public String Person2(@PathVariable String name) {
System.out.println("name=" + name);
return "person";
}
这两个方法所在的Controller类映射/home。当请求/home/person?id=123时,我们为id对象使用@RequestParam注解,spring mvc框架就会将请求参数中的id的值转换为我们需要的类型,然后赋值给action方法的id参数。当请求/home/person/kai时,{name}作为路径参数,url中对应的部分(“kai”)会被赋值给action方法的name参数。
当进行重定向(redirect)时,使用org.springframework.ui.Model就无法将数据传递给重定向的视图文件了,需要使用org.springframework.web.servlet.mvc.support.RedirectAttributes对象来传递。
@RequestMapping("/do")
public String Do(RedirectAttributes redirectAttributes){
redirectAttributes.addFlashAttribute("msg", "redirect data");
return "redirect:/home/person/kai";
}
这里我们通过redirectAttributes.addFlashAttribute()方法,将数据放到org.springframework.web.servlet.mvc.support.RedirectAttributes对象中,在重定向的视图中可以通过EL表达式来获取数据。
如果想让action方法返回json格式的数据,需要做以下几件事:
1,springmvc配置文件中要启用
如下
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="springmvc2.controllers" />
<mvc:annotation-driven />
<mvc:resources location="/WEB-INF/static/" mapping="/static/**" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".jsp" />
bean>
beans>
第二,要引入jackson包的依赖,如下
<dependency>
<groupId>org.codehaus.jacksongroupId>
<artifactId>jackson-mapper-aslartifactId>
<version>1.9.2version>
dependency>
第三,要使用@ResponseBody注解。
首先,我们定义一个model类
package springmvc2.models;
public class Person {
private String id;
private String name;
private int age;
//getters and setters
}
下面是action方法
@RequestMapping(value="/getinfo",method = RequestMethod.GET)
public @ResponseBody Person GetInfo(){
Person p=new Person();
p.setId("abc");
p.setName("kai");
p.setAge(18);
return p;
}
当请求/home/getinfo时,会返回以下内容
{"id":"abc","name":"kai","age":18}
前面提到了@RequestParam和@PathVariable,每个注解接受一个参数,如果一个注册页面包含好多个表单元素,提交后,可以通过@ModelAttribute接受整个对象。下面是JSP文件中的表单
每个input元素是一个Person类的属性,我可以通过如下的方式来获取Person对象
@RequestMapping(value="/addperson",method=RequestMethod.POST)
public String AddPerson(@ModelAttribute Person person) {
System.out.println("person.id=" + person.getId());
System.out.println("person.name=" + person.getName());
System.out.println("person.age=" + person.getAge());
return "person";
}