分享
 
 
 

用ActionMapping构建漂亮的Struts应用程序

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

邱吉尔曾经说过他喜欢学习新东西,但他觉得没有必要让别人教他。不管你是否喜欢学习新知识,也不管有人教你还是你自学,学习Java通常意味着仔细研究许多特殊的类。学习Struts也是如此。

这就是我写本系列第四部分的初衷,在本文中,我将详述org.apache.struts.action.ActionMapping类,它是从org.apache.struts.config.ActionConfig派生的。ActionMapping将一个请求路径映射到一个action类,它是Struts应用程序中最常用的类之一。在你深入学习这个类时,你会重新用到在该系列第1、2和3部分创建的两个login应用程序,从而了解如何运用ActionMapping来重写应用程序。

当然,你可能不记得以前用过任何ActionMapping实例了。这是因为控制器servlet实际上为你创建了它们。你只需要配置在Struts配置文件(struts-config.xml)中创建的每个ActionMapping实例就行了(通过给它的属性赋值)。了解这些属性对正确运用ActionMapping类很重要,因此我将讲述这些属性以及如何定义它们。

首先,让我们回想一下,Struts配置文件的根元素是<struts-config。<struts-config元素可以包含一个可选的<action-mappings元素 ,同样<action-mappings元素可以包含<action元素。例如,下面就是本系列第三部分的login应用程序配置文件中的<struts-config元素及其子元素:<struts-config

<action-mappings

<action path="/login"

type="com.javapro.struts.LoginAction"/

<action path="/logout"

type="com.javapro.struts.LogoutAction"/

<action path="/viewSecret"

type="com.javapro.struts.ViewSecretAction"/

</action-mappings

</struts-config

<action-mapping中的每个<action都代表控制器servlet创建的一个ActionMapping实例。一个<action元素可以包含多个特性,每个特性都和ActionMapping实例中的一个属性相应。

作为例子,我们来看前面的Struts配置文件中的这个<action元素:<action path="/login"

type="com.javapro.struts.LoginAction"/

这个<action将路径“/login”映射到action类com.javapro.struts.LoginAction。换句话说,一个以“/login.do”结尾的用户请求将被传递到LoginAction类。然而,ActionMapping也有其它的用途。你(Struts程序员)可以通过给它的属性赋值来给ActionMapping实例下达action指令。(有些属性与action forms相关,我将在本系列的第五部分讲述。)

ActionMapping类的属性

ActionMapping有许多属性。首先,它从ActionConfig类继承了一些属性――如type、forward、include和unknown。它们与action forms是无关的。前三个属性是ActionMapping类最重要的属性。你只能指定其中的一个,所以,如果一个<action元素已经定义了一个type属性,它就不能有forward属性或include属性了。

type属性的值是路径所映射的Action类的完全限定的Java类的名称。(你曾在前面的login应用程序中的Struts配置文件中用过这个属性。)如果运用了type属性,那么控制器servlet就可以调用action实现类的execute方法,传递恰当的ActionMapping实例。注意,org.apache.struts.action.Actionclass类的execute方法有如下的定义(第一个参数是一个ActionMapping实例):public ActionForward execute(ActionMapping mapping,

ActionForm form, HttpServletRequest request,

HttpServletResponse response)

throws IOException, ServletException

forward属性代表的是满足该请求的context-relative资源(通过调用RequestDispatcher.forward()),而不是实例化type属性指定的Action类。(更多关于如何运用这个属性的信息,参见后面的‘修改login应用程序’部分。)

我们给include属性赋的值是满足该请求的context-relative资源路径(通过调用RequestDispatcher.include()),而不是实例化type属性指定的Action类。

注意,<action元素包含的forward属性与可能出现在<action元素下的<forward元素是不同的。这就是说,一个<action元素可以有一个type属性,以及一个或多个<forward子元素,如下面这个<action元素所示(我马上会讲述<forward元素):

<action path="/login"

type="com.javapro.struts.LoginAction"

<forward name="success"

path="/mainMenu.jsp"/

<forward name="failure"

path="/login.jsp"/

</action

我们用<path属性来指定这个ActionMapping将处理的请求路径。最后,用unknown属性来处理未知的路径。在一个action元素中,将这个属性设置为true,使这个action成为该应用程序缺省的action。换句话说,它处理所有其它的action不能处理的请求。在一个单独的应用程序中,只有一个action可以被定义成是缺省的。

例如,下面这个<action元素将unknown属性设置为true,使该action成为缺省的:<action path="/login"

type="com.javapro.struts.LoginAction"

unknown="true"/

<forward元素

<forward元素描述了一个逻辑名称与一个context-relative URI路径识别的资源之间的映射。它有以下这些属性: ? className 这是你想运用的ActionForward实现类的完全限定的Java类的名称。缺省情况下,它的值是作为“forward”初始化参数给Struts控制器servlet配置的。

? contextRelative 在一个模块化应用程序中,如果路径属性是以一个斜线(“/”)开头的,并且是相对于整个Web应用程序的,而不是相对于该模块的,我们就将这个属性设置为true。缺省情况下是false。

? name 这是forward的唯一标识符,用来在应用程序的action类中引用它。

? path 被映射资源的context-relative路径。

? redirect 设置成true,运用sendRedirect()引导到该资源;或者设置成false,运用RequestDispatcher.forward()作为替代。

运用<action下的<forward元素意味着你不必在你的ActionForward对象中写死路径名。例如,我们来看前面的login应用程序中LoginAction类的execute方法中的代码:public ActionForward execute(ActionMapping mapping,

ActionForm form, HttpServletRequest request,

HttpServletResponse response)

throws IOException, ServletException {

String userName =

request.getParameter("userName");

String password =

request.getParameter("password");

if (userName!=null && password!=null &&

userName.equals("john") &&

password.equals("123")) {

HttpSession session = request.getSession();

session.setAttribute("loggedIn", "1");

return (new ActionForward("/mainMenu.jsp"));

}

else {

return (new ActionForward("/login.jsp"));

}

}

注意,最后的两个return语句写死了mainMenu.jsp和login.jsp页面。如果任意一个文件名发生改变,你都必须重新编译LoginAction类。但是如果你用<forward元素,你可以用一个名称映射mainMenu.jsp页面,用另一个名称映射login.jsp页面。现在,如果你需要改变文件名,你就可以在配置文件中进行改变,而不需要重新编译了。要这么做,你需要在struts-config.xml文件中声明这个<action元素:

<action path="/login"

type="com.javapro.struts.LoginAction"

<forward name="success" path="/mainMenu.jsp"/

<forward name="failure" path="/login.jsp"/

</action

现在,mainMenu.jsp就与“success”这个名称联系在一起了,login.jsp与“failure”联系在一起了。你可以通过调用ActionMapping类的findForward方法,传入相关的名称从一个action实现类的内部得到ActionForward实例:mapping.findForward(name);

例如,要得到包含路径“/mainMenu.jsp”的ActionForward对象,我们可以用下面的方法:mapping.findForward("success");

同样,要得到包含路径“/login.jsp”的ActionForward对象,可以用:writemapping.findForward("failure");

接下来,我们该用<forward方法重写login应用程序了。

修改Login应用程序

注意,你在第三部分创建的login应用程序发生了怎样的变化。首先,我们来看原应用程序中ViewSecretAction类的execute方法:

public ActionForward execute(ActionMapping mapping,

ActionForm form, HttpServletRequest request,

HttpServletResponse response)

throws IOException, ServletException {

return (new ActionForward("/viewSecret.jsp"));

}

除了返回一个路径是“/viewSecret.jsp”的ActionForward对象外,该execute方法没有做任何的处理。通过运用struts-config.xml文件中<action元素的forward属性,我们就不需要ViewSecretAction类了。要实现这一点,我们可以将下面的<action代码:<action path="/viewSecret"

type="com.javapro.str

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有