.@RequestMapping映射
该注解中存的是映射路径的字符串
1.1 value的值是一个数组,也就是说可以定义多个访问路径,同时“.action”可以省略,前端控制器中主要查找主体部分。注意在前端页面访问时必须要加上“.action”。
1.2 method表示前端请求的方法,必须要存在POST,当然此属性可以不设置,默认所有都可以。
1.3 此注解还可以出现在类前面,表示该类中所有的方法访问路径都需要加上/item,以此区别不同控制器中的方法
2.Controllre中方法返回值
1 //查询该id的数据
2 @RequestMapping(value="/itemEdit.action")
3 public ModelAndView test2(HttpServletRequest request,Integer id){
4
5 //获取页面传递的id
6 String str = request.getParameter("id");
7 //Integer id = Integer.parseInt(str);
8 //调用service获取items
9 Items items = itemsService.findItemsById(id);
10
11 //返回页面
12 ModelAndView mv = new ModelAndView();
13 mv.addObject("item", items);
14 mv.setViewName("editItem");
15 return mv;
16 }
- ModelAndView,返回类型是一个页面视图,将查询的数据通过add*方法添加,setViewName将页面进行绑定,该类型将数据与视图混合,适用于普遍情况。
1 //更新修改的信息
2 @RequestMapping(value = "/voidTest.action")
3 public void test5(Items items,Model model,HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
4 //条件修改
5 itemsService.updateItems(items);
6
7 model.addAttribute("model", "model");
8
9 request.getRequestDispatcher("success").forward(request, response);
10
11 }
- void,同样可以通过model类传递数据,跳转页面时就需要采用原始的Servlet方式,上面是转发模式。该类型主要用于不需要跳转视图,例如Ajax的数据处理
1 @RequestMapping(value="queryItem.action")
2 public String test4(Integer[] ids,Model model){
3
4 System.out.println(ids[0]);
5
6 model.addAttribute("model", "model");
7 //return "redirect:/itemEdit.action?itemId=" + ids[0];
8 //return "forward:/itemEdit.action";
9 return "success";
10 }
- String,官方推荐使用这种模式,它的优点在于将视图与数据分离、解耦,符合三层结构的思想。返回的字符串需是jsp页面或者.action,可以采用转发和重定向的方式。默认是转发。(转发和重定向的区别这里不多说了,简单来说,转发是一次请求不会对视request数据,重定向两次请求,request数据丢失)
3.异常处理
3.1 springmvc的异常处理模式
如图所示,一旦出现异常spring会一直向上抛,当到前端控制器时,spring会把异常转交给异常处理器(HandlerExceptionResolver),这是一个接口,需要自己实现一个类,同时该类需要在springmvc中注册才能被使用。
异常分为两种,执行异常(不可知异常)与预期异常
3.2 构建自定义异常处理器
首先有一下几个步骤,创建自定义异常类->创建自定义异常处理器,用于方便返回需要的异常信息。
异常类:没有过多地添加属性,只是简单的封装。
public class MyException extends Exception {
// 异常信息
private String message;
public MyException() {
super();
}
public MyException(String message) {
super();
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
异常处理器:
1 public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
2
3 @Override
4 public ModelAndView resolveException(HttpServletRequest request,
5 HttpServletResponse response, Object obj,
6 Exception e) {
7
8 String msg;
9
10 //预期异常
11 if(e instanceof MyException){
12 msg = e.getMessage();
13 }else {
14 // 如果是运行时异常,则取错误堆栈,从堆栈中获取异常信息
15 Writer out = new StringWriter();
16 PrintWriter s = new PrintWriter(out);
17 e.printStackTrace(s);
18 msg = out.toString();
19 }
20
21 // 返回错误页面,给用户友好页面显示错误信息
22 ModelAndView modelAndView = new ModelAndView();
23 modelAndView.addObject("msg", msg);
24 modelAndView.setViewName("error");
25
26 return modelAndView;
27
28 }
29
30 }
其中,Object表示异常的具体位置,由全路径表示。
3.3 配置
1 <!-- 配置异常处理器 --> 2 <bean id="myHandler" class="com.springmvc.exception.MyHandlerExceptionResolver"></bean>