最近因为工作的原因,重新接触的strut1.2,对其中的跳转很是不解。后来有机会接触到一种在后缀上加一个参数来给数据进行指定方法的调用,本来这是很好的。但是现在的项目是二次开发,就出现了一个问题,看了一个大牛的代码,让我不爽,我不明白是不是大牛就是技术狂。
这位大牛是这样做的 在页面中设置这样的隐藏域 偷偷的传参数给url,真是让人崩溃,代码真是晦涩难懂啊。我想很长时间才能搞懂整个项目的框架结构了.
<html:form action="tLSecuUsersAction.do" focus="${requestScope.focus == null ? 'name' : requestScope.focus}">
<html:hidden property="action" value="login" /><!-- input type="text" name="loginName" value="22"/ -->
</html:form>
<action path="/tLSecuUsersAction"
type="com.stt.platform.admin.web.TTSecuUsersAction"
name="TTSecuUsersLoginForm" scope="request" validate="false"
parameter="action">
</action>
在action中继承一个DispatchAction,其中有一个login()的方法 ,我晕。看完这段代码我直接崩溃,就是不让人看懂是不。。。
下面是关于 使用DispatchAction类调用多个Action方法的收集。希望会有点帮助!
在使用Struts动作时,每一个Action都需要编写一个类,并且要在struts-config.xml进行配置。这对于一个拥有很多Action的Web程序来说,工作量是非常大的。为此,Struts提供了DispatchAction类,这个类允许将一个Action作为一个方法来调用。在Web浏览器中通过请求参数来指定要调用的动作。
虽然DispatchAction类是一个抽象类,但其中却没有一个抽象方法。因此,DisplatchAction的子类不用实现任何DisplatchAction类中的方法。但如果要处理Action代码,就必须根据相应的Action来编写Action方法。一个Action方法除了方法名和execute方法不一样外,其他的都和execute方法完全一样。但编写Action方法时要注意,Action方法名必须和用于指定动作的请求参数值一致(大小写也必须一致)。在下面的例子中演示了通过DispatchAction类实现方法和Action的对应。在这个例子中,有三个方法:fr、en和unspecificed.其中fr和en是两个Action方法,分别用于将当前页面转发到法文和英文页面,而当用于指定Action的请求参数不存在时,则调用unspecificed方法(在这个方法中将当前页面转发到中文页面)。在这个程序中使用的用于指定Action的请求参数为language(读者可以指定自己的请求参数)。
在<samples工程目录>\src\action目录建立一个MyDispatchAction.java文件,代码如下:
package action;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.actions.*;
public class MyDispatchAction extends DispatchAction
{
// forward到法文页面
public ActionForward fr(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
try
{
RequestDispatcher rd = request.getRequestDispatcher("/newGlobal.jsp?language=fr");
rd.forward(request, response);
}
catch (Exception e)
{
}
return null;
}
// forward到英文页面
public ActionForward en(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
try
{
RequestDispatcher rd = request.getRequestDispatcher("/newGlobal.jsp?language=en");
rd.forward(request, response);
}
catch (Exception e)
{
}
return null;
}
// 在未使用language=fr和language=en作为访问参数的情况时调用这个方法
protected ActionForward unspecified(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception
{
try
{
// forward到中文页面
RequestDispatcher rd = request.getRequestDispatcher("/newGlobal.jsp?language=zh");
rd.forward(request, response);
}
catch (Exception e)
{
}
return null;
}
}
在struts-config.xml文件中加入如下的配置代码来配置MyDispatchAction:
<action path="/locale" type="action.MyDispatchAction" parameter="language"/>
其中parameter参数表示用于指定Action的请求参数名。
在启动Tomcat后,可通过如下的URL进行测试:
显示英文页面:
http://localhost:8080/samples/locale.do?language=en
显示法文页面:
http://localhost:8080/samples/locale.do?language=fr
显示中文页面(默认页面):
http://localhost:8080/samples/locale.do
虽然上面的代码可以很好地调用相应的Action方法,但在一些情况时,如请求参数language指定的Action方法不存在时,就会抛出异常。那么如果我们想在非正常情况下都调用默认的处理Action动作的方法(也就是unspecificed方法)该怎么办呢?