本篇内容介绍了“Struts2工作原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
Struts2 的工作原理如下图所示。这里我们一步步介绍每一步的核心内容。
1.客户端初始化一个对Servlet容器(如Tomcat)的请求
2.这个请求通过一系列过滤器(其中一个是可选的过滤器,称为 ActionContextCleanUp,它对于集成 Struts 2 和其他框架,例如 SiteMesh Plugin 很有用)。
3.然后调用FilterDispatcher,FilterDispatcher询问Action Mapper来决定这个请求是否需要调用一个Action。
FilterDispatcher是控制器的核心,也是mvc中c控制层的核心。下面粗略分析一下我理解的filter Dispatcher工作流程和原理:Filter Dispatcher初始化和核心doFilter启用
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 抛出 IOException, ServletException ...{ HttpServletRequest 请求 = (HttpServletRequest) 请求; HttpServletResponse 响应 = (HttpServletResponse) res; ServletContext servletContext = filterConfig .getServletContext(); //这里处理HttpServletRequest和HttpServletResponse。 DispatcherUtils du = DispatcherUtils .getInstance(); du.prepare(request, response);//像方法名一样进行locale、encoding和特殊请求参数设置。 尝试 ...{ request = du .wrapRequest(request, servletContext);//打包请求 } 捕捉 (IOException e) ...{ String message = "无法使用 MultipartRequestWrapper 包装 servlet 请求!" ; LOG.error(消息,e); 抛出新的 ServletException(消息,e); } ActionMapperIF mapper = ActionMapperFactory .getMapper();//获取动作映射器 ActionMapping mapping = mapper .getMapping(request);//映射获取动作 如果(映射 ==空)...{ // 这个请求中没有任何动作,我们应该寻找静态资源吗? String resourcePath = RequestUtils .getServletPath(request); if ("".equals(resourcePath) && null != request.getPathInfo()) ...{ resourcePath = 请求.getPathInfo(); } if ("true".equals(Configuration.get(WebWorkConstants.WEBWORK_SERVE_STATIC_CONTENT)) && resourcePath.startsWith("/webwork")) ...{ 字符串 名称 = resourcePath .substring("/webwork".length()); findStaticResource(名称,响应); } 别的 ...{ // 这是一个正常的请求,让它通过 链.doFilter(请求,响应); } // WW 在这里完成了它的工作 返回; } 对象 o = null ; 尝试 ...{ //setupContainer(请求); o = beforeActionInvocation (request, servletContext); //下面分析整个框架的核心方法。 du.serviceAction(请求,响应,servletContext,映射); } 最后 ...{ afterActionInvocation(request, servletContext, o); ActionContext.setContext(null); } } du.serviceAction(请求,响应,servletContext,映射); //该方法询问Action Mapper是否需要调用Action来处理请求。如果 Action Mapper 决定需要调用某个 Action,FilterDispatcher 就会处理对 ActionProxy 的请求。 public void serviceAction(HttpServletRequest request, HttpServletResponse response, String namespace, String actionName, Map requestMap, Map parameterMap, Map sessionMap, Map applicationMap) ...{ HashMap extraContext = createContextMap (requestMap, parameterMap, sessionMap, applicationMap, request, response, getServletConfig()); //实例化Map请求,询问ActionMapper是否需要调用Action来处理请求。 extraContext.put(SERVLET_DISPATCHER, 这个); OgnlValueStack 堆栈 = (OgnlValueStack) request.getAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY); 如果(堆栈!= null)...{ extraContext.put(ActionContext.VALUE_STACK,new OgnlValueStack(stack)); } 尝试 ...{ ActionProxy 代理 = ActionProxyFactory .getFactory().createActionProxy(namespace, actionName, extraContext); //这里的actionName是通过两个getAction Name通道解析的。FilterDispatcher 处理对 ActionProxy 的请求。这是 Servlet Dispatcher 的 TODO:。 request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, proxy.getInvocation().getStack()); proxy.execute(); //ActionProxy通过代理方式执行 如果(堆栈!= null)...{ request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY,stack); } } 捕捉(配置异常 e)...{ log.error("找不到动作", e); 发送错误(请求,响应,HttpServletResponse.SC_NOT_FOUND,e); } 捕捉(异常 e)...{ log.error("无法执行动作", e); sendError(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e); } }
4.如果ActionMapper决定需要调用一个Action,FilterDispatcher处理对ActionProxy的请求
5.ActionProxy通过ConfigurationManager查询框架的配置文件,找到需要调用的Action类。在这里,我们通常从 struts.xml 中读取配置。
6.ActionProxy 创建一个 ActionInvocation 的实例。
7.ActionInvocation 实例使用命名方式调用。在Action调用前后,都涉及到Intercepter的调用。
“Struts2工作原理是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。