如何使用JSF显示/隐藏组件?

Abh*_*ote 21 javascript java jsf

如何使用JSF显示/隐藏组件?我目前正在尝试在javascript的帮助下做同样的事但不成功.我不能使用任何第三方库.

感谢| ABHI

Kev*_*ahe 60

实际上,您可以在没有 JavaScript的情况下完成此任务,仅使用JSF的rendered属性,将要显示/隐藏的元素包含在可以重新呈现的组件中,例如panelGroup,至少在JSF2中.例如,以下JSF代码显示或隐藏两个下拉列表中的一个或两个,具体取决于第三个下拉列表的值.AJAX事件用于更新显示:

<h:selectOneMenu value="#{workflowProcEditBean.performedBy}">
    <f:selectItem itemValue="O" itemLabel="Originator" />
    <f:selectItem itemValue="R" itemLabel="Role" />
    <f:selectItem itemValue="E" itemLabel="Employee" />
    <f:ajax event="change" execute="@this" render="perfbyselection" />
</h:selectOneMenu>
<h:panelGroup id="perfbyselection">
    <h:selectOneMenu id="performedbyroleid" value="#{workflowProcEditBean.performedByRoleID}"
                     rendered="#{workflowProcEditBean.performedBy eq 'R'}">
        <f:selectItem itemLabel="- Choose One -" itemValue="" />
        <f:selectItems value="#{workflowProcEditBean.roles}" />
    </h:selectOneMenu>
    <h:selectOneMenu id="performedbyempid" value="#{workflowProcEditBean.performedByEmpID}"
                     rendered="#{workflowProcEditBean.performedBy eq 'E'}">
        <f:selectItem itemLabel="- Choose One -" itemValue="" />
        <f:selectItems value="#{workflowProcEditBean.employees}" />
    </h:selectOneMenu>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,如果您还想提交表单,则只提交render = true的输入字段(或此处为SelectOneMenus). (3认同)
  • 应该注意的是,它使用ajax并会创建额外的服务器请求。尽管有时这可能是更好的选择,但我会选择基于javascript的解决方案 (2认同)

McD*_*ell 14

通常,您需要通过其clientId获取控件的句柄.此示例使用带有请求范围绑定的JSF2 Facelets视图来获取另一个控件的句柄:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
  <h:head><title>Show/Hide</title></h:head>
  <h:body>
    <h:form>
      <h:button value="toggle"
               onclick="toggle('#{requestScope.foo.clientId}'); return false;" />
      <h:inputText binding="#{requestScope.foo}" id="x" style="display: block" />
    </h:form>
    <script type="text/javascript">
      function toggle(id) {
        var element = document.getElementById(id);
        if(element.style.display == 'block') {
          element.style.display = 'none';
        } else {
          element.style.display = 'block'
        }
      }
    </script>
  </h:body>
</html>
Run Code Online (Sandbox Code Playgroud)

具体如何执行此操作取决于您正在使用的JSF版本.有关较旧的JSF版本,请参阅此博客文章:JSF:使用组件标识符.


Tho*_*sen 7

使用 h 命名空间中大多数(如果不是全部)标记上可用的“rendered”属性。

<h:outputText value="Hi George" rendered="#{Person.name == 'George'}" />
Run Code Online (Sandbox Code Playgroud)


Eug*_* S. 7

您应该使用<h:panelGroup ...>带属性的标记rendered.如果设置true为渲染,<h:panelGroup ...>则不会显示内容.你的XHTML文件应该是这样的:

<h:panelGroup rendered="#{userBean.showPassword}">
    <h:outputText id="password" value="#{userBean.password}"/>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

UserBean.java:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class UserBean implements Serializable{
    private boolean showPassword = false;
    private String password = "";

    public boolean isShowPassword(){
        return showPassword;
    }
    public void setPassword(password){
        this.password = password;
    }
    public String getPassword(){
        return this.password;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 几乎是正确的想法,但是如果您希望能够动态显示/隐藏组件(如AJAX事件),则应该在panelGroup上的组件上使用呈现的属性,而不是在panelGroup本身上.如果在panelGroup上使用render并且其条件最初为false,则在第一次尝试更新时会出现错误,因为它不会存在于页面上. (4认同)