springmvc中Controller前端控制器的映射与返回数据,以及异常处理

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

原文地址:https://www.cnblogs.com/lisd/p/10299249.html