Jsf p:accordionPanel选项卡标题未显示
在我的JSF2.2应用程序中有一个动态手风琴面板,它从一个命名bean中获取其值。比如说Jsf p:accordionPanel选项卡标题未显示,jsf,primefaces,accordion,title,Jsf,Primefaces,Accordion,Title,在我的JSF2.2应用程序中有一个动态手风琴面板,它从一个命名bean中获取其值。比如说 <p:accordionPanel id="formsPanel" value="#{formController.forms}" var="form" rendered="#{not empty formController.forms}"> <p:tab title="#{form.name}"> </p:tab>
<p:accordionPanel id="formsPanel" value="#{formController.forms}" var="form"
rendered="#{not empty formController.forms}">
<p:tab title="#{form.name}">
</p:tab>
</p:accordionPanel>
表单是一种小部件
@Named
public class Widget
{
protected String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
//Other stuff
}
你看不出有什么特别的形式
@Named
public class Form extends Widget
{
//Form related code
}
有了这些,我不明白为什么
没有在选项卡的标题中显示表单的名称
我还尝试将accordion面板中的var名称从表单
更改为formInstance
,但这没有帮助,我还从表单
类和小部件
类中删除了@Named
如果我在调试模式下启动服务器并在createForm方法中放置断点,我可以看到FormController
form实例成员的名称确实为null
那么为什么
不能正确设置表单的名称呢
编辑:
我已经成功创建了一个SSCCE
这是XHTML
<!DOCTYPE html>
<html xmlns="http://www.w3c.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Forms</title>
</h:head>
<h:body>
<p:accordionPanel id="formsPanel" value="#{formController.forms}"
var="formInstance" rendered="#{not empty formController.forms}">
<p:tab title="#{formInstance.name}">
</p:tab>
</p:accordionPanel>
<p:accordionPanel rendered="#{not empty formController.forms}">
<p:tab title="Add form">
<h:form id="addFormForm1">
<p:panelGrid columns="3" layout="grid">
<h:outputLabel value="Form name:" />
<p:inputText value="#{formController.form.name}" required="true"
label="text" />
<p:commandButton update="formsPanel"
action="#{formController.createForm}" value="Add form" />
</p:panelGrid>
</h:form>
</p:tab>
</p:accordionPanel>
</h:body>
</html>
FormController
@Named
@ViewScoped
public class FormController
{
private FormService formService;
private List<Form> forms;
public Form form = new Form();
@PostConstruct
public void init()
{
formService = FormService.INSTANCE;
forms = formService.findAll();
}
public void createForm()
{
formService.createForm(form);
form = new Form();
}
public List<Form> getForms()
{
return forms;
}
public void setForms(List<Form> forms)
{
this.forms = forms;
}
public Form getForm()
{
return form;
}
public void setForm(Form form)
{
this.form = form;
}
}
正如您在下面的屏幕截图中所看到的,初始化时使用的初始表单显示为ok,但添加带有名称的表单只会显示一个没有标题的新选项卡
我所做的是在Form.setName和FormController.createForm中放置两个断点
键入表单名称并单击“添加表单”时,将调用这两个方法
首先,使用表单对象引用(例如)com.test调用setForm。Form@30998fa6它的名字是正确的
然后使用表单对象引用com.test调用createForm。Form@2ad84d0f并且名称为空。我不明白为什么这是两个不同形式的物体
另一个症状是@PostConstruct被多次调用,而不是一次调用。好的,再深入一点,我找到了答案。这有帮助 当我切换到使用
@ManagedBean
时,它开始工作。我不确定的是我使用的是Glassfish 4,我的POM中有以下依赖项
<dependency>
<groupId>javax.faces</groupId>
<artifactId>javax.faces-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
javax.faces
javax.faces-api
2.2
假如
因此,我觉得我在使用JSF2.2,那么当您使用javax.faces.bean.ViewScoped use'@ManagedBean时,为什么这不能与
@Named
一起工作呢。当您使用import javax.faces.view.ViewScoped时,请使用此处提到的'@Named我认为您的名称冲突。var是“form”,但由于@Named
注释,它同时是托管cdibean的名称。如果从列表中访问表单,则最有可能不需要后者。尝试将var重命名为formInstance
,但无效。尽管如此,请从实体类中删除@Named
。它不属于那里。你在标签标题中也重命名了它吗?我希望你没有。我有。是的,我现在也从表单中删除了@Named
,这取决于你是导入javax.faces.bean.viewscope还是导入javax.faces.view.viewscope。另外,如果classpath中有所有CDI JAR,那么这并不是真正问题的解决方案,但是因为您的问题仍然不是,所以很难找到原因。而且@Named
是CDI而不是JSF。如果@Named不起作用,你一定会犯很多不同的错误,所以我认为它起作用了…@Kukeltje,你知道吗,让你自己冷静下来。它是可验证的@Mahendran它是一个faces bean。还使用glassfish,其中焊接cdi依赖项为provided@PaulStatham我想这就是它不起作用的原因。当您使用javax.faces.bean.ViewScoped时,请使用“@ManagedBean”。当您使用import javax.faces.view.ViewScoped使用此处提到的'@命名时,我本以为已经有一个很好的副本,但我找不到一个。。。
@Named
public enum FormService
{
INSTANCE(new ArrayList<Form>());
private List<Form> forms;
private FormService(List<Form> forms)
{
this.forms = forms;
this.forms.add(new Form("Form 1"));
}
public void createForm(Form form)
{
forms.add(form);
}
public List<Form> findAll()
{
return forms;
}
}
@Named
@ViewScoped
public class FormController
{
private FormService formService;
private List<Form> forms;
public Form form = new Form();
@PostConstruct
public void init()
{
formService = FormService.INSTANCE;
forms = formService.findAll();
}
public void createForm()
{
formService.createForm(form);
form = new Form();
}
public List<Form> getForms()
{
return forms;
}
public void setForms(List<Form> forms)
{
this.forms = forms;
}
public Form getForm()
{
return form;
}
public void setForm(Form form)
{
this.form = form;
}
}
public class Form
{
private String name;
public Form()
{
}
public Form(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
<dependency>
<groupId>javax.faces</groupId>
<artifactId>javax.faces-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>