通配符举例–BookAction
package cn.itcast.pattern;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class BookAction extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("BookAction ********* execute()");
return "success";
}
/*
* 在struts2框架中,action是多实例
*/
public BookAction() {
System.out.println("BookAction的构造方法");
}
/*
* 自定义方法:
* * 由public来修饰的
* * 必须是String返回类型
* * 不能传参数
* * 方法名自定义
*
* * 总之,一句话:除了方法名与execute()不一样,其他所有内容都一样。
*
*/
public String add() throws Exception {
System.out.println("BookAction ********* add()");
return "add";
}
}
通配符举例–struts-pattern.xml
struts-pattern.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="pattern" namespace="/pattern" extends="struts-default">
<!--
* struts2框架运行时,默认执行action类中的execute()方法
* 在action标签里的method属性:指定的是要执行action类中的哪个方法
-->
<action name="bookAction" class="cn.itcast.pattern.BookAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action>
</package>
</struts>
通配符举例—BookAction如何自定义方法
在action中增加新的方法的要求:
- 方法最好要用public修饰
- 方法的名称自定义
- 方法没有参数
- 方法的返回值为String
要定义的方法就是与execute方法的方法名称不同,其他的都一样,只有这样的定义方法struts2才识别
jsp页面如下:
访问BookAction_add 测试action标签中的method属性<br>
<a href="${pageContext.request.contextPath}/pattern/bookAction.action"> 测试</a><br>
<br>
<br>
测试结果:
通配符映射
- 一个 Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系
- 通配符映射规则
- 若找到多个匹配, 没有通配符的那个将胜出
- 若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名及进行匹配
- 若 Struts 找到的带有通配符的匹配不止一个, 最后一个匹配将胜出
- 被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…
- {0} 匹配整个 URI
*
可以匹配零个或多个字符, 但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要使用 .
通配符映射示例(1)
jsp页面:
通配符映射示例(1):<br>
<a href="${pageContext.request.contextPath}/pattern/a_add.action"> 通配符映射示例(1)</a><br>
<a href="${pageContext.request.contextPath}/pattern/b_add.action"> 通配符映射示例(1)</a><br>
<a href="${pageContext.request.contextPath}/pattern/c_add.action"> 通配符映射示例(1)</a><br>
<br>
struts-pattern.xml配置如下:
<!--
<a href="${pageContext.request.contextPath}/pattern/a_add.action"> 通配符映射示例(1)</a><br>
<a href="${pageContext.request.contextPath}/pattern/b_add.action"> 通配符映射示例(1)</a><br>
<a href="${pageContext.request.contextPath}/pattern/c_add.action"> 通配符映射示例(1)</a><br>
-->
<!-- <action name="a_add" class="cn.itcast.pattern.BookAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action>
<action name="b_add" class="cn.itcast.pattern.BookAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action>
<action name="c_add" class="cn.itcast.pattern.BookAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action> -->
<!-- 以上配置可以改写如下: -->
<!-- "*"就是通配符,匹配的是不一样的内容 -->
<action name="*_add" class="cn.itcast.pattern.BookAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action> -->
测试结果:
点击第二个超链接/pattern/b_add.action:
通配符映射示例(2)
jsp页面:
通配符映射示例(2):<br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action"> 图书</a><br>
<a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户</a><br>
<br>
<br>
struts-pattern.xml配置如下:
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action"> 图书</a><br>
<a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户</a><br>
-->
<!-- <action name="BookAction_add" class="cn.itcast.pattern.BookAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action>
<action name="UserAction_add" class="cn.itcast.pattern.UserAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/UserAction.jsp</result>
</action> -->
<!-- 以上配置可以改写如下: -->
<!-- {1}表示的是匹配"*"通配符的第一个子串 -->
<action name="*_add" class="cn.itcast.pattern.{1}" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/{1}.jsp</result>
</action>
UserAction文件:
package cn.itcast.pattern;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class UserAction extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("UserAction ********* execute()");
return "success";
}
/*
* 自定义方法:
* * 由public来修饰的
* * 必须是String返回类型
* * 不能传参数
* * 方法名自定义
*
* * 总之,一句话:除了方法名与execute()不一样,其他所有内容都一样。
*
*/
public String add() throws Exception {
System.out.println("UserAction ********* add()");
return "add";
}
public String delete() throws Exception {
System.out.println("UserAction ********* delete()");
return "success";
}
}
测试结果:
点击用户超链接:
通配符映射示例(3)
jsp页面:
通配符映射示例(3):<br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
<br>
<br>
<a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/UserAction_delete.action">用户删除</a><br>
<br>
<br>
struts-pattern.xml配置如下:
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
<br>
<br>
<a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/UserAction_delete.action">用户删除</a><br>
-->
<!-- <action name="BookAction_add" class="cn.itcast.pattern.BookAction" method="add">
<result name="add">/pattern/BookAction.jsp</result>
</action>
<action name="BookAction_delete" class="cn.itcast.pattern.BookAction" method="delete">
<result name="success">/pattern/success.jsp</result>
</action>
<action name="UserAction_add" class="cn.itcast.pattern.UserAction" method="add">
<result name="add">/pattern/UserAction.jsp</result>
</action>
<action name="UserAction_delete" class="cn.itcast.pattern.UserAction" method="delete">
<result name="success">/pattern/success.jsp</result>
</action> -->
<!-- 以上配置可以改写如下: -->
<!-- {2}匹配就是"*"通配符的第二个子串 -->
<!-- {0}匹配的是"*"通配符的整个串 -->
<action name="*_*" class="cn.itcast.pattern.{1}" method="{2}">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/{1}.jsp</result>
</action>
测试:
点击用户删除超链接
点击图书添加超链接
动态方法调用
- 动态方法调用: 通过 url 动态调用 Action 中的方法
如果Action中存在多个方法时,我们可以使用!+方法名调用指定方法 - 感叹号方式(需要开启),官网不推荐使用这种方式,建议大家不要使用.
用这种方式需要先开启一个开关
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
jsp页面
动态方法调用!形式:<br>
<a href="${pageContext.request.contextPath}/pattern/BookAction!add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction!delete.action">图书删除</a><br>
struts-pattern.xml配置如下:
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction!add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction!delete.action">图书删除</a><br>
动态方法调用:
* 页面中请求连接:namespace+actionName+"!"+执行方法名
* 在struts.xml文件中,不用配置method属性,而是通过页面的连接动态执行指定方法
* 动态方法调用,不经常使用。经常使用的是通配符
* 动态方法调用,默认是关闭状态
* struts.enable.DynamicMethodInvocation = false
-->
<action name="BookAction" class="cn.itcast.pattern.BookAction">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action>
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>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 引入自定义配置文件 -->
<include file="cn/itcast/primer/struts_primer.xml"></include>
<include file="cn/itcast/resulttype/struts_resulttype.xml"></include>
<include file="cn/itcast/pattern/struts_pattern.xml"></include>
</struts>
测试:
点击图书删除超链接:
使用通配符定义action
jsp页面
使用通配符定义action<br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
struts-pattern.xml配置如下:
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
-->
<action name="*_*" class="cn.itcast.pattern.{1}" method="{2}">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/{1}.jsp</result>
</action>
全局结果
当多个action中都使用到了相同result,这时我们应该把result定义为全局结果
注:局部的会覆盖全局
全局结果和局部结果的区别:
* 全局结果:对该包下所有的action配置起作用
* 局部结果:只对当前的action起作用
jsp页面:
<br><br>
测试全局和局部的action<br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_find.action">图书查找</a><br>
struts-pattern.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="pattern" namespace="/pattern" extends="struts-default">
<!-- 配置全局结果类型 -->
<global-results>
<result name="success">/pattern/successGlobal.jsp</result>
</global-results>
<action name="BookAction_find" class="cn.itcast.pattern.BookAction" method="find">
<!--
如果局部结果类型和全局结果类型,同时存在
* 局部结果类型会覆盖了全局的结果类型
局部结果类型和全局结果类型的作用范围:
* 全局结果类型:作用于整个package
* 局部结果类型:作用于某个action
-->
<!-- <result name="success">/pattern/success.jsp</result>-->
</action>
</package>
</struts>
测试:
struts-pattern.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="pattern" namespace="/pattern" extends="struts-default">
<!-- 配置全局结果类型 -->
<global-results>
<result name="success">/pattern/successGlobal.jsp</result>
</global-results>
<!--
* struts2框架运行时,默认执行action类中的execute()方法
* 在action标签里的method属性:指定的是要执行action类中的哪个方法
-->
<!-- <action name="bookAction" class="cn.itcast.pattern.BookAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/a_add.action"> 通配符映射示例(1)</a><br>
<a href="${pageContext.request.contextPath}/pattern/b_add.action"> 通配符映射示例(1)</a><br>
<a href="${pageContext.request.contextPath}/pattern/c_add.action"> 通配符映射示例(1)</a><br>
-->
<!-- <action name="a_add" class="cn.itcast.pattern.BookAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action>
<action name="b_add" class="cn.itcast.pattern.BookAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action>
<action name="c_add" class="cn.itcast.pattern.BookAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action> -->
<!-- 以上配置可以改写如下: -->
<!-- "*"就是通配符,匹配的是不一样的内容 -->
<!-- <action name="*_add" class="cn.itcast.pattern.BookAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action"> 图书</a><br>
<a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户</a><br>
-->
<!-- <action name="BookAction_add" class="cn.itcast.pattern.BookAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action>
<action name="UserAction_add" class="cn.itcast.pattern.UserAction" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/UserAction.jsp</result>
</action> -->
<!-- 以上配置可以改写如下: -->
<!-- {1}表示的是匹配"*"通配符的第一个子串 -->
<!-- <action name="*_add" class="cn.itcast.pattern.{1}" method="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/{1}.jsp</result>
</action> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
<br>
<br>
<a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/UserAction_delete.action">用户删除</a><br>
-->
<!-- <action name="BookAction_add" class="cn.itcast.pattern.BookAction" method="add">
<result name="add">/pattern/BookAction.jsp</result>
</action>
<action name="BookAction_delete" class="cn.itcast.pattern.BookAction" method="delete">
<result name="success">/pattern/success.jsp</result>
</action>
<action name="UserAction_add" class="cn.itcast.pattern.UserAction" method="add">
<result name="add">/pattern/UserAction.jsp</result>
</action>
<action name="UserAction_delete" class="cn.itcast.pattern.UserAction" method="delete">
<result name="success">/pattern/success.jsp</result>
</action> -->
<!-- 以上配置可以改写如下: -->
<!-- {2}匹配就是"*"通配符的第二个子串 -->
<!-- {0}匹配的是"*"通配符的整个串 -->
<!-- <action name="*_*" class="cn.itcast.pattern.{1}" method="{2}">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/{1}.jsp</result>
</action> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction!add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction!delete.action">图书删除</a><br>
动态方法调用:
* 页面中请求连接:namespace+actionName+"!"+执行方法名
* 在struts.xml文件中,不用配置method属性,而是通过页面的连接动态执行指定方法
* 动态方法调用,不经常使用。经常使用的是通配符
* 动态方法调用,默认是关闭状态
-->
<!-- <action name="BookAction" class="cn.itcast.pattern.BookAction">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
-->
<!-- <action name="*_*" class="cn.itcast.pattern.{1}" method="{2}">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/{1}.jsp</result>
</action> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_find.action">图书查找</a><br>
-->
<action name="BookAction_find" class="cn.itcast.pattern.BookAction" method="find">
<!--
如果局部结果类型和全局结果类型,同时存在
* 局部结果类型会覆盖了全局的结果类型
局部结果类型和全局结果类型的作用范围:
* 全局结果类型:作用于整个package
* 局部结果类型:作用于某个action
-->
<result name="success">/pattern/success.jsp</result>
</action>
</package>
</struts>