带动态添加组件的PrimeFaces视图
问题描述:
我需要PrimeFaces中的一个非常动态的视图。视图必须构建到运行时并添加PrimeFaces组件。带动态添加组件的PrimeFaces视图
在我的视图中,我有一个panelgrid并添加了来自backing Bean的元素。我的问题是没有setter被调用。我添加了一个ValueExpression,并且调用getter,但从来不是setter。
我查看
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link href="#{request.contextPath}/resources/css/primefaces-9/theme.css" rel="stylesheet" type="text/css"/>
<link href="#{request.contextPath}/resources/css/p_css.css" rel="stylesheet" type="text/css"/>
</h:head>
<h:body style="font-family: Arial; font-size: 8pt;">
<h:form id="buttonForm">
<p:calendar id="test" value="#{editor.dt_vrAufnahmeDatum}" mindate="#{editor.str_currentDate}" navigator="true" locale="de" pattern="dd.MM.yyyy" />
<p:selectOneMenu id="selTest" />
<p:commandButton id="reloadPanelGrid" action="#{editor.setUiComponents()}" value="new" />
</h:form>
<h:form id="dynaForm">
<p:panelGrid id="tiles" columns="1" >
<h:outputText value="hallo" />
<p:commandButton value="Submit" actionListener="#{editor.storeDataVr()}" process="dynaForm"/>
</p:panelGrid>
</h:form>
</h:body>
</html>
我支持bean
package com._9.controller.global;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.el.ValueExpression;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UISelectItem;
import javax.faces.component.html.HtmlPanelGroup;
import javax.faces.context.FacesContext;
import org.primefaces.component.panelgrid.PanelGrid;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;
@ManagedBean(name = "editor")
@ViewScoped
public class Editor implements Serializable
{
private static final long serialVersionUID = -33430593454354523L;
private String str_Text = "";
@PostConstruct
public void init()
{
}
public String getStr_Text()
{
return this.str_Text;
}
public void setStr_Text(String str_Text)
{
this.str_Text = str_Text;
}
public void setUiComponents()
{
org.primefaces.component.inputtext.InputText inpt_obj = new org.primefaces.component.inputtext.InputText();
inpt_obj.setValueExpression("value", createValueExpression("#{editor.str_text}", String.class));
HtmlPanelGroup tile = new HtmlPanelGroup();
tile.setId("testPanelGroup");
tile.getChildren().add(0, inpt_obj);
PanelGrid tiles;
tiles = (PanelGrid) FindComponent.doFind(FacesContext.getCurrentInstance(), "dynaForm:tiles");
tiles.getChildren().add(2, tile);
RequestContext.getCurrentInstance().update("dynaForm:tiles");
}
public ValueExpression createValueExpression(String valueExpression, Class<?> valueType)
{
FacesContext facesContext = FacesContext.getCurrentInstance();
return facesContext.getApplication().getExpressionFactory().createValueExpression(facesContext.getELContext(), valueExpression, valueType);
}
public void StoreDataVr()
{
int i = 0;
}
}
有没有在我的setValueExpression导致二传手到不行什么问题?
答
在你的setUiComponents()方法中,你用小写的't'创建值表达式“#{editor.str_text}”,但是你的getter和setter用大写字母'T'来命名。当您单击第一个命令按钮时,您可能会在应用程序日志中看到PropertyNotFoundException,表示它无法创建值表达式。