Struts.xml
包含配置
在默认的情况下,
Struts2
将自动加载放在
WEB-INF/classes
路径下的
struts.xml
文件。大部分应用里,随着应用的规模的增加,系统的
Action
数量大量增加,导致了
struts.xml
配置文件变得非常臃肿。
为了避免这种情况,可以将一个
struts.xml
文件分解成多个配置文件,然后在
struts.xml
文件中包含其他配置文件。比如说:在
struts.xml
文件中使用以下配置方式
<include file=”struts-mod1.xml” />
通过这种方式提供了一种模块化的方式来管理
struts.xml
文件。
另外,在
core
的根目录下有一个
struts-default.xml
文件,注意,这个文件是自动加载的,不需要在我们的
struts.xml
文件中用
include
导入。
Bean
的配置
一般这个元素不需要我们进行配置,只是需要重新定义
struts2
的核心组件的时候才需要使用到这个元素。
Struts2
框架是一个可以高度扩展的框架,框架的大部分核心组件,都是通过
IOC
容器来进行管理的。因此,允许开发者可以很方便的提供自己的组件实现类,并将组件类部署到
struts2
就
OK
了。
这个标记很不常用,如果需要可以查看帮助。
不过这里举个例子:
<bean type=”com.opensymphony.xwork2.ObjectFactory” name=”caFactory” class=”cc.dynasoft.MyObject” />
以上代码的作用是使用一个自己定义的
ObjectFactory
来替换了
struts2
内置的
object
。
常量配置
Struts
有一个属性文件,
struts.properties
,实际上这个配置文件是指定
struts2
的属性。而常量配置就是指定
struts2
属性的一种方式。例子:
<constant name=”struts.custom.i18n.resources” value=”message” />
以上用于指定国际化资源文件的前缀名是
message
,当然也可以在
struts.properties
中配置,如下:
struts.custom.i18n.resources=message
也可以在
web.xml
中进行配置:
作为
FilterDispatcher
的
init-param
<param-name> struts.custom.i18n.resources</param-name>
<param-value>message</param-value>
以下是加载
struts2
常量的搜索顺序:
1、
struts-default.xml
中
2、
struts-plugin.xml
中
3、
struts.xml
中
4、
struts.properties
5、
web.xml
中
包配置
Struts2
使用
package
来管理
Action
和拦截器等。配置该包时,必须指定一个
name
属性,用于指定包名,可以指定一个可选的
extends
属性,是另一个包的名字,子包可以继承父包的拦截器,拦截器栈、
action
等配置。除此之外,
struts
还提供了一个抽象包,抽象包的含义是该包不能有
action
的定义。设置
abstract=”true”
说明这是一个抽象包。
以下是一个例子:
<package name=”mod1” extends=”struts-default” />
其中
struts-default
是
struts-default.xml
提供的包。
另一个比较重要的概念就是命名空间:
考虑在一个
web
应用中需要同名的
action
,
struits2
以命名空间的方式来管理
Action
,同一个命名空间不能有同名的
Action
,不同的命名空间可以有同名的
Action
。如果不指定命名空间,则默认的命名空间是
””
,指定了命名空间之后,
Action
的
URL
应该是命名空间
+Action
名。
比如说:
<action name=”register” extends=”struts-default” namespace=”/user” >
……
</action>
则对应的
Action
应该是
/user/register.action
。
如果
namespace=”/”
,说明这是一个根命名空间。
如果指定了命名空间,但是在该命名空间中找不到该
Action
,
struts2
将会在默认的命名空间中继续查找,如果还找不到,则出现系统错误。
比如说:
请求
/order/save.action
,系统首先在命名空间
/order
中查找,如果找到,使用该
action
进行处理,否则,系统将到默认的命名空间中查找,如果两个命名空间都找不到,出现系统错误。
拦截器配置
拦截器实际上思想就是
AOP
,我们可以使用拦截器跟踪日志、跟踪系统性能瓶颈等。
拦截器的配置无非就是声明拦截器、引用拦截器以及声明拦截器栈。可以认为拦截器栈是由多个拦截器组成的一个大的拦截器。
定义拦截器和拦截器栈都在
<interceptors />
这个标记内
以下是一个例子:
<interceptors>
<interceptor name=”log” class=”cc.dynasoft.LogInterceptor” />
<interceptor name=”authority” class=”cc.dynasoft. Authority Interceptor” />
<interceptor name=”timer” class=”cc.dynasoft.TimerInterceptor” />
<interceptor-stack name=”default”>
<interceptor-ref name=” authority” />
<interceptor-ref name=” timer” />
</interceptor>
引用拦截器是在
action
中引用的:例子:
<action name=”login” class=”cc.dynasoft.LoginAction”>
……
<interceptor-ref name=”log” />
</action>
配置
Action
实际上配置
Action
很简单,就使用
action
标签就
OK
了,
action
标签有两个重要属性:
name
和
class
,
name
是必须指定的,他既是
action
的名字,也是该
action
需要处理的
URL
的前半部分。如果
class
没有指定,默认是
ActionSupport
。而
ActionSupport
默认处理就是返回一个
SUCCESS
字符串。
struts
的全局配置文件中有一个属性:
struts.enable.SlashesInActionNames
如果设置为
true
,允许
struts2
框架中使用斜线。
Action
中直接访问
servlet API
有以下两种方法:
1、
如果需要访问
ServletContext
,
Action
类需要实现接口
ServletContextAware
如果需要访问
HttpServletRequest
,
Action
类需要实现接口
ServletRequestAware
如果需要访问
HttpServletResponse
,
Action
类需要实现接口
ServletResponseAware
以下是例子代码,主要用于访问
Reponse
对象:
public class LoginAction implements Action,ServletResponseAware
{
private HttpServletResponse response;
//
实现
ServletResponseAware
接口必须实现的方法
public String execute() throw Exception
{
Cookie c = new Cookie(“user”,getUsername());
c.setMaxAge(60*60);//
最大生存时间
response.addCookie(c);
return SUCCESS;
}
}
2、
struts2
提供了一个
ServletActionContext
,这个类包含了访问
request
,
response
等静态方法。
注意:即使我们在
struts2
的
Action
中获得了
HttpServletResponse
对象,也不要尝试直接在
Action
中生成对客户端的输出。比如:下面代码是没有实际意义的,即
response.getWriter().println(“hello world!”);
本文详细介绍了Struts2框架中的各种配置方式,包括如何通过分解struts.xml文件实现模块化管理,以及Bean、常量、包、命名空间、拦截器和Action的配置方法。

被折叠的 条评论
为什么被折叠?



