使用ajax从jsf中的primefaces树选定项设置primefaces selectOneMenu默认值
Posted
技术标签:
【中文标题】使用ajax从jsf中的primefaces树选定项设置primefaces selectOneMenu默认值【英文标题】:Setting primefaces selectOneMenu default value from primefaces tree selected item in jsf with ajax 【发布时间】:2012-10-03 11:15:54 【问题描述】:在第一种形式中,我有一个 primefaces 多选树(从 LDAP 填充),在另一种形式中,我有一个 selectOneMenu primefaces 组件。我想将默认的 selectOneMenu 值(此菜单上显示的第一个)设置为树选择节点的值。我尝试使用 f:ajax.. 但它不起作用,因为这些元素不属于同一表单(渲染属性中的 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>
这是我的托管 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);
问题是如何在树节点选择发生后刷新 selectOneMenu 的 itemLabel 的“#treeBean.selectedNodeValue”..
顺便说一句,我是 jsf 的新手,我真的很不高兴传统的 ajax 用于加载 来自另一个页面的 div 中的内容在 jsf 中不再起作用..我在以前的一些 jsp/servlet 应用程序中使用它并且它工作正常..
求帮助!!
【问题讨论】:
您是否有理由需要 2 个表格?如果您使用单一表单,事情会简单得多。 我更愿意将每个表格分开,但我会试试看!谢谢你:) 如果我了解您要做什么,接下来我会将 selectOneMenu 绑定到支持 bean 上的一个值。在您的 getSelectedNodeValue() 中,我将设置该值。完成这项工作的最后一部分是使用如下所示的 lisenter 事件:primefaces.org/showcase-labs/ui/treeEvents.jsf。 实际上,selectOneMenu 除了显示所选节点之外还有其他用途吗?看起来您的下拉菜单在选择列表中只会有一个项目。如果是这种情况,你可以只使用一个 h:outputtext 来显示你想要的数据吗? No SteveS,这是一个未完成的代码 :) 我已经按照你所说的将所有内容放在一个表格中,并且再次出现“ contains an unknown id”,但通过正确解决它从页面源代码 thnx 到这篇文章 ***.com/questions/9858699/… 的 id 我还添加了所有 p:ajax 以及来自您的示例的 lisenter 事件到我的树中,现在它工作正常!你值得 10 声望点的人! ^^ 【参考方案1】:如果我了解您要做什么,接下来我会将 selectOneMenu 绑定到支持 bean 上的值。在您的 getSelectedNodeValue() 中,我将设置该值。完成这项工作的最后一部分是使用如下所示的侦听器事件:primefaces.org/showcase-labs/ui/treeEvents.jsf。
【讨论】:
以上是关于使用ajax从jsf中的primefaces树选定项设置primefaces selectOneMenu默认值的主要内容,如果未能解决你的问题,请参考以下文章
PrimeFaces 4.0/JSF 2.2.x 中的文件上传不适用于 AJAX - javax.servlet.ServletException:请求内容类型不是多部分/表单数据
JSF(Primefaces)通过ID更新几个元素的ajax
JSF/PrimeFaces ajax 请求上的会话超时和 ViewExpiredException 处理
JSF/Primefaces AJAX 请求真的是异步的吗?