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!”);