`
cats_tiger
  • 浏览: 276493 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2 + ECSide解决“查询->更新->回到原查询状态”的问题

阅读更多
经常有这样的情况:用户千辛万苦的查询数据,并且翻页呀翻页的找到一条,然后修改它,保存成功以后,查询结果和页数都不见了!下次修改不得不重复上述操作。
使用Struts2的Chain Result可以实现多个Action的连续执行,但是,上述场景中需要跨越两次以上的Requests,很多parameters都无法保留,入下图:
查询=>分页=>编辑(查询参数和分页参数丢失)=>保存=>查询(没有参数的查询)
解决的办法是保留parameters,可以写一个taglib来实现这个目的:
public class ParametersTag extends BodyTagSupport {
  private static Log log = LogFactory.getLog(ParametersTag.class);
  /** 输出为input tag */
  public static final String TYPE_INPUT_TAG = "inputTag";
  /** 输出为query string */
  public static final String TYPE_QUERY_STRING = "queryString";
  
  /**
   * 指定包含的parameters,如果没有指定,则包含全部。可以使用*、?作为通配符。
   */
  private String includes;
  /**
   * @see #TYPE_INPUT_TAG
   * @see #TYPE_QUERY_STRING
   */
  private String type;

  /**
   * @see javax.servlet.jsp.tagext.BodyTagSupport#release()
   */
  @Override
  public void release() {
    includes = null;
    type = null;
    super.release();
  }

  /**
   * @see javax.servlet.jsp.tagext.BodyTagSupport#doEndTag()
   */
  @Override
  public int doEndTag() throws JspException {    
    Enumeration<String> keys = pageContext.getRequest().getParameterNames();
    String str = "";    
    if(StringUtils.isBlank(type) || StringUtils.equals(TYPE_INPUT_TAG, type)) {
      log.debug("Build Input Tags.");
      str = buildInputTags(keys);
    } else {
      log.debug("Build query string.");
      str = buildQueryString(keys);
    }
    try {
      pageContext.getOut().write(str);
    } catch (IOException e) {
      e.printStackTrace();
    }
    return BodyTagSupport.EVAL_PAGE;
  }
  
  /**
   * 根据参数构造queryString
   * @param keys 参数名称
   */
  private String buildQueryString(Enumeration<String> keys) {
    StringBuffer buf = new StringBuffer();
    while(keys.hasMoreElements()) {
      String key = keys.nextElement();
      String value = pageContext.getRequest().getParameter(key);
      if(StringUtils.isBlank(value)) {
        continue;
      }
      buf.append(key)
      .append("=")
      .append(value);
      if(keys.hasMoreElements()) {
        buf.append("&");
      }
    }
    return buf.toString();
  }

  /**
   * 根据参数构造Input
   * @param keys 参数名称
   */
  private String buildInputTags(Enumeration<String> keys) {
    StringBuffer buf = new StringBuffer();
    while(keys.hasMoreElements()) {
      String key = keys.nextElement();
      if(!isInclude(key)) {
        continue;
      }
      String value = pageContext.getRequest().getParameter(key);
      buf.append("<input type='hidden' name='")
      .append(key) 
      .append("' value='")
      .append((value == null) ? StringUtils.EMPTY : value)
      .append("'/>");
    }
    
    return buf.toString();
  }
  
  /**
   * 判断某个参数是否可以包含。
   */
  private boolean isInclude(String target) {
    if(StringUtils.isBlank(includes)) {
      return true;
    }
    PathMatcher matcher = new AntPathMatcher();
    Set<String> incs = StringUtil.parseCommaSplitedString(includes);
    for(String inc : incs) {
      if(matcher.match(inc, target)) {
        return true;
      }
    }
    
    return false;
  }
  
  
  /**
   * @return the includes
   */
  public String getIncludes() {
    return includes;
  }

  /**
   * @param includes the includes to set
   */
  public void setIncludes(String includes) {
    this.includes = includes;
  }

  /**
   * @return the type
   */
  public String getType() {
    return type;
  }

  /**
   * @param type the type to set
   */
  public void setType(String type) {
    this.type = type;
  }
}

jsp页面中这样使用:
<s:form theme="simple" action="create" id="saveForm">
	<jsam:params includes="ec*,query*" type="inputTag"></jsam:params>
</s:form>

或者:
  <a href='edit.do?id=${item.id}&<jsam:params includes="ec*,query*" type="queryString"/>'>edit</a>

在Struts2的配置文件中和chain一起使用:
  <action name="preStorageQuery" class="preStorageAction" method="pageQuery">
	<interceptor-ref name="chain"></interceptor-ref>
        <interceptor-ref name="basicStack"/>
	    <result name="success">list.jsp</result>
  </action>
  <!-- 使用chain,可以回到原来的查询状态 -->
  <action name="save" class="preStorageAction" method="save">		   
	<result name="success" type="chain">		    
	    <param name="actionName">preStorageQuery</param>
	    <param name="method">pageQuery</param>
	    <param name="namespace">/admin/drugstorage/pre</param>
	 </result>		   
	 <result name="input">list.jsp</result>
	 <interceptor-ref name="params" />
	 <interceptor-ref name="model-driven" />
         <interceptor-ref name="validationWorkflowStack" />
  </action>

上面的代码中省略了.tld中的内容,而且taglib只有includes属性,没有excludes属性。
使用taglib应该算是比较丑陋的做法,但是一时也想不到更好的方法,Ajax当然可以解决,可是我这个项目是改造遗留系统,总不能都改成Ajax的。其实这个taglib用起来还算方便,各位如果有更好的办法请多赐教,这篇博文权当抛砖。
分享到:
评论
7 楼 soci 2008-09-09  
GET提交
6 楼 yourenyouyu2008 2008-09-09  
如果你们用seam中的对话的话,这样的问题相当的简单。
5 楼 syncml 2007-12-21  
我也为这种类型的操作犯愁
4 楼 huazihun 2007-12-15  
@cats_tiger
发生错误类似:http://ecside.group.iteye.com/group/topic/3150
,望赐教!
3 楼 steven_652 2007-12-14  
这里会有一个问题的,查询条件的字段很有可能会和编辑form的字段重复,导致提交form出错。比如查询条件中有合同号字段(ContractNo),在编辑记录的时候恰巧也有合同号信息需要进行修改,这样就会出现异常!
2 楼 cats_tiger 2007-12-14  
发生什么错误呀?从来没有遇到过。
1 楼 huazihun 2007-12-14  
写的不赖,学习了。
但不知道楼主能否解决一下struts2+ecside的隐藏input表单问题,
在查询、翻页、排序时会发生错误。

相关推荐

    《JavaEE实用开发指南:基于Weblogic+EJB3+Struts2+Hibernate+Spring》-- part3/3

    《JavaEE实用开发指南:基于Weblogic+EJB3+Struts2+Hibernate+Spring》-- part3/3

    JSP-车辆管理系统(struts+hibernate+spring+oracle)

    JSP-车辆管理系统(struts+hibernate+spring+oracle) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! JSP-车辆管理系统(struts+hibernate+spring+oracle) JSP-车辆管理系统(struts+hibernate+spring+oracle) ...

    struts+spring+hibernate的整合JAR包

    struts+spring+hibernate的整合JAR包,里面包含了这三个框架需要的所以jar包,还包括会用到的其他jar包像:log4j.jar ...。 若需开发SSH项目,可以遵循以下步骤 1:使用MyEclipse创建Web Project 2:添加struts 右键-...

    struts2 + spring + mybatis 框架整合jar包

    &lt;filter&gt;&lt;filter-name&gt;struts2&lt;/filter-name&gt;&lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter&lt;/filter-class&gt;&lt;/filter&gt;&lt;filter-mapping&gt;&lt;filter-name&gt;struts2&lt;/filter-name&gt;...

    Struts2+Spring+MyBatis环境搭建

    Struts2+Spring+MyBatis环境搭建 Struts2、Spring 和 MyBatis 是 Java Web 开发中三个非常重要的框架,分别负责 MVC 模式的Presentation层、Business层和Persistence层。Struts2 负责处理用户的请求和响应,Spring ...

    解决struts2.1.6+spring+hibernate 中文乱码

    ### 解决Struts2.1.6 + Spring + Hibernate 中文乱码问题 在Web开发过程中,特别是使用Java EE框架时,字符编码问题一直是开发者关注的重点之一。对于使用Struts2.1.6、Spring以及Hibernate这三个框架组合的项目而...

    Struts2+spring2+hibernate3实例源码-java源码

    ### Struts2 + Spring2 + Hibernate3 整合实例源码分析 #### 一、概述 随着企业级应用的发展,为了提高开发效率和系统维护性,越来越多的项目开始采用MVC设计模式。其中,Struts2作为MVC框架中的佼佼者,在前端...

    Maven下搭建Struts2+spring+hibernate框架

    &lt;filter-class&gt;org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;struts2&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;/filter...

    struts框架搭建

    ### Struts2框架搭建及配置详解 #### 一、Struts2框架简介 Struts2是Struts的一个改进版本,它结合了WebWork框架和Struts框架的优点,并且增加了许多新特性,使得开发者能够更加方便地开发Java Web应用程序。...

    Struts2-Crud+JdbcDemo最简单的Struts2+jdbc学习曾删改查程序

    这个"Struts2-Crud+JdbcDemo"项目是一个基础的学习示例,涵盖了如何使用Struts2和JDBC进行基本的CRUD(创建、读取、更新和删除)操作。 首先,我们来详细了解一下Struts2的核心概念: 1. **Action类**:在Struts2...

    最新版本的Struts2+Spring4+Hibernate4框架整合

    整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...

    json-lib-2.1.jar和struts2-json-plugin-2.1.8.1.jar

    结合这三个组件,开发者可以构建出响应式、动态的Web应用,后端使用Struts 2处理业务逻辑,通过JSON Plugin返回JSON数据,前端利用jQuery通过AJAX请求获取这些数据,然后动态更新页面,提高用户体验。这种前后端分离...

    Struts2学习案例--------入门篇

    输出Hello World 使用到struts2标签和jstl表达式 2、 URL:http://localhost:8080/struts100515 输入用户名XXX ------&gt; 提交 ,显示 你好 XXX 使用ONGL表达式 3、 URL:...

    struts2-json-plugin-2.3.8.jar

    Struts2 JSON Plugin是针对Apache Struts2框架的一个重要组件,版本为2.3.8。这个插件主要的功能是让Struts2应用程序能够轻松地处理JSON(JavaScript Object Notation)数据格式,使得Web应用可以方便地进行JSON序列...

    SSH\\others\\struts2-spring-plugin-2.2.1.jar

    Struts2是一个非常著名的Java Web开发框架,它基于MVC(Model-View-Controller)设计模式,用于构建高效、可扩展且易于维护的企业级应用程序。在给定的压缩包文件中,我们关注的是"struts2-spring-plugin-2.2.1.jar...

    struts2-convention-plugin-2.3.15.1.jar

    struts2-convention-plugin-2.3.15.1.jar

    struts2+json

    Struts2是一个强大的Java web开发框架,它极大地简化了基于MVC(模型-视图-控制器)架构的应用程序开发。这个资源"struts2+json"显然涉及到在Struts2框架下实现JSON(JavaScript Object Notation)数据交换,这是一...

    STRUTS2+HIBERNATE详细的分页实现代码详细的分页实现代码

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是如何在Struts2与Hibernate框架结合下实现分页功能。接下来将详细解析Struts2与Hibernate如何协作完成这一任务。 ### Struts2与Hibernate...

Global site tag (gtag.js) - Google Analytics