我在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'])}" />
(知道param
是implicit 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?
答案 0 :(得分:3)
action
属性在表单提交触发的HTTP请求的应用请求值阶段期间进行评估,因此与使用表单生成HTML输出的HTTP请求不同(并且具有请求中存在email
参数。)
在HTTP请求的呈现响应阶段期间评估<f:param>
标记,该请求需要在其中生成表单中的HTML输出。因此,这在生成的HTML输出中结束“硬编码”(与action
属性中的EL方法参数相反!)。当用户提交表单时,这只是作为普通的String
请求参数传递回服务器(如果它最初是复杂类型,则需要转换回来)。
这与值是否为隐式EL对象无关。
也就是说,还有其他两种方式:
将其作为隐藏输入传递(不,不是<h:inputHidden>
)。
<h:form>
<input type="hidden" name="email" value="#{param.email}" />
...
</h:form>
将其设置为视图范围bean的属性,只要视图存在,它就会保留在bean中。
<f:metadata>
<f:viewParam name="email" value="#{viewScopedBean.email}" />
</f:metadata>