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之间的映射更为明确,方便开发;