我在 Glassfish 4.1 上使用 JSF 2.2。
我尝试将查询参数作为操作方法参数传递,如下所示:
// Example 1. This does not work.
// at url http://localhost:8080/app/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="93fce1f7f6e1bdebfbe7feffacf6fef2faffaee7f6e0e7d3f6fef2faffbdf0fcfe" rel="noreferrer noopener nofollow">[email protected]</a>
<p:commandButton value="Place order" action="#{orderManager.placeOrder(param['email'])}" />
(知道 param
是 implicit EL object 。)
在服务器日志中,我已将其配置为打印方法参数,但我可以看到传入了一个空字符串,而不是我预期的“[email protected] ”。
我已确认我的整体配置正常工作。如果我将上面的代码片段替换为以下内容,则服务器日志中会输出“[email protected] ”:
// Example 2. This works.
<p:commandButton value="Place order" action="#{orderManager.placeOrder('<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cbbfaeb8bf8baea6aaa2a7e5a8a4a6" rel="noreferrer noopener nofollow">[email protected]</a>')}" />
我也确认了我使用EL隐式对象是可行的。如果我从 FacesContext 检索参数(当然是从 placeOrder
的签名中删除电子邮件参数之后),以下代码片段将起作用:
// Example 3. This works.
<p:commandButton value="Place order" action="#{orderManager.placeOrder()}" >
<f:param name="email" value="#{param['email']}"/>
</p:commandButton>
这是最后一个谜团,一个真正让我困惑的谜团,如果我使用以下代码片段,我可以从方法参数和 FacesContext 中检索“电子邮件”参数,但请记住示例 1 中的方法参数不可检索!
// Example 4. This works, and BOTH parameters are retrievable!
<p:commandButton value="Place order" action="#{orderManager.placeOrder(param['email'])}" >
<f:param name="email" value="#{param['email']}"/>
</p:commandButton>
我可以传入隐式 JSF EL 对象作为操作方法参数吗?
你能解释为什么它在示例 4 中有效,但在示例 1 中无效吗?
最佳答案
action
属性在表单提交触发的 HTTP 请求的应用请求值阶段进行评估,因此这是一个与表单中生成 HTML 输出的请求不同的 HTTP 请求(并且请求中存在 email
参数) .
<f:param>
标签在 HTTP 请求的渲染响应阶段进行评估,该阶段需要生成包含表单的 HTML 输出。因此,这最终会在生成的 HTML 输出中“硬编码”(与 action
属性中的 EL 方法参数相反!)。当用户提交表单时,它只是作为普通的 String
传回服务器。请求参数(如果它最初是复杂类型,则需要将其转换回来)。
这与该值是否是隐式 EL 对象无关。
也就是说,还有另外两种方法:
将其作为隐藏输入传递(不,不使用
<h:inputHidden>
)。<h:form> <input type="hidden" name="email" value="#{param.email}" /> ... </h:form>
将其设置为 View 作用域 bean 的属性,只要 View 存在,它就会保留在 bean 中。
<f:metadata> <f:viewParam name="email" value="#{viewScopedBean.email}" /> </f:metadata>
关于jsf - 传递作为 EL 操作方法参数传递的请求范围变量不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29337682/