jsf - 传递作为 EL 操作方法参数传递的请求范围变量不起作用

标签 jsf request parameter-passing el managed-bean

我在 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'])}" />

(知道 paramimplicit 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 对象无关。

也就是说,还有另外两种方法:

  1. 将其作为隐藏输入传递(不,不使用 <h:inputHidden> )。

    <h:form>
        <input type="hidden" name="email" value="#{param.email}" />
        ...
    </h:form>
    
  2. 将其设置为 View 作用域 bean 的属性,只要 View 存在,它就会保留在 bean 中。

    <f:metadata>
        <f:viewParam name="email" value="#{viewScopedBean.email}" />
    </f:metadata>
    

关于jsf - 传递作为 EL 操作方法参数传递的请求范围变量不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29337682/

相关文章:

java - :graphicimage not working in c:foreach

java - 在 webMethods Java 服务中获取请求对象

php - "Request does not exist"创建表单 symfony2

delphi - OleDB:无法绑定(bind) DBTYPE_WSTR 参数 - 出现 DB_E_UNSUPPORTEDCONVERSION 错误

c# - 在表单之间传递对象及其所有值

java - selectOne 和 selectMany 选项是否受 SelectItems 限制?

jsf - 在 JSF22 中替换 @ManagedBean(eager=true)

java - JBoss 6 上的 JSF 1.2 和 EL 表达式未解析

java - Guice 注入(inject)根据每个请求创建的上下文实例

nhibernate - 当参数之一是列表时,如何将参数传递给 NHibernate 中的存储过程?