理解
Struts
配置文件
通过一个基于 XML 的配置文件来记录和控制 Struts 配置。缺省情况下,该文件的名称是 struts-config.xml ,位于 Web 应用程序的 WEB-INF 目录中。 Struts 有一个中央控制器 Servlet ( org.apache.struts.action.ActionServlet ) ,首次加载 Struts 应用程序时,它会对该配置文件进行分析。
该配置文件包含
Action
类与
Form
类的映射。映射为应用程序提供页面流。因此,配置文件的两个重要部分是
<form-beans>
和
<action-mappings>
。
|
|
合并后的应用程序流是这样的:
如果
Struts
配置文件中提供的配置详细信息正确,
Struts
控制器会对该应用程序流实施控制。如果提供的路径不正确或未在类加载器中找到
Form Bean
或
Action Bean
,控制器将返回运行时错误。
|
Struts Form Bean
那么,准确地讲什么是
Form Bean
呢?
Form Bean
是一种
Java Bean
,广泛用于映射
HTML
表单与相应的
Java Bean
。
Form Bean
的编码和使用都很简单。在使用
Form Bean
时,需要密切注意以下几点:
1.
Form Bean
映射到的是
HTML
表单上的元素或控件。例如,如果
HTML
表单包含名为
name
的字段,
Form Bean
就会包含名为
name
的属性。
2.
在映射到
HTML
控件的
Form Bean
中定义的每个属性都必须有与之对应的赋值方法和取值方法。例如,该属性有两个方法:
setName()
和
getName()
。
3.
Form Bean
还包含一个名为
validate()
的方法。可以使用
validate
方法验证表单项,如果验证失败,则填充
actionErrors
对象,并将控制权返还给调用页面,随后调用页面会显示这些错误。下一小节将对验证和错误处理做更多介绍。
Action
Action
类主要用于处理来自视图的数据和对该数据执行任何业务操作。
Action
类是
org.apache.struts.action.Action
(其实就是一个
HttpServlet
)的扩展。因此实际上是在执行
Servlet
。
这些
action
类与
Servlet
不同,它们不是在
web.xml
中注册,而是映射到
Struts
配置文件中的
action
表单。其类似于以下代码:
|
<action
path="/login" type="com.test.LoginAction" name="LoginForm" scope="request" validate="true" input="/pages/Login.jsp"/> |
可以使用其中的
path
属性
"/login"
调用
Servlet
。
Action
类定义需要先行覆盖,才能执行任何任务的
execute
方法。
Execute
方法有权访问对应视图的
actionForm
Bean
、对整个
Struts
配置的引用、
HttpServletRequest
对象及
HttpServletResponse
对象。这使
execute
方法能够对
HttpSession
对象、
HttpSelvletRequest
对象
及
HttpServletResponse
对象执行操作。
|
public ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest request, HttpServletResponse response) |
备注:在
Struts 1.0
中,该方法的名称是
perform()
。
Struts 1.1
已不支持该方法。
Action
类返回
ActionForward
对象。此
ActionForward
对象确定需要将请求发送到的正确视图。还会在
Struts
配置文件中注册需要将控制权转交给的正确视图。
在上例中,假定在登录失败时需要将控制权传递给
error.jsp
,在登录成功时需要将控制权传递给
nextPage.jsp
。
Forward
标记的注册方式如下:
|
<action
path="/login" type="com.test.LoginAction" name="LoginForm" scope="request" validate="true" input="/pages/Login.jsp"> <forward name="failure" path="/error.jsp"/> <forward name="success" path="/nextPage.jsp"/></action> |
Execute
方法通常以下列语句作为结束语句。
return (mapping.findForward("failure"));
其中的
mapping
指的是
ActionMapping
对象。已定义了特定
action
的
"failure"
路径。因此以上语句实际执行的操作是将请求发送给
error.jsp
。
以上示例中的
<forward>
标记具有局部作用域,可以在定义时所针对的
action
内使用。但也可以定义全局
forward
。全局
forward
也在
Struts
配置文件中定义,这与任何其它配置信息是一样的。正如定义全局变量那样,全局
forward
可以在应用程序中的任何地方使用。
|
<global-forwards>
<forward name="welcome" path="/Welcome.jsp"/> </global-forwards> |
Validate
方法和错误处理
如前所述,可以在 struts-config.xml 中禁用操作和验证。 Action 中央控制器将确保不进行验证。 |
<action
path="/login" type="com.test.LoginAction" name="LoginForm" scope="request" validate="true" input="/pages/Login.jsp"/> |
排除消息资源故障
消息资源帮助开发人员在一个集中位置存储标签、错误信息等内容,简化了后续阶段的维护工作。该集中位置是一个属性文件,存储在应用程序的类路径中,因此组件可以方便地访问。
以下是为
Struts
应用程序定义消息资源的两种方法:
对于
web.xml
,
将属性文件定义为
ActionServlet
的
param-value
。下面是一个简短的示例:
|
<servlet> <servlet-name>action</servlet -name> <servlet-class> org.apache.struts.action .ActionServlet </servlet-class> <init-param> <param-name> application </param-name> <param-value> beatest.ApplicationResources </param-value> </init-param> </servlet> |
请注意,
param-name
应用程序和值表示为
beatest.ApplicationResources
。
这表示在应用程序类路径的包
beatest
内一定存在一个名为
ApplicationResources.properties
的属性文件。
在
Struts 1.1
中,可以在
struts-config.xml
中定义资源包。
<message-resources parameter="beatest.ApplicationResources"/>
此处的参数为必需值,它引用类路径
beatest
包中的
ApplicationResources.properties
文件。使用
Struts 1.1
时可以有多个资源包,这使开发人员还能够对资源包进行组织。例如,可以有这样的包:
<message-resources key=”errorBundle” parameter="beatest.ApplicationErrors"/>
和
<message-resources key=”labelsBundle” parameter="beatest.ApplicationLabels"/>
可以在应用程序中对它们进行适当设置。如果用户想要为
HTML
显示标签,则可以使用
labelsBundle
。
<bean:message bundle="lablesBundle" key="some.message.key"/>
而如果想要显示错误信息,则可以使用
errorBundle
。
<bean:message bundle="errorBundle" key="some.error.message"/>
|