Struts2是
Struts社区和
WebWork社区的共同成果,我们甚至可以说,
Struts2是
WebWork的升级版,他采用的正是
WebWork的核心,所以,
Struts2并不是一个不成熟的产品,相反,构建在
WebWork基础之上的
Struts2是一个运行稳定、性能优异、设计成熟的
WEB
框架。
之前看多一些struts2课程视频,感觉讲得非常棒。但是今天吕海东老师讲的struts2课程,我感到受益匪浅。
他讲课风格是通俗易懂、概念结合程序实例,感觉收获真的非常之大啊。
在此学生希望吕老师身体健康、工作顺心。
一:认识Struts2
1:Struts2是一个基于JavaEE框架(request/response)
2:实现了JavaWeb MVC的VC功能
View(V)功能: ⑴输入:Struts2 FormatTag 如<s:textfield />||<input type="text" />
⑵输出:DataTag(类似于${})+LogicTag(<c:foreach/>)+I18NTag
Controller(C)功能:⑴取得表单数据⑵数据验证⑶数据类型转换⑷调用Model曾方法⑸传递数据⑹跳转到页面
二:Strut2中C、V的具体作用
㈠核心控制器:FilterDispatcher
㈡拦截器:Interceptor
㈢Action:实现具体控制器
㈣Result:负责导航 ->实现转发功能
㈤ActionContex:保存请求中所有数据
㈥ValueStack:保存Action数据
㈦OGNL:表达式语言(类似于EL)
三:Struts2的工作原理
下载的
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
结构
public
class
FilterDispatcher
implements
StrutsStatics, Filter {
}
StrutsStatics
并没有定义业务方法,只定义了若干个常量。
Struts2
对常用的接口进行了重新封装,比如
HttpServletRequest
、
HttpServletResponse
、
HttpServletContext
等。 以下是
StrutsStatics
的定义:
代码清单
8
:
StrutsStatics.java
public
interface
StrutsStatics {
/**
*
Constant
for
the
HTTP
request
object.
*/
public
static
final
String
HTTP_REQUEST
=
"com.opensymphony.xwork2.dispatcher.HttpServletRequest"
;
/**
*
Constant
for
the
HTTP
response
object.
*/
public
static
final
String
HTTP_RESPONSE
=
"com.opensymphony.xwork2.dispatcher.HttpServletResponse"
;
/**
*
Constant
for
an
HTTP
request dispatcher}
.
*/
public
static
final
String
SERVLET_DISPATCHER
=
"com.opensymphony.xwork2.dispatcher.ServletDispatcher"
;
/**
*
Constant
for
the
servlet context}
object.
*/
public
static
final
String
SERVLET_CONTEXT
=
"com.opensymphony.xwork2.dispatcher.ServletContext"
;
/**
*
Constant
for
the
JSP
page context}
.
*/
public
static
final
String
PAGE_CONTEXT
=
"com.opensymphony.xwork2.dispatcher.PageContext"
;
/**
Constant
for
the
PortletContext
object
*/
public
static
final
String
STRUTS_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()
方法
public
void
init(FilterConfig filterConfig)
throws
ServletException {
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()
方法
protected
Dispatcher createDispatcher(FilterConfig filterConfig) {
Map<String,String> params =
new
HashMap<String,String>();
for
(Enumeration e = filterConfig.getInitParameterNames(); e.hasMoreElements(); ) {
String name = (String) e.nextElement();
String value = filterConfig.getInitParameter(name);
params.put(name, value);
}
return
new
Dispatcher(filterConfig.getServletContext(), params);
}
当用户向
Struts2
发送请求时,
FilterDispatcher
的
doFilter()
方法自动调用,这个方法非常关键。首先,
Struts2
对请求对象进行重新包装,此次包装根据请求内容的类型不同,返回不同的对象,如果为
multipart/form-data
类型,则返回
MultiPartRequestWrapper
类型的对象,该对象服务于文件上传,否则返回
StrutsRequestWrapper
类型的对象,
MultiPartRequestWrapper
是
StrutsRequestWrapper
的子类,而这两个类都是
HttpServletRequest
接口的实现。
分享到:
相关推荐
Struts2的入门小实例helloworld,jar包齐全,可以运行。
本章完成一个HelloWorld实例开发的演示,目的是使读者可以对struts2有一个整体的认识,熟悉glassfish2的使用,主要讲解了一个简单的Struts2应用的HelloWorld实例,这个例子可以帮助读者快速入门,获得开发Struts2...
第一个struts框架的完成,使用eclipse写的。第一次写其实是在半年前,现在再重新写,真是错误连篇,最讨厌的是报404错误。首先检查tomcat部署时,有什么错误,针对性解决,大多是因为jar包多了或者少了。有时,jar包...
Struts2 下的HelloWorld 源码 1
第1章 Struts 2概述,第2章 Struts 2下的HelloWorld,第3章 Struts 2基础,第4章 深入Struts 2,第5章 Struts 2的类型转换,第6章 文件的上传和下载.,第7章 Struts 2的拦截器,第8章 Struts 2的输入校验,9.2 ...
2.truts 2权威指南——第2章 Struts 2下的HelloWorld.doc 3.Struts 2权威指南——第3章 Struts 2基础.doc 4.Struts2.0系列(1-15) 5.Struts2中用Spring实现IoC.doc 6.Struts2中的零配置与CoC(Convention over ...
第一部分 Strut 2:一个全新的框架 第1章 Struts 2:现代Web框架 2 1.1 Web应用程序:快速学习 2 1.1.1 构建Web应用程序 2 1.1.2 基础技术简介 3 1.1.3 深入研究 6 1.2 Web应用程序框架 7 1.2.1 什么是框架 7 1.2.2 ...
二、第一个Struts 2.0应用程序——Hello World 下面我们进行臭名昭著的Hello World程序。几乎所有语言的第一个程序都是Hello World。在src目录上右键,新建一个类,参数如下: 类的内容如下: package ...
第二章 HelloWorld你的第一个Struts程序 第三章 MVC概述 第四章 Model模型 第五章 View页面视图 第六章 Controller控制器 第七章 使用Struts连接池 第八章 Struts的异常处理 第九章 Struts的国际化 第十章 Plug-in ...
struts2 总结入门学习文档 教你如何白手起家搭建Struts2开发环境、编写第一个struts2应用helloworld、属性介绍、接口、拦截器介绍、struts2标签等。93页
Struts 2权威指南——第1章 Struts 2概述.doc Struts 2权威指南——第2章 Struts 2下的HelloWorld.doc Struts 2权威指南——第3章 Struts 2基础.doc 01 为Struts 2.0做好准备 02 常用的Struts 2.0的标志(Tag) 03 ...
Struts基础开发,开发第一个struts程序,包括struts开发环境的配置。
里面包括了10个小故事,每个故事都针对一个经典的知识点:第一个故事,讲述如何在Struts2.0里开发你的Hello world第二个故事,模拟登陆,主要是看formbeean对象在action里怎么用第三个故事,操作调用自己的方法,而...
第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...
第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...
01章:本书第1章的工程,只需直接使用JBuider 2005打开即可; 02章:猜数字工程; 03章:登录用例和常用Web组件开发工程以及数据库脚本; 05章:实体Bean开发示例,该示例仅供参考; 08-11章:标记库taglib1应用...
帮你创建第一个struts2,了解struts2的工作流程和原理。
第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...