3

我有一个应用程序,它的布局带有左侧和中心布局单元(demoLayout.xhtml)。在主页 (main.xhtml) 上,我在左侧布局单元 (demoTree.xhtml) 上有 p:tree,在中心布局单元 (first.xhtml、second.xhtml、third.xhtml) 上有三种不同的形式。中心表单使用树节点单击进行切换。我的默认中心表单是 first.xhtml 并且当我没有将 p:commandButton 放在 first.xhtml 上时 second.xhtml 上的命令按钮和 third.xhtml 上的操作没有被调用。当我将 p:commandButton 放在 first.xhtml 上时,其他命令按钮可以工作,但我不想将 p:commandButton 放在 first.xhtml 上。我能怎么做?

demoLayout.xhtml

    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui">

    <f:view id="mainPanel" encoding="UTF-8" contentType="text/html">

        <h:head>
            <f:facet name="first">
                <meta http-equiv="X-UA-Compatible" content="EmulateIE8" />
                <meta content='text/html; charset=UTF-8' http-equiv="Content-Type" />
                <title>#{title}</title>
            </f:facet>

        </h:head>

        <h:body>

            <p:layout fullPage="true">

                <p:layoutUnit id="left" position="west" size="300" resizable="true" closable="true" collapsible="true" header="Quick Links" visible="true" minSize="200">
                    <div id="west">
                        <ui:insert name="west">
                            Default West Content
                        </ui:insert>
                    </div>
                </p:layoutUnit>

                <p:layoutUnit id="center" position="center">
                    <div id="centerDiv">
                        <ui:insert name="center">
                            Default Center Content
                        </ui:insert>
                    </div>
                </p:layoutUnit>

            </p:layout>

        </h:body>
    </f:view>

    </html>

main.xhtml

<ui:composition template="demoLayout.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui">

        <ui:param name="title" value="demo" />

    <ui:define name="west">
        <ui:include src="demoTree.xhtml" />
    </ui:define>

    <ui:define name="center">
        <ui:include src="#{demo3MBean.activePanel}" />
    </ui:define>

</ui:composition>

演示树.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

    <h:form id="treeForm">

    <p:growl id="messages" showDetail="true" sticky="false" />

        <p:tree value="#{demoTreeBean.root}" var="node" id="tree" animate="true"    style="width:350px;height:720px" dynamic="true" cache="false"
        selectionMode="single">

            <p:treeNode type="First">
                <h:outputText value="#{node}" id="lblNode1" />
            </p:treeNode>
            <p:treeNode type="Second">
                <h:outputText value="#{node}" id="lblNode2" />
            </p:treeNode>
            <p:treeNode type="Third">
               <h:outputText value="#{node}" id="lblNode3" />
            </p:treeNode>
            <p:ajax event="select" update=":rightForm" listener="#{demo3MBean.onNodeSelect}" />
        </p:tree>

        <p:blockUI block=":center" trigger="tree">  
        LOADING<br />
            <p:graphicImage value="/images/ajax-loader.gif" />
        </p:blockUI>

    </h:form>

 </ui:composition>

第一个.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui">

    <h:form id="rightForm">

    <p:growl id="messages" showDetail="true" sticky="false" />

        <br></br>

        <p:fieldset id="resourceList" legend="1 nolu grup">

            <h:outputText value="1 Nolu XHTML" />
        <br />
            <ui:remove> 
            <p:commandButton id="buton" value="Print Me 1" actionListener="#{demo3MBean.printMe1}" />
            </ui:remove>
        </p:fieldset>

    </h:form>

</ui:composition> 

第二个.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui">

    <h:form id="rightForm">

        <p:growl id="messages" showDetail="true" sticky="false" />

        <br></br>

        <p:fieldset id="resourceList" legend="2 nolu grup">

            <h:outputText value="2 Nolu XHTML" />
            <br />
            <p:commandButton id="buton" value="Print Me 2" actionListener="#{demo3MBean.printMe2}" />

        </p:fieldset>

    </h:form>

</ui:composition>

第三个.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui">

    <h:form id="rightForm">

        <p:growl id="messages" showDetail="true" sticky="false" />

        <br></br>

        <p:fieldset id="resourceList" legend="3 nolu grup">

            <h:outputText value="3 Nolu XHTML" />
            <br />
            <p:commandButton id="buton" value="Print Me 3" actionListener="#{demo3MBean.printMe3}" />

        </p:fieldset>

    </h:form>

</ui:composition>

Demo3MBean.java

@ManagedBean(name = "demo3MBean")
@ViewScoped
public class Demo3MBean extends TlosSWBaseBean implements Serializable {

    private static final long serialVersionUID = -504537811128309503L;

    private String activePanel = FIRST_PANEL;

    public final static String FIRST_PANEL = "first.xhtml";
    public final static String SECOND_PANEL = "second.xhtml";
    public final static String THIRD_PANEL = "third.xhtml";

    public void onNodeSelect(NodeSelectEvent event) {

        String nodeType = event.getTreeNode().getType();
        if (nodeType.equals("First")) {

            activePanel = FIRST_PANEL;

        } else if (nodeType.equals("Second")) {

            activePanel = SECOND_PANEL;

        } else if (nodeType.equals("Third")) {

            activePanel = THIRD_PANEL;
        }

    }

    public void printMe1(ActionEvent e) {
        System.out.println("Me 1");
    }

    public void printMe2(ActionEvent e) {
        System.out.println("Me 2");
    }

    public void printMe3(ActionEvent e) {
        System.out.println("Me 3");
    }

    public String getActivePanel() {
        return activePanel;
    }

    public void setActivePanel(String activePanel) {
        this.activePanel = activePanel;
    }

}

DemoTreeBean.java

@ManagedBean(name = "demoTreeBean")
public class DemoTreeBean {

    private TreeNode root;

    @SuppressWarnings("unused")
    public DemoTreeBean() {
        root = new DefaultTreeNode("Root", null);
        TreeNode node0 = new DefaultTreeNode("First", "First Node", root);
        TreeNode node1 = new DefaultTreeNode("Second", "Second Node", root);
        TreeNode node2 = new DefaultTreeNode("Third", "Third Node", root);

    }

    public TreeNode getRoot() {
        return root;
    }
}

我还阅读了这些:

4

3 回答 3

1

main.xhtml 中的这部分是您的问题的原因。

<ui:define name="center">
    <ui:include src="#{demo3MBean.activePanel}" />
</ui:define>

在运行时更改值src不起作用。

尝试使用静态值,例如

<ui:define name="center">
    <ui:include src="third.xhtml" />
</ui:define>

你会看到按钮工作。

于 2013-08-21T06:12:03.520 回答
1

在运行时更改src的值将不起作用。

<ui:define name="center">
    <ui:include src="#{demo3MBean.activePanel}" />
</ui:define>

解决您的问题的替代解决方案是为您的 xhtml 页面使用渲染标志。例如

<ui:define name="center">

<s:div rendered="#{demo3MBean.firstFlag}">
    <ui:include src="first.xhtml" />
</s:div>

<s:div rendered="#{demo3MBean.secondFlag}">
    <ui:include src="second.xhtml" />
</s:div>

<s:div rendered="#{demo3MBean.thirdFlag}">
    <ui:include src="third.xhtml.xhtml" />
</s:div>

</ui:define>

最初将所有页面标志设置为 FALSE。仅在单击相关树节点时才将特定标志值设为 TRUE。不要忘记为包含页面的所有组件设置唯一的“id”

使用上述解决方案,commandButtons、commandLinks等组件的action和actionListener等属性也将正常完美地工作。

希望这能解决您的问题。如果有帮助,也不要忘记接受我的回答。祝你今天过得愉快!!

于 2014-05-18T17:40:22.360 回答
0

通过更新包含文件中的表单来包含不同的文件是不可能。由于每个文件中都有表单,因此只有在选择树节点rightForm时才更新rightForm当前加载的文件。所以永远不会加载不同的文件。
此外,当每个文件都存在时,在每个文件中定义相同的表单是一种不好的方法(类似于growl)。

要解决此问题,请删除h:formin first.xhtmlsecond.xhtml并将您third.xhtml的第二个更改为以下内容:ui:definemain.xhtml

<ui:define name="center">
    <h:form id="rightForm">
        <ui:include src="#{demo3MBean.activePanel}" />
    </h:form>
</ui:define>

你为什么要在 中定义三个p:treeNodes p:tree?当您在中初始化树时,DemoTreeBean无需手动定义树节点。p:tree只是迭代给定值的节点,正如您在展示中看到的那样。尝试以下代码以减少添加更多树节点时的工作量:

<p:tree value="#{demoTreeBean.root}" var="node" id="tree" animate="true" 
  style="width:350px;height:720px" dynamic="true" cache="false"
  selectionMode="single">
    <p:treeNode type="#{node.data}">
        <h:outputText value="#{node}" id="lblNode1" />
    </p:treeNode>
    <p:ajax event="select" update=":rightForm" listener="#{demo3MBean.onNodeSelect}" />
</p:tree>
于 2013-08-21T10:08:21.873 回答