Struts
控制器组件负责接受用户请求、更新模型,以及选择合适的视图组件返回给用户。控制器组件有助于将模型层和视图层分离,有了这种分离,就可以在同一个模型的基础上得心应手地开发多种类型的视图。
Struts
控制器组建主要包括:
·
ActionServlet
组件:充当
Struts
框架的中央控制器。
·
RequestProcessor
组件:充当每个子应用模块的请求处理器。
·
Action
组件:负责处理一项具体的业务。
Struts
框架采用控制器组件来预处理所有的客户请求,这种集中控制方式可以满足
MVC
设计模式的两大需求:
·首先,控制器在用户输入数据和模型之间充当媒介
/
翻译者的角色,提供一些通用功能,如安全、登入和其他针对具体用户请求的重要服务,当系统的这些通用功能出现需求变更时,部需要修改整个应用,只需要修改局部的控制器组件即可。
·其次,由于所有的请求都经过控制器过滤,因此可以降低视图组件之间,以及视图组件和模型组件之间的相互依赖关系,提高每个组件的相对独立性。由控制器组件来决定把合适的视图组件返回给用用户,这可以减少视图组件之间直接的,错综复杂的连接关系,使应用更加灵活,便于维护。
Struts
框架采用
ActionServlet
和
RequestProcessor
组件进行集中控制,并采用
Action
组件来处理单项业务。
一
控制器组件的控制机制
Struts
的控制器组件主要完成以下任务:
·接受用户请求
·根据用户请求,调用合适的模型组件来执行相应的业务逻辑。
·获取业务逻辑执行结果。
·根据当前状态以及业务逻辑执行结果,选择合适的视图组件返回给用户。
1 Action
类
org.apache.struts.action.ActionServlet
类是
Struts
框架的核心控制器组件,所有的用户请求都先有
ActionServlet
来处理,然后再由
ActionServlet
把请求转发给其他组件。
Struts
框架只允许在一个应用中配置一个
ActionServlet
类,在应用的生命周期中,仅创建
ActionServlet
类的一个实例,这个
ActionServlet
实例可以同时响应多个用户请求。
<!--[if !supportLists]-->(a) <!--[endif]-->Struts框架初始化过程
<!--[if !supportLists]-->(1) <!--[endif]-->调用initInternal()方法,初始化Struts框架内在的消息资源,如与系统日志相关的同志、警告和错误消息。
<!--[if !supportLists]-->(2) <!--[endif]-->调用initOther()方法,从web.xml文件中加载ActionServlet的初始化参数,如config参数。
<!--[if !supportLists]-->(3) <!--[endif]-->调用initServlet()方法,从web.xml文件中加载ActionServlet的URL映射信息。此外还会注册web.xml和Struts配置文件所使用的DTD文件,这些DTD文件用来验证web.xml和Struts配置文件的语法。
<!--[if !supportLists]-->(4) <!--[endif]-->调用initModuleConfig()方法,加载并解析子应用模块的Struts配置文件;创建ModuleConfig对象,把它存储在ServletContext中。
<!--[if !supportLists]-->(5) <!--[endif]-->调用initModuleMessageResources()方法,加载并初始化默认子应用模块的消息资源:创建MessageResources对象,把它存储在ServletContext中。
<!--[if !supportLists]-->(6) <!--[endif]-->调用initModuleDataSources()方法,加载并初始化默认子应用模块的数据源。如果在Struts配置文件中没有定义<data-sources>元素,就忽略这一流程。
<!--[if !supportLists]-->(7) <!--[endif]-->调用InitModulePlugins()方法,加载并初始化默认子应用模块的所有插件。
<!--[if !supportLists]-->(8) <!--[endif]-->当默认子应用模块被成功地初始化后,如果还包括其他子应用模块,将重复流程(4)~(7),分别对其他子应用模块进行初始化。
<!--[if !supportLists]-->(b) <!--[endif]-->ActionServlet的process()方法
当
ActionServlet
实例接受到
HTTP
请求之后,在
doGet()
或
doPost()
方法都会调用
process()
方法来处理请求。一下是
ActionServlet
的
process()
方法的源代码:
protected voidprocess (HttpServletRequest request, HttpServletResponse response)
throwIOException, ServletException {
ModuleUtils.getInstance().selectModule(request,getServletContext());
getRequestProcessor(getModuleConfig(request)).process(request,response);
}
在
process()
方法中,首先调用
org.apache.struts.util.ModuleUtils
类的
selectModule()
方法,这个方法选择负责处理当前请求的子应用模块,然后把与子应用模块相关的
ModuleConfig
和
MessageResources
对象存储倒
request
范围中,这使得框架的其余组件可以方便地从
request
范围中读取这些对象,从而获取应用配置信息和消息资源。
process()
方法的第二步操作为获得
RequestProcessor
类的实例,然后调用
RequestProcessor
类的
process()
方法,来完成十几的预处理请求操作。
<!--[if !supportLists]-->(c) <!--[endif]-->扩展ActionServlet类
在
Sturts 1.1
之前的版本中,
ActionServlet
类本身包含了很多处理请求的代码。从
Struts 1.1
开始,多数功能被移到
org.apache.struts.action.RequestProcessor
类中,以便减轻
ActionServlet
类的控制负担。
尽管新版本的
Struts
框架允许在应用中创建矿展
ActionServlet
类的子类,但是这在多数情况下没有必要,因为控制器的多数控制功能位于
RequestProcessor
类中。
如果实际应用确实需要创建自己的
ActionServlet
类,则可以创建一个
ActionServlet
的子类,然后在
web.xml
文件中配置这个客户化
ActionServlet
类。
如果覆盖了
init()
方法,应该确保首先调用
super.init()
,它保证
ActionServlet
的默认初始化操作被执行。除了覆盖
init()
方法外,事实上,还可以根据十几需要覆盖
ActionServlet
的任何其他方法。
2 RequestProcessor
类
对于多应用模块的
Struts
应用,每个子应用模块都有各自的
RequestProcessor
实例。在
ActionServlet
的
process()
方法中,一旦选择了正确的子应用模块,就会调用子应用模块的
RequestProcessor
实例的
process()
方法来处理请求。在
ActionServlet
调用这个方法时,会把当前的
request
和
response
对象传给它。
Struts
框架只允许应用中存在一个
ActionServlet
类,但是可以存在多个客户化的
RequestProcessor
类,每个子应用模块都可以拥有单独的
RequestProcessor
类。如果想修改
RequestProcessor
类的一些默认功能,可以覆盖
RequestProcessor
基类中的相关方法。
<!--[if !supportLists]-->(a) <!--[endif]-->RequestProcessor类的process()方法
RequestProcessor
类的
process()
方法负责实际的预处理请求操作。
RequestProcessor
类的
process()
方法一次执行一下流程:
(1)
调用
processMultipart()
方法。如果
HTTP
请求方式为
POST
,并且请求的
contentType
属性以“
multipart/form-data
”开头,标准的
HttpServletRequest
对象将被重新包装,以方便处理“
multipart
”类型的
HTTP
请求。如果请求方式为
GET
,或者
contentType
属性不是“
multipart
”,就直接返回原始的
HttpServletRequest
对象。
(2)
调用
processPath()
方法,获得请求
URI
的路径,这一信息可用于选择合适的
Struts Action
组件。
(3)
调用
processLocale()
方法,当
ControllerConfig
对象的
locale
属性为
true
,将读取用户请求中包含的
Locale
信息,然后把
Locale
实例保存在
session
范围内。
(4)
调用
processContent()
方法,读取
ControllerConfig
对象的
contentType
属性,然后调用
response.setContentType(contentType)
方法,设置响应结果的文档类型和字符编码。
(5)
调用
processNoCache()
方法,读取
ControllerConfig
对象的
nocache
属性,如果
nocache
属性为
true
,在响应结果中将加入特定的头参数:
Pragma
、
Cache-Control
和
Expires
,防止页面被存储在客户浏览器的缓存中。
(6)
调用
processPreprocess()
方法。该方法不执行任何操作,直接返回
true
。子类可以覆盖这个方法,执行客户化的预处理请求操作。
(7)
调用
processMapping()
方法,寻找和用户请求的
URI
匹配的
ActionMapping
。如果不存在这样的
ActionMapping
,则向用户返回恰当的错误消息。
(8)
调用
processRoles()
方法,先判断是否为
Action
配置了安全角色,如果配置了安全角色,就调用
isUserRole()
方法判断当前用户是否具备必需的角色;如果不具备,就结束请求处理流程,向用户返回恰当的错误消息。
(9)
调用
processActionForm()
方法,先判断是否为
ActionMapping
配置了
ActionForm
,如果配置了
ActionForm
,就先从
ActionForm
的存在范围内寻找该
ActionForm
实例;如果不存在,就创建一个实例。接下来把它保存在合适的范围中,保存时使用的属性
key
为
ActionMapping
的
name
属性。
(10)
调用
processActionForm()
方法。如果为
ActionMapping
配置了
ActionForm
,就先调用
ActionForm
的
reset()
方法,再把请求中的表单数据组装到
ActionForm
中。
(11)
调用
processValidate()
方法,如果为
ActionMapping
配置了
ActionForm
,并且
ActionMapping
的
validate
属性为
true
,就调用
ActionForm
的
validate()
方法。如果
validate()
方法返回的
ActionErrors
对象中包含
ActionMessage
对象,说明表单验证失败,就把
ActionErrors
对象存储在
request
范围内,再把请求转发到
ActionMapping
的
input
属性指定的
Web
组件。如果
ActionForm
的
validate()
方法执行表单验证成功,就继续执行下一步请求处理流程。
(12)
调用
processForward()
方法,判断是否在
ActionMapping
中配置了
forward
属性。如果配置了这个属性,就调用
RequestDispatcher
的
forward()
方法,请求处理流程结束,否则继续下一步。
(13)
调用
processInclude()
方法,判断是否在
ActionMapping
中配置了
include
属性。如果配置了这个属性,就调用
RequestDispatcher
的
include()
方法,请求处理流程结束,否则继续下一步。
(14)
调用
processActionCreate()
方法,先判断是否在
Action
缓存中存在这个
Action
实例,如果不存在,就创建一个
Action
实例,把它保存在
Action
缓存中。
(15)
调用
processActionPerform()
方法,该方法再调用
Action
实例的
execute()
方法。
execute()
方法位于
try/catch
代码中,以便捕获异常。
(16)
调用
processActionForward()
方法,把
Action
的
execute()
方法返回的
ActionForward
对象作为参数传给它。
processActionForward()
根据
ActionForward
对象包含的请求转发信息来执行请求转发或重定向。
<!--[if !supportLists]-->(b) <!--[endif]-->扩展RequestProcessor类
开发人员可以很方便地创建客户化的
RequestProcessor
类。
在
Struts
配置文件中,
<controller>
元素的
processorClass
属性
RequestProcessor
类。
3 Action
类
Action
类是用户请求和业务逻辑之间的桥梁。每个
Action
充当客户的一项业务代理。在
RequestProcessor
类预处理请求时,在创建了
Action
的实例后,就调用自身的
processActionPerform()
方法,该方法再调用
Action
类的
execute()
方法。
Action
的
execute()
方法调用模型的业务方法,完成用户请求的业务逻辑,然后根据执行结果把请求转发给其他合适的
Web
组件。
<!--[if !supportLists]-->(a) <!--[endif]-->Action类缓存
为了确保线程安全
(thread-safe)
,在一个应用的生命周期中,
Struts
框架只会为每个
Action
类创建一个
Action
实例。所有的客户请求共享一个
Action
实例,并且所有请求线程可以同时执行它的
execute()
方法。
RequestProcessor
类包含一个
HashMap
,作为存放所有
Action
实例的缓存,每个
Action
实例在缓存中存放的属性
key
为
Action
类名。在
RequestProcessor
类的
processActionCreate()
方法中,首先检查在
HashMap
中是否存在
Action
实例,如果存在,就返回这个实例;否则,就创建一个新的
Action
实例。创建
Action
实例的代码位于同步代码块中,以保证只有一个线程创建
Action
实例。一旦线程创建了
Action
实例并把它存放到
HashMap
中,以后所有的线程就会直接使用这个缓存中的实例。
<!--[if !supportLists]-->(b) <!--[endif]-->ActionForward类
Action
类的
execute()
方法返回一个
ActionForward
对象。
ActionForward
对象代表了
Web
资源的逻辑抽象,这里的
Web
资源可以是
JSP
页、
Java Servlet
或
Action
。从
execute()
方法中返回
ActionForward
对象有两种方法:
·
在
execute()
方法中动态创建一个
ActionForward
实例
·
在
Struts
配置文件中配置
<forward>
元素。
配置了
<forward>
元素后,在
Struts
框架初始化时就会创建存放
<forward>
元素;
在
execute()
方法中只需调用
ActionMapping
实例的
findForward()
方法,来获取特定的
ActionForward
实例。
findForward()
方法先调用
findForwardConfig()
方法,在
Action
级别(即
<action>
元素内的
<forward>
子元素)寻找匹配的
ActionForward
对象。如果没有,再在全局级别(即
<global-forwards>
元素内的
<forward>
子元素)中寻找匹配的
ActionForward
对象。如果找到,就返回该
ActionForward
对象。如果
findForward()
方法没有找到匹配的
ActionForward
对象,它不会抛出异常,而是返回
null
。在浏览器端,用户将收到一个空白页。
采用第二种方式,无需在程序中硬编码来指定转发资源的无力路径,而是在配置文件中配置转发资源,程序中秩序引用转发资源的逻辑名即可,这提高了应用的灵活性和可维护性。
<!--[if !supportLists]-->(c) <!--[endif]-->创建支持多线程的Action类
在
Struts
应用的生命周期中,只会为每个
Action
类创建一个实例,所有的客户请求共享这个实例。因此,必需保证在多线程环境中,
Action
也能正常工作。保证线程安全的重要元素是在
Action
类中仅仅使用局部变量,谨慎地使用实例变量。
如果在
Action
的
execute()
方法中定义了局部变量,对于每个调用
execute()
方法的线程,
Java
虚拟机会在每个线程的堆栈中创建局部变量,因此每个线程拥有独立的局部变量,不会被其他线程共享。当线程执行完
execute()
方法时,它的局部变量就会被销毁。
如果在
Action
类中定义了实例变量,那么在
Action
实例的整个生命周期中,这个实例变量被所有的请求线程共享。因此不能在
Action
类中定义代表特定客户状态的实例变量。
在
Action
类中定义的实例变量代表了可以被所有请求线程访问的共享资源。为了避免共享资源的竞争,在必要的情况下,需要采用
Java
同步机制对访问共享资源的代码块进行同步。
(d)Action
类的安全
在某些情况下,如果
Action
类执行的功能非常重要,则只允许具有特定权限的用户才能访问该
Action
。为了防止未授权的用户来访问
Action
,可以在配置
Action
时指定安全角色。
<action>
元素的
roles
属性指定访问这个
Action
的用户必须具备的安全角色,多个角色之间以逗号隔开。
RequestProcessor
类在预处理请求时会调用自身的
processRoles()
方法,该方法先检查在配置文件中是否未
Action
配置了安全角色,如果配置了安全角色,就调用
HttpServletRequest
的
isUserInRole()
方法,来判断用户是否具备了必要的安全角色。如果不具备,就直接向客户端返回错误。
二
使用内置的
StrutsAction
类
Struts
提供了一些现成的
Action
类,在
Struts
应用中直接使用这些
Action
类可以大大节省开发时间。
1 org.apache.struts.actions.ForwardAction
类
在
JSP
网页中,尽管可以直接通过
<jsp:forward>
标签把请求转发给其他
Web
组件,但是
Struts
框架提倡先把请求转发给控制器,再由控制器来负责请求转发。
有控制器来负责请求转发有以下一些优点:
·控制器具有预处理请求功能,它能够选择正确的子应用模块来处理请求,并且把子应用模块的
ModuleConfig
和
MessageResources
对象存放在
request
范围内。这样,请求转发的目标
Web
组件就可以正常地访问
ModuleConfig
和
MessageResources
对象。
·如果
JSP
页面中包含
HTML
表单,那么控制器能够创建和这个表单对应的
ActionForm
对象,把用户输入表单数据组装到
ActionForm
中。如果
<action>
元素的
validate
属性为
true
,那么还会调用
ActionForm
的表单验证方法。控制器把
ActionForm
对象存放在
request
或
session
范围内,这样请求转发的目标
Web
组件也可以访问
ActionForm
。
·
JSP
网页之间直接相互转发违背了
MVC
的分层原则,按照
MVC
设计思想,控制器负责处理所有请求,然后选择适当的视图组件返回给用户,如果直接让
JSP
相互调用,控制器就失去了流程控制作用。
对于用户自定义的
Action
类,既可以负责请求转发,还可以充当客户端的业务代理,如果仅仅需要
Action
类提供请求转发功能,则可以使用
org.apache.struts.actions.ForwardAction
类。
ForwardAction
类专门用于转发请求,不执行任何其他业务操作。
ActionServlet
把请求转发给
ForwardAction
,
ForwardAction
再把请求转发给
<action>
元素中
parameter
属性指定的
Web
组件。总之,在
Web
组件之间通过
ForwardAction
类来进行请求转发,可以充分利用
Struts
控制器的预处理请求功能。此外,也可以通过
<action>
元素的
forward
属性来实现请求转发。
2 org.apache.struts.actions.IncludeAction
类
在
JSP
网页中,尽管可以直接通过
<include>
指令包含另一个
Web
组件,但是
Struts
框架提倡先把请求转发给控制器,再由控制器来负责包含其他
Web
组件。
IncludeAction
类提供了包含其他
Web
组件的功能。与
ForwardAction
一样,
Web
组件通过
IncludeAction
类来包含另一个
Web
组件,可以充分利用
Struts
控制器的预处理功能。
<action>
的
paramter
属性指定需要包含的
Web
组件。此外,也可以通过
<action>
元素的
include
属性来包含
Web
组件。
3 org.apache.struts.actions.DispatchAction
类
通常,在一个
Action
类中,只能完成一种业务操作,如果希望在同一个
Action
类中完成一组相关的业务操作,可以使用
DispatchAction
类。
创建一个扩展
DispatchAction
类的子类,不必覆盖
execute()
方法,而是创建一些实现实际业务操作的方法,这些业务方法都应该和
execute()
方法具有同样的方法签名,即他们的参数和返回类型都应该相同,此外也应该声明抛出
Exception
。
在配置
DispatchAction
类时,需要把
parameter
属性设置为“
method
”。设置之后,当用户请求访问
DispatchAction
时,应该提供
method
请求参数。
4 org.apache.struts.actions.LookupDispatchAction
类
LookupDispatchAction
类是
DispatchAction
的子类,在
LookupDispatchAction
类中也可以定义多个业务方法。通常
LookupDispatchAction
主要应用于在一个表单中有多个提交按钮,而这些按钮又有一个共同的名字的场合,这些按钮的名字和具体的
ActionMapping
的
parameter
属性值相对应。
在
Struts
配置文件中配置
LookUpDispatchAction
:
在
<action>
元素中,设置
parameter
属性时,需要使它和
<html:submit>
标签的
property
属性保持一致。
5 org.apache.struts.actions.SwitchAction
类
SwitchAction
类用于子应用模块之间的切换。对于请求访问
SwitchAction
的
URL
,需要提供两个参数:
·
prefix
:指定子应用模块的前缀,以“
/
”开头,默认子应用模块的前缀为空字符串“”。
·
page
:指定被请求
Web
组件的
URI
,只需指定相对于被切换后的子应用模块的相对路径。
三
利用
Token
解决重复提交
在某些情况下,如果用户对同一个
HTML
表单多次提交,
Web
应用必需能够判断用户的重复提交行为,以作出相应的处理。
可以利用同步令牌(
Token
)机制来解决
Web
应用中重复提交的问题,
Struts
也给出了一个参考实现。
org.apache.struuts.action.Action
类中提供了一系列和
Token
相关的方法:
·
protected boolean isTokenValid(javax.servlet.http.HttpServletRequestrequest)
判断存储在当前用户会话中的令牌值和请求参数中的令牌值是否匹配。如果匹配,就返回
true
,否则返回
false
。只要符合一下情况之一,就返回
false
:
·不能存在
HttpSession
对象。
·在
session
范围内没有保存令牌值。
·在请求参数中没有令牌值
·存储在当前用户
session
范围内的令牌值和请求参数中的令牌值不匹配。
·
protected voidresetToken(javax.servlet.http.HttpServletRequest request)
从当前
session
范围内删除令牌属性。
·
protected voidsaveToken(javax.servlet.http.HttpServletRequest request)
创建一个新的令牌,并把它保存在当前
session
范围内。如果
HttpSession
对象不存在,就首先创建一个
HttpSession
对象。
具体的
Token
处理逻辑由
org.apache.struts.util.TokenProcessor
类来完成,它的
generateToken(request)
方法根据用户会话
ID
和当前系统时间来生成一个唯一的令牌。
四
实用类
在创建
Web
应用时,有许多检索和处理
HTTP
请求的操作时重复的。为了提高应用代码的可重用性,减少冗余,
Struts
框架提供了一组提供这些通用功能的实用类,它们可以被所有的
Struts
应用共享。
1 RequestUtils
类
org.apache.struts.util.RequestUtils
为
Struts
控制框架提供了一些处理请求的通用方法。
RequestUtils
类中的所有方法都是线程安全的,在这个类中没有定义任何实例变量,所有的方法都被声明为
static
类型。因此,不必创建
RequestUtils
类的实例,可以直接通过类名来访问这些方法。
RequestUtils
类的常用方法
方法
|
描述
|
absoluteURL(HttpServletRequest request,String utl)
|
创建并返回绝对
URL
路径,参数
path
指定相对于上下文(
context-relative
)的相对路径
|
createActionForm(HttpServletRequest request, ActionMapping mapping, ModuleConfig moduleConfig, ActionServlet servlet)
|
先从
request
或
session
范围内查找该
ActionForm
,如果存在,就直接将它返回,否则先创建它的实例,把它保存在
request
或
session
范围内,再把它返回。
mapping
参数包含了
<action>
元素的配置信息,例如它的
scope
属性指定
ActionForm
的范围
|
populate(Object bean, HttpServletRequest request)
|
把
HTTP
请求中的参数值组装到指定的
JavaBean
中,请求的参数名和
JavaBean
的属性名匹配。当
ActionServlet
把用户输入的表单数据组装到
ActionForm
中时,就调用此方法
|
2 TagUtils
类
org.apache.struts.taglib.TagUtil
类为
JSP
标签处理类提供了许多实例方法,如果要使用
TagUtils
类,首先应调用
TagUtils.getInstance()
方法,获得
TagUtils
类的实例,
getInstance()
方法为静态方法。
TagUtils
类的常用方法
方法
|
描述
|
getInstance()
|
返回一个
TagUtils
的实例。该方法为静态的,如果要在程序中获得
TagUtils
的实例,可以调用
TagUtils.getInstance()
方法
|
getActionMessages(PageContext pageContext, String paramName)
|
调用
pageContext.findAttribute(paramName)
方法,从
page, request, session
和
application
范围内减缩并返回
ActionMessages
对象,参数
paramName
指定检索
ActionMessages
对象的属性
key
|
getModuleConfig(PageContext pageContext)
|
返回
ModuleConfig
对象,如果不存在,就返回
null
|
lookup(PageContext pageContext, String name, String scope)
|
返回特定范围内的
JavaBean
。参数
scope
指定
JavaBean
的所在范围,
name
参数指定
JavaBean
在特定范围内的名字
|
message(PageContext pageContext, String bundle, String locale, String key)
|
从指定的
Resource Bundle
中返回一条消息文本,参数
locale
指定
Locale
,参数
key
指定消息
key
|
write(PageContext pageContext, String text)
|
向网页上输入特定的文本,参数
text
用于指定文本内容
|
3 ModuleUtils
类
org.apache.struts.taglib.ModuleUtils
类提供了处理子应用模块的实用方法,如果要使用
ModuleUtils
类,首先应该调用
ModuleUtils.getInstance()
方法,获得
ModuleUtils
类的实例,
getInstance()
方法为静态方法。
ModuleUtils
类的常用方法
方法
|
描述
|
getInstance()
|
返回一个
ModuleUtils
的实例。该方法为静态的,如果要在程序中获得
ModuleUtils
的实例,可以调用
ModuleUtils.getInstance()
方法。
|
getModuleConfig(javax.servlet.http.HttpervletRequest request)
|
从
request
范围内检索并返回
ModuleConfig
对象
|
getModuleConfig(java.lang.String prefix, javax.servlet.ServletContext context)
|
从
application
范围内检索并返回
ModuleConfig
对象,参数
prefix
指定子应用模块名的前缀
|
getModuleName(javax.servlet.http.HttpServletRequest request, javax.servlet.ServletContext context)
|
返回请求访问的子应用模块的名字
|
selectModule(javax.servlet.http.HttpServletRequest request, javax.servlet.ServletContext context)
|
选择请求访问的子应用模块,把和子应用模块相关的
ModuleConfig
和
MessageResources
对象存储到
request
范围中
|
4 Globals
类
org.apache.struts.Globals
类提供一组公共类型的静态常量,被用作在特定范围内存放
JavaBean
的属性
key
。
Globals
类中定义的常量
方法
|
描述
|
ACTION_SERVLET_KEY
|
代表在
application
范围内存放
ActionServlet
实例的属性
key
|
DATA_SOURCE_KEY
|
代表在
application
范围内存放默认的
DataSource
实例的属性
key
|
ERROR_KEY
|
代表在
request
范围内存放
ActionErrors
实例的属性
key
|
LOCALE_KEY
|
代表在
session
范围内存放
Locale
实例的属性
key
|
MAPPING_KEY
|
代表在
request
范围内存放
ActionMapping
实例的属性
key
|
MESSAGE_KEY
|
代表在
request
范围内存放
ActionMessages
实例的属性
key
|
MESSAGES_KEY
|
代表在
application
范围内存放各个子应用模块的
MessageResources
实例的属性
key
的前缀
|
MODULE_KEY
|
代表在
application
范围内存放各个子应用模块的
ModuleConfig
实例的属性
key
的前缀
|
REQUEST_PROCESSOR_KEY
|
代表在
application
范围内存放各个子应用模块的
RequestProcessor
实例的属性
key
的前缀
|
阅读材料:《精通Struts:基于MVC的Java Web设计与开发》
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=372708