JSF无法以编程方式调用表单重置按钮,或重置会话变量

时间:2014-09-06 13:21:59

标签: javascript jsf session javabeans

与其他语言/模板引擎组合花费了大量时间,但对于JSF来说是相当新的并且具有"愉快"接管使用basic Sun JSF lib的遗留JSF 1.1项目并且由于政治原因无法更新为更现代化的东西,如使用PrimeFaces或IceFaces的JSF 2.2,我个人喜欢在阅读之后做的事情那些能力。

设置是一个简单的Web应用程序,其中包含登录页面和两个选项卡(人员和地址),每个选项卡都有自己的Backing Beans和JSF页面。每个选项卡的六个总导航状态以"搜索表单"开头。导致"搜索结果"提交页面,然后是"查看"个人结果的页面 onmousedown (点击动作);对于每个人和地址数据。 "搜索表单"页面是会话范围的,并且被设计成在标题为"用户的搜索查询"的标题框中将搜索参数传递给彼此。这样做是因为"搜索结果"地址搜索的页面实际上是一个重载的人员搜索结果,其中地址被引入"按地址搜索人员#34;。是的,这可能都可以通过一个带有一些可选搜索参数的单页来完成,但它不是,并且无论出于何种原因我不允许更改核心页面结构,只是负责修复错误。

有一个长期存在的错误我被要求修复,其中一个页面(人物)总是在设置两个(地址)时显示搜索参数,因为一些不完整的逻辑(里面)显示搜索查询参数的panelGrid:)

<h:outputText value="Coverage Type:"/>
<h:outputText value="#{addressSearchUI.searchParameters.coverageType}" 
   rendered="#{empty personSearchUI.searchParameters.coverageType}"/>
<h:outputText value="#{personSearchUI.searchParameters.coverageType}"
   rendered="#{!empty personSearchUI.searchParameters.coverageType}"/>

有点过于简单化了;如果设置了人物搜索的覆盖范围类型,请使用该设置,但如果没有,请尝试使用地址coverageType搜索参数。只设置一个或另一个时效果很好。

问题案例: 由于它们是会话范围的,如果它们都设置在单独的搜索中并且我们在“地址”页面上怎么办?显示旧人员搜索的值(反之亦然;这是主要问题)。如果它们都没有设置怎么办?它应该显示ALL COVERAGE的默认值,很容易添加,但不能解决这个主要问题。

解: 认为这将是一个简单的解决方案,但我已经碰到了一个主要的墙,试图做以下两个简单的事情之一,我认为这将解决我的问题:

A)获取一个页面的搜索参数的会话范围值并重置它或设置为空字符串(然后该naiive表示逻辑可以保留原样)

B)当我们切换标签时调用支持bean init()方法时,以编程方式从Java调用一个页面的重置按钮(我可以调用该方法,但不知道如何获取原始会话实例而不是创建新的一个,它将触发一个不存在的页面UI方式)


这是我迄今为止所做的尝试:

A)向提交按钮本身添加 actionListener 属性,并尝试强制重置其他搜索表单中的值。

<h:commandButton
       id="personReset"
       styleClass="submitButton"
       value="Reset"     
       action="#{transactionSearchUI.resetSearch}"/>

<h:commandButton 
      id="personSearch"     
      styleClass="searchButton"
      value="Search"
      rendered="#{personSearchUI.canDo['performSearch']}" 
      actionListener="#{addressSearchUI.resetSearch}"
      action="#{personSearchUI.performSearch}"/>

B)在每次搜索的辅助bean中,尝试调用另一个的重置按钮:

/* utility method */
  private UIComponent findComponent(String id, UIComponent where) {
       if (where == null) {
          return null;
       }
       else if (where.getId().equals(id)) {
          return where;
       }
       else {
          List<UIComponent> childrenList = where.getChildren();
          if (childrenList == null || childrenList.isEmpty()) {
             return null;
          }
          for (UIComponent child : childrenList) {
             UIComponent result = null;
             result = findComponent(id, child);
             if(result != null) {
                return result;
             }
          }
        return null;
      }
  }

//... then inside init() method that is called when Person tab loads

FacesContext facesContext = FacesContext.getCurrentInstance();
UIViewRoot root = facesContext.getViewRoot();      
HtmlCommandButton button = (HtmlCommandButton) findComponent("addressReset", root);
ActionEvent actionEvent = new ActionEvent(button);
actionEvent.queue();

使用NullPointerException失败,因此显然无法以这种方式从其他的支持bean访问一个选项卡(除非我遗漏了某些内容)。

C)将值从一个标签重置为另一个标签的JavaScript方法:

<script type="text/javascript">
function clearAddressSearchParams() {
    document.getElementById('AddressSearch:addressSearch:addressReset').click();
    document.forms['AddressSearch:addressSearch'].reset();
    return false;
}
window.onload = clearStats;
</script>

这两种尝试触发&#34;重置&#34;的客户端方法都没有。按钮动作将继续工作,再次,&#34; Person&#34;和&#34;地址&#34;搜索表单被设置为两个完全独立的bean和页面(即使最终扩展另一个),一个不会活跃(或在DOM中可用),因此它不会找到元素。

在这一点上,我知道显然有一个更简单的解决方案,但我在我的智慧结束时可能从错误的角度来看这个,所以我不知道还有什么可做,但放了这里有一些JSF天才的赏金。但是,如果有人可以建议修复(鉴于我对旧版JSF技术的限制,不添加外部库并保持相同的基本代码结构),您将获得赏金和大量赞赏。

编辑:要将所有这些概括为一个问题,任何人都可以建议一个可靠的(遗留JSF 1.1兼容)方式来刷新会话变量或重置它,而不管它被设置为活动的页面吗?

0 个答案:

没有答案