重点:
首先会找到被@Controller修饰的方法加入到Bean中,然后被@RequestMapping注解的方法就是该处理器要执行的方法。
请求映射的关键字:
@RequestMapping
作用:
@RequestMapping实现将queryList方法和url进行映射,一个方法对应一个url。
参数1:映射地址value
将url绑定到对应的方法上 ,一般建议将url设置和方法写一样。
@RequestMapping(value="/queryList")
如果参数只有value可以省略value,如:
@RequestMapping("/queryList")
web.xml中配置拦截的.action的网址
输入:http://localhost:8080/SpringMVC_test/queryList.action
就会执行被
@RequestMapping("/queryList")注解的方法内容
参数2:method限定请求的方式method
可以指定“GET”或者"POST"请求类型,表示该url只能以魔种请求方式请求才能获得响应,如:
@RequestMapping(value="/queryList",method = {RequestMethod.POST})
只有以POST的方式才可以调用该处理器的该方法。
参数3:请求参数params
可以指定某一种参数类型,只有当请求数据中含有该名称的请求参数时,才能响应,如:
@RequestMapping(value="/queryList",params = "id")
只有当请求的url中有id这个参数才允许访问,如果url请求中不含有名称为id时,该方法就拒绝此次请求。
http://localhost:8080/SpringMVC_test/queryList.action?id=2
参数4:请求头类型headers
@RequestMapping(value="/queryList",headers = "Content-Type:text/html;charset=UTF-8")
参数5:consumes和produces
consumes表示处理请求的提交内容类型(Content-Type)
produces表示返回的内容类型
参数绑定:简单类型
请求中包含参数,可以传入到控制器中,通过方法的形参可以完成绑定,但是条件是形参的名字要和传入参数的名字相同:
@RequestMapping(value="/queryList")
public String queryList(Model model,Integer id) {
System.out.println("id:"+id);
List<Fruit> list = fruitService.queryFruitsList();
model.addAttribute("fruits",list);
return "/fruitsList";
}
url地址:
http://localhost:8080/SpringMVC_test/queryList.action?id=2
这样就可以在该方法中访问到传入进来的id值。
也可以通过@RequestParam重命名参数,如:
public String queryList(Model model,@RequestParam(value ="id") Integer fruit_id) {
System.out.println("id:"+fruit_id);
}
url地址:
http://localhost:8080/SpringMVC_test/queryList.action?id=2
参数绑定:默认值
如果传入参数是空或者null,想让它有个默认值就可以使用@RequestParam中的defaultValue属性,如:
@RequestMapping(value="/queryList")
public String queryList(Model model,@RequestParam(value ="id",defaultValue = "1") Integer fruit_id) {
url地址:
http://localhost:8080/SpringMVC_test/queryList.action
也输出:id=1
意思就是 如果请求中没有id参数,或者id参数值为空,那就给id一个默认值为1
参数绑定:包装类
@RequestMapping(value="/queryList")
public String queryList(Model model,Fruit fruit) {
System.out.println("name:"+fruit.getName());
}
url:
http://localhost:8080/SpringMVC_test/queryList.action?name=%E5%8D%A7%E6%A7%BD
输出:
name:卧槽
name是Fruit包装类的属性名,这种类型会被SpringMVC的处理器适配器解析,会创建出具体的实体类,并将相关的属性值通过set方法绑定到包装类中,所以成功。
注意:
也可以传入HttpServletRequest和HttpServletResponse,如:
@RequestMapping(value="/queryList")
public String queryList( HttpServletRequest request, HttpServletResponse response) {
System.out.println("name:"+request.getParameter("name"));
return "/fruitsList";
}
url:
http://localhost:8080/SpringMVC_test/queryList.action?name=%E5%8D%A7%E6%A7%BD
输出:
***
name:卧槽
不仅如此,
参数绑定:包装类还可以嵌套包装类,
只要传递的参数是“包装对象.属性”的形式就行,如:
首先创建两个类:(嵌套关系)
这里注意了嵌套类中(Fruit)必须有一个无参的构造函数,这样才能创建出一个对象赋值给包装类
public class Fruit {
String name;
Integer price;
public Fruit(){};
public Fruit(String name, Integer price) {
this.name = name;
this.price = price;
}
省略set和get方法
}
public class Person {
Fruit fruit;
省略set和get方法
}
访问页面:
<form action="queryList.action">
<input type="text" name="fruit.name" />
</form>
控制器:
@RequestMapping(value="/queryList")
public String queryList(Person person) {
System.out.println("name:"+person.getFruit().getName());
return "/fruitsList";
}
url地址:
http://localhost:8080/SpringMVC_test/queryList.action?fruit.name=12
输出:
name:12
参数绑定:数组类型
前台:
<form action="queryList.action" method="post">
<input type="text" name="ids" />
<input type="text" name="ids" />
<input type="text" name="ids" />
<input type="submit" />
</form>
控制器后台:
@RequestMapping(value="/queryList")
public String queryList(int[] ids) {
for(int i=0;i<ids.length;i++){
System.out.println("id"+i+":"+ids[i]);
}
return "/fruitsList";
}
注意:
传递的参数组属性名name要和控制器相关方法的形参保持一致才行。
参数绑定:List类型
条件是请求参数名字:格式"集合名[下标].属性"
控制方法形参的包装类的属性要和请求参数的集合名一样.
前台:
<form action="queryList.action" method="post">
<input type="text" name="list[0].name" />
<input type="text" name="list[0].price" />
<input type="text" name="list[1].name" />
<input type="text" name="list[1].price" />
<input type="submit">
</form>
后台控制器:
@RequestMapping(value="/queryList")
public String queryList(Person person) {
for (Fruit fruit:person.getList()) {
System.out.println(fruit);
}
return "/fruitsList";
}
person类:
public class Person {
List<Fruit> list;
public List<Fruit> getList() {
return list;
}
public void setList(List<Fruit> list) {
this.list = list;
}
}
参数绑定:Map类型
注意:
前台请求参数的Map元素的name属性要和Controller相关的Map形参名字要一样,而且对应的Key键也要保持一致。
前台:
<form action="queryList.action" method="post">
<input type="text" name="map['name']" value="苹果"/>
<input type="text" name="map['price']" vlaue="12"/>
<input type="submit">
</form>
控制器后台:
@RequestMapping(value="/queryList")
public String queryList(Person person) {
Map<String,Object> map = person.getMap();
for (String string: map.keySet()) {
System.out.println(string+":"+map.get(string));
}
return "/fruitsList";
}
person类:
public class Person {
Map<String,Object> map;
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
}