SpringMVC随笔——理解注解

来源:互联网 发布:2016中超联赛助攻数据 编辑:程序博客网 时间:2024/05/17 22:10

SpringMVC注解笔记

一、处理URL的方式


1.每个Controller请求处理对应多个URL

import com.baobaotao.service.BbtForumService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controller //将一个类成为 Spring 容器的 Beanpublic class MyController {    @Autowired    private MyController myController;    /*1.一个Controller处理多个URL,即将类MyController        MultiActionController,而不需要像以前一样继承继承SimpleFormController 或 MultiActionController 来定义自己的 Controller 的     *2.第一个URL:/first.do的URL处理由方法first(无参数)处理     *3.第二个URL:/second.do?num=1的URL处理由方法second(有参数要入参,格式为:?parm=XXX)处理     */    @RequestMapping("/first.do")     public String first() {        System.out.println("call first method.");        return "first";    }    @RequestMapping("/second.do")     public String second(int num){        System.out.println(num);        System.out.println("call second method.");        return "second";    }}

2.每个Controller处理请求请求一个URL

import com.baobaotao.service.BbtForumService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controller //将一个类成为 Spring 容器的 Bean@RequestMapping("/myController.do")public class MyController {    @Autowired    private MyController myController;    /*1.@RequestMapping("/myController.do")指定Controller对应的URL请求     *2.如果url中包括:method=first参数,则由方法first负责,     即:/myController.do?method=first     *3.如果url中包括:method=second?num=xxx参数,则由方法second负责,即:/myController.do?method=second&num=1     */    @RequestMapping(params = "method=first")     public String first() {        System.out.println("call first method.");        return "first";    }    @RequestMapping(params = "method=second")     public String second(int num){        System.out.println(num);        System.out.println("call second method.");        return "second";    }}

3.请求处理方法可以处理特定的HTTP请求方法

@Controller //将一个类成为 Spring 容器的 Bean@RequestMapping("/myController.do")public class MyController {    @Autowired    private MyController myController;    /*     *1.当请求以http POST方式请求时,方法first负责处理     *2.当请求以http GET方式请求时,方法second负责处理     */    @RequestMapping(params = "method=first",method = RequestMethod.POST)     public String first() {        System.out.println("call first method.");        return "first";    @RequestMapping(params = "method=second",method="RequestMethod.GET")     public String second(int num){        System.out.println(num);        System.out.println("call second method.");        return "second";    }    }

二、通过URL如何将处理方法中的参数绑定

1.按参数名匹配进行绑定

 @RequestMapping(params = "method=second")     public String second(int num) {    System.out.println(num);        System.out.println("call second method.");        return "second";   }

当URL为http:localhot:8080//myController.do?method=second?num=1的请求时,需要关注发生以下的几点:

  • 方法second会处理url中method=second的请求
  • 同时num =1的请求参数在类型转换后绑定到 second() 方法的num 入参上
  • 最后方法second返回的是String类型的“second”,它是被解析为逻辑视图的名称,即ModelAndView类型
  • 另外如果是基本数据类型,URL请求都会有对应的参数绑定在方法中的参数上

2.可以将JavaBean作为URL的绑定入参

JavaBean的属性与方法:

/** * @author Lijian *  */public class Person{    // 这里的属性必须跟数据库中字段要一致,必须对应    private int id;    private String name;    private int age;    /*     * 这里getter/setter方法以及toString都可以自动生成     */    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "User [id=" + id + ", name=" + name + ", age=" + age + "]";    }}

将JavaBean作为参数传入方法second中:

 @RequestMapping(params = "method=second")     public String second(int num,Person person) {    System.out.println("num "+num);    System.out.println("Person "+person);        System.out.println("call second method.");        return "second";   }

这时候的URL应该为:
http:localhot:8080//myController.do?method=second?num=1&id=1&name=Lijian&age=22
其中id、name、age为person的属性与方法second中person属性绑定。如果此时url中没有id,Spring也不会报错,会默认person.id值为0

3.注解@RequestParam指定绑定的参数

比如我们需要将second(int num,Person person)中参数num绑定在URL中的id参数上,就可以使用@RequestParam来实现

@RequestMapping(params = "method=second")     public String second(@RequestParam("id") int num,Person person) {    System.out.println("num "+num);    System.out.println("Person "+person);        System.out.println("call second method.");        return "second";   }

这里,对 second() 请求处理方法的入参标注了 @RequestParam(“id”) 注解,所以它将和 id 的 URL 参数绑定。

4.使用ModelMap访问请示对应的隐含模型对象

我们每次请求模型对象时,其所有属性都会在request的属性列表中,就比如下面的例子所示,ModelMap的属性currPerson通过addAttribute()方法放到request的属性列表中。最后可以JSP视图中request.getAttribute(“currPerson”)(或者EL语言:${currPerson})访问到person对象。

@RequestMapping(params = "method=second")     public String second(@RequestParam("id") int num,Person person,ModelMap model) {    System.out.println("num "+num);    System.out.println("Person "+person);    //将person对象以currPerson为键值放入model中    model.addAttribute("currPerson",Person)        System.out.println("call second method.");        return "second";   }

但是ModelMap的属性currPerson等在默认的情况下都是request作用域,每次请求结束后,相应的属性将销毁不复存在,但是如果需要共享ModelMap中的属性,就需要将属性放到session缓存,就可以做到多请求访问。

5.使ModelMap中的属性具有Session作用域

@Controller@RequestMapping("/myController.do")@SessionAttributes("currPerson") //将ModelMap中属性名为currPerson的属性,并放到Session属性列表中,这样可以多请求共享。public class myController {@RequestMapping(params = "method=second")     public String second(@RequestParam("id") int num,Person person,ModelMap model) {    System.out.println("num "+num);    System.out.println("Person "+person);    //将person对象以currPerson为键值放入model中    model.addAttribute("currPerson",Person)        System.out.println("call second method.");        return "second";   }

最后,总结SpringMVC注解的几点好处

  • Controller不需要继承其他任何的接口,它只是个POJO(Plain Old Java Objects,简单的Java对象,实际就是普通JavaBeans,POJO不担当任何特殊的角色,也不实现任何特殊的Java框架的接口)
  • 对URL的请求很方便进行分发与处理;
  • 很好地通过URL绑定请求处理方法的参数,进行入参;
  • 请求与Controller之间的映射更为明确,方便开发;
原创粉丝点击