实际应用中的两个通用化实现(struts2)

现在手头的工作流页面端用的是struts2,由于以前没有用过webwork,所以现在用起来基本上是摸着石头过河,感觉蛮辛苦的,不过很有挑战性。

在经过一个早上的努力之后,实现了针对工作流页面的转发action,用于将不同的ProcessDefinition转发到相应的action。这里听取了同事的意见,直接把页面action的名字和流程定义名默认一样,这样就可以少一张table来维护,何乐不为。所以这个DispatchAction最后变成很简单的,就实现了一个可以动态转发action的动作。参考apache上面的文章,很快完成了这一部分的操作。

xml 代码 (struts2配置文件)
  1. <action name="FlowDispatch" class="com.ivo.wfl.action.FlowDispatchAction">  
  2. action>  
  1. <global-results>  
  2.       <result name="forwardAction" type="chain">${forwardAction}result>  
  3. global-results>  
java 代码 (DispatchAction)
  1. import com.ivo.common.BaseAction;   
  2.   
  3. public class FlowDispatchAction extends BaseAction {   
  4.        
  5.     private String forwardAction;   
  6.        
  7.     public FlowDispatchAction() {   
  8.     }   
  9.        
  10.     @Override  
  11.     public String execute() {      
  12.         String workflow_ID = request.getParameter("Workflow_ID");   
  13.         forwardAction = workflow_ID;   
  14.         return "forwardAction";   
  15.     }   
  16.   
  17.     public String getForwardAction() {   
  18.         return forwardAction;   
  19.     }   
  20.   
  21.     public void setForwardAction(String forwardAction) {   
  22.         this.forwardAction = forwardAction;   
  23.     }   
  24.        
  25. }  

以上的实现基本上参考apache上的说明文档,设置一个全局result,type为chain,这样在每一个package中都可以调用,并能保存request范围的数据。在repuest中会把ProcessDefinition带过来,这样通过约定的方式,直接转发到对应的action。

 

然后就是页面端button的部分,每一个环节都有不同的按钮,所以这里也用约定的方式,transition名字就作为button的名字,然后action里面的方法也要与transition相同,这样,在调用相应的button时,就默认去执行这个transition对应的方法。这样的实现比较简单。

java 代码
  1. public class ButtonTag extends TagSupport{   
  2.   
  3.     private String taskName;   
  4.     private Long taskId;   
  5.     private String workflowId;   
  6.        
  7.     public int doEndTag() throws JspException {   
  8.         Request objRequest = new Request();   
  9.         Response objResponse = null;   
  10.         String acceptButton = "accept";   
  11.         String saveButton = "save";   
  12.         try{   
  13.             String out = "";   
  14.             if (taskId == 0) {   
  15.                 out += "< input type=\"submit\" id=\" " + workflowId + "_0\" " +   
  16.                 "name=\"action:" + acceptButton + this.workflowId + "\" value=\"" + acceptButton + "\" " +   
  17.                 "οnclick=\"form.οnsubmit=null\"/>";   
  18.                 out += "< input type=\"submit\" id=\" " + workflowId + "_0\" " +   
  19.                 "name=\"action:" + saveButton + this.workflowId + "\" value=\"" + saveButton + "\" " +   
  20.                 "οnclick=\"form.οnsubmit=null\"/>";   
  21.             }else {   
  22.                 objRequest.setTaskId(this.taskId);   
  23.                 objResponse = objRequest.call("Transition");   
  24.                
  25.                 for( String transition : objResponse.getTransitions()) {   
  26.                     if (transition.equals("loop")) continue;   
  27.                     out += "< input type=\"submit\" id=\" " + workflowId + "_0\" " +   
  28.                             "name=\"action:"+transition + this.workflowId + "\" value=\"" + transition + "\" " +   
  29.                             "οnclick=\"form.οnsubmit=null\"/>";   
  30.                 }   
  31.             }   
  32.             pageContext.getOut().print(out);   
  33.         }catch (Exception e) {   
  34.             e.printStackTrace();   
  35.         }   
  36.         return SKIP_BODY;   
  37.     }  

这种方法跟下面那种其实很类似,只需要把onclick部分的代码替换为自定义的js方法即可objRequest这个对象是用来调用web service。通过web service返回了这个taskInstance的transtion,然后根据这个transition名字来循环创建button。

 

最后就是button端怎么调用action中的方法,刚开始我用struts2默认的格式,使用string将这一段代码拼出来。后来因为客户端验证的问题,因为页面上有很多必选或者其他非业务数据的验证,所以最好能在页面端就验证,这样能减少server的压力。所以出了几个通用的js方法,来调用相应的action。因为流程中transition的名字也不会很多,就那么几个,所以很少会出现添加js方法的时候,最多就再添加一两个。

到下午,把上面的程序都调通,这样,我的第一个表单到目前为止改善的差不多了。

继续努力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值