- 浏览: 420257 次
- 性别:
- 来自: 济南
文章分类
最新评论
-
pmh905001:
写的很详尽,感谢!
解析jvm.dll和java.exe -
Bll:
插得真深啊,我的是(eclipse_j2ee_juno):F: ...
在eclipse里jsp编译后的java和class文件的位置 -
heming_way:
谢谢,对我很有用,解答了我对多值依赖的疑问
关于多值依赖--范式! -
JavaStudy2011:
java语言解析xml文件 -
vrussell:
Thanks man, it helps me a lot!
获得IEditorPart和IDocument
1. 客户端提起一个(HttpServletRequest)请求,如上文在浏览器中输入”http://localhost:8080/TestMvc/add.action”就是提起一个(HttpServletRequest)请求。
2. 请 求被提交到一系列(主要是三层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher)。注意这里是有顺序的,先ActionContextCleanUp,再其他过滤器(SiteMesh等)、最后到 FilterDispatcher。
3. FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。下面粗略的分析下我理解的FilterDispatcher工作流程和原理:
//FilterDispatcher进行初始化并启用核心doFilter //其代码如下: public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException ...{ HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; ServletContext servletContext = filterConfig.getServletContext(); // 在这里处理了HttpServletRequest和HttpServletResponse。 DispatcherUtils du = DispatcherUtils.getInstance(); du.prepare(request, response);//正如这个方法名字一样进行locale、encoding以及特殊request parameters设置 try ...{ request = du.wrapRequest(request, servletContext);//对request进行包装 } catch (IOException e) ...{ String message = "Could not wrap servlet request with MultipartRequestWrapper!"; LOG.error(message, e); throw new ServletException(message, e); } ActionMapperIF mapper = ActionMapperFactory.getMapper();//得到action的mapper ActionMapping mapping = mapper.getMapping(request);// 得到action 的 mapping if (mapping == null) ...{ // there is no action in this request, should we look for a static resource? String resourcePath = RequestUtils.getServletPath(request); if ("".equals(resourcePath) && null != request.getPathInfo()) ...{ resourcePath = request.getPathInfo(); } if ("true".equals(Configuration.get(WebWorkConstants.WEBWORK_SERVE_STATIC_CONTENT)) && resourcePath.startsWith("/webwork")) ...{ String name = resourcePath.substring("/webwork".length()); findStaticResource(name, response); } else ...{ // this is a normal request, let it pass through chain.doFilter(request, response); } // WW did its job here return; } Object o = null; try ...{ //setupContainer(request); o = beforeActionInvocation(request, servletContext); //整个框架最最核心的方法,下面分析 du.serviceAction(request, response, servletContext, mapping); } finally ...{ afterActionInvocation(request, servletContext, o); ActionContext.setContext(null); } } du.serviceAction(request, response, servletContext, mapping); //这个方法询问ActionMapper是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个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来处理这个(request)请求 extraContext.put(SERVLET_DISPATCHER, this); OgnlValueStack stack = (OgnlValueStack) request.getAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY); if (stack != null) ...{ extraContext.put(ActionContext.VALUE_STACK,new OgnlValueStack(stack)); } try ...{ ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, actionName, extraContext); //这里actionName是通过两道getActionName解析出来的, FilterDispatcher把请求的处理交给ActionProxy,下面是ServletDispatcher的 TODO: request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, proxy.getInvocation().getStack()); proxy.execute(); //通过代理模式执行ActionProxy if (stack != null)...{ request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY,stack); } } catch (ConfigurationException e) ...{ log.error("Could not find action", e); sendError(request, response, HttpServletResponse.SC_NOT_FOUND, e); } catch (Exception e) ...{ log.error("Could not execute action", e); sendError(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e); } }
ActionProxy创建一个ActionInvocation的实例,同时ActionInvocation通过代理模式调用Action。但在调用之前ActionInvocation会根据配置加载Action相关的所有Interceptor。(Interceptor是struts2另一个核心级的概念)
发表评论
-
IE中的条件编译
2011-10-30 18:53 2082引用条件编译介绍 在IE有一个几乎没人知道的特性--“条件编 ... -
ClientAbortException: java.net.SocketException: Connection reset by peer: socke
2011-10-13 14:25 1描述下问题 tomcat报错 ClientAbortExc ... -
(转)实现Ajax请求队列按顺序执行
2011-10-07 10:23 5508摘自http://www.ilovejs.net/archiv ... -
关于无法delete文件
2011-09-26 17:12 1425File f=new File(targetDir+&qu ... -
firefox上传文件
2011-09-23 15:19 2189先看一个实例: jsp <tr class=" ... -
HTML标签的<button>导致数据在firefox自动提交和在firefox里面弹出div窗口失败
2011-09-07 15:22 1797项目中遇到这么个问题 项目中想利用div制造弹出窗口的操作 c ... -
转:Div自适应高度
2011-08-04 14:49 1519由于设计页面需要,要把两个并排显示的div实现一样高的效果,n ... -
在eclipse里jsp编译后的java和class文件的位置
2011-08-03 14:08 10271eclipse版本不一样,位置也不一样 第一种:(网上搜到的) ... -
iframe的属性:document和Document以及Document的属性和iframe在各个浏览器获得内部文档的写法
2011-08-03 11:37 2121.document引用到是的 iframe所在页面对象, .D ... -
浏览器加载显示html的顺序
2011-08-02 15:36 2319其实浏览器加载显示html的顺序是按下面的顺序进行的: 1、I ... -
PreparedStatement setString 特殊字符乱码
2011-07-29 13:27 2254PreparedStatement setString 特殊字 ... -
符编码笔记:ASCII,Unicode和UTF-8
2011-07-29 10:37 934阮一峰 日期: 2007年10月28日 1. ASCII码 ... -
自己写的多表单插入数据和几个form同时提交
2011-07-28 18:40 3137<%@ page language="ja ... -
获得IEditorPart和IDocument
2011-04-18 13:08 2049IWorkbench workbench=Platform ... -
黑客利用js--alert(1)
2011-03-14 12:51 2891Javascript代码 ($=[$=[]][(__=!$+ ... -
Tomcat的Classloader
2010-08-27 17:48 4252Tomcat的启动是从解析bat文件开始,bat文件最终调用o ... -
Tomcat启动过程
2010-08-11 15:03 1178今天在独立的Tomcat中部署LifeRay Portal , ... -
Spring中bean的作用域
2010-08-10 13:44 1826如何使用spring的作用域 ... -
@SuppressWarnings("*****")
2010-08-07 16:25 1086解释一: 屏蔽某些编译时的警告信息 ... -
各种类型文件中java的形式
2010-08-06 17:35 1330.a' : 'application/octet-s ...
相关推荐
### Struts2运行机制详解 #### 一、Struts2框架概述 Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用框架,它为开发者提供了构建可扩展、易于维护的Web应用程序的工具。Struts2不仅继承了...
本篇文章将深入解析Struts1框架的执行原理,以及Action、ActionServlet、ActionForm三个关键组件的工作机制。 首先,我们来看Struts1的工作流程: 1. 用户通过浏览器发起HTTP请求,请求的目标是应用中的一个JSP或...
总的来说,Struts2的工作流程大致为:请求到达->过滤器Dispatcher拦截->查找Action映射->创建Action实例->执行拦截器链->调用Action的execute方法->返回Result->渲染视图。这种设计允许开发者将业务逻辑、数据验证、...
开发者可以根据需要组合和配置拦截器栈,这些拦截器会在Action执行前后按顺序执行。 视图组件在Struts2中得到了增强,例如,Struts2提供了一系列组件如updownselect、doubleselect、datetimepicker、token和tree等...
Action 之间的跳转是 Struts2 框架中的一种机制,允许不同的 Action 之间进行跳转,以实现复杂的业务逻辑。这种机制可以分为两种类型:chain 和 redirect-action。 1. Chain 类型 当 type 为 chain 时,说明是 ...
### JSP 文件运行机制详解 #### 一、JSP 文件的基本概念 JSP(Java Server Pages)是一种基于Java技术的动态网页技术标准。它允许在HTML文档中嵌入Java代码和表达式,使得Web页面能够根据请求动态生成内容。通过...
2. **拦截器(Interceptors)**:Struts2的拦截器机制允许开发者定义一系列处理请求的规则,如日志记录、权限检查、事务管理等,这些规则可以在Action执行前后被调用,提高了代码的复用性和模块化。 3. **结果类型...
2. `ACTION_ALL_APPS`:这个Action通常用于列出手机上安装的所有应用程序。用户可以通过此Action查看和启动不同应用。 3. `ACTION_ALTERNATIVE`:此Category表示Activity提供了用户浏览数据的另一种操作选择。它常...
Struts2通过Action类的校验机制,帮助开发者实现这一目标。下面我们将深入探讨Struts2如何对Action中的所有方法进行校验。 首先,Struts2的校验机制基于两个主要组件:Validator和ValidationInterceptor。Validator...
这个拦截器是Struts2默认包含的,它会在Action执行链中寻找合适的处理策略。在`struts-default.xml`或自定义的配置文件中,可以定义异常到结果的映射,这样当特定类型的异常发生时,就会跳转到预先定义的结果页面。...
在Struts框架中,通常通过配置文件(struts.xml)定义Action,并且在用户请求到达时,框架会根据请求参数匹配相应的Action执行逻辑。然而,在某些场景下,我们希望在不进行任何用户交互的情况下就执行某些逻辑,比如在...
2. **update**:在Action执行期间的每个时间步调用,提供当前的进度。 3. **stop**:Action结束时调用,可以用于清理或恢复初始状态。 4. **reverse**:返回一个与当前Action相反的动作,常用于动画反向播放。 五、...
3. **Interceptors (拦截器)**: 拦截器用于处理Action执行前后的一系列操作,如验证、数据填充等。 #### 三、Action动态方法调用原理 在Struts 2中,动态方法调用是指通过配置文件指定Action类中的特定方法来响应...
1. **标准流程控制**:最常见的应用场景是在一个Action执行完毕后,根据特定的逻辑条件选择不同的ActionForward,从而决定是显示某个JSP页面还是调用另一个Action。 2. **携带参数的转发**:通过在ActionForward的...
综上所述,Struts的运行机制是通过配置文件、控制器组件(ActionServlet和RequestProcessor)、ActionForm以及Action对象的交互来实现对客户端请求的处理,并将处理结果呈现给用户。这种机制使得开发者能够以一种...
通过上述分析可以看出,Struts2提供了丰富的特性来支持Web应用程序的开发,尤其是通过Namespace和ActionMethod等机制来组织和管理Action,以及利用通配符配置来简化配置文件,大大提高了开发效率和维护性。