一、数据传入部分
1、RequestMapping注解:
@RequestMapping(value = "请求的URL",params = {"限定传入的参数"},method="限定方法类型",headers="限定请求头")
2、路径数据部分:
<a href="method2/100">测试请求头</a><br><br>
@RequestMapping("{m}/{pid}")
public String method1(@PathVariable("pid") String id,
@PathVariable("m") String method) {
System.out.println(method + "/" + id);
return "resp";
}
一个占位符可以占一层路径。可以将所有路径都用占位符占住,但是如有多个和URL匹配的方法就会报错(SpringMVC框架会尽量避免这种情况,当避无可避的时候就凉凉)。
可以通过@PathVariable注解来取到占位符上的真正路径,value可以省略,如果省略则后面的变量名必须和占位的变量名相同。当找不到的时候,会报错,除非将required设置为false。
运行结果:
3、携带参数:
<a href="method1/100?username=abc">测试请求参数</a><br><br>
@RequestMapping("{m}/{pid}")
public String method1(@PathVariable("pid") String id,
@PathVariable("m") String method,
@RequestParam(value = "user", required = false) String username) {
System.out.println(method + "/" + id + "?username=" + username);
return "resp";
}
当以get方式携带请求参数的时候,用@RequestParam来取到传入的参数值,value可以省略,如果省略则后面的变量名必须和传入的参数名相同。当找不到的时候,会报错,除非将required设置为false。
4、传入Servlet的原生API:
<a href="method2/100?username=abc">测试请求头</a><br><br>
@RequestMapping("method2/{pid}")
public String method2(@PathVariable("pid") String id,
@PathVariable(value = "m", required = false) String method,
@RequestHeader("user-agent") String heads,
HttpServletRequest request) {
System.out.println("method2/" + id + "?user-agent=" + heads + "&username=" + request.getParameter("username"));
return "resp";
}
运行结果:
5、POJO的自动封装(需要配置CharacterEncodingFilter):
自定义的对象,SpringMVC会根据表单的name和实体类中的变量名进行一对一映射,全找到就自动封装。
<form action="order" method="post">
物品名字: <input type="text" name="productName"><br>
物品数量: <input type="text" name="productQuantity"><br>
物品总价: <input type="text" name="totalPrice"><br>
用户姓名: <input type="text" name="address.userName"><br>
用户收货地址: <input type="text" name="address.location"><br>
用户手机: <input type="text" name="address.mobile"><br>
<input type="submit" value="提交">
</form>
@RequestMapping("order")
public String method3(Order order) { //还支持级联的自动封装
System.out.println(order);
return "resp";
}
运行结果:
二、数据输出部分
Map、Model、ModelMap:
<a href="method1">测试Map输出数据</a><br><br>
<a href="method2">测试Model输出数据</a><br><br>
<a href="method3">测试ModelMap输出数据</a><br><br>
@Controller
public class OutController {
@RequestMapping("method1")
public String method1(Map<String,Object> map) {
map.put("param","这是方法一");
return "showparam";
}
@RequestMapping("method2")
public String method2(Model model) {
model.addAttribute("param","这是方法二");
return "showparam";
}
@RequestMapping("method3")
public String method3(ModelMap modelmap) {
modelmap.addAttribute("param","这是方法三");
return "showparam";
}
}
pageContext: ${pageScope.param}<br><br>
request: ${requestScope.param}<br><br>
session: ${sessionScope.param}<br><br>
application: ${applicationScope.param}<br><br>
运行结果:
SpringMVC确定POJO值的三步;
1、如果隐含模型中有这个key(标了ModelAttribute注解就是注解指定的value,没标就是参数类型的首字母小写)指定的值,如果有将这个值赋值给bindObject;
2、如果是SessionAttributes标注的属性,就从session中拿;
3、如果都不是就利用反射创建对象;
当Map、Model、ModelMap这三个传递输出数据的时候,总会变成隐含模型—BindingAwareModelMap。这个隐含模型可不得了,很牛逼的!