私が考える最も基本的なシナリオのいくつかを実行しようとしています。
開始ページにはデータベースからのカテゴリのリストがあり、カテゴリをクリックすると、そのカテゴリに関する詳細が記載されたページが表示されます (名前や製品などを印刷する場合があります)。
BalusCがブログ投稿で行ったことをやろうとしていました
私はJava-ee-7、グラスフィッシュ4.1、休止状態4.3.5を使用しています
index.xhtml で、パラメーターを使用してカテゴリへのリンクを作成します。
<h:link outcome="category.xhtml" value="#{category.name}">
<f:param name="categoryId" value="#{category.id}"/>
</h:link>
カテゴリは、クエリ文字列categoryId
パラメーターを使用して問題なく出力されます。
次に、category.xhtml に次のものがあります。
<f:metadata>
<f:viewParam name="categoryId"
value="#{categoryController.category}"
converter="#{categoryConverter}" />
</f:metadata>
<h:body>
Category name:
<h:outputText value="#{categoryController.category.name}" />
<!-- this one prints nothing -->
</h:body>
CategoryController コードは次のようになります。
@Named
@RequestScoped
public class CategoryController {
private Category category;
public void setCategory(Category category) {
this.category = category;
}
public Category getCategory() {
return category;
}
}
コンバーターは次のようになります。
@Named
@RequestScoped
public class CategoryConverter implements Converter {
@Inject
private CategoryRepository categoryRepository;
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) {
return categoryRepository.find(Integer.parseInt(s));
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) {
if (o == null || !(o instanceof Category)) {
return null;
}
return ((Category) o).getId().toString();
}
}
いくつかのテスト専用getAsString
メソッドが呼び出されますが、代わりにあるべきだと思いますgetAsObject
。
ステートメント<h:outputText value="#{categoryController.category.name}" />
は何も出力しません (おそらく null です)。category.xhtml
ページにカテゴリエンティティを含めるにはどうすればよいですか?
--
明確にするために、次のようなもので機能させます
<h:commandButton action="#{categoryController.showCategory(category)}" />
しかし、これは生成さhttp post
れ、簡単なget
リクエストが必要です。私にとっては、経由でしかアクセスできないというのはばかげているでしょうpost
。
何か不足している場合に備えて、不要なコードを取り除いた github からアクセスできるようにします: https://github.com/Yavin/jsf-entity-convert