由于CDI(及其实现Weld),JEE6中的每个POJO都可以注释@Named,这使得POJO可以被视图访问.
这是否意味着ManagedBeans现在已经完全过时了?还是我错过了@ManagedBean仍然有意义的东西?
我认为我的问题与此类似,但尚未发现它可行
<f:metadata>
<f:viewParam id="id" name="id" value="#{detailsBean.id}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
为什么我不能用@Named执行此操作并使用CDI:
@Named
@RequestScoped
public class DetailsBean {
private Contacts detailsContact;
@EJB
ContactsFacade contactsEJB;
private int id;
public DetailsBean() {
System.out.println("details bean called");
}
@PostConstruct
public void onLoad() {
detailsContact = contactsEJB.find(id);
}
Run Code Online (Sandbox Code Playgroud)
我无法记录身份证.
当然,@ ManagedProperty与CDI不兼容.
*****UPDATE*****
一些xhtml:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="../template.xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:f="http://java.sun.com/jsf/core">
<ui:define name="head">
<f:metadata>
<f:viewParam name="paginator" value="#{contactsBean.contactsTablePaginator}"/>
<f:viewParam name="rows" value="#{contactsBean.contactsTableRows}"/>
</f:metadata>
</ui:define>
<ui:define name="content">
<p:growl id="growl" showDetail="true"/> …Run Code Online (Sandbox Code Playgroud) 非常感谢您帮助解决以下问题(JBoss 6.0,Mojarra - 2.2 Snapshot,facelet 1.1和PrimeFaces 3.0.M4:
问题是,在获取值集之前调用请求bean的post构造方法.我们如何确保首先设置会话bean上的参数值,然后调用请求bean的post构造方法.
问题#1:当点击"Next"时,这是一个ajax调用1. testRequestBB的"初始化"post构造方法被调用2. testSessionBB的"next"方法被调用来设置值
预期的行为应该是另一种方式,使用ajax调用在会话bean中设置值,然后应该初始化请求bean.
问题#2:请求bean的"初始化"后构造方法被调用两次.
- 是因为请求bean从基类扩展(尽管基类中没有post构造方法).
当显示test.xhtml页面时,可以采取哪些措施来解决获取post构造方法两次调用的问题?
这是代码:
<h:dataTable id="testId" emptyMessage="#{messages.noData}" var="test" value="#{testList}">
....
<f:facet name="footer">
<h:form id="pgId">
<h:commandLink value="#{messages.next} ">
<f:ajax listener="#{testSessionBB.next}" />
</h:commandLink>
.....
</h:form>
</f:facet>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)
@Named("testSessionBB")
@SessionScoped
public class TestSessionBB implements Serializable
{
private int testStartRow;
.....
public String next()
{
if (this.getTestStartRow() + 5 > 15) // hard coded value for simplicity in this post
{
this.setTestStartRow(15);
} else {
this.setTestStartRow(this.getTestStartRow() + 5);
} …Run Code Online (Sandbox Code Playgroud)