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

时间:2015-03-30 02:53:13

标签: 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/order.xhtml?email=test@email.com

<p:commandButton value="Place order" action="#{orderManager.placeOrder(param['email'])}" />

(知道paramimplicit EL object。)

在服务器日志中,我已将其配置为打印方法参数,但我可以看到传入空字符串,而不是我预期的“test@email.com”。

我已确认我的整体配置正常。如果我用以下内容替换上面的代码段,则在服务器日志中输出“test@email.com”:

// Example 2. This works.

<p:commandButton value="Place order" action="#{orderManager.placeOrder('test@email.com')}" />

我还确认我使用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中的“email”参数,但请回忆一下方法参数在示例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?

1 个答案:

答案 0 :(得分:3)

action属性在表单提交触发的HTTP请求的应用请求值阶段期间进行评估,因此与使用表单生成HTML输出的HTTP请求不同(并且具有请求中存在email参数。)

在HTTP请求的呈现响应阶段期间评估<f:param>标记,该请求需要在其中生成表单中的HTML输出。因此,这在生成的HTML输出中结束“硬编码”(与action属性中的EL方法参数相反!)。当用户提交表单时,这只是作为普通的String请求参数传递回服务器(如果它最初是复杂类型,则需要转换回来)。

这与值是否为隐式EL对象无关。

也就是说,还有其他两种方式:

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

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

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