使用POJO对象绑定请求参数
public User testPOJO(User user){
return new User();
}
支持级联属性
SpringMVC的Handler方法可以接受的原生ServletAPI
HttpServletRequest
HttpServletResponse
HttpSession
java.security,Principal
Locale
InputStream
OutputStream
Reader
Writer
处理数据模型
1. ModelAndView
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
String viewName="success";
ModelAndView modelAndView = new ModelAndView(viewName);
/*添加数据模型到modelAndView中 */
modelAndView.addObject("ok","这是个键值对");
return modelAndView;
}
<h3>${requestScope.ok}</h3>
方法返回的目标可以是MAV类型,其中可以包含视图和模型信息,SpringMVC会把MAV的model中数据放到request域对象
2. Map 及 Model
@RequestMapping("/testMap")
public String testMap(Map<String,Object> map){
map.put("id",Arrays.asList("1001","1002","1003"));
return "success";
}
HTML成功页面应有的ID:${requestScope.id}
目标方法可以添加Map类型,实际上也可以是Model类型或ModelMap类型,最终还是通过ModelAndView输出内容
3. @SessionAttributes
@SessionAttributes({"user"})
@Controller
public class demo{
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Map<String,Object> map){
User user=new User("zhangsan","123456",22);
map.put("user",user);
return "success";
}
}
request user:${requestScope.user}
SessionAttributes user:${sessionScope.user}
注意:SessionAttributes注解只能放在类的上面,里面的值要和下面的key对应上,这样既能在session域中有该对象,请求域里面也会有
SessionAttributes属性:
values={"user","address"}可放多个KEY
types={String.class} 也可放多个,用法与value一样。可同时存在
SessionAttribute引发的异常
有可能的解决办法:
- @ModelAttribute (“key-name”)
- 添加带有@ModelAttribute 的方法
4. ModelAttribute
@ModelAttribut
public void getUser(@RequestParam(value="id",required=false) Integer id,Map<String,Object> map){
if(id!=null){
User user = new User(1,"J",123456,12);
map.put("user",user);
}
}
<form action="testModelAttribute" method="post">
<input type="hidden" name="id" value="1"/>
name:<input type="text" name="username" value="J"/>
<br>
age:<input type="text" name="age" value="12"/>
<br>
<<input type="submit" value="submit"/>
</form>
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("修改之后:"+user);
return "success";
}
- 被ModelAttribut标记的方法会在每个目标方法执行之前被MVC执行
- 执行ModelAttribute 注解修饰的方法:
从数据库中取出对象,把对象放到了Map中,key为user。
SpringMVC从Map中取出User对象,并把表单的请求参数赋给该User对象的对应属性。
SpringMVC把上述修改后的对象传入目标方法的参数
注意:在ModelAttribut修饰的方法中,放入到Map时的key需要和目标方法入参类型的第一个字母小写的字符串一致,若想自定义key-name, 则需在目标方法入参处增加@ModelAttribute (“key-name”)
源码有待深入了解
JstlView
补充:Bean的配置选ResourceBundleMessageSource
property name=“basename” value="配置文件名"
SpringMVC-mvc-view-controller标签
<mvc:view-controller path="/success" view-name="success">
此标签可以不通过handler直接访问success页面
但是添加了此标签的工程将无法正常访问其他controller方法
解决办法:
<mvc:annotation-driven/>
SrpingMVC重定向
如果返回的字符串中带有forward:或者redirect:前缀时,SpringMVC会对他们进行特殊处理:
将forward:和redirect:当成指示符,其后的字符串作为URL来处理
<a href="testRedirect">TestRedirect</a>
@RequestMapping("/testRedirect")
public String testRedirect(){
System.out.println("testRedirect");
return "redirect:/index.jsp";
}
@ControllerAdvice与@ExceptionHandler
@ControllerAdvice加在类上,用于统一管理异常类
@ExceptionHandler加在方法上,参数是异常类.class
@ExceptionHandler({ArithmeticException.class})
public ModelAndView testException(Exception ex){
System.out.println("异常信息:"+ex);
MondelAndView mv=new ModelAndView("viewName");
mv.addObject("exception",ex);
return mv;
}
@ResponseStatus
主要加在类上,有两个属性,reason和value
reason主要标记错误原因,value则指定错误码类型(返回页面的时候就会变成错误码)
若写在方法上,则该方法会直接抛出异常到页面。