Struts2 中最核心的是 Action, 而 Action 的核心就是 struts.xml , struts.xml 集中了所有页面的导航定义。对于大型的 Web 项目,通过此配置文件即可迅速把握其脉络,这不管是对于前期的开发,还是后期的维护或升级都是大有裨益的。掌握 struts.xml 是掌握 Struts2 的关键所在 。
本节代码向读者演示 struts.xml 内容的组成部分
= XML 文件字符编码定义和 DTD 文件声明。
= global-results 映射定义,如何进行全局导航页面
= package 映射定义。包含的 Action 各属性介绍
<!------------------------------------------- 文件名: struts.xml------------------------------->
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- Action 所在包定义 -->
<package name="C04" extends="struts-default">
<!-- 全局导航页面定义 -->
<global-results>
<result name="global">/jsp/login.jsp</result>
</global-results>
<!-- Action 名字,类以及导航页面定义 -->
<!-- 通过 Action 类处理才导航的的 Action 定义 -->
<action name="Login"
class="com.example.struts.action.LoginAction">
<result name="input">/jsp/login.jsp</result>
<result name="success">/jsp/success.jsp</result>
</action>
<!-- 直接导航的的 Action 定义 -->
<action name="index" >
<result >/jsp/login.jsp</result>
</action>
</package>
</struts>
( 1 ) struts.xml 第一行是所有 xml 文件都具有的声明。通常以“ <? ”开始 , 以“ ?> ”结束。 Version 是必须指定的 , 该属性一般都为 1.0 ,表明该文档遵守 XML1.0 规范。 Encoding 是可选的,如果不写则默认 UTF-8 ,该文件代码中的 gb2312 表明该文件的编码集是 gb2312 ,支持中文字符。常见的字符编码集有支持简体中文的 gb2312 ,支持繁体中文的 GBK ,支持西欧字符的 ISO8859-1 以及通用的国际编码 UTF-8 。 DTD 文件必须被声明,它表明 struts.xml 是支持 Struts2.0 的文档类型定义。 DTD 全称为 Document Type Defination (文档类型定义)。
( 2 ) struts.xml 文件中所有的属性定义都是以“ <struts > ”开始,“ </struts > ”结束。主要属性有很多,这里先详细介绍 package 。
( 3 ) package 里定义了 Action 映射申明。它也可以包含很多 <action> 或者一个也不包含(当然实际开发中是不可能一个都不包含的)。其中 name 属性内容是开发的 web 项目名称,比如本章代码是 C04 项目,所以代码里写的是 C04 。而且它还扩展了 Struts2 自带的缺省文件 struts-default.xml 配置文件,在此基础上可以对 Action 或其他项目中需要用到的类映射进行自定义。
( 4 ) Action 是之前所述 package 包含的 Action 映射申明。 <action> 里的 name 属性是在 JSP 页面上定义的 Action 名字。在 Struts2 里系统主动寻找名字为它的 Action ,一旦找到就根据 class 属性里定义的 Action 类路径去执行该 Action 类。在代码里可以看到 Action 名字为 Login.action ,系统搜索到它之后根据映射定义的 class 执行 LoginAction 类。 result 相当于在 Struts1 里的 forward 属性。因为 Action 对象都是配置对象,这些配置对象都有唯一的标识,其中 name 就是标识。通过检索这些标识, Action 对象封装了需要指向的 URL ,系统就会将 最后响应信息转到 URL 所指的 JSP 页面。也就是代码里在 <result> 和 </result> 里定义的 JSP 页面路径。
注意: Action 的 name 一定要写成代码里显示的形式,没必要后面加“ .do ”或者“ .action ”这样的后缀名形式。因为“ .do ”是 Struts1 里定义的 Action 后缀名形式 ( 当然在 web.xml 里也可以使用 <url-pattern>*.do</url-pattern> 来定义或定义成其他后缀名形式 ) ,在 Struts2 里已经废弃不用了。而“ .action ”不加是因为当系统运行时候其实它会自动搜寻后缀名为“ .action ”的 Action ,所以也没必要加。否则就变成搜寻“ xx.action.action ”这样格式的 Action ,系统肯定会报错。
另外说一句,虽然 Struts2 里系统只会搜寻“ .action ”的 Action ,但也可以让它只搜寻其他名字的后缀名。在 Struts2 的 org/apache/struts2 目录下有个 default.properties 属性文件,其中有个属性名为 struts.action.extension ,可以将它改为“ struts.action.extension=do ”,这样就只搜寻“ .do ”后缀名。如果不想修改 Struts2 的源文件,也可以用 struts.properties ,在该文件里加上“ struts.action.extension=do ”。而且还可以改为“ struts.action.extension=do , htm ”,这样就不只搜寻“ .do ” , 还可以搜寻“ .htm ”后缀名。当中以“,”隔开就行。
代码里还示范了另外一种 Action 写法,这种 Action 是不经过具体 Action 类进行业务逻辑处理,而是类似一个简单的 Html 链接功能。如代码所示,系统找到 index.Action ,根据 <result> 里定义的 URL ,在浏览器里直接显示 login.jsp 。
注意: <result> 和 </result> 之间定义的 JSP 页面要把全路径写出来,不能只写 login.jsp 、 success.jsp 。除非该 JSP 页面是在系统根目录下。
( 5 ) <global-results> 是全局导航页面映射定义,这些定义的 <result> 是被多个 Action 共用的。如果一个具体 Action 在 <action> 里找不到定义的 <result> 唯一标识,它就去寻找(也可称之为匹配) <global-results> 里的 <result> 唯一标识。如代码所示如果 LoginAction 返回的唯一标识不是“ input ”和“ success ”而是“ global ”,那它就在浏览器显示的是名字为“ global ”的 <result> 指向的 JSP ,这里只是为了示范,所以还是指向 login.jsp 。可以新建一个 error.jsp ,让 <global-results> 中这个名字为“ global ”的 <result> 指向它。则页面显示的就是 error.jsp 的内容。
更多信息请查看 java进阶网 http://www.javady.com