2012-03-25 25 views
0

我试图以尽可能最独立的方式将Plupload与JSF集成,因为我创建了一个复合组件。在JSF中集成一个compositeComponent的属性和一个Servlet

要使用Plupload在我的JSF页面我只要致电:

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

凡MyBean.files是一个列表。

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

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

Plupload使用JavaScript来配置一切,请求将被发送到在下面的代码在属性“URL”指定的URL:我指定“/ plupload”作为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> 

,这是我的servlet的网址(在web.xml中)。

我能想到的两种可能的解决方案:

  1. 继续使用这个servlet,这是由FacesServlet的完全独立,并找到一种方法,在我的复合成分通过属性“价值”作为请求属性到我的servlet。但是,我怎么能做到这一点?

  2. 停止使用新的servlet,我不应该这样做,因为我使用的是JSF,一切都应该由FacesServlet处理。而不是使用新的servlet,我可以创建一个ManagedBean。在这个managedBean中,我可以创建一个方法并恢复HttpRequest和HttpResponse。如果它是一个managedBean,那么使用处理上载的方法来交流我的compositeComponent会更容易。问题:如何通过URL引用managedBean的方法?我仍然需要在javascript代码中填写“url”属性。有什么样“/面/为myBean行动= 'myMethod的()'

感谢您事先的任何答案;?)

回答

0

把它作为请求PATHINFO

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); 
+0

谢谢你回答这BalusC这将完全如果工作。我试图传递一个简单的字符串到我的servlet,但我想传递一个完整的对象,我不认为我可以通过URL来完成。正如我所说的,#{cc.attrs.value}是一个列表,使用你的代码,我得到列表的元素打印在我的HTML文件中。由于我的列表是空的,JSF呈现:url:'/ plupload /'+ encodeURIComponent('[]')。 – 2012-03-25 15:17:06

+0

将其转换为字符串。或者通过唯一ID将其存储为会话属性,然后传递该ID。 – BalusC 2012-03-25 15:53:44

+0

将它转换为字符串将不起作用...我不需要该变量的副本,我需要对它的引用= /。我尝试了会话的想法,我创建了一个新的会话范围的托管Bean,并使用我的复合组件中的预渲染事件加载它。它工作得很好;)。谢谢。我会写一个详细的答案,告诉我做了什么来帮助那些未来可能有类似问题的人。 – 2012-03-25 22:25:27