struts2基础知识和工作流程
2018-01-05 15:34
585 查看
**
框架是人们用于解决相同或者相似类型问题的方案。特点:可重用性,可扩展性,可收缩性。而struts框架是基于mvc设计模式,采用Servlet和Jsp技术来实现的。
大部分框架都是基于请求响应(Request-response)模式的应用Framework的逻辑结构:
控制器(Controller)
业务逻辑层(Business Logic)
数据逻辑层(Data Logic)
也可以说,Struts2 = struts1 + xworks。
truts2相对于struts1来说简单了很多,并且功能强大了很多,我们可以从几个方面来看:
1 > 在软件设计上Struts2没有像struts1那样跟Servlet API和struts API有着紧密的耦合,Struts2的应用可以不依赖于Servlet API和struts API。 Struts2的这种设计属于无侵入式设计,而Struts1却属于侵入式设计。
————–运用大量的装饰者设计模式
2> Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能。
3> Strut2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。在Struts1中,如果我们要实现同样的功能,就必须向Struts1的底层实现BeanUtil注册类型转换器才行。
4> Struts2提供支持多种表现层技术,如:JSP、freeMarker、Velocity等
5> Struts2的输入校验可以对指定方法进行校验,解决了Struts1长久之痛。
6> 提供了全局范围、包范围和Action范围的国际化资源文件管理实现
7>请求参数封装对比:struts2.x使用ModelDriven模式,这样我们 直接 封装model对象,无需要继承任何struts2的基类,避免了侵入性。
8>struts2.x是线程安全的,每一个对象产生一个实例,避免了线程安全问题;而struts1.x在action中属于单线程。
9>标签库几乎可以完全替代JSTL的标签库,并且 struts2.x支持强大的ognl表达式。
1. 实现MVC模式,结构清晰;
2. 丰富的struts的标记库,利用好能大大提高开发效率;
3. 全局结果与声明式异常;
4. 可使用OGNL进行参数传递
5. 各个类方便使用的拦截器
缺点:
1. 转到表现层时,需要配置结果页面;页面多了比较繁杂;
2. 对Servlet的依赖性过强
3. struts标签稍微比el表达式繁重
工作流程大概如下:
1.客户端发出一个指向servlet容器的请求;
2.请求会经过StrutsPrepareAndExecuteFilter过滤器;
3.过滤器和请求将访问struts2的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。
如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一些基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。过滤器会通过询问ActionMapper类来查找请求中需要用到的Action。
4.如果找到需要调用的Action,过滤器会把请求的处理交给ActionProxy。ActionProxy为Action的代理对象。ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类。
5.ActionProxy创建一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,它表示了Action的执行状态,或者说它控制的Action的执行步骤。它持有Action实例和所有的Interceptor。
6.ActionInvocation实例使用命名模式来调用,1. ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在调用Action的过程前后,涉及到相关拦截器(intercepetor)的调用。
7. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
———————————通俗地说:
1发送http请求
2Web服务器(tomcat/weblogic…)启动初始化
3执行struts核心过滤器StrutsPrepareAndExecuteFilter
4加载struts配置文件中配置信息,找到对应的Action类并实例化
5执行各类拦截器和Action中对应方法
6配置文件中找到返回结果
7转发到具体页面或其它操作
注意:struts2读取到struts.xml的内容后,以javabean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件。
关于struts配置文件的加载顺序:
struts-default.xml (核心功能的初始化)
strtus-plugin.xml (struts相关插件)
struts.xml (用户编写的配置文件)
struts.properties (用户自定义配置文件)(可以没有)
struts版本: 2.3
1.引入jar文件
commons-fileupload-1.2.2.jar 【文件上传相关包】
commons-io-2.0.1.jar
struts2-core-2.3.4.1.jar 【struts2核心功能包】
xwork-core-2.3.4.1.jar 【Xwork核心包】
ognl-3.0.5.jar 【Ognl表达式功能支持表】
commons-lang3-3.1.jar 【struts对java.lang包的扩展】
freemarker-2.3.19.jar 【struts的标签模板库jar文件】
javassist-3.11.0.GA.jar 【struts对字节码的处理相关jar】
2.配置web.xml
通过在项目的web.xml中引入过滤器,Struts的核心功能的初始化,通过过滤器完成.
filter 过滤器
init/ 启动执行
doFilter/ 访问执行
destroy
web.xml.
struts2-core-2.3.4.1.jar
StrutsPrepareAndExecuteFilter 即为核心过滤器
注意:
使用的struts的版本不同,核心过滤器类是不一样的!
3.action开发
注意:
1. action类,也叫做动作类; 一般继承ActionSupport类
即处理请求的类 (struts中的action类取代之前的servlet)
2. action中的业务方法,处理具体的请求
4.struts.xml配置
1. 加载项目web.xml
2. 创建Struts核心过滤器对象, 执行filter init()
struts-default.xml, 核心功能的初始化
struts-plugin.xml, struts相关插件
struts.xml 用户编写的配置文件
请求访问:
3. 用户访问Action, 服务器根据访问路径名称,找对应的aciton配置, 创建action对象
4. 执行默认拦截器栈中定义的18个拦截器
5. 执行action的业务处理方法
struts-default.xml, 详解
目录:struts2-core-2.3.4.1.jar/ struts-default.xml
内容:
1. bean节点指定struts在运行的时候创建的对象类型
2.指定struts-default包 【用户写的package(struts.xml)一样要继承此包 】
package struts-default 包中定义了:
a. 跳转的结果类型
dispatcher 转发,不指定默认为转发
redirect 重定向
redirectAction 重定向到action资源
stream (文件下载的时候用)
b. 定义了所有的拦截器
定义了32个拦截器!
为了拦截器引用方便,可以通过定义栈的方式引用拦截器,
此时如果引用了栈,栈中的拦截器都会被引用!
defaultStack
默认的栈,其中定义默认要执行的18个拦截器!
c. 默认执行的拦截器栈、默认执行的action
Framework框架概念
**框架是人们用于解决相同或者相似类型问题的方案。特点:可重用性,可扩展性,可收缩性。而struts框架是基于mvc设计模式,采用Servlet和Jsp技术来实现的。
大部分框架都是基于请求响应(Request-response)模式的应用Framework的逻辑结构:
控制器(Controller)
业务逻辑层(Business Logic)
数据逻辑层(Data Logic)
Struts2比较struts1的优势
Struts2 是在Struts1的基础上,融合了xwork的功能;也可以说,Struts2 = struts1 + xworks。
truts2相对于struts1来说简单了很多,并且功能强大了很多,我们可以从几个方面来看:
1 > 在软件设计上Struts2没有像struts1那样跟Servlet API和struts API有着紧密的耦合,Struts2的应用可以不依赖于Servlet API和struts API。 Struts2的这种设计属于无侵入式设计,而Struts1却属于侵入式设计。
————–运用大量的装饰者设计模式
2> Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能。
3> Strut2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。在Struts1中,如果我们要实现同样的功能,就必须向Struts1的底层实现BeanUtil注册类型转换器才行。
4> Struts2提供支持多种表现层技术,如:JSP、freeMarker、Velocity等
5> Struts2的输入校验可以对指定方法进行校验,解决了Struts1长久之痛。
6> 提供了全局范围、包范围和Action范围的国际化资源文件管理实现
7>请求参数封装对比:struts2.x使用ModelDriven模式,这样我们 直接 封装model对象,无需要继承任何struts2的基类,避免了侵入性。
8>struts2.x是线程安全的,每一个对象产生一个实例,避免了线程安全问题;而struts1.x在action中属于单线程。
9>标签库几乎可以完全替代JSTL的标签库,并且 struts2.x支持强大的ognl表达式。
struts自身的优缺点
优点:1. 实现MVC模式,结构清晰;
2. 丰富的struts的标记库,利用好能大大提高开发效率;
3. 全局结果与声明式异常;
4. 可使用OGNL进行参数传递
5. 各个类方便使用的拦截器
缺点:
1. 转到表现层时,需要配置结果页面;页面多了比较繁杂;
2. 对Servlet的依赖性过强
3. struts标签稍微比el表达式繁重
Struts工作流程
工作流程大概如下:
1.客户端发出一个指向servlet容器的请求;
2.请求会经过StrutsPrepareAndExecuteFilter过滤器;
3.过滤器和请求将访问struts2的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。
如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一些基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。过滤器会通过询问ActionMapper类来查找请求中需要用到的Action。
4.如果找到需要调用的Action,过滤器会把请求的处理交给ActionProxy。ActionProxy为Action的代理对象。ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类。
5.ActionProxy创建一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,它表示了Action的执行状态,或者说它控制的Action的执行步骤。它持有Action实例和所有的Interceptor。
6.ActionInvocation实例使用命名模式来调用,1. ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在调用Action的过程前后,涉及到相关拦截器(intercepetor)的调用。
7. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
———————————通俗地说:
1发送http请求
2Web服务器(tomcat/weblogic…)启动初始化
3执行struts核心过滤器StrutsPrepareAndExecuteFilter
4加载struts配置文件中配置信息,找到对应的Action类并实例化
5执行各类拦截器和Action中对应方法
6配置文件中找到返回结果
7转发到具体页面或其它操作
在web.xml中配置struts过滤器
在web.xml中配置核心过滤器<filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class>
struts.xml配置加载
在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。注意:struts2读取到struts.xml的内容后,以javabean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件。
关于struts配置文件的加载顺序:
struts-default.xml (核心功能的初始化)
strtus-plugin.xml (struts相关插件)
struts.xml (用户编写的配置文件)
struts.properties (用户自定义配置文件)(可以没有)
struts2开发流程
在myeclipse中创建一个web项目。struts版本: 2.3
1.引入jar文件
commons-fileupload-1.2.2.jar 【文件上传相关包】
commons-io-2.0.1.jar
struts2-core-2.3.4.1.jar 【struts2核心功能包】
xwork-core-2.3.4.1.jar 【Xwork核心包】
ognl-3.0.5.jar 【Ognl表达式功能支持表】
commons-lang3-3.1.jar 【struts对java.lang包的扩展】
freemarker-2.3.19.jar 【struts的标签模板库jar文件】
javassist-3.11.0.GA.jar 【struts对字节码的处理相关jar】
2.配置web.xml
通过在项目的web.xml中引入过滤器,Struts的核心功能的初始化,通过过滤器完成.
filter 过滤器
init/ 启动执行
doFilter/ 访问执行
destroy
web.xml.
<!-- 引入struts核心过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
struts2-core-2.3.4.1.jar
StrutsPrepareAndExecuteFilter 即为核心过滤器
注意:
使用的struts的版本不同,核心过滤器类是不一样的!
3.action开发
注意:
1. action类,也叫做动作类; 一般继承ActionSupport类
即处理请求的类 (struts中的action类取代之前的servlet)
2. action中的业务方法,处理具体的请求
public class HelloAction extends ActionSupport { // 处理请求 public String execute() throws Exception { return "success"; } }
4.struts.xml配置
<package name="hello" namespace="/test" extends="struts-default"> <action name="helloworld_*" class="test.action.HelloWorldAction" method="{1}"> <result name="success">/WEB-INF/page/hello.jsp</result> </action> </package>
Struts2执行流程
服务器启动:1. 加载项目web.xml
2. 创建Struts核心过滤器对象, 执行filter init()
struts-default.xml, 核心功能的初始化
struts-plugin.xml, struts相关插件
struts.xml 用户编写的配置文件
请求访问:
3. 用户访问Action, 服务器根据访问路径名称,找对应的aciton配置, 创建action对象
4. 执行默认拦截器栈中定义的18个拦截器
5. 执行action的业务处理方法
struts-default.xml, 详解
目录:struts2-core-2.3.4.1.jar/ struts-default.xml
内容:
1. bean节点指定struts在运行的时候创建的对象类型
2.指定struts-default包 【用户写的package(struts.xml)一样要继承此包 】
package struts-default 包中定义了:
a. 跳转的结果类型
dispatcher 转发,不指定默认为转发
redirect 重定向
redirectAction 重定向到action资源
stream (文件下载的时候用)
b. 定义了所有的拦截器
定义了32个拦截器!
为了拦截器引用方便,可以通过定义栈的方式引用拦截器,
此时如果引用了栈,栈中的拦截器都会被引用!
defaultStack
默认的栈,其中定义默认要执行的18个拦截器!
c. 默认执行的拦截器栈、默认执行的action
<default-interceptor-ref name="defaultStack"/> <default-class-ref class="com.opensymphony.xwork2.ActionSupport" /> <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/> <interceptor name="params"class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
相关文章推荐
- 基础知识普及帖:百度搜索引擎的工作流程
- 仓管员工作指导手册,仓库管理员基础知识与日常工作流程
- 【struts基础】Struts2工作基本流程
- Struts2基本流程及基础知识问答
- 基础知识普及帖:百度搜索引擎的工作流程
- 浏览器是怎样工作的(一):基础知识 转载http://ued.ctrip.com/blog/how-browsers-work-i-basic-knowledge.html
- javaweb随笔(二)------struts2工作流程
- Struts2基础知识
- 【每日工作-第一天、第二天】Java基础知识
- strtus2 批量下载 中文问题、压缩文件等 ------ 讨论struts2工作流程
- Struts2的工作流程和容易忽略的问题
- 工作中能用到的基础知识总结(二)
- struts2核心工作流程与原理
- 浏览器是怎样工作的(一):基础知识
- java新手web开发学习笔记--基础知识和(struts,hibeinate,spring)ssh框架流程
- Struts2的工作流程
- struts2基础知识(一)
- Struts2知识点回顾(五)拦截器的工作流程以及如何实现
- Java程序员从笨鸟到菜鸟之(四十一)细谈struts2(五)action基础知识和数据校验
- struts2核心工作流程与原理