美文网首页
SpringMVC常用注解

SpringMVC常用注解

作者: WhyDoWeLive | 来源:发表于2019-08-01 17:43 被阅读0次

@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文档的根元素

@XmlElemnt作用于POJO的set方法上,表示xml的element

相关文章

网友评论

      本文标题:SpringMVC常用注解

      本文链接:https://www.haomeiwen.com/subject/jwhcdctx.html