通配符和动态方法调用
通配符映射: 一个 Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系通配符映射规则
1、若找到多个匹配, 没有通配符的那个将胜出
2、若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名及进行匹配
3、若 Struts 找到的带有通配符的匹配不止一个, 最后一个匹配将胜出 被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…
{0}匹配的是"*"通配符的整个串 {0} 匹配整个 URI * 可以匹配零个或多个字符, 但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要用 \.
--------------------------------------------------------------------------------------------------------------------
示例:
1、不同的action name 不同的action class 相同的action method 不同的result
<!-- <a href="${pageContext.request.contextPath}/pattern/BookAction_add.action"> 图书</a><br>
<a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户</a><br>
-->
<action name="*_add" class="cn.itcast.struts2.pattern.{1}">
<result name="success" type="dispatcher">
<param name="location">/pattern/{1}.jsp</param>
</result>
</action>
--------------------------------------------------------------------------------------------------------------------
2、相同的action name 相同的action class 不同的action method 相同的result
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
-->
<action name="BookAction_*" class="cn.itcast.struts2.pattern.BookAction" method="{1}">
<result name="success" type="dispatcher">
<param name="location">/pattern/success.jsp</param>
</result>
</action>
--------------------------------------------------------------------------------------------------------------------
3、不同的action name 不同的action class 不同的action method 不同的result
<!--
<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="*_*" class="cn.itcast.struts2.pattern.{1}" method="{2}">
<result name="success" type="dispatcher">
<param name="location">/pattern/{1}.jsp</param>
</result>
</action>
---------------------------------------------------------------------------------------------------------------------
4、动态方法调用!形式: 相同的action name 相同的action class 相同的 result method由页面中的路径表示
动态方法调用:
* 页面中请求连接:namespace+actionName+"!"+执行方法名
* 在struts.xml文件中,不用配置method属性,而是通过页面的连接动态执行指定方法
* 动态方法调用,不经常使用。经常使用的是通配符
* 动态方法调用,默认是开启状态
* 配置动态方法:在default.properties中配置:
struts.enable.DynamicMethodInvocation=true 为默认开启
设置为false为关闭动态方法
<!-- 在动态方法调用中BookAction!add.action 【BookAction表示action中的name !后面的表示action中的method】-->
<!-- <a href="${pageContext.request.contextPath}/pattern/BookAction!add.action">图书添加</a><br>-->
<!-- <a href="${pageContext.request.contextPath}/pattern/BookAction!delete.action">图书删除</a><br>--> -->
<action name="BookAction" class="cn.itcast.struts2.pattern.BookAction">
<result name="success" type="dispatcher">
<param name="location">/pattern/success.jsp</param>
</result>
</action>
------------------------------------------------------------------------------------------------------------------------
5、全局结果当多个action中都使用到了相同result,这时我们应该把result定义为全局结果
如果局部结果类型和全局结果类型,同时存在
* 局部结果类型会覆盖了全局的结果类型
局部结果类型和全局结果类型的作用范围:
* 全局结果类型:作用于整个package
* 局部结果类型:作用于某个action
<package ....>
<!-- 定义全局结果 写在package里面-->
<global-results>
<result name="success" type="dispatcher">/pattern/successGlobal.jsp</result>
</global-results>
</package>
注:局部的会覆盖全局Struts2中 应用范围内action的实例,每个请求都会创建一个action实例====================================================================================
<package name="access" extends="default" namespace="/access">
<action name="*" class="com.chinacreator.ptgl.xtgl.action.AccessibilityAction" method="{1}">
<result name="toJssqPage">/jsp/xtgl/jssq.jsp</result>
<result name="toAccessPage">/jsp/xtgl/access.jsp</result>
<interceptor-ref name="PTGLSecurityStack" />
</action>
</package>
访问struts的action:
通配符:
命名空间/方法名.action