【问题标题】:Passing query parameter value in h:commandLink action在 h:commandLink 操作中传递查询参数值
【发布时间】:2014-11-07 02:53:43
【问题描述】:

尝试通过jsf commandLink动作将查询参数值,参数名称targetURL传递给后端bean方法。

当我在下面(在 param.targetURL 周围加上引号)时,文字 param.targetURL 被传递给方法:

<h:commandLink id="targetURLLink" action="#{commonTaskBean.redirectTo('param.targetURL')}"  style="display:none" />

当我在下面做(没有引号包围 param.targetURL)时,

<h:commandLink id="targetURLLink" action="#{commonTaskBean.redirectTo(param.targetURL)}"  style="display:none" />

我收到此错误 NullPointerException:

 9/15/14 9:20:44:529 CDT] 00000039 SystemErr     R java.lang.NullPointerException
[9/15/14 9:20:44:529 CDT] 00000039 SystemErr     R  at org.apache.el.util.ReflectionUtil.paramString(ReflectionUtil.java:315)
[9/15/14 9:20:44:529 CDT] 00000039 SystemErr     R  at org.apache.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:234)
[9/15/14 9:20:44:529 CDT] 00000039 SystemErr     R  at org.apache.el.parser.AstValue.invoke(AstValue.java:255)
[9/15/14 9:20:44:529 CDT] 00000039 SystemErr     R  at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
[9/15/14 9:20:44:529 CDT] 00000039 SystemErr     R  at org.apache.myfaces.view.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:83)
[9/15/14 9:20:44:530 CDT] 00000039 SystemErr     R  at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:88)
[9/15/14 9:20:44:530 CDT] 00000039 SystemErr     R  at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:100)
[9/15/14 9:20:44:530 CDT] 00000039 SystemErr     R  at javax.faces.component.UICommand.broadcast(UICommand.java:120)
[9/15/14 9:20:44:530 CDT] 00000039 SystemErr     R  at javax.faces.component.UIViewRoot._broadcastAll(UIViewRoot.java:973)
[9/15/14 9:20:44:530 CDT] 00000039 SystemErr     R  at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:275)
[9/15/14 9:20:44:530 CDT] 00000039 SystemErr     R  at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1285)
[9/15/14 9:20:44:530 CDT] 00000039 SystemErr     R  at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:711)
[9/15/14 9:20:44:530 CDT] 00000039 SystemErr     R  at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:34)
[9/15/14 9:20:44:530 CDT] 00000039 SystemErr     R  at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
[9/15/14 9:20:44:530 CDT] 00000039 SystemErr     R  at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
[9/15/14 9:20:44:530 CDT] 00000039 SystemErr     R  at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)

我把上面的代码改成如下:

<h:commandLink id="targetURLLink" actionListener="#{commonTaskBean.redirectTo}" style="display:none" >
    <f:attribute name="targetURL" value="#{param.targetURL}" />
</h:commandLink>    

但是后端 bean 得到一个空值:

String targetURL = (String) event.getComponent().getAttributes().get("targetURL");

这很奇怪,因为下面在屏幕上正确显示了 targetURL 参数的值:

<h:outputText value="#{param.targetURL}"/>

【问题讨论】:

  • 通常,完整的堆栈跟踪有助于查看它是否是您自己的代码或库中的错误。通常,完整的堆栈跟踪本身也代表了整个答案(关键是我们能够用外行的方式向您解释它)。您最好不要从问题中省略堆栈跟踪,就好像它是无关紧要的装饰一样。
  • @BalusC:我更新了我的帖子以包含相关的堆栈跟踪。出于某种原因,我今天遇到了另一个错误。
  • 这是 Apache EL 中的一个错误。在当前版本中,它已经修复了很长时间。您不清楚您正在使用哪个容器,并且不幸的是,堆栈跟踪中省略了暗示它的部分,但如果它是例如Tomcat,然后将其升级到最新版本。
  • 谢谢巴鲁斯。我正在使用 websphere 8.0。升级 websphere 需要大量的工作和协调。有什么你知道的解决方法吗?
  • 取决于是否要在显示带有表单的页面时传递参数,或者在页面中提交表单时。该代码实际上是后者,但您的问题/问题暗示了前者(不仅因为它是一种获取帖子数据的奇怪方式)。

标签: jsf-2 el


【解决方案1】:

你的问题是双重的。

首先,您面临的异常是由相对古老的 Apache EL 版本中的错误引起的。它无法正确处理作为方法参数传递的nulls。升级 EL 实现(或更恰当地说,容器实现)应该可以解决这个问题。

其次,您似乎对传递带有表单的页面时可用的请求参数感兴趣,而不是在页面中提交表单时可用的请求参数。引用 #{param} 作为 EL 方法参数方法从根本上是错误的。 #{param} 指的是当前请求的请求参数映射。在提交表单的那一刻,这就是表单提交请求本身。你需要&lt;f:param&gt;。它在第一次呈现带有表单的页面时进行评估(作为证据,您实际上可以在 HTML 源代码中看到它)。

<h:commandLink ... action="#{commonTaskBean.redirectTo}">
    <f:param name="targetURL" value="#{param.targetURL}" />
</h:commandLink>
public void redirectTo() throws IOException {
    // ...

    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    String targetURL = ec.getRequestParameterMap().get("targetURL");
    ec.redirect(targetURL);
}

【讨论】:

    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多