Tiles,Struts 2,链接动作以及传递put-attribute值

时间:2011-06-21 19:41:44

标签: attributes struts2 polymorphism chaining tiles2

我正在编写一个搜索引擎来探索多种搜索算法。 Web部分浮动在Struts 2.1.6和Tiles 2.2.2上。它目前是一个完整的混乱,所以下面我已经考虑了一个简化的版本,专注于我遇到的确切问题。

通过网站的正常流程如下:

  1. 搜索表单。选择搜索算法并输入搜索参数。
  2. 提交表格。算法选择设置表单提交的操作。
  3. 结果页面。在顶部包含searchform的副本(在splash和结果中使用相同的searchform jsp代码)。
  4. 问题:我想添加搜索表单变体。变体2将提交一些与变体1相同的搜索算法,具有相同的结果页面,但当然我希望变体2搜索形式显示在顶部以保持一致性。新流程将是:

    1. 选择搜索表单。对于Vanilla,转到2.对于Crazy,转到3。
    2. 从{A,B,C}中选择搜索算法并输入搜索参数。转到4。
    3. 从{B,C,D,E}中选择搜索算法并输入搜索参数。转到4。
    4. 提交。链(使用Struts“chain”resulttype **)到所选算法的相应搜索操作。
    5. 显示结果。包括{Vanilla |的副本疯狂}搜索表单。
    6. **切换到“链”是为了允许更自动地传递算法参数。旧方法使用了隐藏字段,使用重定向进行维护非常困难,您将在下面的struts.xml中看到。

      所以对于单一变体,我有类似的东西:

      struts.xml:
          <action name="SearchPage" class="nies.actions.search.SearchForm">
              <result name="input">/Search.jsp</result>
          </action>
      
      <!-- List of available search algorithms to fill 'searcher' param above: --> 
          <action name="AlgorithmA" class="nies.actions.search.AlgorithmA">
              <result name="success" type="tiles">Results</result>
              <result name="input"type="redirectAction">
                      <param name="actionName">SearchPage</param>
                      <param name="namespace">/</param>
                      <param name="searchAlgorithm">AlgorithmA</param>
              </result>
          </action>
          <action name="AlgorithmB" class="nies.actions.search.AlgorithmB">
              <result name="success" type="tiles">Results</result>
              <result name="input" type="redirectAction">
                      <param name="actionName">SearchPage</param>
                      <param name="namespace">/</param>
                      <param name="searchAlgorithm">AlgorithmB</param>
              </result>
          </action>
          <action name="AlgorithmC" class="nies.actions.search.AlgorithmC">
              <result name="success" type="tiles">Results</result>
              <result name="input" type="redirectAction">
                      <param name="actionName">SearchPage</param>
                      <param name="namespace">/</param>
                      <param name="searchAlgorithm">AlgorithmC</param>
              </result>
          </action>
      

      所以我打算添加的是:

      struts.xml:
          <action name="CrazySearchPage" class="nies.actions.search.CrazySearchForm">
              <result name="input">/CrazySearch.jsp</result>
              <result name="success" type="chain">${searcher}</result>
          </action>
      

      (可能将搜索页面的搜索输入显示切换到图块以保存copypasta)(并且为搜索算法输入所有输入重定向参数,因为链接会自动将这些值保留在堆栈中)

      ...但现在我已经被软管了,因为SearchPage和CrazySearchPage共享的链式操作都显示在结果图块中:

      tiles.xml:
      <tiles-definitions>
        <definition name="Results" template="/resultsTemplate.jsp">
      <put-attribute name="tabPane" value="/resultsEagerTabPane.jsp"/>
        </definition>
        ...
      

      结果图块包含常规SearchPage中使用的常规搜索表单代码:

      resultsTemplate.jsp:
      <%@ taglib prefix="s" uri="/struts-tags" %>
      <%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
      <html>
      <head>
        <title><s:property value="query.queryString"/></title>
      </head>
      <body>
      ...
      <div id="searchform">
      <tiles:insertTemplate template="/searchform.jsp" flush="true"/>
      </div>
      ...
      

      我想通过切换来相信

      <tiles:insertTemplate template="/searchform.jsp" flush="true"/>
      

      <tiles:insertAttribute name="searchform" flush="true"/>
      

      然后我可以(1)为CrazyResults创建一个新的tile,它通过相应的searchform jsp传递,或者(B)找到一些方法来传递tile属性,基于* SearchPage运行。

      (1)的问题是链式算法动作已经转到常规的结果图块,我不想从常规的SearchPage中禁止这些算法,所以我可以在CrazySearchPage上使用它们。我想我可以定义一组重复的算法动作供CrazySearchPage使用,它使用不同的名称和不同的结果调用同一个类,但这会使struts.xml和我的其他配置文件混乱(我有大量的显示与每个动作名称相关联的设置。)

      (B)的问题是我还没有找到足够的磁贴文档来告诉我这是否可行以及如何做到这一点。 Struts和Tiles似乎没有直接相互交谈,只是传递笔记。

2 个答案:

答案 0 :(得分:1)

我认为有几个独立的问题,所以这不是一个完整的解决方案,它只会解决我认为会成为绊脚石的问题。

混乱的主要原因是使用redirectAction并且您使用链的新计划并没有好多少。 struts2世界中的这些类似于goto语句。这就是它易于使用,非常适合快速修复,但如果不受约束地使用就会造成很大的混乱(并且像goto一样可以完全避免它们)。

以下是一些建议:

避免链接和redirectAction。它们似乎有意义使用拦截器。

添加约定插件,这样可以避免大多数struts.xml的维护。

如果完成上述操作,那么您的应用程序我相信不会一团糟,但视图中的问题似乎是一个单独的问题。我确实使用瓷砖,但我无法理解什么不起作用。您的所有图块结果都指向结果。我使用tile的方式就像你使用JSP一样。您应该对不同的页面(切片结果)有不同的定义。如果您没有使用 extends 属性的任何切片定义,我认为您缺少Tiles的强大功能。 Tiles非常像JSP,只是通过tile,你可以分解出页面的所有通用性。

答案 1 :(得分:0)

我的问题是如何在tiles属性中插入动作的响应。我这样做了:

<tiles:insertTemplate template="/workflow/login.action"/>

在web.xml:

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>        
</filter-mapping>

我不知道您是否想要这样做,但这与您为行动设定的结果无关。