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”压缩包中应该包含了所有必要的库文件,确保项目能够正常运行。 接下来,创建一个简单的Action类。在Struts2中,Action类需要继承自`com.opensymphony.xwork2.ActionSupport`...
在这个"Struts2 HelloWorld"程序中,我们将深入理解Struts2的基本结构和配置,以及如何创建第一个简单的应用。 首先,让我们从环境搭建开始。为了运行Struts2的HelloWorld程序,你需要安装Java Development Kit ...
### Struts2 实例 HelloWorld 知识点解析 #### 一、概述 在学习Struts2框架时,通常会从最简单的“Hello World”实例开始。这种实例不仅可以帮助初学者快速上手,还能让大家对Struts2的工作原理有一个基本的理解。...
这个"Struts2_HelloWorld"项目是初学者学习Struts2框架的理想起点。它提供了一个简单的示例,帮助开发者理解如何在实际环境中设置和运行一个基本的Struts2应用。 首先,我们需要了解Struts2的核心概念。Struts2是...
本篇文章将引导你逐步了解如何使用Struts2创建你的第一个"Hello, World!"应用程序,同时解决项目中可能出现的依赖问题。 在开始之前,确保你已经安装了Java开发环境(JDK)和Apache Maven或Apache Ant,这两个工具...
这个“struts2,helloworld例子”是针对初学者的一个典型教程,旨在帮助开发者快速理解和掌握Struts2的基本用法。 首先,我们需要在MyEclipse这样的集成开发环境中搭建Struts2项目环境。这通常包括以下几个步骤: 1...
本篇学习笔记将引导我们从零开始,通过一个简单的"HelloWorld"项目,了解Struts2的基础知识。 首先,我们需要在本地环境中搭建Struts2的开发环境。这包括安装JDK、配置Java环境变量、下载Apache Struts2的最新版本...
这个"struts2 HelloWorld最小必备包"是初学者入门Struts2框架的起点,它包含了运行一个简单的"Hello, World!"示例所需的所有核心组件。 1. **Struts2 Core** (`struts2-core-2.5.2.jar`): 这是Struts2框架的核心...
本章节我们将深入解析“第二章 Struts2 下的HelloWorld 源码 1”这一主题,通过分析源代码,理解Struts2的核心工作原理以及其基本配置。 在Struts2中,HelloWorld程序是初学者入门的经典示例,它帮助我们快速掌握...
在本文中,我们将深入探讨如何使用IntelliJ IDEA 2017.3版本来创建一个基于Struts2框架的第一个Web应用程序。Struts2是一个强大的、开源的MVC(Model-View-Controller)框架,它简化了Java Web开发,提高了代码的可...
对于初学者来说,"Struts2制作HelloWorld"是理解并掌握该框架的第一步。下面我们将深入探讨这个过程涉及的主要知识点。 1. **Struts2项目的搭建**:创建一个Struts2项目通常包括以下几个步骤: - 引入Struts2的...
本教程将深入探讨如何创建并运行你的第一个Struts2程序。 首先,我们需要了解Struts2的核心概念。Struts2框架提供了一种分层架构,它通过Action类处理用户请求,Action类与业务逻辑交互,并通过Result返回视图。...
4. **创建第一个Action**:在src/main/java目录下创建一个新的Java类,例如`HelloWorldAction`,实现Struts2的Action接口。代码如下: ```java package com.example.helloworld; import ...
现在我们可以创建第一个Struts2动作类。在src目录下创建一个包(例如com.example.struts2),然后创建一个Java类,如"HelloWorldAction",继承自`com.opensymphony.xwork2.ActionSupport`。在这个类中,定义一个返回...
本文将引导你踏上Struts 2的自学之旅,从准备工作开始,逐步介绍如何创建并运行你的第一个“Hello, World!”程序。 ### 1. Struts 2 框架简介 Struts 2是Apache软件基金会的一个开源项目,它是基于MVC(Model-View-...
Struts2是一个强大的MVC(Model-View-Controller)框架,广泛应用于Java Web开发中。在本示例中,"struts2完整的Hello Word例子"是帮助开发者理解并熟悉...对于初学者,理解并实践这些步骤是掌握Struts2的第一步。
对于初学者来说,理解并动手实践Struts2的第一个实例是非常重要的,这将帮助他们快速掌握该框架的基本用法。下面,我们将详细讲解如何创建并运行一个简单的Struts2应用实例。 首先,你需要确保已经安装了Java SDK和...
第一个struts框架的完成,使用eclipse写的。第一次写其实是在半年前,现在再重新写,真是错误连篇,最讨厌的是报404错误。首先检查tomcat部署时,有什么错误,针对性解决,大多是因为jar包多了或者少了。有时,jar包...
这个例子简单地演示了如何设置Struts2环境,创建第一个Action并显示简单的输出。 通过以上这些实例,你可以逐步学习和掌握Struts2的配置、Action、拦截器、结果类型、OGNL表达式、数据绑定、国际化、安全等方面的...