spring mvc中基于注解的控制器

使用基于注解的控制器,可以在一个控制器类内包含多个请求处理方法。本文将介绍在spring mvc中经常用到的注解类,包括:

  • 声明Controller、Action,以及URL映射的注解(@Controller,@RequestMapping)
  • 向视图中传递数据(Model)
  • 接受请求参数和路径变量的注解(@RequestParam,@PathVariable)
  • 重定向时传递数据的参数(RedirectAttributes)
  • 返回JSON数据的注解
  • 使用@ModelAttribute接受请求对象

声明Controller、Action,以及URL映射的注解

我们在上一篇博客中,使用了下面的代码来声明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)

上面的代码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表达式来获取数据。

返回JSON数据的注解

如果想让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}

使用@ModelAttribute接受请求对象

前面提到了@RequestParam和@PathVariable,每个注解接受一个参数,如果一个注册页面包含好多个表单元素,提交后,可以通过@ModelAttribute接受整个对象。下面是JSP文件中的表单

method="post"> type="text" name="id" /> type="text" name="name" /> type="text" name="age" /> type="submit" value="submit" />

每个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";
}

你可能感兴趣的:(spring,spring,boot基础专栏)