我们先来看看前文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>