struts中3种情况通配符的使用方法 及 动态方法调用

时间:2020-12-17 11:12:21

一:概述

      概念:

应用可能有很多个action 声明,可把多个相似的映射关系简化为一个映射关系的机制 (多个Action类----一个action标签)
     通配符映射规则:

一般使用“*” 匹配零个或多个字符,被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用。 {1} 匹配第一个子串, {2} 匹配第二个子串…以此类推。
若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名进行匹配 。
若带有通配符的匹配多个, 以最后一个匹配为准。

 

二:三种通配符的使用方法(具体结合代码示例十分便于理解)

1.不同的Action类中,同样功能的方法通配

2.同一个Action类中,不同功能的方法通配

3.不同Action类中,不同功能的方法的通配

 

 

三:动态方法调用

动态方法调用: 通过在 url 中指定方法名动态调用 Action 中的方法

语法形式:action名字+!+调用的Action方法名。

Struts 2动态方法默认可用, 则可在 struts.xml 文件中添加 constant 元素禁用该功能:

<constant name="struts.enable.DynamicMethodInvocation" value="false"/>

 

四:示例

构造两个简单的action:

1. CustomerAction

package com.tianci.struts2_wildcard;
import com.opensymphony.xwork2.ActionSupport;
public class CustomerAction extends ActionSupport
{
	// 无参数的构造器
	public CustomerAction()
	{
	}
	
	// add
	public String add()
	{
		System.out.println("call add method of CustomerAction.");
		return "add";
	}

	// delete
	public String delete()
	{
		System.out.println("call delete method of CustomerAction.");
		return "delete";
	}
}

 

2.OrderAction

package com.tianci.struts2_wildcard;
import com.opensymphony.xwork2.ActionSupport;
public class OrderAction extends ActionSupport
{
	// 无参数的构造器
	public OrderAction()
	{

	}

	// add
	public String add()
	{
		System.out.println("call add method of OrderAction.");
		return "add";
	}

	// delete
	public String delete()
	{
		System.out.println("call delete method of OrderAction.");
		return "delete";
	}
}

 

xml子配置文件:

?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

	<constant name="struts.devMode" value="false" />
	<constant name="struts.custom.i18n.resources" value="fileuploadresource" />

	<package name="struts2_wildcard" namespace="/struts2_wildcard"
		extends="struts-default">


		<!-- 示例一: 不同的Action类中,同样功能的方法通配。如下:通配到了不同action中的add方法 -->
		<action name="*_add" class="com.tianci.struts2_wildcard.{1}"
			method="add">
			<result name="add">
			/struts2_wildcard/{1}.jsp
			</result>
		</action>



		<!-- 示例二:同一个Action类中,不同功能的方法通配。 -->
		<!-- 都能匹配上,则在最前面的优先覆盖掉后面的。如:本例中测试,OrderAction_add.action 时。匹配到的结果是:add方法。 -->
		<action name="OrderAction_*" class="com.tianci.struts2_wildcard.OrderAction"
			method="{1}">
			<result name="add">
				/struts2_wildcard/Add.jsp
			</result>
			<result name="delete">
				/struts2_wildcard/Delete.jsp
			</result>
		</action>


		<!-- 示例三:不同Action类中,不同功能的方法的通配。 -->
		<!-- 示例中可以通配到这些方法:/struts2_wildcard/CustomerAction_add.action; /struts2_wildcard/CustomerAction_delete.action; 
			/struts2_wildcard/OrderAction_add.action; /struts2_wildcard/OrderAction_delete.action; -->
		<action name="*_*" class="com.tianci.struts2_wildcard.{1}"
			method="{2}">
			<result name="add">
				/struts2_wildcard/{1}.jsp
			</result>
			<result name="delete">
				/struts2_wildcard/Delete.jsp
			</result>
		</action>


		<!-- 动态方法调用 语法形式:action名字+!+调用的Action方法名-->
		<!--示例:如在本地访问时,项目名为:struts2;namespace名为:struts2_wildcard
		则访问 OrderAction中add方法的url为"http://localhost:8080/struts2/struts2_wildcard/OrderAction!add"	-->
		<action name="OrderAction" class="com.tianci.struts2_wildcard.OrderAction">
			<result name="add">
				/struts2_wildcard/Add.jsp
			</result>
		</action>
		
	</package>
</struts>