与其他语言/模板引擎组合花费了大量时间,但对于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兼容)方式来刷新会话变量或重置它,而不管它被设置为活动的页面吗?