使用ajax从jsf中的primefaces树选定项设置primefaces SelectOne菜单默认值

使用ajax从jsf中的primefaces树选定项设置primefaces SelectOne菜单默认值,ajax,jsf,primefaces,Ajax,Jsf,Primefaces,在第一种形式中,我有一个primefaces多选择树(从LDAP填充),在另一种形式中,我有一个selectOneMenu primefaces组件。我想将默认的selectOneMenu值(此菜单上显示的第一个)设置为所选树节点的值。我尝试使用f:ajax。。但它不起作用,因为这些元素不属于同一表单(render属性中的selectOneMenu名称未知..) 下面是我的index.xhtml,它包含所有这些元素: <?xml version="1.0" encoding="ISO-8

在第一种形式中,我有一个primefaces多选择树(从LDAP填充),在另一种形式中,我有一个selectOneMenu primefaces组件。我想将默认的selectOneMenu值(此菜单上显示的第一个)设置为所选树节点的值。我尝试使用f:ajax。。但它不起作用,因为这些元素不属于同一表单(render属性中的selectOneMenu名称未知..)

下面是我的index.xhtml,它包含所有这些元素:

 <?xml version="1.0" encoding="ISO-8859-1" ?>
<!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"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <title>Insert title here</title>
    <script src="JS/general.js" type="text/javascript"></script>
    <link rel="stylesheet" type="text/css" href="CSS/general.css" />
    <script src="clean/clean-ajax-all.js"></script>
    <script>
        var crudmenu = "crudmenu";
        var adduserform = "adduserform";
    </script>
</h:head>
<body>

    <h:form id="form">

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

        <p:tree value="#{treeBean.root}" var="node"
            onNodeClick="this.form.submit();" selectionMode="multiple"
            selection="#{treeBean.selectedNodes}" id="treeMultiple">

            <p:treeNode>
                <h:outputText value="#{node}" />
            </p:treeNode>
        </p:tree>


        <p:commandButton value="Display Selected" update="messages"
            actionListener="#{treeBean.displaySelectedMultiple}" id="btnDisplay" rendered="false"/>  

    </h:form>


    <div id="adduserform" name="adduserform"
        style="text-align: center; overflow: hidden; height: 0px; width: 270px; border: #040600 1px;">


        <h:form>
            <h:panelGrid border="1" columns="2">
            ID :  <p:selectOneMenu value="" panelStyle="width:150px"
                    effect="fade" var="p" style="width:160px" filter="true"
                    filterMatchMode="startsWith">
                    <f:selectItem itemLabel="#{treeBean.selectedNodeValue}"
                        itemValue="" />

                </p:selectOneMenu> 


    objectClass : <p:selectOneMenu value="" panelStyle="width:150px"
                    effect="fade" var="p" style="width:160px" filter="true"
                    filterMatchMode="startsWith">
                    <f:selectItem itemLabel="Select One" itemValue="" />

                </p:selectOneMenu>


            </h:panelGrid>
        </h:form>
    </div>



</body>
</html>

在此处插入标题
var crudmenu=“crudmenu”;
var adduserform=“adduserform”;
身份证件:
对象类:
这是我的托管bean:

package org.primefaces.examples.view;

import java.io.Serializable;

import javax.faces.application.FacesMessage;
//other imports..

@ManagedBean(name = "treeBean")
public class TreeBean implements Serializable {


    private TreeNode root;

    private TreeNode[] selectedNodes;

    private String selectedNodeValue;


    public TreeBean() {

        populateTreeFromLdap();

    }


    public String getSelectedNodeValue() {
        if (selectedNodes != null && selectedNodes.length == 1)
            for (TreeNode node : selectedNodes)
            selectedNodeValue = node.getData().toString(); 
        return selectedNodeValue;
    }


    public void setSelectedNodeValue(String selectedNodeValue) {
        this.selectedNodeValue = selectedNodeValue;
    }


    public void populateTreeFromLdap(){
     //code to get entries from LDAP..
            }               


    }

    public TreeNode getRoot() {
        return root;
    }

    public TreeNode[] getSelectedNodes() {
        return selectedNodes;
    }

    public void setSelectedNodes(TreeNode[] selectedNodes) {
        this.selectedNodes = selectedNodes;
    }

    public void displaySelectedMultiple(ActionEvent event) {
        if (selectedNodes != null && selectedNodes.length > 0) {
            StringBuilder builder = new StringBuilder();

            for (TreeNode node : selectedNodes) {
                builder.append(node.getData().toString());
                builder.append("<br />");
            }

            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Selected", builder.toString());

            FacesContext.getCurrentInstance().addMessage(null, message);
        }
    }
}
package org.primefaces.examples.view;
导入java.io.Serializable;
导入javax.faces.application.FacesMessage;
//其他进口。。
@ManagedBean(name=“treeBean”)
公共类TreeBean实现了可序列化{
独活根;
私有树节点[]所选节点;
私有字符串selectedNodeValue;
公树{
populateTreeFromLdap();
}
公共字符串getSelectedNodeValue(){
if(selectedNodes!=null&&selectedNodes.length==1)
用于(TreeNode节点:selectedNodes)
selectedNodeValue=node.getData().toString();
返回selectedNodeValue;
}
public void setSelectedNodeValue(字符串selectedNodeValue){
this.selectedNodeValue=selectedNodeValue;
}
public void populateTreeFromLdap(){
//从LDAP获取条目的代码。。
}               
}
公共树节点getRoot(){
返回根;
}
公共树节点[]getSelectedNodes(){
返回所选节点;
}
公共无效集合selectedNodes(TreeNode[]selectedNodes){
this.selectedNodes=selectedNodes;
}
public void displayedSelectedMultiple(操作事件){
if(selectedNodes!=null&&selectedNodes.length>0){
StringBuilder=新的StringBuilder();
用于(TreeNode节点:selectedNodes){
append(node.getData().toString());
builder.append(“
”); } FacesMessage=新的FacesMessage(FacesMessage.SEVERITY_信息, “选定”,builder.toString()); FacesContext.getCurrentInstance().addMessage(空,消息); } } }
问题是如何在树节点选择发生后刷新selectOneMenu的itemLabel的“#{treeBean.selectedNodeValue}”

顺便说一句,我是jsf新手,我对传统的ajax用于加载感到非常不安 来自另一个页面的div中的内容在jsf中不再起作用了。我在以前的一些jsp/servlet应用程序中使用了它,它工作得很好


谢谢你的帮助

如果我理解您想要做什么,接下来我将把selectOneMenu绑定到支持bean上的一个值。在getSelectedNodeValue()中,我将设置该值。完成这项工作的最后一个步骤是使用监听器事件,如图所示:primefaces.org/showcase labs/ui/treeEvents.jsf。

是否有理由需要两个表单?如果你只使用一个表单,事情会简单得多。我更喜欢将每个表单分开,但我会尝试!谢谢你:)如果我明白你想做什么,接下来我将把selectOneMenu绑定到支持bean上的一个值。在getSelectedNodeValue()中,我将设置该值。完成这项工作的最后一个步骤是使用lisenter事件,如下所示:。实际上,SelectOne菜单除了显示所选节点之外还有其他用途吗?看起来您的下拉列表在选择列表中只有一项。如果是这样的话,你能用一个h:outputtext来显示你想要的数据吗?不,SteveS,这是一个未完成的代码:)我把所有的东西都放在一个表单中,就像你说的那样,并且“包含一个未知的id”同样,通过从页面源代码thnx中获取正确的id,我解决了这个问题。我还将示例中的所有p:ajax和lisenter事件添加到我的树中,现在它运行良好!!你应该得到10点声望,伙计^^