资源预览内容
第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
亲,该文档总共4页全部预览完了,如果喜欢就下载吧!
资源描述
Struts2执行流程2009-12-16 12:19Struts2执行流程1. web.xml 部署描述符2. FilterDispatcher 实现 StrutsStatics, Filter 接口(1)Filter:一个 filter 是一个对象用于执行过滤任务为每个请求资源(一个 servlet 或静态内容), 或响应一个资源,或两者.过滤器执行过滤是在 doFilter 方法中.每个过滤器访问一个 FilterConfig 对象从中获取初始化参数,一个引用到 ServletContext 可以被使用,例如,在过滤器任务需要时装载资源.过滤器的配置在 Web 应用程序的部署描述符中.init()-初始化过滤器,它的输入参数 javax.servlet.FilterConfig 的一个实例,可以这里初始化过滤要使用到的 FilterConfig。这个方法由 Web 容器自动调用。doFilter()-进行具体的过滤操作,这个方法以 javax.servlet.ServletRequest 请求信息, javax.servlet.ServletResponse 响应信息,javax.servlet.FilterChain 过滤链。过滤链,在 Web 应 用程序中所有的过滤器会构成一个链状,符合过滤条件的程序将会根据定义的顺序执行所有链中的过滤器。在这个方法中调用 FilterChain 的 doFilter(javax.servlet.ServletRequest, javax.servlet.SerletResponse)方法就可以传递到链中的下一个过滤器。destory()-销毁过滤器,可以在这里释放使用完的资源,例如设置过滤器中 FilterConfig 为 null。(2)StrutsStatics: 定义 Struts 中使用的常量,常量用来获取和设置 Action 上下文以外的对象或其它集合.可以使用如下方式获取这些对象ActionContext context = ActionContext.getContext();HttpServletRequest request = (HttpServletRequest)context.get(HTTP_REQUEST);(3) FilterConfig 接口:一个过滤器配置对象,用于 Servlet 容器传递信息到过滤器在初始化期间.BeanSelectionProvider 类:选择框架实现的关键扩展点,用于装载属性常量.选择的实现是从 container builder 使用的名字定义关联属性,默认名为” struts”例如:获取 requestActionContext.getContext().put(HTTP_REQUEST, request)执行流程: init(FilterConfig filterConfig)初始化过滤器-createDispatcher(filterConfig); 创建调度器,返回带有过滤器参数 Dispatcher-执行 Dispatcher 的 init 方法,首先创建 configurationManager,如果为 null 使用 BeanSelectionProvider. DEFAULT_BEAN_NAME 参数创建.- 配置的初始化/加载 org/apache/struts2/default.properties 文件init_DefaultProperties(); / 1/加载格式相同的 struts-default.xml,struts-plugin.xml,struts.xmlinit_TraditionalXmlConfigurations(); / 2/可读取 public static final String STRUTS_LOCALE = struts.locale;配置init_LegacyStrutsProperties(); / 3/加载 Web.xml 中的 actionPackages 配置init_ZeroConfiguration(); / 4/读取 configProviders 参数,配置用户定义的 providerinit_CustomConfigurationProviders(); / 5/Struts2.0.9中为空init_MethodConfigurationProvider();/初始化 Filter 中的 config 参数中指定的配置文件, initParams 参数的获取是在 Dispatcher 创建时init_FilterInitParameters() ; / 6/在 BeanSelectionProvider 中注册别名init_AliasStandardObjects() ; / 7/读取 public static final String STRUTS_I18N_RELOAD = struts.i18n.reload;参数,Container container = init_PreloadConfiguration();/读取 public static final String STRUTS_CONFIGURATION_XML_RELOAD = struts.configuration.xml.reload;init_CheckConfigurationReloading(container);/初始化 weblogic 相关配置init_CheckWebLogicWorkaround(container);- String param = filterConfig.getInitParameter(packages);String packages = org.apache.struts2.static template org.apache.struts2.interceptor.debugging;设置静态资源 Prefixes-doFilter处理一个 Action 和它请求的静态资源,过滤器尝试配置请求到一个 Action mapping.如果 mapping 找到了,Action 的处理在 dispatcher 的 serviceAction 方法.如果 Action 处理失败,doFilter 将会尝试去创建一个错误页面通过 dispatcher.另外请求一个静态资源,资源将直接 Copy 到响应 ,使用适当的 caching 头设置.如果请求没有匹配一个 Action mapping 或一个静态资源页,那么将通过.(1) getServletContextServlet2.3规范中 Servlet Context 可以从 Session 中从新获取。不幸的是,一些版本的 Weblogic 不能够从新获取从 Filter 的配置中.因此,这个方法允许子类重新获取 Servlet Context 从其它源.(2) prepareDispatcherAndWrapRequest(request, response)包装和返回给定的 request,如果需要,作为处理 multipart data 包装给定的 request.1.dispatcher.prepare(request, response);准备 request,包括设置 encoding 和 locale,使用注入的 public static final String STRUTS_I18N_ENCODING = struts.i18n.encoding、public static final String STRUTS_LOCALE = struts.locale和 public static final String STRUTS_DISPATCHER_PARAMETERSWORKAROUND = struts.dispatcher.parametersWorkaround;(是否使用一个 Servlet request 参数,对一些版本的 Weblogic 是必需的)2.request = dispatcher.wrapRequest(request, getServletContext();首先包装 request,通过预先编码可以使用 multipart/form-data 参数访问的情况.3. mapping = actionMapper.getMapping(request, dispatcher.getConfigurationManager();找到对应的 Action 映射.4. 如果找不到就去查找静态资源.可以设置 public static final String STRUTS_SERVE_STATIC_CONTENT = struts.serve.static;5.然后是正常的 chain.doFilter(request, response);请求传递6. dispatcher.serviceAction(request, response, servletContext, mapping);装载映射的 Acation 类和调用适当的 Action 方法,或直接转向 Result.这个方法首先创建 Action 上下文从给定的参数,并且装载一个 ActionProxy 从给定的 Action 名和 namespace.然后,Action 方法被直行和输出通道通过 response 对象.Action 没有找到,发送到用户是通过 Dispatcher 的 sendError 方法,使用404返回码.所有的其它错误是通过抛出 ServletException 异常.ValueStack stack = (ValueStack) request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);如果已经存在这样的值栈,创建一个新的,拷贝和传递它为新的 Action 所使用. ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace, name, extraContext, true, false);ActionProxy 将会查阅框架的配置文件管理(初始化是从 Struts.xml 文件), 下一步,ActionProxy 创建一个 ActionInvocation,它来负责命令模式的实现. 包括调用拦截器在调用 Action 自身之前. proxy.setMethod(method);设置 Action 调用中要执行的方法.如果没有方法被指定,将会由 Action 的配置来提供.设置 Action 中执行的方法.如果 ActionMapping 直接到一个 resultif (mapping.getResult() != null) Result result = mapping.getResult();result.execute(proxy.getInvocation(); else /没有配置 result 的情况proxy.execute();调用 ActionProxy 接口中的 String execute() throws Exception;方法,它的实现类为 DefaultActionProxy,在其中会调用 retCode = invocation.invoke()方法.ActionInvocation 接口的实现类 DefaultActionInvocation 的 invoke 方法首先调用拦截器栈,如果拦截器执行完,调用 Act
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号