JSFのマネージドBeanからJavaScript関数を呼び出す(実行する)方法はありますか?
関連する場合は、PrimeFacesも使用しています。
PrimeFaces 6.2より前では、これに RequestContext#execute()
を使用できます。
_public void submit() {
// ...
RequestContext.getCurrentInstance().execute("alert('peek-a-boo');");
}
_
PrimeFaces 6.2以降:
_public void submit() {
// ...
PrimeFaces.current().executeScript("alert('peek-a-boo');");
}
_
標準JSFには、そのための直接的な公開APIはありません。最良の方法は、目的のスクリプトをBeanプロパティとして設定し、Beanプロパティが空でない場合に_<h:outputScript>
_コンポーネントを条件付きでレンダリングすることです。
_<h:commandButton ... action="#{bean.submit}" />
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
_
_public void submit() {
// ...
script = "alert('peek-a-boo');";
}
_
Ajaxでフォームを送信する場合は、_<h:outputScript>
_を別のコンポーネントでラップし、代わりにajax更新することを忘れないでください。 Ajaxの更新/レンダリングは、レンダリングされた属性を持つコンポーネントでは機能しません も参照してください。
_<h:commandButton ... action="#{bean.submit}">
<f:ajax execute="@form" render="script" />
</h:commandButton>
<h:panelGroup id="script">
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
</h:panelGroup>
_
「そのための直接的なパブリックAPIはありません」というステートメントについては、不思議なことに PartialResponseWriter
クラス(JSF ajax応答の作成を担当)はJSF 2.0以降に既に startEval()
および endEval()
メソッドを使用すると、コールバックスクリプトを直接応答に書き込むことができますが、JSF 2.3が登場するまで、驚くほど公開メソッドはありませんでした PartialViewContext
これらのメソッドに委任します。 issue 1412PartialViewContext#getEvalScripts()
に従って、最終的にパブリックAPIに追加されました。
_public void submit() {
// ...
FacesContext.getCurrentInstance().getPartialViewContext().getEvalScripts().add("alert('peek-a-boo');");
}
_
古いJSFバージョンの場合、これはカスタムPartialViewContext
実装を作成することによってのみ実装できます。 JSFユーティリティライブラリOmniFacesは、 OmniPartialViewContext
で正確にそれを行いました。これは Ajax
ユーティリティクラス を介して使用できます。
_public void submit() {
// ...
Ajax.oncomplete("alert('peek-a-boo');");
}
_
使用しているPrimefacesのバージョンに応じて、RequestContext.execute("{js here}");
を使用できます
Primefaces 3.4ドキュメントから:
RequestContextは、ajaxリクエストの完了時にjavascriptを実行する方法を提供します。このアプローチは、コールバックパラメーターを渡して条件付きjavascriptを実行するよりも簡単です。以下の例は、ajaxリクエストが完了するとダイアログを非表示にします。
コード
public void save() {
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.execute("dialog.hide()");
}
Primefacesで最も近いものは次のとおりです。
http://www.primefaces.org/showcase/ui/callbackParams.jsf
3.0には拡張機能もあると言っていますが、
単純にできません。
Managed Bean
はサーバーで、JavaScriptはブラウザーで動作します。
Managedbeanに設定された値に応じて、条件付きでJavaScriptを呼び出すことができます。
一般に、Javaは、スクリプトエンジンを使用して文字列を評価するAPIを提供します。これは、javax.script.ScriptEngineクラスとjavax.script.ScriptEngineManagerクラスによって実現できます。
あなたの状況が何であるかは完全にはわかりませんが、javascriptをマネージドBeanに文字列として渡すことができれば、おそらくJavaスクリプトAPIを使用してサーバー側でjavascriptを実行できます。
詳細については、次のリンクを参照してください。 http://docs.Oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html