0

以前は、エンティティ オブジェクトの特定のプロパティを、jsf マネージド Bean (またはマネージド Bean のコンストラクター) の @PostConstruct メソッドでのインスタンス化と同じくらい早く、事前定義された値で初期化していました。マネージド Bean がなくなった状態でプロジェクトを Seam に移植すると、この機能を保持できなくなります (マネージド Bean なしの JSF 2.2 ではどのようになるのか疑問に思います)。

エンティティ クラス:

@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.
}

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...
}

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 バージョンの Stateless Session Bean も 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
}

フォームの Seam バージョン:

<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>

インスタンス化されたときにタスク オブジェクトに日付とログイン ユーザー データ (できればデフォルト カテゴリ) を保持させる方法についてアドバイスが必要です。

4

2 に答える 2

1

まず申し訳ありませんが、この回答にコメント リンクが見つかりませんか?? (モデレーターはこの投稿を自由に移動してください;))

entityhome クラスをセッション Bean として拡張することは可能です。しかし、それが正しいことであるかどうかはわかりません。私の目的をより正確に果たす新しいセッション Bean を作成する可能性が高くなります。

ファクトリー呼び出し用。これは、他の名前と同じ方法で jsf ページから呼び出します。つまり、value="#{createNewTask.id}" です。または、別のクラスに注入することもできます。seam doc を見てください。その本当によく書かれています。

于 2011-10-25T05:05:35.923 に答える
1

エンティティを初期化する方法はいくつかあります。エンティティ用に拡張できる 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;
    }
}

そして、queryHome.getInstance() を呼び出します。entityHome の id プロパティが設定されている場合、この ID を持つエンティティをデータベースからロードしようとします。ID がない場合は、createInstance() を呼び出します。これが普段の使い方です。

Seam マネージド Bean でファクトリ アノテーション付きメソッドを作成することもできます。そこでは、好きなことを何でもできます。

@Name("CreationFactory")
@Scope(ScopeType.STATELESS)
pulic class CreationFactory {

    @Factory("createNewTask")
    public Task createTask() {
        Task task = new Task();
        task.sometext = "sometext";
        return task;
    }
}

私は通常、Bean に直接アクセスしたり作成したりしませんが、entityhome のようなマネージャー コンポーネントを使用してそれを行います。ファクトリを使用してアクセスを簡素化できますが、これについては Seam のドキュメントで説明されています。

マーティン

于 2011-10-21T13:51:25.750 に答える