我想从Primefaces中的p:selectOneMenu组件(下拉列表)中选择一个值。我从Java Bean获取数据。我有以下代码:
XHTML:
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:body>
<h:form>
<p:messages id="errorMessages" style="color:red;margin:8px;" />
<br></br>
<p:panelGrid columns="2" style="margin-bottom:10px" cellpadding="5">
<h:outputText value="Tasks: "/>
<p:selectOneMenu value="#{devTestController.selectedTask}">
<f:selectItems value="#{devTestController.tasks}" var="task" itemLabel="#{task.label}" itemValue="#{task.value}"/>
<f:converter converterId="infoRowBeanConverter" />
</p:selectOneMenu>
</p:panelGrid>
<br/>
<p:commandButton value="Execute Task" update = "errorMessages" action="#{devTestController.executeTask()}"/>
</h:form>
</h:body>
</html>
Java Bean DevTestController。java:
package mypackage;
import java.util.LinkedList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
@ManagedBean
@RequestScoped
public class DevTestController
{
private InfoRowBean selectedTask;
private static List<InfoRowBean> tasks;
@PostConstruct
public void initList()
{
if (tasks == null)
{
tasks = new LinkedList<>();
tasks.add(new InfoRowBean("Task 1", "Task 1"));
tasks.add(new InfoRowBean("Task 2", "Task 2"));
}
}
public InfoRowBean getSelectedTask()
{
return selectedTask;
}
public void setSelectedTask(InfoRowBean selectedTask)
{
this.selectedTask = selectedTask;
}
public List<InfoRowBean> getTasks()
{
return tasks;
}
public void executeTask()
{
System.out.println("Executing task " + selectedTask.label);
}
}
InfoRowBean。java:
package mypackage;
import java.util.List;
public class InfoRowBean
{
String label = null;
String value = null;
public InfoRowBean(String label, String value)
{
setLabel(label);
setValue(value);
}
public String getLabel()
{
return label;
}
public void setLabel(String label)
{
this.label = label;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
// This must return true for another InfoRowBean object with same label/id.
public boolean equals(Object other)
{
return other instanceof InfoRowBean && (label != null) ? label.equals(((InfoRowBean) other).label) : (other == this);
}
// This must return the same hashcode for every InfoRowBean object with the same label.
public int hashCode()
{
return label != null ? this.getClass().hashCode() + label.hashCode() : super.hashCode();
}
// Override Object#toString() so that it returns a human readable String representation.
// It is not required by the Converter or so, it just pleases the reading in the logs.
public String toString()
{
return "InfoRowBean[" + label + "," + value + "]";
}
}
转换器InfoRowBeanConverter.java:
package mypackage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
@FacesConverter("infoRowBeanConverter")
public class InfoRowBeanConverter implements Converter
{
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
return value;
}
public String getAsString(FacesContext context, UIComponent component, Object value)
{
return value.toString();
}
}
如果我按下按钮,什么都不会发生(也没有错误)。如果我从标记中删除参数“value”(即leave),按钮工作正常,但我当然不会得到所选项目。这里有什么问题?
问题是您的转换器没有将提交的字符串值转换为getAsObject()
方法中的具体InfoRowBean
实例,而是返回您在getAsString()
方法中生成的原始提交的String
值。这与selectedTask
的类型不匹配,即InfoRowBean
。
您需要相应地修复转换器,以便返回复杂对象的唯一字符串表示形式,通常是数据库标识符的样式(以便可以在基于文本的格式中进一步使用,例如HTML输出和HTTP请求参数),通常通过使用唯一标识符作为键的DB调用,将唯一的字符串表示形式准确地转换回具体的复杂对象实例。
另一种选择是使用omnifaces。选择JSF实用程序库OmniFaces的SelectItemsConverter
,这样您就无需使用为组件创建自定义转换器
另一种选择是将
selectedTask
更改为String
,而不是InfoRowBean
(并且去掉整个转换器,因为它在这个构造中完全无用)。
如何填充h的选项:从数据库中选择一个菜单
我在用Primefaces 5.3。 首先,我实现了根据p:SelectBooleanCheckBox的值更改p:SelectOneMenu的可见性的功能: 接下来,我想更新bean中的值,这是在p:selectonemenu中选择的。这就是我的问题开始的地方:即使我使用p:ajax显式调用一个侦听器,它也不会被调用。这是我的代码: 下面是我如何启用/禁用SelectOneMenu: 所有这些都存
我有一个类似于上面代码的数据表,如你所见,我使用事件RowSelected复选框,有没有办法知道单击的行,并根据该信息完全禁用该行?
在JSF页面中,我需要显示(选定行数)的(总行数)。我可以使用rowIndexVar属性在其中一列中显示行号,但我不知道在行选择的输入文本中单独显示相同的数字。 我需要在JSF页面或托管bean中做什么才能获得所选的行号。 请在这方面帮助我。 下面是我的JSF页面
请考虑以下代码: 现在我要定义一个类C,它的成员f是类B,成员g来自类a,类似于这样: 我如何在C++中做到这一点?
我目前正在使用 但这并没有返回选择模型中的一个选定项。
我在PrimeFaces中创建了一个datatable,它接收并呈现一个对象列表。在这一行的末尾,我有一个commandButton元素,当使用它时,它会在服务器上的managedBean上执行一些操作。 使用参数属性中命令按钮中的对象id检索当前行的所有数据。 问题是我有一个selectOneMenu元素,它与对象无关。我选择一个影响后面逻辑的值。 这是桌子: ...选择 ... 还有命令按钮