这一系列文章,主要记录学习Struts2过程,主要参考Struts2的reference,还有自带例子。这些都可以从官网http://struts.apache.org/下载源代码即可。
1. index.html 页面中头标签:
<head>
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=Welcome.do">
</head>
meta 标签的 http-equiv 属性语法格式是:< meta http-equiv=" 参数 " content=" 参数变量值 " > ,Refresh 表示自动刷新并指向新页面,其中的 0 是指停留 0 秒钟后自动刷新到 URL 网址,这里直接转向 action 中处理。具体用法见: http://www.it.com.cn/f/edu/052/23/73036.htm
2. 通过struts2的reference系统学习下struts.xml文件配置.
管理元素
- Bean 配置
一般地, sturts2 框架使用 bean 配置进行容器注入才使用。大部分的应用不需要进行这个配置的, struts-default.xml 默认的配置文件中有 bean 配置,可以参考下。
<struts>
<bean type="com.opensymphony.xwork2.Object
Factory" name="myfactory" class="com.company.myapp.MyObjectFactory" />
...
</struts>
- Constant 配置
常量配置提供了一种简单的方式(通过设定关键词,即可修改框架插件的行为),通过这种方式可以定制 struts 应用。
<struts>
<constant name="struts.devMode" value="true" />
...
</struts>
- Package 配置
包是 actions, results, result types, interceptors, 和 拦截器堆栈的集合,组装成一个逻辑的配置单元。
<struts>
<package name="employee" extends="struts-default" namespace="/employee">
<default-interceptor-ref name="crudStack"/>
<action name="list" method="list"
class="org.apache.struts2.showcase.action.EmployeeAction" >
<result>/empmanager/listEmployees.jsp</result>
<interceptor-ref name="basicStack"/>
</action>
....
</package>
</struts>
- Namespace 配置
命名空间主要是把 action 的配置划分成逻辑模块,和 c++ 、 xml 等命名空间一样,都是防止重复的手段。
<package name="default">
<action name="foo" class="mypackage.simpleAction">
<result name="success" type="dispatcher">greeting.jsp</result>
</action>
<action name="bar" class="mypackage.simpleAction">
<result name="success" type="dispatcher">bar1.jsp</result>
</action>
</package>
<package name="mypackage1" namespace="/">
<action name="moo" class="mypackage.simpleAction">
<result name="success" type="dispatcher">moo.jsp</result>
</action>
</package>
<package name="mypackage2" namespace="/barspace">
<action name="bar" class="mypackage.simpleAction">
<result name="success" type="dispatcher">bar2.jsp</result>
</action>
</package>
注意: 如果没有找到命名空间下的 action ,则会默认找到“”即默认命名空间下 action ,例如:查找 /barspace/foo.action ,由于 /barspace 下没有 foo.action ,所有执行 package name=default 下的 foo.action, 因为该 package 命名空间是默认的“”。
- Include 配置
Include 配置是一种流行的“分而治之”的策略。框架通过这种配置,可以包含多个配置文件,主要用于项目开发中团队分工合作。
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="Home.xml"/>
<include file="Hello.xml"/>
<include file="Simple.xml"/>
<include file="/util/POJO.xml"/>
<include file="/com/initech/admin/admin-struts.xml"/>
</struts>
请求处理元素
- Interceptor 配置
拦截器允许用户定义 Action 执行前后的代码,拦截器的主要实现技术:动态代理等。
<interceptors>
<interceptor name="security" class="com.company.security.SecurityInterceptor"/>
<interceptor-stack name="secureStack">
<interceptor-ref name="security"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
- Action 配置
Action 的配置是整个框架的基础。
<action name="Logon" class="tutorial.Logon">
<result type="redirectAction">Menu</result>
<result name="input">/Logon.jsp</result>
</action>
注 :想在 action 名使用 ’/’ ,如: <action name="admin/home" class="tutorial.Admin"/> ,必须声明: <constant name="struts.enable.SlashesInActionNames" value="true"/>. 一般命名action 最好使用createUser 或my_action 方式,不要使用create.user 或my-action 形式。
- Result 配置
当 Action 执行结束后,返回的结果是一个 String 。下面是 ActionSupport 类中自带的 String 的,当然我们也可以自己定义。
String SUCCESS = "success";
String NONE = "none";
String ERROR = "error";
String INPUT = "input";
String LOGIN = "login";
注: 在配置文件中,当 type 的 name 是“ * ”时,这并不是通配符,这是当 Action 返回的 String 在配置文件中找不到时,就去匹配“ * ”。
- Unknown 处理者
Unknown 处理是针对 Struts2.1 版本以上的。它实现了 com.opensymphony.xwork2.UnknownHandler 接口 , 并且当找不到 ction, result, or method 执行时候,框架就会去执行这个配置中的类。
<bean type="com.opensymphony.xwork2.Un
knownHandler" name="handler" class="myclasses.SomeUnknownHandler"/>
错误处理之异常配置
当一个 Action 抛出异常时,异常匹配是一个非常重要的配置。它能根据所配置的异常,转向不同的页面。
<struts>
<package name="default">
...
<global-results>
<result name="login" type="redirect">/Login.action</result>
<result name="Exception">/Exception.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.sql.SQLException" result="SQLException"/>
<exception-mapping exception="java.lang.Exception" result="Exception"/>
</global-exception-mappings>
...
<action name="DataAccess" class="com.company.DataAccess">
<exception-mapping exception="com.company.SecurityException" result="login"/>
<result name="SQLException" type="chain">SQLExceptionAction</result>
<result>/DataAccess.jsp</result>
</action>
...
</package>
</struts>
下一篇文章,将详细分析mailreader例子中语言切换显示功能实现~