我正在学习JSF 2。我想要实现的第一件事是以下场景:
我的页面上有一个commandLink。单击此链接时,将呈现h:panelGroup-Tag(取决于相应ManagedBean中的布尔属性 - 默认情况下为false)。我希望当再次点击“打开”panelGroup的链接时(那已经有效),不会呈现该panelGroup但我希望当用户点击该panelGroup外部时(不起作用)也不会呈现panelGroup
ManagedBean看起来像:
@ManagedBean
@SessionScoped
public class LocaleBean {
@PostConstruct
public void init(){
locale = new Locale("de_DE");
showLanguageDiv = false;
}
private boolean showLanguageDiv;
public boolean getShowLanguageDiv() {
return showLanguageDiv;
}
public void setShowLanguageDiv(final boolean showLanguageDiv) {
this.showLanguageDiv = showLanguageDiv;
}
public void switchShowDivStatus(ActionEvent e) {
showLanguageDiv = !showLanguageDiv;
}
facelet看起来像:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core">
<h:form>
<div>
<h:commandLink style="float: right;padding: 2px" actionListener="#{localeBean.switchShowDivStatus}" value="#{msg.language}" >
</h:commandLink>
</div>
<h:panelGroup rendered="#{localeBean.showLanguageDiv}" style="clear:both;float:right;border:2px;border-style: solid" >
<p><h:commandButton .... /></p>
<p><h:commandButton .... /></p>
<p><h:commandButton .... /></p>
</h:panelGroup>
</h:form>
</ui:composition>
我已经尝试添加一个通过javascript点击的隐藏链接(当用户点击正文中的任何位置时),它将ManagedBean的布尔属性设置为false,以便不渲染panelGroup。这部分起作用,因为panelGroup不再显示了。但另一方面,点击链接以显示panelGroup后再没有效果了。
它的外观如下:
<h:body onclick="document.getElementById('invisibleform:invisiblelink').click()">
.
.
.
<h:form id="invisibleform">
<h:commandLink id="invisiblelink" actionListener="#{localeBean.switchShowDivStatus}"></h:commandLink>
</h:form>
</h:body>
那么我该如何解决这个问题呢?这样做的最佳做法是什么?隐藏的链接是正确的方法吗?从我到目前为止所看到的,似乎这是应该通过javascript在客户端完成的事情。但我找到的所有解决方案都基于普通的html页面(非JSF),我无法想象在使用JSF时应该如何做。
感谢您的任何建议。
答案 0 :(得分:0)
你能在JSF上使用Primefaces吗?有一个组件<p:overlayPanel>
See here for the showcase。也许这对你有用......