Struts2中struts.xml文件详解

我们先来看看前文demo中的struts.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
 "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="demo" namespace="" extends="struts-default">
		<action name="helloAction_*" class="com.lixue.web.action.HelloWorldAction" method="{1}">
			<result name="ok">/success.jsp</result>
		</action>
	</package>

</struts>

1:package节点类似java中的包,struts2引用包的概念。

2:package节点下的name属性就是包的名称,可以根据不同的业务取不同的名字,避免命名冲突。

3:package节点下的namespace属性表示命名空间,决定了访问URL的父级地址,如namespace="/demo",则访问规则为http://8080/项目名称/namespace,所以该访问路径为:http://8080/项目名称/demo/...

4:package节点下的extends属性必须写上,而且必须继承"struts-default",这样才能够实现struts2的功能(注:struts2-default不要拼写错了)


5:action节点表示同个包中多个动作指向URL,可以有多个。

6:action节点中的name属性是指定访问的action的名称(例子中采用的是通配符的形式,后续会详解)。

7:action节点中的class属性是指定访问的action的全路径(包名+类名)。

8:action节点中的method属性表示要访问的action中的方法(例子中的是通配符的形式,后续会详解)。

9:action节点中的result属性表示访问后要跳转的路径。


Action名称的搜索顺序:

例如:请求的url为:http://locahost:8080/Struts2Demo/path1/path2/path3/helloAction_test.action。

1:首先寻找namespace为"/path1/path2/path3"的package,如果存在则继续在这个包下寻找名字为helloAction的action,如果不存在,则进行第2步。

2:寻找namespace为"/path1/path2"的package,如果存在则继续在这个包下寻找名字为helloAction的action,如果不存在,则进行第3步。

3:寻找namespace为"/path1"的package,如果存在则继续在这个包下寻找名字为helloAction的action,如果不存在,则去默认的namespace的包下寻找名字为hellAction的action【注:默认的namespace为空字符串】。如果还是找不到,就会报错。


Action中的相关默认值:

1:如果没有为action指定class属性,默认是ActionSupport。

2:如果没有为action指定method属性,默认是执行action中的execute()方法。

3:如果没有指定result的name属性,默认值为success


Result属性:

Action中的方法根据结果码跳转到对应的视图页面,在com.opensymphony.xwork2.Action接口中定义了一组标准的结果码:

public interface Action
{
	public static final String SUCCESS = “success”;
	public static final String NONE = “none”;
	public static final String ERROR = “error”;
	public static final String INPUT = “input”;
	public static final String LOGIN = “login”;
}

SUCCESS:表示执行成功之后跳转。

NONE:表示Action执行成功,但不需要显示视图给用户。

LOGIN:表示因用户没有登陆而没有正确执行将返回该登陆视图。


配置Result的映射:

<result name="success">success.jsp</result>
<result name="error">/error.jsp</result>

绝对路径是以斜杠(/)开头,相对于当前的Web应用程序的上下文路径。

相对路径不以斜杠(/)开头,相对于当前执行的action的路径。

如:当前Web应用程序的上下文路径为:/StrutsDemo,请求路径为:/StrutsDemo/admin/login.action执行成功后跳转路径为:/StrutsDemo/admin/success.jsp,因为配置中的success.jsp没有加斜杠(/),是个相对路径,表示相对于当前执行的action的路径,即在admin目录下的success.jsp页面。

执行失败后的跳转路径为:/StrutsDemo/error.jsp因为配置中的error.jsp加入斜杠(/),表示绝对路径,即相对于上下文的路径:/StrutsDemo/error.jsp。


result结果类型:

在result进行跳转的时候可以指定多种跳转的类型,因为接口类型实现了com.opensymphony.xwork2.Result接口的类,在struts2中预定义了多种结果类型,如下表:


注:结果类型在包中使用result-type元素来定义,上面的结果类型都是在框架的默认配置文件struts-default.xml中定义的。

result节点中有type属性,用于指向url路径的方式,dispatcher为默认值


全局视图:

<global-results>
<result name="err">/err.jsp</result>
</global-results>

如果要在其他包也实现这样的视图,就需要使用继承的方式来实现:

<package name="base" namespace="" extends="struts-default">
<global-results>
	<result name="err">/err.jsp</result>
</global-results>
</package>
然后在其他包分别继承当前的基础包:

<package name="demo" namespace="" extends="base">
<action name="helloAction_*" class="action.HelloAction" method="{1}">
	<result name="ok">/index.jsp</result>
</action>
</package>


在struts.xml配置属性,通过依赖注入来设置值:

<package name="demo" namespace="" extends="struts-default">
		<action name="helloAction_*" class="com.lixue.web.action.HelloWorldAction" method="{1}">
			<param name="savePath">/upload</param>
			<result name="ok">/success.jsp</result>
		</action>
	</package>

通过param来定义定义变量,在Action中直接通过setter和getter来设置和获值。

public class HelloWorldAction {

	private String savePath;
	
	public String getSavePath() {
		return savePath;
	}

	public void setSavePath(String savePath) {
		this.savePath = savePath;
	}
}

动态方法调用,首先要设置下面的属性为true:

<constant name="struts.enable.DynamicMethodInvocation" value="true" />
struts.xml:

<package name="demo" namespace="" extends="struts-default">
		<action name="helloAction" class="com.lixue.web.action.HelloWorldAction">
			<result name="ok">/success.jsp</result>
		</action>
	</package>

假设action中有个test()方法(使用一个感叹号后面接方法名称的方式来访问,这种方式的前提是struts.enable.DynamicMethodInvocation为true)

url的访问路径可以这样写:http://localhost:8080/StrutsDemo/helloAction!test.action

还有另外一种访问方式,那就是通过通配符的形式,name属性后面跟上下划线加星号,method="{1}"表示匹配所有方法。

<package name="demo" namespace="" extends="struts-default">
		<action name="helloAction_*" class="com.lixue.web.action.HelloWorldAction" method="{1}">
			<result name="ok">/success.jsp</result>
		</action>
	</package>

通过通配符的形式访问的url:http://localhost:8080/StrutsDemo/helloAction_test.action


include标签包含多个struts.xml配置文件:

在大部分的应用中,action的数量是很多的,我们如果写在一个文件中就会非常臃肿,struts2提供了包含标签可以包含多个struts.xml文件,代码如下:

<struts>
<include file="struts-user.xml"/>
<include file="struts-order.xml"/>
</struts>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值