我曾經初始化一個實體對象的某些屬性,它具有預定義的值,只要它在jsf託管bean的@PostConstruct方法中實例化(或者甚至是託管bean的構造函數)。當將託管bean移出項目到Seam時,我不能再保留這個功能(也想知道如何在沒有託管bean的情況下在JSF 2.2中)。從核心JSF遷移到Seam時移植託管bean的功能
實體類:
@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.
}
Managed 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...
}
JSF頁面的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>
無狀態會話Bean Seam的版本中還假設了JSF的責任管理的bean
@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
}
形式的縫版本:
<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>
我需要就如何使任務對象的意見保存日期並登錄用戶數據(最好是默認類別),在實例化時預先填充。
謝謝,馬丁。我在項目中使用了一種服務外觀模式,其中每個與數據庫的直接通信都使用會話bean作爲服務外觀完成,並且它們由Seam(managed-bean)組件調用 - 儘管Seam明智地說這種模式可能不是非常合適,因爲它可以消除對JSF託管bean的需求。因此,我將尋找一種更適合Seam的更合適的設計模式,並使我能夠保持大型項目的代碼清潔。 – Skyhan