Struts2学习之配置Action

引言

如何让Action与相应的请求匹配呢?

包和包名空间

       Struts2使用包来组织Action , 因此,将Action 定义放在包定义下完成,定义Action 通过使用<package…/>下的<action… ./>子元素来完成, 而每个package 元素配置一个包。

例子
 <package name="lee" extends="struts-default">
    </package>

属性介绍:

  • name::必需属性。该属性指定该包的名字,该名字是该包被其他包引用的key。
  • extends:可选属性。该属性指定该包继承其他包。继承其他包,可以继承其他包中的Action 定义、拦截器定义等。
  • namespace:可选属性。该属性定义该包的命名空间。
  • abstract::可选属性。它指定该包是否为一个抽象包。抽象包中不能包含Action 定以。
    命名空间的功能:
           为了处理同一个Web 应用中包含同名Action 的情形。Struts2以命名空间的方式来管理Action ,同一个命名空间里不能有同名的Action,不同的命名空间里可以有同名的Action 。
           Struts2 不支持为单独的Action 设置命名空间,而是通过为包指定namespace 属性来为包下面的所Struts有Action 指定共同的命名空间。如果配置<package … ./>时没有指定namespace 属性, 则该包下的所有Action 处于默认的包空间下。
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>

    <constant name="struts.custom.i18n.resources" value="mess"/>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
    <constant name="struts.devMode" value="true"/>
    <package name="lee" extends="struts-default">
        <action name="login" class="LoginAction">
            <result name="error">error.jsp</result>
            <result name="success">welocme.jsp</result>
        </action>
    </package>
    <package name="Book" extends="struts-default" namespace="/book">
        <action name="loginBook" class="LoginAction">
            <result name="error">error.jsp</result>
            <result name="success">welocme.jsp</result>
        </action>
    </package>
</struts>

       如上面代码所示,其中包lee没有指定命名空间,则为默认的,包Book指定了命名空间book;
       当某个包指定了命名空间后,改包下所有的Action处理的URL应该是命名空间+Action名。

Action的基本配置

Action的定义

 <action name="login" class="LoginAction">
            <result name="error">error.jsp</result>
            <result name="success">welocme.jsp</result>
        </action>

Struts2的Action 名字就是它所处理的URL (如果请求URL 包含. action 后缀,则应该去掉. action 后缀再匹配)其中class属性指定了该Action的实现类。

使用Action的动态方法使用

       Struts2动态方法调用是指表单元素的acti on 并不是直接等于某个Action 的名字,而是以如下形式来指定表单的action 属性。

<S:form action="login!execute">

指定method属性及使用方法

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="lee" extends="struts-default">
		<!-- 配置login Action,处理类为LoginRegistAction
			默认使用execute方法处理请求-->
		<action name="login" class="org.crazyit.app.action.LoginRegistAction">
			<!-- 定义逻辑视图和物理视图之间的映射关系 -->
			<result name="error">/WEB-INF/content/error.jsp</result>
			<result>/WEB-INF/content/welcome.jsp</result>
		</action>
		<!-- 配置regist Action,处理类为LoginRegistAction
			指定使用regist方法处理请求-->
		<action name="regist" class="org.crazyit.app.action.LoginRegistAction"
			method="regist">
			<!-- 定义逻辑视图和物理视图之间的映射关系 -->
			<result name="error">/WEB-INF/content/error.jsp</result>
			<result>/WEB-INF/content/welcome.jsp</result>
		</action>
		<action name="*">
			<result>/WEB-INF/content/{1}.jsp</result>
		</action>
	</package>
</struts>

       上面两个逻辑Action,它们对应的处理类都是LoginRegistAction。login和regist 两个Action 虽然有相同的处理类, 但处理逻辑不同一一处理逻辑通过method 方法指定,其中名为login 的Action 对应的处理逻辑为默认的execute方法,而名为regist 的A ction 对应的处理逻辑为指定的regist 方法.

<script type="text/javascript">
function regist()
{
	// 获取页面的第一个表单
	targetForm = document.forms[0];
	// 动态修改表单的action属性
	targetForm.action = "regist";
}
</script>
// Action包含的注册控制逻辑
	public String regist() throws Exception
	{
		ActionContext.getContext().getSession()
			.put("user" , getUsername());
		addActionMessage("恭喜您," + getUsername() + ",您已经注册成功!");
		return SUCCESS;
	}

为了解决上面代码的冗余
在配置< a ction … ./>元素时,允许在指定name 属性时使用模式字符串( 即用“*”代表一个或多个任意宇符),接下来就可以在class 、method 属性及<result… ./ >子元素中使用{N }的形式来代表前面第N 个星号( *)所匹配的子串。

发布了89 篇原创文章 · 获赞 27 · 访问量 6052

猜你喜欢

转载自blog.csdn.net/qq_41827511/article/details/104959333