.@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>