【问题标题】:params not getting passed to backing bean for h:commandLink under rich:popupPanel and t:dataList在rich:popupPanel 和t:dataList 下,参数未传递给h:commandLink 的支持bean
【发布时间】:2012-08-28 09:09:41
【问题描述】:

我有rich:popupPanel,它在t:dataTable 的一列下包含t:dataList。这个 dataList 有 h:commandLink 里面有 f:param 。它在richfaces 3.3 上运行良好,但在迁移到richfaces 4 后,它停止工作。提到我在那里使用rich:modalPanel 代替rich:popupPanel 的事实。我浏览了很多链接:

https://community.jboss.org/thread/202583

commandButton/commandLink/ajax action/listener method not invoked or input value not updated

但没有帮助 :(。我错过了什么吗?目前,bean 是会话范围的,我正在使用 getter 来获取数据模型,因为我无法将它放入构造函数中。

如果有人对此有想法,请告诉我。

PS:渲染的 HTML 等效项如下所示。它具有请求参数 varPath,但在支持 bean 中我们将其设为 null。

<a onclick="return myfaces.oam.submitForm('actionForm','actionForm:j_id0',null,    [['varPath','/Link']]);" href="#" tabindex="-1" accesskey="">/Link</a>

【问题讨论】:

  • 您能给我们提供一个更详细的代码示例吗?包含弹出面板和 dataList 的页面会很有帮助
  • 谢谢。通过将表单的 encType 更改为“application/x-www-form-urlencoded”解决了问题。不知道它是如何工作的!

标签: jsf-2 richfaces commandlink


【解决方案1】:

发现将表单的 encType 从“multipart/form-data”更改为“application/x-www-form-urlencoded”可以解决此问题。不过很奇怪!不知道为什么它不适用于多部分加密。

首先,它不是加密,而是编码。差异是相当大的。 “加密”是一种以这种方式更改值的方式,这种方式在没有安全密钥(密码密钥、种子等)的情况下是不可预测的。 “编码”是一种以数据传输机制可以接受和/或另一方可识别/可解析而不会丢失任何数据的方式更改值的方法。这些值并没有变得不可读或其他什么,它们只是排列得有些具体和不同。

回到您的具体问题,multipart/formdata 编码通常仅在您需要能够随表单一起发送(上传)文件时使用,例如使用 &lt;input type="file"&gt; 或 RichFaces &lt;rich:fileUpload&gt; 组件.标准的application/x-www-form-urlencoded表单编码,基本规定了请求参数应该以这种格式发送URL-encoded

Content-Type: application/x-www-form-urlencoded;charset=UTF-8

name1=value1&name2=value2&name3=value3

不适合传递文件内容。为此,应该使用multipart/form-data 编码,基本上如下所示:

Content-Type: multipart/form-data;boundary=SOME_BOUNDARY

--SOME_BOUNDARY
content-disposition: form-data;name="name1"
content-type: text/plain;charset=UTF-8

value1
--SOME_BOUNDARY
content-disposition: form-data;name="name2"
content-type: text/plain;charset=UTF-8

value2
--SOME_BOUNDARY
content-disposition: form-data;name="name3"
content-type: text/plain;charset=UTF-8

value3
--SOME_BOUNDARY--

这种格式允许在请求正文中包含完整的文件内容。

在 JSF 2.0/2.1 Web 应用程序中,multipart/form-data 请求通常由自定义 Filter 处理。对于 RichFaces 3,这通常由 RichFaces 4 中缺少的 org.ajax4jsf.Filter 处理。

请注意,application/x-www-form-urlencoded 已经是 HTML 表单的 默认 编码类型。所以你不需要自己明确指定。完全省略enctype 属性:

<h:form>

</h:form>

你应该准备好了。

【讨论】:

  • 非常感谢 BalusC 的详细解释。它真的很有帮助。因为,使用编码类型作为“multipart/form-data”和richfaces4是没有办法的。我将尝试寻找有自定义过滤器的方法,该过滤器将填写“org.ajax4jsf.Filter”。请让我知道,如果你知道相同的好来源。
  • 获得了您的这篇文章:balusc.blogspot.in/2009/12/uploading-files-in-servlet-30.html。试试看。
  • 只是添加 并没有返回支持 bean 中的参数值,我仍然将它们作为 null 并且这些不是文件参数,简单的字符串参数。我需要为此写下整个自定义过滤器吗?
【解决方案2】:

发现将表单的 encType 从“multipart/form-data”更改为“application/x-www-form-urlencoded”可以解决此问题。不过很奇怪!不知道为什么它不适用于多部分加密。

如果有人知道这件事,仍然想知道这背后的解释。

【讨论】:

    【解决方案3】:

    使用 a4j:commandLink 而不是 h:commandLink 可以正确传递参数,从而解决了这个问题。无需仅为参数自定义过滤器。

    【讨论】:

    • 这是一种解决方法,而不是解决方案。您似乎完全不了解基本的 HTTP 概念,也不了解 HTTP 请求中发生了什么。正如我的回答中所解释的,您只需从 &lt;h:form&gt; 中删除 enctype 属性即可解决您的问题。毕竟你不需要它。
    • 是的。我同意你的看法,这是一种解决方法,而不是解决方案。不幸的是,我无法删除 encType,因为它需要作为 multipart/form-data ,因为图像和文件上传也以形式存在。我知道在这种情况下创建自定义过滤器是最好的选择,但由于时间限制,我更愿意只使用解决方法。
    【解决方案4】:

    CommandButton 应该放在一个表单标签中。听起来你有嵌套表单或者你没有表单。

    【讨论】:

    • 感谢您的回复。我已经用
      包围了整个内容。
    • 正如我之前提到的,它在richfaces 3.3 中可以正常使用rich:modalPanel,但现在在将其迁移到rich:popupPanel 后,它会导致问题。
    • 你可以添加 也许有一些输出
    • h:messages 上也没有任何内容 :(。它已经存在于应用程序中的每个对话框中。不过感谢您的建议。
    • 我忘记提到的重要一点是,如果我将参数作为支持 bean 的绑定方法的参数传递,链接就像一个魅力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多