Javascript 复合组件之间的集成&x27;JSF中的s属性和Servlet

Javascript 复合组件之间的集成&x27;JSF中的s属性和Servlet,javascript,jsf,servlets,plupload,Javascript,Jsf,Servlets,Plupload,我试图以最独立的方式与JSF集成,因为我创建了一个复合组件 要在我的JSF页面中使用Plupload,我只需调用: <comp:plupload ... value=#{MyBean.files} /> 其中MyBean.files是一个列表 当我向Plupload组件添加文件并单击“开始上载”按钮时,我希望它将所有内容上载到临时文件夹,并用这些文件属性(例如,路径)填充复合组件“值”中指定的对象 为了上传我正在使用的文件,servlet与JSF无关,它在第一部分工作得很好:它

我试图以最独立的方式与JSF集成,因为我创建了一个复合组件

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

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

其中MyBean.files是一个列表

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

为了上传我正在使用的文件,servlet与JSF无关,它在第一部分工作得很好:它将所有内容上传到一个临时文件夹。我的问题是第二部分,我做了很多研究,但是我找不到一种方法将JSF复合组件中的属性“value”传递给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>

...
...
//当DOM就绪时,将div转换为队列小部件
$(函数(){
$(“#上传器”).pluploadQueue({
//一般设置
运行时:“#{cc.attrs.runtimePreferences}”,
url:“/plupload”,
最大文件大小:“#{cc.attrs.maxFileSize}”,
...
});
});

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

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

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

  • 停止使用新的servlet,我不应该这样做,因为我使用的是JSF,一切都应该由FacesServlet处理。我可以创建ManagedBean,而不是使用新的servlet。在这个managedBean中,我可以创建一个方法并恢复HttpRequest和HttpResponse。如果我的compositeComponent是managedBean,那么与处理上载的方法进行通信就更容易了。问题:如何通过URL引用managedBean的方法?我仍然需要在javascript代码中填充属性“url”。是否有类似于“/faces/MyBean?action='myMethod()


  • 提前感谢您的回答;)

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

    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,并在我的复合组件中使用预呈现事件加载了它。它起作用了很好,谢谢。我会写一个详细的答案,告诉大家我做了些什么来帮助那些将来可能有类似问题的人。