- 浏览: 1591280 次
- 性别:
- 来自: 吉林
文章分类
- 全部博客 (624)
- C/C++ (33)
- Java (181)
- 网络相关 (7)
- 我爱篮球 (3)
- 也爱足球 (4)
- 杂谈 (1)
- 系统架构 (3)
- Web Service (14)
- Framework (3)
- 系统命令 (8)
- 管理平台相关 (8)
- 其它 (35)
- Websphere (1)
- Struts2 (24)
- Hibernate (16)
- Spring (23)
- javascript (20)
- jquery (23)
- html/css/div (28)
- 数据库 (40)
- JavaWeb (27)
- 设计模式 (2)
- 文档编写 (3)
- SVN (5)
- Ant (1)
- Maven (13)
- 软件项目管理 (8)
- AOP (1)
- kindeditor (1)
- JSON (2)
- Servlt/JSP (4)
- WordXML (2)
- XML (12)
- 面试相关 (7)
- Tomcat (11)
- 性能与调优 (29)
- 职业发展 (2)
- 操作系统 (7)
- AJAX (2)
- DWR (1)
- Eclipse (12)
- 持续集成 (3)
- 批处理命令 (1)
- Mozilla Rhino (2)
- 新鲜技术 (18)
- Apache mina (2)
- 底层技术 (18)
- Linux (22)
- 新鲜技术,IT历史 (1)
- 敏捷开发 (1)
- 版本控制 (5)
- 较火技术 (7)
- 集群 (2)
- Web前端 (13)
- 报表工具 (3)
- 网站架构 (5)
- 大数据 (8)
- 分布式存储 (5)
- 云计算 (8)
- TCP/IP协议 (1)
- 负载均衡 (3)
- 硬件 (1)
- 表现层技术 (3)
- Velocity (3)
- jvm (6)
- 并发编程 (10)
- hadoop (8)
- 数据结构和算法 (12)
- 计算机原理 (1)
- 测试驱动开发-TDD (3)
- 开发技巧 (1)
- 分词器 (1)
- 项目构建工具 (2)
- JMX (4)
- RMI (1)
- 测试技术 (22)
- 网络完全 (1)
- Git (4)
- apache开源包 (4)
- Java常用 (1)
- mock (2)
- OSGi (2)
- MongoDB (1)
- JBPM (1)
- Storm (3)
- mysql (2)
- telnet (1)
- 正则表达式 (1)
- bootstrap (4)
- Apache ActiveMQ (1)
- redis (9)
- Nginx (2)
- rsync+inotify文件同步 (2)
- testng (1)
- 原型设计工具 (1)
- 工程能力 (1)
- 风险控制 (3)
- ibatis (1)
- 分布式 (4)
- 安全技术 (1)
- 计算机基础 (4)
- 消息中间件 (1)
- UML (2)
最新评论
-
u012236967:
java命令执行jar包(里面的main函数)的方式(包括依赖其它的jar包问题) -
世界尽头没有你:
Selenium自动化测试从入门到精通(Java版)百度网盘地 ...
自动化测试工具 Selenium WebDriver 入门教程(针对主流浏览器) -
小小西芹菜:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
dwr实现Reverse Ajax推送技术的三种方式 -
hellozhouqiao:
楼主,请教一点问题.现在我们需要在excel 的页脚里面加上图 ...
FreeMaker + xml 导出word(处理目录,图片和页眉页脚问题) -
乱在长安:
使用Timer会有各种各样的问题好嘛?!书上推荐使用Sched ...
DelayQueue (ScheduledThreadPoolExecutor调度的实现)
读者如果曾经学习
过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。实际上Struts1.x与Struts2并无我
们想象的血缘关系。虽然Struts2的开发小组极力保留Struts1.x的习惯,但因为Struts2的核心设计
完全改变,从思想到设计到工作流程,都有了很大的不同。
Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以
说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在
WebWork基础之上的Struts2是一个运行稳定、性能优异、设计成熟的WEB 框架。
本章主要对Struts的源代码进行分析,因为Struts2与WebWork的关系如此密不可分,因此,读者需要下载xwork的源代码,访问http://www.opensymphony.com/xwork/download.action 即可自行下载。
下
载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到struts-
2.1.0-src"struts-2.0.10"src"core"src"main"java 目录下查看Struts2的源文件,如图14所示。
(图14)
主要的包和类
Struts2
框架的正常运行,除了占核心地位的xwork的支持以外,Struts2本身
也提供了许多类,这些类被分门别类组织到不同的包中。从源代码中发现,基本上每一个Struts2类都访问了WebWork提供的功能,从而也可以看出
Struts2与WebWork千丝万缕的联系。但无论如何,Struts2的核心功能比如将请求委托给哪个Action处理都是由xwork完成
的,Struts2只是在WebWork的基础上做了适当的简化、加强和封装,并少量保留Struts1.x中的习惯。
以下是对各包的简要说明:
包名
说明
org.apache.struts2. components
该包封装视图组件,Struts2在视图组件上有了很大加强,不仅增加了组件的属性个数,更新增了几个非常有用的组件,如updownselect、doubleselect、datetimepicker、token、tree等。
另外,Struts2可视化视图组件开始支持主题(theme),缺省情况下,使用自带的缺省主题,如果要自定义页面效果,需要将组件的theme属性设置为simple。
org.apache.struts2. config
该包定义与配置相关的接口和类。实际上,工程中的xml和properties文件的读取和解析都是由WebWork完成的,Struts只做了少量的工作。
org.apache.struts2.dispatcher
Struts2的核心包,最重要的类都放在该包中。
org.apache.struts2.impl
该包只定义了3个类,他们是StrutsActionProxy、StrutsActionProxyFactory、StrutsObjectFactory,这三个类都是对xwork的扩展。
org.apache.struts2.interceptor
定义内置的截拦器。
org.apache.struts2.util
实用包。
org.apache.struts2.validators
只定义了一个类:DWRValidator。
org.apache.struts2.views
提供freemarker、jsp、velocity等不同类型的页面呈现。
下表是对一些重要类的说明:
类名
说明
org.apache.struts2.dispatcher. Dispatcher
该类有两个作用:
1、初始化
2、调用指定的Action的execute()方法。
org.apache.struts2.dispatcher. FilterDispatcher
这是一个过滤器。文档中已明确说明,如果没有经验,配置时请将url-pattern的值设成/*。
该类有四个作用:
1、执行Action
2、清理ActionContext,避免内存泄漏
3、处理静态内容(Serving static content)
4、为请求启动xwork’s的截拦器链。
com.opensymphony.xwork2. ActionProxy
Action的代理接口。
com.opensymphony.xwork2. ctionProxyFactory
生产ActionProxy的工厂。
com.opensymphony.xwork2.ActionInvocation
负责调用Action和截拦器。
com.opensymphony.xwork2.config.providers. XmlConfigurationProvider
负责Struts2的配置文件的解析。
Struts2的工作机制
3.1Struts2体系结构图
Strut2的体系结构如图15所示:
(图15)
3.2Struts2的工作机制
从图15可以看出,一个请求在Struts2框架中的处理大概分为以下几个步骤:
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、
一旦Action执行完毕,ActionInvocation负责根据
struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者
FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。
注:以上步骤参考至网上,具体网址已忘记。在此表示感谢!
3.3Struts2源代码分析
和Struts1.x不同,Struts2的启动是通过FilterDispatcher过滤器实现的。下面是该过滤器在web.xml文件中的配置:
代码清单6:web.xml(截取)
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Struts2建议,在对Struts2的配置尚不熟悉的情况下,将url-pattern配置为/*,这样该过滤器将截拦所有请求。
实际上,FilterDispatcher除了实现Filter接口以外,还实现了StrutsStatics接口,继承代码如下:
代码清单7:FilterDispatcher结构
publicclassFilterDispatcherimplementsStrutsStatics, Filter {
}
StrutsStatics
并没有定义业务方法,只定义了若干个常量。Struts2对常用
的接口进行了重新封装,比如HttpServletRequest、HttpServletResponse、HttpServletContext等。
以下是StrutsStatics的定义:
代码清单8:StrutsStatics.java
publicinterfaceStrutsStatics {
/**
*ConstantfortheHTTPrequestobject.
*/
publicstaticfinalStringHTTP_REQUEST="com.opensymphony.xwork2.dispatcher.HttpServletRequest";
/**
*ConstantfortheHTTPresponseobject.
*/
publicstaticfinalStringHTTP_RESPONSE="com.opensymphony.xwork2.dispatcher.HttpServletResponse";
/**
*ConstantforanHTTPrequest dispatcher}.
*/
publicstaticfinalStringSERVLET_DISPATCHER="com.opensymphony.xwork2.dispatcher.ServletDispatcher";
/**
*Constantfortheservlet context}object.
*/
publicstaticfinalStringSERVLET_CONTEXT="com.opensymphony.xwork2.dispatcher.ServletContext";
/**
*ConstantfortheJSPpage context}.
*/
publicstaticfinalStringPAGE_CONTEXT="com.opensymphony.xwork2.dispatcher.PageContext";
/**ConstantforthePortletContextobject*/
publicstaticfinalStringSTRUTS_PORTLET_CONTEXT="struts.portlet.context";
}
容器启动后,FilterDispatcher被实例化,调用 init(FilterConfig
filterConfig)方法。该方法创建Dispatcher类的对象,并且将FilterDispatcher配置的初始化参数传到对象中(详情请
参考代码清单10),并负责Action的执行。然后得到参数packages,值得注意的是,还有另外三个固定的包和该参数进行拼接,分别是
org.apache.struts2.static、template、和
org.apache.struts2.interceptor.debugging,中间用空格隔开,经过解析将包名变成路径后存储到一个名叫
pathPrefixes的数组中,这些目录中的文件会被自动搜寻。
代码清单9:FilterDispatcher.init()方法
publicvoidinit(FilterConfig filterConfig)throwsServletException {
this.filterConfig = filterConfig;
dispatcher = createDispatcher(filterConfig);
dispatcher.init();
String param = filterConfig.getInitParameter("packages");
String packages ="org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
if(param !=null) {
packages = param +" "+ packages;
}
this.pathPrefixes= parse(packages);
}
代码清单10:FilterDispatcher.createDispatcher()方法
protectedDispatcher createDispatcher(FilterConfig filterConfig) {
Map<String,String> params =newHashMap<String,String>();
for(Enumeration e = filterConfig.getInitParameterNames(); e.hasMoreElements(); ) {
String name = (String) e.nextElement();
String value = filterConfig.getInitParameter(name);
params.put(name, value);
}
returnnewDispatcher(filterConfig.getServletContext(), params);
}
当用户向Struts2发送请求时,FilterDispatcher的
doFilter()方法自动调用,这个方法非常关键。首先,Struts2对请求对象进行重新包装,此次包装根据请求内容的类型不同,返回不同的对象,
如果为multipart/form-data类型,则返回MultiPartRequestWrapper类型的对象,该对象服务于文件上传,否则返回
StrutsRequestWrapper类型的对象,MultiPartRequestWrapper是StrutsRequestWrapper的子
类,而这两个类都是HttpServletRequest接口的实现。包装请求对象如代码清单11所示:
代码清单11:FilterDispatcher.prepareDispatcherAndWrapRequest()方法\
1. Struts2架构图
这是Struts2官方站点提供的Struts 2 的整体结构。
2. Struts2部分类介绍
这部分从Struts2参考文档中翻译就可以了。
ActionMapper
ActionMapper其实是HttpServletRequest和Action调用请求的一个映射,它屏蔽了Action对于Request等
java
Servlet类的依赖。Struts2中它的默认实现类是DefaultActionMapper,ActionMapper很大的用处可以根据自己的
需要来设计url格式,它自己也有Restful的实现,具体可以参考文档的docs\actionmapper.html。
ActionProxy&ActionInvocation
Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是
由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而
ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。
ConfigurationProvider&Configuration
ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤其实现类
XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。
3. Struts2请求流程
1、客户端发送请求
2、请求先通过ActionContextCleanUp-->FilterDispatcher
3、FilterDispatcher通过ActionMapper来决定这个Request需要调用哪个Action
4、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,这儿已经转到它的Delegate--Dispatcher来执行
5、ActionProxy根据ActionMapping和ConfigurationManager找到需要调用的Action类
6、ActionProxy创建一个ActionInvocation的实例
7、ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用
8、Action执行完毕,ActionInvocation创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。添加PreResultListener可以在Interceptor中实现。
另一个版本:大同小异~
一个请求在Struts2框架中的处理大概分为以下几个步骤:
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);
- }
- }
4.
FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。
5.
ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类.
如上文的struts.xml配置
- <?xml version= "1.0" encoding= "GBK" ?>
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
- <struts>
- <include file="struts-default.xml" />
- <package name= "struts2" extends = "struts-default" >
- <action name="add"
- class = "edisundong.AddAction" >
- <result>add.jsp</result>
- </action>
- </package >
- </struts>
如果提交请求的是add.action,那么找到的Action类就是edisundong.AddAction。
6.
ActionProxy
创建一个ActionInvocation的实例,同时ActionInvocation通过代理模式调用Action。但在调用之前
ActionInvocation会根据配置加载Action相关的所有Interceptor。(Interceptor是struts2另一个核心级
的概念)
下面我们来看看ActionInvocation是如何工作的:
ActionInvocation
是Xworks 中Action 调度的核心。而对Interceptor
的调度,也正是由ActionInvocation负责。ActionInvocation 是一个接口,
而DefaultActionInvocation 则是Webwork 对ActionInvocation的默认实现。
Interceptor 的调度流程大致如下:
1. ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。
2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。
Interceptor
将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、WebWork的许多功能
都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运
行。
那么什么是拦截器。
拦截器就是AOP(Aspect-Oriented Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。)
拦截器的例子这里就不展开了。
struts-default.xml文件摘取的内容:
- < interceptor name = "alias" class = "com.opensymphony.xwork2.interceptor.AliasInterceptor" />
- < interceptor name ="autowiring" class = "com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor" />
- < interceptor name ="chain" class = "com.opensymphony.xwork2.interceptor.ChainingInterceptor" />
- < interceptor name ="conversionError" class = "org.apache.struts2.interceptor.StrutsConversionErrorInterceptor" />
- < interceptor name ="createSession" class = "org.apache.struts2.interceptor.CreateSessionInterceptor" />
- < interceptor name ="debugging" class = "org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
- < interceptor name ="external-ref" class = "com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor" />
- < interceptor name ="execAndWait" class = "org.apache.struts2.interceptor.ExecuteAndWaitInterceptor" />
- < interceptor name ="exception" class = "com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor" />
- < interceptor name ="fileUpload" class = "org.apache.struts2.interceptor.FileUploadInterceptor" />
- < interceptor name ="i18n" class = "com.opensymphony.xwork2.interceptor.I18nInterceptor" />
- < interceptor name ="logger" class = "com.opensymphony.xwork2.interceptor.LoggingInterceptor" />
- < interceptor name ="model-driven" class = "com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor" />
- < interceptor name ="scoped-model-driven" class = "com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor" />
- < interceptor name ="params" class = "com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
- < interceptor name ="prepare" class = "com.opensymphony.xwork2.interceptor.PrepareInterceptor" />
- < interceptor name ="static-params" class = "com.opensymphony.xwork2.interceptor.StaticParametersInterceptor" />
- < interceptor name ="scope" class = "org.apache.struts2.interceptor.ScopeInterceptor" />
- < interceptor name ="servlet-config" class = "org.apache.struts2.interceptor.ServletConfigInterceptor" />
- < interceptor name ="sessionAutowiring" class = "org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor" />
- < interceptor name ="timer" class = "com.opensymphony.xwork2.interceptor.TimerInterceptor" />
- < interceptor name ="token" class = "org.apache.struts2.interceptor.TokenInterceptor" />
- < interceptor name ="token-session" class = "org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
- < interceptor name ="validation" class = "com.opensymphony.xwork2.validator.ValidationInterceptor" />
- < interceptor name ="workflow" class = "com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor" />
- < interceptor name ="store" class = "org.apache.struts2.interceptor.MessageStoreInterceptor" />
- < interceptor name ="checkbox" class = "org.apache.struts2.interceptor.CheckboxInterceptor" />
- < interceptor name ="profiling" class = "org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
7.
一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。如上文中将结构返回“add.jsp”,但大部分时候都是返回另外一个action,那么流程又得走一遍………
发表评论
-
Struts2与Velocity整合
2014-02-19 17:13 2339转自:http://yjhexy.iteye.com/ ... -
Velocity简介和Velocity与Jsp、Freemarker的对比(java常用的三种表现层技术)
2014-02-19 17:09 1447Velocity 是一个基于java ... -
学习Struts2 jQuery Plugin 3.0(转)(此外还有struts-jquery-grid-tags, showcase等)
2014-01-14 20:04 1373from:http://blog.csdn.net/ld_f ... -
KindEditor上传图片问题
2013-03-19 15:24 3412转自:http://www.cnblogs.com/jav ... -
使用SVN检出Struts Spring Hibernate源码
2013-02-05 16:50 1364Spring Spring源码是由springframewo ... -
Servlet与Struts action线程安全问题分析
2012-08-23 10:22 1184Servlet/JSP技术和ASP、PHP等相比,由于其多线程 ... -
Struts2上传文件过大的反馈处理
2012-08-23 09:42 2385问题描述:前段时间在struts2下做文件上传,当上传大文件时 ... -
Struts2的addActionError() 与addFieldError ()
2012-08-23 09:41 1098addActionError() 与addFieldError ... -
struts2中<s:property value="xx"/>的工作原理
2012-08-20 10:18 1717使用struts2标签的jsp页面中<s:propert ... -
struts2的线程安全(好好看看)(在理解不扎实与测试下自己砸了理解的真理)
2012-08-08 15:57 2950转自:http://japi.iteye.com/blog/4 ... -
struts2下利用json进行文件上传和下载遇到的一些问题(暂时未明白)
2012-07-16 16:52 1323上传文件时:利用jquery的ajaxfileupload异步 ... -
struts2文件下载(使用struts2配置方式和单纯response方式)
2012-07-16 16:43 1871若是使用类似Servlet方式下载,可以通过ServletAc ... -
struts2文件上传(单个文件和多个文件)
2012-07-16 16:38 19701. 文件上传的原理: 表单元素的encty ... -
探究Struts2运行机制:StrutsPrepareAndExecuteFilter 源码剖析 (转)
2012-07-13 15:22 1210作者:niumd blog:http://ari.i ... -
Struts2的StrutsPrepareAndExecutefilter与FilterDispatcher
2012-07-13 15:18 988FilterDispatcher是早期struts2的过滤器, ... -
OGNL遍历list和map以及访问四个范围的属性值
2012-07-11 17:23 2350转自:http://blog.csdn.net/a9529 ... -
struts2的result为chain的跳转问题(参数设置)
2012-07-09 14:59 2637本文章非原创,本文章抄录于http://blog.sina.c ... -
struts2拦截器(转)
2012-07-01 13:52 1213转自:http://www.blogjava.ne ... -
Struts2返回JSON数据的具体应用范例(转)
2012-06-29 09:20 1408早在我刚学Struts2之初 ... -
从源代码角度看Struts2返回JSON数据的原理(转)
2012-06-28 23:30 2082前面一篇文章其实只是介绍了如何在Struts2中返回JSON数 ...
相关推荐
struts2工作原理、请求响应流程。。。。。。。。。。。。。。。
### 二、Struts2工作流程详解 #### 1. 请求初始化 一切始于客户端发起的HTTP请求,该请求通常包含用户提交的数据和请求的资源标识符。请求首先到达Web服务器的Servlet容器,如Apache Tomcat。 #### 2. 过滤器链 ...
Struts1 工作原理浅析 一、Struts1 工作原理概述 Struts1 是一个基于 MVC 模式的 Web 应用框架,它的工作原理可以分为三个部分:Model、View 和 Controller。Model 负责处理业务逻辑,View 负责表现层,Controller...
理解Struts2的工作原理是深入学习和有效利用该框架的关键。下面将详细介绍Struts2的工作流程。 1. **请求接收**:当用户在浏览器中提交一个HTTP请求时,这个请求首先会被Web服务器(如Apache Tomcat)接收到。如果...
在深入理解Struts的工作原理之前,我们先来简单回顾一下MVC模式的基本概念: **Model(模型)**:这是应用程序的核心业务逻辑,通常由Java Beans或Enterprise JavaBeans (EJBs)实现,它们处理数据和业务规则。 **...
#### Struts2工作流程 1. **用户提交请求**:客户端通过HTTP协议向服务器发送请求。 2. **FilterDispatcher拦截请求**:所有的请求首先被FilterDispatcher捕获。 3. **ActionMapper确定Action**:...
【标题】:“Hibernate、Spring和Struts工作原理及使用理由” 【内容】: Hibernate是一个流行的Java持久化框架,它的核心工作原理主要包括以下步骤: 1. **读取并解析配置文件**:Hibernate通过读取hibernate....
Struts1是Apache组织开发的一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它简化了开发...实际开发中,虽然Struts1已经被Struts2和其他现代框架取代,但了解其工作原理对理解和使用其他框架仍然有裨益。
Struts2的设计理念和工作流程与WebWork框架相似,可以认为Struts2是对WebWork的升级和扩展,吸收了WebWork的优点,同时改进了Struts1的一些不足,如更简洁的配置和更强大的动作映射。 8. **集成其他框架**: ...
### Struts2工作原理深度解析 #### 引言 Struts2框架,作为Java Web开发领域的一款重要工具,其设计理念源自于WebWork框架,并融合了Struts1的优点,旨在提供更为强大、灵活的MVC(Model-View-Controller)架构...
学习的时候总结出来的,相当清晰的描述了struts2
`struts原理.txt`文件可能包含了文字描述,进一步解释了Struts2的核心概念和机制,比如Action的配置、结果映射、拦截器的实现方式,以及Struts2如何整合其他技术,如Spring或Hibernate进行依赖注入和持久化操作。...
Struts2 工作原理及拦截器和过滤器 Struts2 框架的工作原理可以分为以下几个步骤: 1. 客户端发出一个指向 Servlet 容器的请求(Tomcat); 2. 这个请求会经过几个过滤器,最后会到达 FilterDispatcher 过滤器。...
### Struts2工作原理 #### 一、Struts2简介 Struts2是Apache软件基金会的一个开源项目,它是Struts1的下一代版本,基于WebWork框架,并融合了Struts1的一些特性,形成了一个新的MVC(Model-View-Controller)框架...
**Struts2原理:** Struts2是在Struts1的基础上发展起来的,它融合了WebWork框架的许多特性。Struts2的核心是.struts2-struts.xml配置文件,它定义了Action和Result。请求到达时,由FilterDispatcher(或后来的...