1

私はJava ee 6を学んでいます。私の目標は、編集リストを作成し、ID、名前文字列、および説明文字列だけで作成された1つの些細なエンティティを削除できる単純なcrudアプリケーションを作成することです。コードhttp://netbeans.org/kb/docs/web/jsf20-crud.htmlを見るためにこれをたどりました。netbeansの代わりにEclipseを使用し、グラスフィッシュの代わりにjboss 7を使用しました。うーん....それは動作します。

私のエンティティは「ユーザー」であると考えてください:ID、ユーザー名、パスワード。「UserRole」エンティティを追加したいのですが、これは id、rolename です。次に、OneToMany と ManyToOne の関係を設定します。

では、ユーザー作成ページでロール入力を管理するにはどうすればよいでしょうか? Netbeans crud が推奨するコードは、すべてのロール ID を値として持つ selectonemenu (選択ドロップダウン リスト) です。フォーム送信時に、ロール コントローラ (jsf マネージド Bean) の静的内部クラス「roleconverter」(facesconverter) が、選択および送信されたロール ID 文字列を取得し、ejb-dao を使用して対応するロールを検索します。

私の質問は次のとおりです。

  • わかりますか?私が上に書いたことは正しいですか?
  • その方法でコンバーターを使用するのはベスト プラクティスですか? このような単純で反復的なタスクに対して、より良い解決策はありませんか?
  • エンティティのコンバーターはエンティティ名を除いてすべて同じですが、たとえば汎用コンバーターを使用して重複を削除するにはどうすればよいですか?
  • jsf 2 で多対多を管理するのに最適な GUI は何だと思いますか? (例: 複数のロールを持つユーザーのシナリオ)
4

1 に答える 1

0

そのとおりです。HTML は基本的に 1 つの大きなものStringであり、HTTP 要求パラメーターはすべてStrings であるため、コンバーターが必要です。HTML と HTTP は、具体的な Java オブジェクトを理解したり、受け渡したりしません。それらは Web サーバーのメモリにのみ存在します。HTML 応答を生成し、HTTP 要求パラメーターを適切に解析するにはSomeRandomEntity、 との間で変換できる必要があります。String

コンバーターが実際にはDRYではない場合、すべてのエンティティーが共通の基本エンティティーを拡張@Idし、ゲッターとセッターと共に定義されていて、汎用 DAO がある場合、このための汎用コンバーターを作成できます。このようなもの(簡単な事前チェックとConverterException処理は省略):

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value == null) {
        return null;
    }

    Long id = ((BaseEntity) value).getId();
    return String.valueOf(id);
}

@Override
@SuppressWarnings("unchecked")
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if (value == null) {
        return null;
    }

    Long id = Long.valueOf(value);
    Class<BaseEntity> type = (Class<BaseEntity>) component.getValueExpression("value").getType(context.getELContext());
    return genericDAO.find(id, type);
}

あるいは、 の特定のケースでは<h:selectOneMenu>、 のオブジェクト値に基づいて変換するコンバーターを使用することもできます<f:selectItem(s)>。ただし、これは簡単なことではありません。JSF2 コンポーネント ライブラリOmniFacesには、そのようなものがSelectItemsConverterあります。興味があれば、そのソース コードを確認することをお勧めします。

于 2012-05-03T21:57:05.707 に答える