文章目录
一、通配符
参考:https://mp.weixin.qq.com/s/IwmSBorQlTefcGF1Qi9zwA
作用:简化代码。
PrivilegeAction.java
public class PrivilegeAction extends ActionSupport {
public String login() {
System.out.println("我是登陆");
return "success";
}
public String register() {
System.out.println("我是注册");
return "success";
}
}
未使用通配符时:
<action name="login" class="privilegeaction.PrivilegeAction" method="login">
<result name="success">/index.jsp</result>
</action>
<action name="register" class="privilegeaction.PrivilegeAction" method="register">
<result name="success">/index.jsp</result>
</action>
使用通配符时:
<package name="privilige" extends="struts-default">
<action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
访问URL
1、localhost:8080/privilege_login
2、localhost:8080/privilege_register
二、Struts中路径的匹配原则
2.1 通常情况
有时候,若在package节点中指定namespace名称空间,则在访问对应的资源名称时,就需要在前面加入相对应名称空间的值。
名称空间的值为“/user”
<package name="privilige" extends="struts-default" namespace="/user">
<action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
访问URL:localhost:8080/user/privilege_login。
2.2 匹配原则
1、在名称空间和资源路径的中间可添加任意的路径。
访问URL:localhost:8080/user/a/b/c/privilege_login。访问成功。
2、不能在名称空间之前加入不存在的路径。
访问URL:localhost:8080/a/user/aprivilege_login。访问失败。
2.3 访问顺序
http://localhost:8080/user/a/a/privilege_login:
1、Struts会把请求的资源路径拿到,也就是privilege_login。
2、看看有没有/user/a/a这个名称空间;若有,就返回结果
——若没有,就看看有没有/user/a这个名称空间;若有,就返回结果
——若没有,再看看有没有/user这个名称空间;若有,就返回结果
3、直到最后,如果都没有找到,就报错!
三、Struts常量
3.1 修改默认访问路径
Struts2默认的访问后缀是.action
如:http://localhost:8080/user/a/a/privilege_login.action:
<struts>
<constant name="struts.action.extension" value="action"/>
<!-- value = "action",URL后缀一定要写action。-->
<!-- 即http://localhost:8080/user/a/a/privilege_login.action -->
<!-- value = "action,do,",URL后缀可以是action,可以是do,也可以不写。= -->
<!-- 即http://localhost:8080/user/a/a/privilege_login.do -->
<!-- value = "action,,",URL后缀可以是action,可以不写。= -->
<!-- 即http://localhost:8080/user/a/a/privilege_login -->
</struts>
3.2 Struts常用的常量
动态方法调用:
1、在action节点不配置method属性
<package name="privilige" extends="struts-default" namespace="/user">
<!-- <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}"> -->
<!-- 没有配置method属性 -->
<action name="login" class="privilegeaction.PrivilegeAction">
<result name="success">/index.jsp</result>
</action>
</package>
2、在地址栏使用资源名称!方法名的方式去调用业务方法
如:http://localhost:8080/user/login!login:
资源名称 + ! + 方法名
四、跳转全局视图
4.1 提出问题
PrivilegeAction.java
public class PrivilegeAction extends ActionSupport {
public String login() {
System.out.println("我是登陆");
return "success";
}
public String register() {
System.out.println("我是注册");
return "success";
}
}
CategoryAction.java
public class CategoryAction extends ActionSupport {
public String add() {
System.out.println("我是添加");
return "success";
}
public String find() {
System.out.println("我是查找");
return "success";
}
}
struts.xml
<action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
<action name="category_*" class="privilegeaction.CategoryAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
提出问题:result标签的属性值及标签体内容相同,是否可以合并,达到简化代码的目的?
解决方案:使用跳转全局视图
4.2 解决问题
struts.xml
<package name="privilige" extends="struts-default" >
<global-results>
<result name="success">/index.jsp</result>
</global-results>
<action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
</action>
<action name="category_*" class="privilegeaction.CategoryAction" method="{1}">
</action>
</package>
五、Action节点中的默认配置
5.1 相对完整的action节点
<action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
</action>
5.2 省略method属性
<action name="privilege" class="privilegeaction.PrivilegeAction">
</action>
不写method的话,默认执行的是execute()方法。execute()方法默认返回值是SUCCESS
public class BBAtion extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("我是execute()");
return SUCCESS;
}
}
5.2 省略class属性
<!-- 什么情况不配置class? 即处理的aciton -->
<!-- 答案: 当只是需要跳转到WEB-INF下资源的时候。 -->
<action name="test2">
<result name="success" >/WEB-INF/index.jsp</result>
</action>
不写class,class默认执行的action在struts-default有配置< default-class-ref class=“com.opensymphony.xwork2.ActionSupport” />
类似与Servlet需要跳转到WEB-INF下的资源。Tomcat不允许直接访问WEB-INF资源。