【问题标题】:CommandButton action: use value of inputText as parameter in dynamic URLCommandButton 操作:使用 inputText 的值作为动态 URL 中的参数
【发布时间】:2013-02-12 04:18:57
【问题描述】:

我需要制作一个小表单,用户在 inputField 中键入一个数字,然后单击一个按钮,然后将其发送到一个页面,使用该数字作为页面的参数。

到目前为止,我进入了这个:

<p:inputText id="myText" style="width:75px;" />
<p:commandButton id="myButton" value="Ir" 
    action="/site/page.xhtml?id=${param['form:myButton']}"
    title="Ir" ajax="false" proces="@this,myText" />

${param['form:myButton']}#{param['form:myButton']}试过,错误是一样的。

问题是,JSF 认为它是一个方法表达式...

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/intranet] threw exception [/myPage action="/site/page.xhtml?id=${param['form:myButton']}".xhtml @95,41  action="/site/page.xhtml?id=${param['form:myButton']}" Not a Valid Method Expression:  action="/site/page.xhtml?id=${param['form:myButton']}" with root cause
javax.el.ELException: Not a Valid Method Expression:  action="/site/page.xhtml?id=${param['form:myButton']}"
at org.apache.el.lang.ExpressionBuilder.createMethodExpression(ExpressionBuilder.java:236)
at org.apache.el.ExpressionFactoryImpl.createMethodExpression(ExpressionFactoryImpl.java:55)
at org.jboss.weld.util.el.ForwardingExpressionFactory.createMethodExpression(ForwardingExpressionFactory.java:43)
at org.jboss.weld.el.WeldExpressionFactory.createMethodExpression(WeldExpressionFactory.java:64)
at com.sun.faces.facelets.tag.TagAttributeImpl.getMethodExpression(TagAttributeImpl.java:222)
at com.sun.faces.facelets.tag.jsf.ActionSourceRule$ActionMapper2.applyMetadata(ActionSourceRule.java:104)
at com.sun.faces.facelets.tag.MetadataImpl.applyMetadata(MetadataImpl.java:81)
at javax.faces.view.facelets.MetaTagHandler.setAttributes(MetaTagHandler.java:129)
at javax.faces.view.facelets.DelegatingMetaTagHandler.setAttributes(DelegatingMetaTagHandler.java:102)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.doNewComponentActions(ComponentTagHandlerDelegateImpl.java:402)

这是最底层的异常跟踪。

问题:当单击按钮时,如何将输入字段中键入的值传递给按钮的操作,以便浏览器导航到所需的页面,将输入中的值作为参数传递,而无需求助到一个backing bean。

我不需要与服务器通信,只需转发页面即可。

任何使用 jQuery 或纯 javascript 与 JSF 结合的解决方案也是可以接受的。

使用 mojarra,primefaces 3.3.1

【问题讨论】:

  • 你做错了。 action 需要一个 java 方法作为 EL。例如:#{bean.someMethod}。其中“bean”是 JSF ManagedBean。要传递值,请使用#{bean.someMethod(someValue)}。在此处查看更多信息:balusc.blogspot.in/2011/09/communication-in-jsf-20.html
  • &lt;p:commandButton&gt; 的操作可以有一个字符串而不是一个 Java 方法。当您单击按钮时,它会将您带到一个页面。我不想要方法表达式。
  • 具体功能需求不清楚。您要执行 GET 表单提交还是要执行 POST 表单提交然后重定向到所需的 GET URL?
  • 另外,使用支持 bean 的解决方案,将输入绑定到 POJO 属性和faces-redirect=true 是已知的,但我需要在不使用支持 bean 的情况下这样做。 JSF、jQuery都可以,但是不能创建或修改Java类。
  • @BalusC:用例:表单具有输入字段和按钮。用户在输入中输入值。用户点击按钮。用户导航到另一个页面,将输入中的值作为参数传递给新页面。在 JSF 中实现此结果而不使用 Java 类的任何策略都是可以接受的。

标签: jsf jsf-2 primefaces el


【解决方案1】:

使用&lt;f:param&gt; 来自BalusC http://balusc.blogspot.in/2011/09/communication-in-jsf-20.html#ProcessingGETRequestParameters的这篇文章中有解释

【讨论】:

  • 该部分解释了如何使用从生成视图的请求到该视图的 GET 参数。我想要相反,获取页面元素的值并将其注入新请求。
  • &lt;f:param&gt; 的用途完全不同。 OP 本质上想要一个 GET 表单。
  • 甚至没有 GET 表单。在这种情况下不需要与服务器通信,只需执行操作并将用户转发到下一页。无论如何,当用户从上一页登陆时,与服务器的通信将完成,但对于导航,只需普通的 javascript 或 jQuery 就足够了
【解决方案2】:

我不需要火箭筒来杀死老鼠。答案很简单。

将一个 javascript 函数绑定到按钮的 onclick,并在该函数中通过其 id 检索输入字段的值,然后将 URL 与参数组合起来并离开 javascript 函数。

JSF 代码(假设它们在以myForm 为 id 的表单内):

<p:inputText id="myInput" style="width:75px;" />
<p:commandButton id="myButton" value="Ir" onclick="navega();" title="Ir" ajax="false" proces="@none" />

Javascript 脚本,在单独的文件中或稍后在 xhtml 文档中声明:

function navega() {
     var submittedInputValue = $('#myForm\\:myInput').val();
     window.location.href = "/site/mypage.xhtml?param1=whatever&amp;id=" + submittedInputValue ;
                }

注意前面的 id (myForm:myInput),在 jQuery 中使用 \\ 转义 :,并在 xhtml 中使用 &amp;amp; 而不是 &amp;,因此它不被视为实体。

注意:可能并非所有这些 commandButton 属性都是必需的,请随时编辑此答案并删除无用的。

编辑:在命令按钮上删除了提交并将过程更改为@none

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2012-06-13
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    相关资源
    最近更新 更多