从核心JSF迁移到Seam时移植托管bean的功能
我曾经在jsf托管bean(甚至托管bean的构造函数)的@PostConstruct方法中实例化实体对象时,就用预定义的值初始化实体对象的某些属性。在将项目移植到Seam时,如果没有托管bean,我就不能再保留这个功能了(我还想知道如果没有托管bean,JSF2.2会是什么样子) 实体类:从核心JSF迁移到Seam时移植托管bean的功能,jsf,seam,managed-bean,postconstruct,Jsf,Seam,Managed Bean,Postconstruct,我曾经在jsf托管bean(甚至托管bean的构造函数)的@PostConstruct方法中实例化实体对象时,就用预定义的值初始化实体对象的某些属性。在将项目移植到Seam时,如果没有托管bean,我就不能再保留这个功能了(我还想知道如果没有托管bean,JSF2.2会是什么样子) 实体类: @Entity @Name("task") // this line in Seam version public class Task implements Serializable { pri
@Entity
@Name("task") // this line in Seam version
public class Task implements Serializable {
private Integer id;
private String subject;
private Date creationDate;
private Date completionDate;
private Category category;
private User user;
public Task() {
}
public Task(Date creationDate) {
this.creationDate = creationDate;
this.user = user;
}
// getters & setters, etc.
}
<h:form id="todo" styleClass="edit">
<rich:panel>
<f:facet name="header">Task To Do</f:facet>
<s:decorate id="dateField" template="layout/edit.xhtml">
<ui:define name="label">Date:</ui:define>
<h:outputText value="#{task.creationDate}"/>
</s:decorate>
<s:decorate id="userField" template="layout/edit.xhtml">
<ui:define name="label">User:</ui:define>
<h:outputText value="#{task.user.name}"/>
</s:decorate>
<s:decorate id="subjectField" template="layout/edit.xhtml">
<ui:define name="label">Başlık</ui:define>
<h:inputText id="subject" required="true" value="#{task.subject}" >
<a4j:support event="onblur" reRender="subjectField" bypassupdates="true" ajaxSingle="true" />
</h:inputText>
</s:decorate>
<!-- other components, etc -->
</rich:panel>
</h:form>
JSF管理的Bean
public class TaskBean extends BaseBean {
// Super class provides the logged in user object and a default category object
private Task task = new Task(java.util.Calendar.getInstance().getTime(), this.user);
@PostConstruct
public void initTaskBean() {
if (certainConditionMet)
task.setCategory(defaultCategory);
}
// Other managed bean business...
}
@Name("taskAction")
@Stateless
public class TaskAction implements TaskActionLocal {
@PersistenceContext
private EntityManager em;
@In private FacesMessages facesMessages;
@In User user;
@In Category defaultCategory
@Logger private Log log;
@In
// private Task task = new Task(java.util.Calendar.getInstance().getTime(), user)
// the above didn't work so
private Task task;
@PostConstruct
public void baslarken() {
System.out.println("TaskAction PostConstructed");
task = new task(java.util.Calendar.getInstance().getTime(), user);
if (certainConditionMet)
task.setCategory(defaultCategory);
// the above won't work either. Date and User always blank on the ui form
}
// other business methods, etc
}
JSF页面
<h:form>
<h:panelGrid columns="2">
Date: <h:outputText value="#{taskBean.task.creationDate}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
User: <h:outputText value="#{taskBean.task.user.name}" />
Subject: <h:inputText value="#{taskBean.task.subject}" id="subjectField" />
Category: <h:selectOneMenu value="#{taskBean.task.category}" id="catMenu">
<f:selectItems value="#{taskBean.categories}" />
</h:selectOneMenu>
// remaining stuff
</h:panelGrid>
</h:form>
表单的Seam版本:
@Entity
@Name("task") // this line in Seam version
public class Task implements Serializable {
private Integer id;
private String subject;
private Date creationDate;
private Date completionDate;
private Category category;
private User user;
public Task() {
}
public Task(Date creationDate) {
this.creationDate = creationDate;
this.user = user;
}
// getters & setters, etc.
}
<h:form id="todo" styleClass="edit">
<rich:panel>
<f:facet name="header">Task To Do</f:facet>
<s:decorate id="dateField" template="layout/edit.xhtml">
<ui:define name="label">Date:</ui:define>
<h:outputText value="#{task.creationDate}"/>
</s:decorate>
<s:decorate id="userField" template="layout/edit.xhtml">
<ui:define name="label">User:</ui:define>
<h:outputText value="#{task.user.name}"/>
</s:decorate>
<s:decorate id="subjectField" template="layout/edit.xhtml">
<ui:define name="label">Başlık</ui:define>
<h:inputText id="subject" required="true" value="#{task.subject}" >
<a4j:support event="onblur" reRender="subjectField" bypassupdates="true" ajaxSingle="true" />
</h:inputText>
</s:decorate>
<!-- other components, etc -->
</rich:panel>
</h:form>
任务
日期:
用户:
巴伊尔克
我需要关于如何使task对象在实例化时保存日期和登录的用户数据(最好是默认类别)的建议。初始化实体有多种可能性。可以为实体扩展EntityHome类。它是编辑器处理实体的默认实现。如果使用seam gen创建应用程序,也会使用它 这看起来像这样:
@Name("queryHome")
@Scope(ScopeType.CONVERSATION)
public class QueryHome extends EntityHome<Query> {
/*
* (non-Javadoc)
* @see org.jboss.seam.framework.Home#createInstance()
*/
@Override
public Query createInstance() {
Query query = super.createInstance();
query.setUser(loggedUser);
query.setCreationDate(new Date());
query.setLastExecutionDate(new Date());
return query;
}
}
我通常不直接访问或创建bean,但我使用entityhome之类的管理器组件来实现。您可以使用工厂简化访问,但Seam文档对此进行了解释
马丁首先很抱歉,我找不到关于这个答案的评论链接??(所以版主可以随意移动此帖子;)) 可以将entityhome类扩展为会话bean是的。但我不确定这样做是否正确。我更可能创建一个新的会话bean,更准确地服务于我的目的
用于工厂调用。在jsf页面中调用它的方式与调用任何其他名称的方式相同。即value=“#{createNewTask.id}”。或者您可以将其注入到另一个类中。看看seam文档。写得真不错 martin,谢谢你的建议,第一种方法很好用——虽然我不确定在EJB场景中,将EntityHome扩展为会话bean是否可行(是吗?)。第二种方法,你能告诉我如何调用方法createTask吗?谢谢,martin。我将一种服务façade模式应用到项目中,在该项目中,直接与数据库的所有通信都是使用会话bean作为服务façade完成的,它们由Seam(托管bean)组件调用——尽管Seam-wise这种模式可能不太合适,因为它宣称不需要JSF托管bean。因此,我将寻找一种更适合Seam的设计模式,这种模式将使我能够保持大型项目的代码整洁。