0

まず第一に、私は JSF の初心者であると言いたいです。

記事の編集に使用できる単純な複合コンポーネントを作成したいと考えています。次のように動作するはずです。

  1. 複合部品はこんな感じ<my:article article="#{interestedBean.article}" />
  2. ArticleBean複合コンポーネントのデータ処理を担当します(ここではsaveメソッドです)
  3. Articleアーティクルを使用する各ページでは、複合コンポーネントをビューに追加し、オブジェクトをバッキング Beanに追加する必要があります。
  4. Articleオブジェクトが複合コンポーネントに渡され、その値が変更されますArticleBean

Article問題は、エンティティ (オブジェクト) をある Bean (関心のある Bean) から別の ( ArticleBean) にビューを介して渡す方法がわからないことです。

例 (疑似コード; Article エンティティが単純な String オブジェクトであるため、コンバーターを使用する必要がないことを想像してみましょう):

// input bean
public class HomePageBean {
    private Article article;
    @PostConstruct
    public void init() {
        this.article = new Article();
        this.article.setText("welcome on home page");
    }
    public void setArticle(Article article) {
        this.article = article;
    }
    public Article article() {
        return article; // on real page article will be taken from database
    }
}

// view
<h:form>
    <h:outputText value="#{articleBean.article.text}">
        <f:attribute name="value" value="#{homePageBean.article.text}" />
    </h:outputText>
</h:form>

// output bean
public class ArticleBean {
    private Article article;
    public void setArticle(Article article) {
        this.article = article;
    }
    public Article getArticle() {
        return article;
    }
    public void save() {
         // save article data to database
    }
}

// entity
public class Article {
    private article text;
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
}

問題は、SecondBean.entity.text値が設定されていないことです。ビューからバッキング Bean にパラメーターを渡すにはどうすればよいですか? Articleを使用して値を設定しようとしていまし@ManagedProperty(value="#{param.article}")<h:outputText>が、形式が整っているため、値は として渡されrandomformname:articleます。

私の英語でごめんなさい

4

1 に答える 1

2

実際、質問には明確化が必要です。ですから、あなたがやりたいことについて、2 つの基本的なアイデアがあります。

1 つのビューで簡単に情報を共有

同じビューで情報を共有したい場合は、マネージド Bean を相互に注入できます@ManagedProperty。注入された Bean は、注入された Bean よりも小さいスコープを持っていないことを覚えておいてください。実際、記事オブジェクトだけが必要な場合、状況で 2 つのマネージド Bean を使用する理由はわかりませんが、それでも、

@ManagedBean
@RequestScoped
public class BaseBean {

    private Article article;

    @ManagedProperty(value="#{injectedBean}")
    private InjectedBean injectedBean;

}

同じにしたいマネージド Bean の両方のプロパティを初期化するには、次のように、注釈が付けられた init メソッドを使用できます@PostConstruct(ただし、多くの代替手段があります)。

@PostConstruct
public void init() {
    Article article = new Article("Welcome");
    this.article = article;
    injectedBean.setArticle(article);
}

ビュー間で情報を共有する

このシナリオでは、ユーザーは最初のビューで編集したい記事を選択し、それを 2 番目のビューに渡します。このシナリオでは、ユーザーが 1 つのページで操作したい記事を選択し ( welcome.xhtml)、実際の操作は別のページで行われます ( manipulation.xhtml)。

一般的なアプローチは、各ページが独自の Bean によってバックアップされるため、上記のセットアップでは「ベース Bean」はその注入を失います。したがって、welcome.xhtmlビューはどこかからそのページにポップアップしたいくつかの記事オブジェクトを使用し、ボタンのクリック時に操作のためにそれを 2 番目のビューに渡します。

Bean は、記事オブジェクトに関しては同じになります。

@ManagedBean
@RequestScoped
public class BaseBean {

    private Article article;

}

@ManagedBean
@RequestScoped
public class InjectedBean {

    private Article article;

}

実際の通過は、ボタンのクリック中に発生します。

    <h:form>
        <h:commandButton value="Manipulation" action="manipulation.xhtml">
            <f:setPropertyActionListener target="#{injectedBean.article}" value="#{baseBean.article}"/>
        </h:commandButton>
    </h:form>

コードでは、プロパティ アクション リスナー メソッドが 2 番目のビューの Bean をインスタンス化し、ベース Bean のプロパティでプロパティを設定します。

ページの読み込みに get パラメータを使用する

次のビューへのナビゲーションをトリガーするコマンド ボタンを含めずに、ページを編集するための簡単なリンクを提供する方が理にかなっている場合があります。<f:param>タグを使用することで実現できます。JSF でパラメーターを処理する基本的な方法は 2 つあります。ページ アクション/preRenderViewイベントを使用する方法と、 @ManagedProperty.

  1. ページ アクション/preRenderViewイベントの使用

仕事はターゲットビューによって行われます

<f:metadata>
    <f:viewParam id="articleId" name="articleId" value="#{injectedBean.id}" />
    <f:event type="preRenderView" listener="#{injectedBean.initEvent}" />
</f:metadata>

preRenderViewイベント用と

<f:metadata>
    <f:viewParam id="articleId" name="articleId" value="#{injectedBean.id}" />
    <f:viewAction action="#{injectedBean.initEvent}" />
</f:metadata>

ページアクション用。マネージド Bean (InjectedBeanオブジェクト) には、次の init メソッドがあります。

public void initEvent() {
    if (id == null) {
        String message = "No id specified in request";
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(message));
        return;
    }
    //use your service method to load the article
    //article = articleService.findById(id);
    //and add messages appropriately
}
  1. @ManagedProperty注釈の使用

このジョブは、 で注釈が付けられた次の Bean メソッドと@PostConstruct、パラメーター依存性注入によって実行されます。セットアップが機能するには、Bean が である必要がありますが@RequestScoped、他の Bean スコープの回避策があることに注意してください。

@ManagedProperty(value="#{param.articleId}")
private Integer id;

@PostConstruct
public void initPostConstruct() {
    if (id == null) {
        String message = "No id specified in request";
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(message));
        return;
    }
    //use your service method to load the article
    //article = articleService.findById(id);
    //and add messages appropriately
}

Bean は次のビューで初期化されます ( manipulation.xhtml)。BalusC が提供するこれら 2 つの方法の非常に有用な比較は、ここにあります。

このビューへのナビゲーションは、たとえば次の<h:link>ような単純な を介して処理できます。

<h:link value="Manipulate" outcome="manipulation.xhtml" >
    <f:param name="articleId" value="#{baseBean.article.id}" />
</h:link>
于 2013-02-14T07:48:36.163 に答える