在实际使用的时候,MultiActionController的使用不是在<<spring in action>>中介绍的那种方法(会spring的都应该知道那本书吧^V^),转而是使用delegate.
其实delegate的使用和书中介绍的方法差不多,下面就来介绍它的使用,一个很入门的例子:
首先在你的spring的配制文件里(例如example-servlet.xml里)写入如下代码
<bean id="taskInstanceController" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
<property name="methodNameResolver">
<ref bean="methodNameResolver" />
</property>
<property name="delegate">
<ref bean="taskInstanceDelegate" />
</property>
</bean>
<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName">
<value>action</value>
</property>
</bean>
<bean id="taskInstanceDelegate" class="com.aceway.adf.workflow.web.TaskInstanceDelegate">
<property name="adminServices">
<ref bean="jbpmAdminServices" />
</property>
</bean>
在这里对于methodNameResolver不熟的朋友可以去查一下资料
TaskInstanceDelegate.java的代码如下:
public class TaskInstanceDelegate {
protected AdminServices adminServices;
public AdminServices getAdminServices() {
return adminServices;
}
public void setAdminServices(AdminServices adminServices) {
this.adminServices = adminServices;
}
public ModelAndView saveAndClose(HttpServletRequest request,
HttpServletResponse response) {
Entry entry = null;
String key = "";
Map<String, String> taskInstanceVariables = new HashMap();
String taskInstanceId = request.getParameter("taskInstanceId")
.toString();
Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) {
key = (String) e.nextElement();
if (key.startsWith(Global.TASK_INSTANCE_VARIABLE_HEAD)) {
taskInstanceVariables.put(key, request.getParameter(key)
.toString());
}
}
String sendResult = adminServices.saveAndClose(Long
.valueOf(taskInstanceId), null, taskInstanceVariables,
"default");
if (sendResult.equals(Global.FALSE))
return new ModelAndView("error", "error", sendResult);
else
return new ModelAndView("info", "info", sendResult);
}
public ModelAndView save(HttpServletRequest request,
HttpServletResponse response) {
String taskInstanceId = request.getParameter("taskInstanceId")
.toString();
String processDefinitionId = request
.getParameter("processDefinitionId").toString();
return new ModelAndView("error", "error", taskInstanceId + "--"
+ processDefinitionId);
}
public ModelAndView cancel(HttpServletRequest request,
HttpServletResponse response) {
String taskInstanceId = request.getParameter("taskInstanceId")
.toString();
String processDefinitionId = request
.getParameter("processDefinitionId").toString();
return new ModelAndView("error", "error", taskInstanceId + "--"
+ processDefinitionId);
}
}
在这里注意的地方的是方法里的参数是(HttpServletRequest request, HttpServletResponse response),记住一定得是这个参数,不然不能正确的找到相应的方法
下面就是相应的.jsp代码了
<form method="post" action="taskInstance.htm">
名称: <input type="text" name="v_name" value="${taskInstanceVariable.variable['v_name']}">
<br>
数量: <input type="text" name="v_item" value="${taskInstanceVariable.variable['v_item']}">
<br>
<input type="hidden" name="taskInstanceId" value="${taskInstanceVariable.taskInstanceId}">
<input type="hidden" name="processDefinitionId" value="${taskInstanceVariable.processDefinitionId}">
<input type="hidden" name="action" id="action">
<input type="submit" value="保存并关闭" οnclick='document.forms[0].elements["action"].value="saveAndClose"'><br>
<input type="submit" value="保存" οnclick='document.forms[0].elements["action"].value="save"'>
<input type="submit" value="取消" οnclick='document.forms[0].elements["action"].value="cancel"'><br>
<input type="submit" width="100px" value="重新分配" οnclick='document.forms[0].elements["action"].value="getActorsName"'>
</form>
这里注意的是<input type="hidden" name="action" id="action">,它的name是action这是和在上面配制文件里methodNameResolver里的paraName的value值是一样的.
还一个要注意的地方,在onclick事件为action付一个值是delegate方法的名字,注意一定得一样哦,包括大小写.