`
wuxufeng8080
  • 浏览: 49423 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

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

    博客分类:
  • jBPM
阅读更多

现在手头的工作流页面端用的是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.                 "onclick=\"form.onsubmit=null\"/>";   
  18.                 out += "< input type=\"submit\" id=\" " + workflowId + "_0\" " +   
  19.                 "name=\"action:" + saveButton + this.workflowId + "\" value=\"" + saveButton + "\" " +   
  20.                 "onclick=\"form.onsubmit=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.                             "onclick=\"form.onsubmit=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方法的时候,最多就再添加一两个。

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

继续努力。

分享到:
评论

相关推荐

    Struts2 Spring Hibernate 应用源码两例

    本资源提供了两个基于SSH2的示例应用源码,对于学习和理解这三大框架的集成以及实际应用具有极大的帮助。 首先,Struts2作为MVC(模型-视图-控制器)设计模式的实现,负责处理用户请求,调度业务逻辑,并与视图进行...

    struts2 课程设计

    在"struts2 课程设计"中,我们将深入探讨如何利用Struts2框架来实现一个完整的通用WEB应用系统,包括交易系统和管理系统两个子系统。这两个子系统涵盖了商品展示、购物车管理、我的订单、用户管理和商品管理等关键...

    spring与struts2整合

    5. **拦截器**:Struts2 中的拦截器可以用来实现通用的行为,如权限验证、日志记录等。通过在 `struts.xml` 文件中配置拦截器栈,可以将这些拦截器应用到所有的 Action 或特定的 Action。 6. **视图解析**:Struts2...

    struts2 jpa project

    在Struts2中,你可以定义拦截器(interceptors)来实现通用的功能,如权限验证、日志记录等。 JPA的实现通常包括实体类(entity classes),这些类代表数据库中的表,并通过注解(如@Entity、@Table、@Id等)进行...

    struts2+spring实例程序

    Spring可以通过其IoC容器初始化Struts2的Action类,并进行依赖注入。同时,Spring的事务管理可以确保数据操作的原子性和一致性。Struts2的拦截器还可以与Spring的AOP结合,实现更复杂的业务逻辑和异常处理。 在实际...

    原创struts2讲义2.pdf

    拦截器是Struts2中的一个重要特性,它允许开发者在Action执行前后添加自定义的行为,比如身份验证、数据校验等。通过配置文件可以轻松地控制哪些Action需要经过哪些拦截器。 **1.2.3 FilterDispatcher与Action映射*...

    Struts2 文档.doc

    Struts2 的诞生是WebWork和Struts社区合作的结果,合并了两个框架的优点,使得新版本在易用性上有了显著提升。 Struts2 的核心架构包括以下几个主要部分: 1. **Web浏览器请求**:用户通过Web浏览器发起对资源的...

    struts2案例 struts2 struts2源码

    "struts2-mailreader-2.0.14.war"和"struts2-blank-2.0.14.war"是两个示例项目。MailReader示例展示了如何使用Struts2处理邮件阅读的业务,包括登录验证、邮件列表展示等功能,而Blank项目则是一个基础模板,提供了...

    STRUTS2优缺点

    - **配置文件较多:**虽然 STRUTS2 提供了 XML 和注解两种配置方式,但在实际开发中仍然需要编写大量的配置信息。 - **配置文件理解难度大:**对于初学者来说,理解这些配置文件的作用和意义可能需要花费一定的...

    struts2Jar

    10. **国际化与本地化**:Struts2支持多语言环境,可以轻松实现应用程序的国际化和本地化。 在实际开发中,使用Struts2可以显著提高开发效率,但同时也需要注意其安全问题。例如,Struts2曾曝出过一些高危漏洞,如...

    深入浅出struts2

    为了达成这一目标,Struts2中提供了很多新特性,比如智能的默认设置、annotation的使用以及“惯例重于配置”原则的应用,而这一切都大大减少了XML配置。Struts2中的Action都是POJO,这一方面增强了Action本身的可...

    struts2+hibernate 注册与登陆源代码

    在Struts2中,配置文件(struts.xml)定义了Action与结果页面的映射,以及Action的执行流程。对于注册功能,我们可以创建一个`RegisterAction`,处理用户的注册请求,而登录功能则对应于`LoginAction`,处理登录验证...

    struts2与dwr整合实例

    Struts2和DWR(Direct Web Remoting)的整合是Web开发中的一种常见技术组合,它们可以帮助开发者构建高效、交互性强的Web应用。Struts2作为MVC框架,提供了强大的控制层支持,而DWR则允许JavaScript在浏览器端直接...

    Struts2与tiles集成示例

    2. **Interceptor**: 拦截器是Struts2中的一个重要特性,它们按照预定义的顺序拦截Action调用,可以用于实现如日志、权限检查等通用功能。 3. **Result**: 表示Action执行后的输出,它可以是JSP、Freemarker模板、...

    struts2.rar

    这个名为"struts2.rar"的压缩包包含了与Struts2相关的两个核心资源:《Struts2_标签.pdf》和《Struts2详细实例教程.pdf》,它们将帮助我们深入理解Struts2框架及其应用。 《Struts2_标签.pdf》可能涵盖了Struts2中...

    Struts2_Spring_Example.zip_spring struts2_struts2-examp

    Struts2 和 Spring 的整合是企业级 Java 应用开发中的常见实践,这两个框架的结合可以充分利用它们的优势,实现更好的控制层(MVC)管理和依赖注入。本示例代码提供了如何将 Struts2 和 Spring 结合使用的具体实现,...

    STRUTS2+SpringLib架包

    Struts2和Spring是两个非常重要的Java开源框架,它们在企业级Web开发中扮演着核心角色。Struts2是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,而Spring则是一个全面的Java应用程序框架,尤其以其...

    Struts2框架使用的所有jar包

    9. `cglib-nodep.jar` 和 `javassist.jar`:这两个库通常作为Hibernate的依赖,用于动态代理和字节码操作,以实现对Java对象的懒加载和透明持久化。 此外,还有一些通用的jar包: 10. `commons-logging.jar`:提供...

    Struts2+Hibernate的简单购物车

    这个简单的购物车项目可能展示了如何在实际开发中结合这两个框架,实现用户登录、浏览商品、添加到购物车、结算等一系列功能。尽管具体的实现细节没有提供,但是理解这两个框架的基本原理和相互作用对于Java Web开发...

Global site tag (gtag.js) - Google Analytics