【问题标题】:Integration beetween a compositeComponent's attribute and a Servlet in JSFJSF 中复合组件属性和 Servlet 之间的集成
【发布时间】:2012-04-09 07:20:13
【问题描述】:

我正在尝试以最独立的方式将Plupload 与 JSF 集成,因为我创建了一个复合组件。

要在我的 JSF 页面中使用 Plupload,我只需调用:

<comp:plupload ... value=#{MyBean.files} />

其中 MyBean.files 是一个列表。

当我将文件添加到 Plupload 组件并单击“开始上传”按钮时,我希望它将所有内容上传到一个临时文件夹并使用这些文件属性(例如路径)填充我的复合组件的“值”中指定的对象)。

要上传我使用 servlet 的文件,它与 JSF 无关,它适用于第一部分:它将所有内容上传到一个临时文件夹。我的问题是第二部分,我做了很多研究,但我找不到将 JSF 复合组件中的属性“值”传递给我的 servlet 的方法。

Plupload 使用 javascript 配置一切,请求将被发送到以下代码中属性“url”中指定的 URL:

<composite:interface>
  ...
  <composite:attribute name="value" required="true" />
</composite:interface>
<composite:implementation>
  ...
  <script type="text/javascript">
    // Convert divs to queue widgets when the DOM is ready
    $(function() {
      $("#uploader").pluploadQueue({
        // General settings
        runtimes : '#{cc.attrs.runtimePreferences}',
        url : '/plupload',
        max_file_size : '#{cc.attrs.maxFileSize}',
        ...
      });
    });
  </script>

  <div id="uploader">
    <p><h:outputText value="Your browser does not support this." /></p>
  </div>
</composite:implementation>

我将“/plupload”指定为 url,这是我的 servlet 的 url(在 web.xml 中)。

我可以考虑两种可能的解决方案:

  1. 继续使用这个完全独立于 FacesServlet 的 servlet,并找到一种方法将我的复合组件中的属性“值”作为请求属性传递给我的 servlet。但是,我该怎么做呢?

  2. 停止使用新的 servlet,我不应该这样做,因为我使用的是 JSF,一切都应该由 FacesServlet 处理。我可以创建一个 ManagedBean,而不是使用新的 servlet。在这个 managedBean 中,我可以创建一个方法并恢复 HttpRequest 和 HttpResponse。如果它是托管Bean,则将我的compositeComponent 与处理上传的方法通信会更容易。问题:如何通过 URL 引用 managedBean 的方法?我仍然必须在 javascript 代码中填写属性“url”。有没有像“/faces/MyBean?action='myMethod()'这样的东西?

提前感谢您的任何回答;)

【问题讨论】:

    标签: javascript jsf servlets plupload


    【解决方案1】:

    将其作为请求路径信息发送。

    url: '/plupload/' + encodeURIComponent('#{cc.attrs.value}'), // You might want to escape JS special characters like singlequotes, newlines, etc as well, depending on what the value can contain.
    

    如果 servlet 映射到/plupload/*,那么您可以通过以下方式获取它:

    String value = request.getPathInfo().substring(1);
    

    【讨论】:

    • 感谢您对 BalusC 的回答。如果我试图将一个简单的字符串传递给我的 servlet,它会非常有效,但我想传递一个完整的对象,我认为我不能通过 URL 来做到这一点。正如我所说,#{cc.attrs.value} 是一个列表,使用您的代码我将列表的元素打印在我的 HTML 文件中。由于我的列表为空,JSF 呈现: url: '/plupload/' + encodeURIComponent('[]').
    • 将其转换为字符串。或者通过唯一 ID 将其存储为会话属性并传递该 ID。
    • 将其转换为字符串不起作用...我不需要变量的副本,我需要对它的引用 =/。我尝试了会话的想法,我创建了一个新的会话范围的托管 Bean,并在我的复合组件中使用预渲染事件加载了它。它工作得很好;)。谢谢你。我将写一个详细的答案,说明我为帮助将来可能遇到类似问题的人所做的工作。
    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2012-12-05
    • 2011-06-02
    • 2012-01-09
    • 1970-01-01
    • 2012-08-25
    • 2012-11-28
    相关资源
    最近更新 更多