2

JSF ときれいな顔でのリダイレクトに問題があります。私はこのようなことにまったく慣れていないので、リダイレクトを機能させることができないので、助けが必要です。

基本的に、私はかなりの設定でこれを持っています:

<url-mapping id="newProject">
    <pattern value="/newProject/" />
    <view-id value="/faces/project/newProject.xhtml" />
    <action>#{projectController.initNewProject}</action>    
</url-mapping>

<url-mapping id="project">
    <pattern value="/project/" />
    <view-id value="/faces/project/projectIdx.xhtml" />
</url-mapping>

関数 initNewProject は次のようになります。

public String initNewProject() throws IOException {

    project = this.createProject(123415, "1234578943148", "KB25");

    System.out.println(project);

    return "pretty:project";
}

project は ProjectController のフィールドです。

  @Named
  @ConversationScoped
  public class ProjectController implements Serializable {
     private transient Project project;
     ...

URL が ../newProject/ から ../project/ に変わり、/faces/project/newProject.xhtml の内容が表示されるので、リダイレクトは思い通りに機能します。しかし、リダイレクト中に ProjektController のコンストラクターが呼び出され、フィールド プロジェクトが null になることがあります。

私が変われば

    return "pretty:project";

    return "/project/projectIdx.xhtml";

すべて正常に動作します。プロジェクトの内容がWebページに表示されます。ただし、URL は変更されません。../newProject/ のままで、ユーザーが F5 キーを押すと、新しいプロジェクトが作成されますが、これは悪いことです。

他のいくつかの理由で、プロジェクトをセッションに保存できないため、これはオプションではありません。

initNewProject 中に作成されたプロジェクトの内容を newProject.xhtml に表示させたいので、リダイレクトでコントローラーを再作成したくありません。

これはどのように達成できますか?

どうもありがとう!

マイケル

4

2 に答える 2

0

問題は、2 つのマッピング間の密結合が原因だと思います。基本的に、最初のマッピングでページ アクションを使用して Bean プロパティを初期化し、2 番目のマッピングによってレンダリングされたページでこのプロパティにアクセスしたいとします。これは、PrettyFaces で作成された RESTful URL が機能する方法ではありません。

代わりに、2 番目のマッピングは他のマッピングから完全に独立している必要があります。これにより、RESTful URL がブックマークされたり、別のブラウザー ウィンドウにコピーされたりしても、確実に機能します。

PrettyFaces でこのような RESTful URL を構築する一般的な方法は、次のようなパス パラメーターを使用することです。

<url-mapping id="project">
    <pattern value="/project/#{projectController.projectId}/" />
    <view-id value="/faces/project/projectIdx.xhtml" />
    <action>#{projectController.loadProject}</action>
</url-mapping>

このようにして、プロジェクトの ID がコントローラーに注入され、ページ アクション メソッドでデータベースから対応するエンティティを読み込むことができます。

public void loadProject() {
  this.project = projectDao.getById( projectId );
}

あなたの例の「新しいプロジェクト」ユースケースを処理する方法は、永続性と全体的なプロセスに関する要件によって異なります。

理論的には、提供したコードも機能するはずです。私の推測ではcid、変換スコープを維持するために必要なクエリ パラメータが何らかの理由で失われていると思われます。PrettyFaces フォーラムには、この問題に関するスレッドがいくつかあります。しかし、知る限り、これは通常、古い CDI 実装のバグが原因です。

于 2013-11-04T06:48:18.313 に答える
0

次の構文を使用してリダイレクトを修正しました。

public String create(final Post post) {
        postService.save(post);
        return "pretty:posts";
}
于 2014-05-15T14:11:52.780 に答える