Struts1.1发布了这么长时间了,我才刚刚开始系统地学习Struts的相关知识,经过前一阵潜心研究,对Struts1.1中已有的类DispatchAction有了进一步的熟悉。我将在这里总结一下,希望能对大家有所帮助。
在1.0版本中我们通常都是用execute方法来完成我们对业务逻辑的处理及页面的转发。通常在一个Action中我们都只能够完成一种业务逻辑的操作。假如要是完成多个业务逻辑(比如:添加、删除等)功能相近的业务逻辑我们就没有办法了么?答案是否定的,我们可以通过在页面中定义一个隐藏变量,在不同的页面要求处理不同的业务逻辑的时候我们可以赋予这个变量不同的值,并在execute方法中通过对变量值的判定来完成不同的业务逻辑操作。
举例来说,我们首先在页面中定义一个隐藏变量。
<;Html:hidden property="operAt"/
然后定义一个javascript函数,我们可以在通过点击提交按钮的时候,在函数体里面修改它的值。
<;SCRIPT
function set(key) {
with(document.forms[0]){
operAt.value=key;
}
}
<;/SCRIPT
当我们点击提交按钮便触发该事件,修改变量的值。
<;html:submit onclick="set('save');"SAVE<;/html:submit
那我们在后台execute中又如何处理相关逻辑呢?
String operAt = myForm.getOperAt();
if (operAt.equals("create")) { ……
if (operAt.equals("save")) { ……
很简单吧!虽然说这样做我们可以实现多个业务逻辑在同一个Action中实现,可是带来的代价便是代码的冗长,不易理解。
下面我们就要介绍一下DispatchAction类了。它是Action的一个子类,它可以实现多个业务逻辑在同一个Action当中的实现,而上面的例子在DispatchAction中也就变成了下面的形式:
public ActionForward create(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception { ……
public ActionForward save(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception { ……
每一种业务逻辑都能在DispatchAction当中找到对应的方法。那么我们如何去实现这样的调用呢?DispatchAction中对struts-config.XML的配置比一般的Action配置稍显麻烦,举例来讲:
<;action path="/telConsle"type="com.meng.action.TelConsleDispatch"
name="telForm" scope="request" validate="false" parameter="method"/
我们在这里指定了parameter的值为method,而当我们请求Action的时候我们必须指定method的值来确定去我们想要调用哪个Action方法。如:
http://localhost:8080/tsss/telConsle.do?method=save
显然,通过显示链接指定参数值的方法可以达到我们调用方法的目的。然而我们假如不想显示调用的话我们应该怎样处理呢?还记得前面讲过的方法么?我们在页面中定义一个隐藏的变量,然后通过对变量的赋值来确定我们来确定我们将要执行的业务方法。在这里我们可不可以一样这样使用呢?
答案是肯定的,我们当然可以通过定义一个类似于<;html:hidden property="operAt"/的变量,只要对该变量赋上对应DispatchAction中的方法的值来确定我们要调用的业务方法。然而笔者比提倡用Struts标签来定义这样的隐含的变量,因为Struts标签为动态标签,它可能需要在FormBean中定义该属性的get和set方法,而在parameter中定义的值不需要在FormBean当中定义get和set方法。笔者建议用html的标准标签<;input来定义该隐藏变量。因为该标签为静态标签,假如我们该用Struts标签的话可能导致页面出错。