SpringMVC随笔——理解注解

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 容器的 Bean
public 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之间的映射更为明确,方便开发;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值