码迷,mamicode.com
首页 > 编程语言 > 详细

SpringMVC核心接口

时间:2018-07-17 14:21:50      阅读:437      评论:0      收藏:0      [点我收藏+]

标签:map   too   interface   ali   load   灵活   部分   初始   dispatch   

DispatcherServlet

DispatcherServlet有点类似HttpServlet接口中用于转发的接口RequestDispatcher

  下面是API中对DispatcherServlet的解释

  1. 它可以使用任何HandlerMapping实现(预先构建或作为应用程序的一部分提供)来控制请求到处理程序对象的路由。默认是BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping。HandlerMapping对象可以在servlet的应用程序上下文中定义为bean,实现HandlerMapping接口,在出现时覆盖默认的HandlerMapping。HandlerMappings可以提供任何bean名
  2. 它可以使用任何HandlerAdapter;这允许使用任何处理程序接口。默认适配器分别是HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter,用于Spring的HttpRequestHandler和控制器接口。还将注册一个默认的AnnotationMethodHandlerAdapter。HandlerAdapter对象可以作为bean添加到应用程序上下文中,覆盖默认的HandlerAdapter。与HandlerMappings一样,handleradapter可以提供任何bean名称
  3. 可以通过HandlerExceptionResolver指定dispatcher的异常解析策略,例如将某些异常映射到错误页面(也可以以rest形式抛出一个JSON)。默认是annotationmethodhandlertionresolver、ResponseStatusExceptionResolver和DefaultHandlerExceptionResolver。可以通过应用程序上下文覆盖这些HandlerExceptionResolvers。HandlerExceptionResolver可以提供任何bean的名称
  4. 它的视图解析策略可以通过ViewResolver实现指定,将符号视图名称解析为视图对象。默认是InternalResourceViewResolver。可以将ViewResolver对象作为bean添加到应用程序上下文中,覆盖默认的ViewResolver。可以给ViewResolvers赋予任何bean名称

下面分别解释上面三个关键接口

HandlerMapping

handlerMapping的初始化完成的最重要的两个工作就是: 

  • 将URL与handler对应的关系保存在handlerMap集合中
  setUrlMap(Map<String,?> urlMap) 
          Set a Map with URL paths as keys and handler beans (or handler bean names) as values.
  getHandler(HttpServletRequest request) 
          Return a handler and any interceptors for this request. 


工作中常用
RequestMappingHandlerMapping去查找Handler(通过Handler的适配器去查找)

HandlerAdapter

  HandlerAdapter初始化会将这个HandlerAdapter对象保存在Dispatcher的HandlerAdapters集合中。当SpringMVC将某个URL对应到某个Handler时,将对应的Handler返回,对应HandlerAdaptor接口的handle方法

   SpringMVC HandlerAdapter机制可以让Handler的实现更加灵活

  handle(HttpServletRequest request, HttpServletResponse response, Object handler) 
          Use the given handler to handle this request.

工作中常用的RequestMappingHandlerAdapter此适配器能执行实现Controller接口的handler

 HandlerExceptionResolver  处理器异常解析

  当后台捕捉到的业务异常时,可以自定义的异常,然后通过实现HandlerExceptionResolver来抛出自定义异常的信息

  • 自定义一个异常
  • public class CustomException extends Exception{  public String msg;
        public CustomException(String msg) {
            super(msg);
            this.msg=msg;
        }  
        public String getMsg() {
            return msg;
        }
        public void setMsg(String msg) {
            this.msg = msg;
        }
    }

    以JSON的格式抛出去

public class CustomExceptionResolver implements HandlerExceptionResolver{

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception exception) {
        //handler 就是处理器适配器执行的Handler对象
        response.setContentType("application/json;charset=UTF-8");
        try {
            PrintWriter writer = response.getWriter();
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("success", false);
            // 为安全起见,只有业务异常我们对前端可见,否则统一归为系统异常
            if (exception instanceof CustomException) {
                map.put("errorMsg", exception.getMessage());
            } else {
                map.put("errorMsg", "系统异常!");
            }
            writer.write(JSON.toJSONString(map));
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

在这里,我们不想让错误跳转到一个错误页面,所以 return null。(以JSON的数据格式 通过response write到前端)接到错误信息想怎么去做,前端自行处理。

  • ViewResolver 视图解析器  将把逻辑视图名解析为具体的View

  应用程序中,我们的页面经常统一放在某个包下(/WEB-INF/page/),而且统一以某个名字结尾(.jsp或者.html),会统  实现类UrlBasedViewResolver:其中有两个方法

      setSuffix  设置在构建URL时附加到视图名称的后缀。   

   setPreffix 在构建URL时,设置前缀以查看名称。

  通过这两个方法,我们在return一个字符串时,可以把页面的前缀和后缀省略,简化了编码。

 

SpringMVC核心接口

标签:map   too   interface   ali   load   灵活   部分   初始   dispatch   

原文地址:https://www.cnblogs.com/ssskkk/p/9308040.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!