提问人:Tiago Vieira Dos Santos 提问时间:5/16/2013 最后编辑:BalusCTiago Vieira Dos Santos 更新时间:1/23/2023 访问量:17584
如何使用本机 JavaScript 在 HTML DOM 事件上调用 JSF 托管 bean?
How to invoke a JSF managed bean on a HTML DOM event using native JavaScript?
问:
我需要在 HTML DOM 事件期间使用 ajax 执行 JSF 托管 Bean 操作方法,类似于 jQuery 的 .在这个项目中,我只能使用 JSF 生成的 JavaScript。有没有办法在原生 JSF 中做到这一点?我可以使用哪个事件或可以使用哪个 JSF ajax 函数?load
$(document).ready(function() { $.ajax(...) })
我正在使用 JSF 2.0、Facelets 和 PrimeFaces。
答:
几种方式。
用。请注意,这仅在 JSF 2.3 之后可用。
<h:commandScript>
<h:form> <h:commandScript name="commandName" action="#{bean.action}" render=":results" /> </h:form> <h:panelGroup id="results"> ... </h:panelGroup>
您可以在 JS 中调用它,如下所示:
commandName();
参数可以按如下方式传递:
commandName({ name1: "value1", name2: "value2" });
并得到如下:
String name1 = externalContext.getRequestParameterMap().get("name1"); // value1 String name2 = externalContext.getRequestParameterMap().get("name2"); // value2
要在事件期间调用它,请设置 .
load
autorun="true"
<h:commandScript ... autorun="true" />
如果您使用的是 PrimeFaces,请使用其
<p:remoteCommand>
。<h:form> <p:remoteCommand name="commandName" action="#{bean.action}" update=":results" /> </h:form> <h:panelGroup id="results"> ... </h:panelGroup>
您可以在 JS 中调用它,如下所示:
commandName();
然而,它不使用 JSF 原生
jsf.ajax.request(),
而是使用 PrimeFaces 原生 jQuery(你知道,PrimeFaces 是 jQuery/UI 之上的 JSF 组件库)。参数可以按如下方式传递:
commandName([{ name: "name1", value: "value1" }, { name: "name2", value: "value2" }]);
并得到如下:
String name1 = externalContext.getRequestParameterMap().get("name1"); // value1 String name2 = externalContext.getRequestParameterMap().get("name2"); // value2
要在事件期间调用它,请设置 .
load
autoRun="true"
<p:remoteCommand ... autoRun="true" />
如果您使用的是 OmniFaces,请使用其
<o:commandScript>
。用法与 with 完全相同,但可用于较旧的 JSF 2.x 版本。<h:commandScript>
只需在第一个示例中替换为。历史说明:完全基于 .
h:
o:
<h:commandScript>
<o:commandScript>
使用“隐藏形式”技巧(实际上,“hack”被赋予了丑陋更好的措辞)。
<h:form id="form" style="display:none;"> <h:commandButton id="button" action="#{bean.action}"> <f:ajax render=":results" /> </h:commandButton> </h:form> <h:panelGroup id="results"> ... </h:panelGroup>
您可以在 JS 中调用它,如下所示:
document.getElementById("form:button").onclick();
请注意触发而不是 .立即调用生成的函数,而基本上只模拟元素上的“点击”动作,就好像使用鼠标一样,这在 IE 中是不支持的,并且在某些浏览器中还要求元素实际上是可交互的(即 届时就不能使用了)。
onclick()
click()
onclick()
onclick
click()
display:none
你可以通过事先通过JS填写的相同形式传递参数。如何在将 JavaScript 变量作为参数传递给 JSF 操作方法?
<h:inputHidden>
要在事件期间调用它,请考虑将其放入 .自动将 的末尾放在 ,因此不需要包装器。
load
<h:outputScript target="body">
target="body"
<script>
<body>
$(document).ready()
<h:outputScript target="body"> document.getElementById("form:button").onclick(); </h:outputScript>
或者,创建一个自定义来扩展和生成必要的 JSF 本机调用。例如,您可以查看 OmniFaces 的源代码。
UIComponent
UICommand
jsf.ajax.request()
<o:commandScript>
评论