邱吉尔曾经说过他喜欢学习新东西,但他觉得没有必要让别人教他。不管你是否喜欢学习新知识,也不管有人教你还是你自学,学习通常意味着仔细研究许多特殊的类。学习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配置文件中的这个
这个
ActionMapping类的属性
ActionMapping有许多属性。首先,它从ActionConfig类继承了一些属性——如type、forward、include和unknown。它们与action forms是无关的。前三个属性是ActionMapping类最重要的属性。你只能指定其中的一个,所以,如果一个
type属性的值是路径所映射的Action类的完全限定的类的名称。(你曾在前面的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类。
注意,
我们用
例如,下面这个
unknown="true"/>
· contextRelative 在一个模块化应用程序中,如果路径属性是以一个斜线(“/”)开头的,并且是相对于整个Web应用程序的,而不是相对于该模块的,我们就将这个属性设置为true。缺省情况下是false。
· name 这是forward的唯一标识符,用来在应用程序的action类中引用它。
· path 被映射资源的context-relative路径。
· redirect 设置成true,运用sendRedirect()引导到该资源;或者设置成false,运用RequestDispatcher.forward()作为替代。
运用
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类。但是如果你用
现在,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");
接下来,我们该用
修改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文件中
【责编:admin】
--------------------next---------------------