0

CRUD を実行すると、RequestScoped チケット Bean があります。

これまで新しいチケットを作成するために使用していた XHTML ページがあります。チケットフィールドは直接入力されます(#{ticket.description}など)

これで、チケットを一覧表示する検索フォームができました。各チケットには、チケット ID をパラメータとして持つリンクがあります。バッキング Bean が EJB/JPA からチケット Bean を取得し (既に実行済み)、それをリクエストに入れるようにします。私はそうする3つの方法を見ます:

  • JPA から取得した Bean からインジェクションで提供された Bean にデータをコピーします。醜い/脱落しやすい.
  • ExternalContex#getRequestMapを使用して、自分で Bean を配置します。非常に適切に見えません。私は正しいですか?
  • できるように、チケット Bean を別の Bean クラスに含めますmyNewBean.setTicket(ticketFromJpa);。最良のオプションのように思えますが、このためだけにページ内のすべての EL にプレフィックスを付けなければならないのは好きではありません。

私がやりたいことを行うための、よりクリーンで適切な方法はありますか?

前もって感謝します。

更新:もう少し情報を加えて、私が欲しいものを言い換えます。page に commandLink があり、バッキング BeanP1で action を呼び出します。そのロジックを実行し、 page にリダイレクトします。(リクエスト スコープの) Beanをアクションに設定したかったので、それを描画できます。AB1B1P2B2AB2P2

実験から、アクションを終了した後A、フレームワークが新しいB2リクエスト スコープ Bean を作成することがわかったので、リクエスト スコープが予想よりも短いように見えます。

ダミアンによって提案されたフラッシュスコープは、私が望むように機能するように見えますが、 #{flash} の周りのページを再設計する必要があり、(それを使用して新しい Bean を作成したい場合) Bean をアクションメソッドでフラッシュします(現在、ページに移動するだけでマネージドBeanが利用可能です)

Request スコープの Bean が維持されることを期待していました。

4

1 に答える 1

4

別のページでチケットを表示するには、次のいずれかを実行できます。1
)チケットのIDを含むaf:paramを指定してh:linkを使用します。

<h:link value="#{ticket.description}" outcome="/viewTicket" >
    <f:param name="id" value="#{ticket.id}" /
</h:link>

次に、viewTicket.xhtml(またはページと呼んだもの)でIDパラメーターを読み取り、JPAからチケットを取得します。

これは、管理対象が基本的にどのように見えるかです。

@ManagedBean
@ViewScoped
public class ViewTicketMBean implements Serializable {

    private String ticketId;
    private Ticket ticket;

    @PostConstruct
    public void init() {
        ticketId = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
        // read ticket from JPA by ID
    }

}

2)h:linkの代わりに、チケットIDを公開したくない場合は、commandLinkを使用できます。これは、viewTicket.xhtmlに移動する前に、JPAからチケットを取得し、フラッシュスコープに配置します。次に、viewTicketで、フラッシュスコープからチケットを取得します。これは、commandLinkcouldlのアクションメソッドがどのように見えるかです。

Ticket ticket = null;
// get ticket from JPA    
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("ticket", ticket);
return "/viewTicket";
于 2012-05-29T13:05:37.120 に答える