Webwork2-ServletDispatcher工作原理

webwork2里的ServletDispatcher是一个Java Servlet,是MVC模式的控制部分,所有客户端的request请求被ServletDispatcher调度。
它在web.xml中配置如下:
  <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
        <load-on-startup>1</load-on-startup>
  </servlet> 
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>



ServletDispatcher的主要功能调用如下:
1、init()方法在服务器启动时调用,
   a、初始化Velocity引擎
   b、检查是否支持配置文件重新载入功能。如果webwork.configuration.xml.reload设置为true,每个request请求都将重新装载xml配置文件。这在开发环境里面特别方便,但在生产环境必须设置为false。这个配置在classes目录下的webwork.properties文件里修改
   //check for configuration reloading
        if ("true".equalsIgnoreCase(Configuration.getString("webwork.configuration.xml.reload"))) {
            FileManager.setReloadingConfigs(true);
        }
  c、设置一些文件上传的信息,比如:上传临时目录,上传的最大字节等。都设置在webwork.properties文件里,如果在classpath中
  没有找到,它会读取默认的default.properties
2、service() 方法,每个servlet的请求都将调用此方法。
  a、通过request请求取得action的命名空间(namespace,有xwork.xml配置文件里面的package而来的)
  例如:/foo/bar/MyAction.action,取得的命名空间为/foo/bar
  b、根据servlet请求的Path,解析出要执行改请求的action的名字(actionName),例如:(../foo/bar/MyAction.action -> MyAction)
  c、创建Action上下文(extraContext),extraContext是一个hashmap,它里面保存了request, response, parameters, session and application,以及将这些对象封装过的
  Map,requestMap,parameterMap,sessionMap,applicationMap
  这样,Action如果需要获取request请求参数,将不直接调用http的request请求,而是直接对request进行封装的RequestMap进行操作.
  /**
     * Merges all application and servlet attributes into a single <tt>HashMap</tt> to represent the entire
     * <tt>Action</tt> context.
     *
     * @param requestMap a Map of all request attributes.
     * @param parameterMap a Map of all request parameters.
     * @param sessionMap a Map of all session attributes.
     * @param applicationMap a Map of all servlet context attributes.
     * @param request the HttpServletRequest object.
     * @param response the HttpServletResponse object.
     * @param servletConfig the ServletConfig object.
     * @return a HashMap representing the <tt>Action</tt> context.
     */
    public static HashMap createContextMap(Map requestMap, Map parameterMap, Map sessionMap, Map applicationMap, HttpServletRequest request, HttpServletResponse response, ServletConfig servletConfig) {
        HashMap extraContext = new HashMap();
        extraContext.put(ActionContext.PARAMETERS, parameterMap);
        extraContext.put(ActionContext.SESSION, sessionMap);
        extraContext.put(ActionContext.APPLICATION, applicationMap);
        extraContext.put(ActionContext.LOCALE, request.getLocale());
        extraContext.put(HTTP_REQUEST, request);
        extraContext.put(HTTP_RESPONSE, response);
        extraContext.put(SERVLET_CONFIG, servletConfig);
        extraContext.put(COMPONENT_MANAGER, request.getAttribute("DefaultComponentManager"));
        // helpers to get access to request/session/application scope
        extraContext.put("request", requestMap);
        extraContext.put("session", sessionMap);
        extraContext.put("application", applicationMap);
        extraContext.put("parameters", parameterMap);
        AttributeMap attrMap = new AttributeMap(extraContext);
        extraContext.put("attr", attrMap);
        return extraContext;
    }
    d、根据前面获得的namespace、actionName、extraContext,创建一个ActonProxy(详细请看xwork介绍)
    ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, actionName, extraContext);
    具体Action的调用,和各种拦截器(Interceptor)的调度等一系列相关操作将由这个ActionProxy负责,我们在这里只要调用
    proxy.execute();
   它就会去执行相应的Action,执行的结果也会按照相应的响应对象去输出。

你可能感兴趣的:(工作,xml,servlet,velocity,Webwork)