[解決済み] サーブレット関連クラスでJSFマネージドBeanを名前付きで取得する
質問
カスタムサーブレット(AJAX/JSON用)を作成しようとしています。
@ManagedBeans
を名前で参照したいのです。私はマッピングすることを望んでいます。
http://host/app/myBean/myProperty
になります。
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
通常のサーブレットから名前でBeanをロードすることは可能でしょうか?そのために使えるJSFサーブレットやヘルパーはありますか?
私は、これらすべてがあまりにも明白であるSpringに甘えているようです。
どのように解決するのですか?
サーブレットベースのアーティファクトで、例えば
@WebServlet
,
@WebFilter
と
@WebListener
を使えば、JSFの
@ManagedBean @RequestScoped
によるものです。
Bean bean = (Bean) request.getAttribute("beanName");
と
@ManagedBean @SessionScoped
によって
Bean bean = (Bean) request.getSession().getAttribute("beanName");
と
@ManagedBean @ApplicationScoped
によって
Bean bean = (Bean) getServletContext().getAttribute("beanName");
これは、ビーンがあらかじめJSFによって自動作成されていることが前提であることに注意してください。そうでない場合、これらは
null
. その後、手動でビーンを作成して
setAttribute("beanName", bean)
.
CDIを使用できるようになった場合
@Named
の代わりに、JSF 2.3 で非推奨となった
@ManagedBean
の代わりにを使えば、手動でビーンを作成する必要がなくなるので、より簡単になります。
@Inject
private Bean bean;
を使っているときはうまくいかないことに注意してください。
@Named @ViewScoped
なぜなら、Bean は JSF のビューの状態によってのみ識別可能であり、それは
FacesServlet
が呼び出されたときにのみ利用可能だからです。そのため、その前に実行されるフィルタでは、ビーンにアクセスする際に
@Inject
ed
@ViewScoped
は常に
ContextNotActiveException
.
中にいるときだけ
@ManagedBean
の中にいるときだけです。
@ManagedProperty
:
@ManagedProperty("#{bean}")
private Bean bean;
の中では動作しないことに注意してください。
@Named
または
@WebServlet
または他のアーティファクト。実際に動作するのは
@ManagedBean
の中だけで動作します。
の中に入っていない場合は
@ManagedBean
の中ではなく
FacesContext
は容易に利用できる(つまり
FacesContext#getCurrentInstance()
が返さない
null
を返さない)、また
Application#evaluateExpressionGet()
:
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
であり,次のように簡略化することができる.
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
であり、以下のように使用することができる。
Bean bean = findBean("bean");
こちらもご覧ください。
関連
-
[解決済み] java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
-
[解決済み] java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config [duplicate].
-
[解決済み] commandButton/commandLink/ajax アクション/リスナーメソッドが呼び出されないか、入力値が設定/更新されない。
-
[解決済み】JSF、Servlet、JSPの違いは何ですか?
-
[解決済み】JSFリソースライブラリは何のためにあり、どのように使用すべきですか?
-
[解決済み] <f:metadata>、<f:viewParam>、<f:viewAction>は何に使えるのでしょうか?
-
[解決済み] javax.el.PropertyNotFoundException の識別と解決。ターゲットに到達できない
-
[解決済み] divタグをレンダリングできるjsfコンポーネントは何ですか?
-
[解決済み] h:commandLinkの代わりにh:outputLinkを使うべきですか?
-
[解決済み] f:viewAction / preRenderView と PostConstruct はいつ使うのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] javax.faces.application.ViewExpiredException: ビューを復元できませんでした
-
[解決済み] JSF 2.2でターゲットが到達できない、識別子がヌルに解決される [重複] 。
-
[解決済み] java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
-
[解決済み] javax.validation.ConstraintViolationException
-
[解決済み] actionとactionListenerの違い
-
[解決済み】JSFリソースライブラリは何のためにあり、どのように使用すべきですか?
-
[解決済み】PrimeFacesのprocess/updateとJSFのf:ajax execute/renderの属性を理解する。
-
[解決済み] h:commandLinkの代わりにh:outputLinkを使うべきですか?
-
[解決済み] Backing Bean (@ManagedBean) か CDI Beans (@Named) か?
-
[解決済み] dataTableやui:repeatのコマンドリンクに選択した行を渡すにはどうしたらいいですか?