您的位置:首页 > 编程语言 > Java开发

struts2基础知识和工作流程

2018-01-05 15:34 585 查看
**

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"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息