以编程方式将文件上载到JSF Web应用程序

时间:2012-05-25 19:31:39

标签: java tomcat post jsf-2 multipartform-data

我在Tomcat 7.0.25上有一个JSF 2.0 / primefaces Web应用程序。该应用程序有一个简单的文件上传表单,如在主要表面showcase中。

<h:form enctype="multipart/form-data">
    <p:messages showDetail="true" />
    <p:fileUpload value="#{fileUploadController.file}" mode="simple" />
    <p:commandButton value="Submit" ajax="false" actionListener="#{fileUploadController.upload}" />
</h:form>
public void upload() throws IOException {
    FacesMessage msg = new FacesMessage("Succesful", this.file.getFileName() + " is uploaded.");
    FacesContext.getCurrentInstance().addMessage(null, msg);
    // do stuff with xml
}

我正在尝试使用stndalone java客户端创建一个multipart / form-data POST请求来上传表单。 现在我已经尝试了thisthis,但没有成功。

在这两种情况下,我都会收到HTTP/1.1 200 OK响应,然后我会收到表单页面,就好像没有发送POST一样。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

以编程方式将表单提交到JSF Web应用程序时,您需要确保考虑以下3项内容:

  • 维护HTTP会话(当然,如果JSF webapp已启用服务器端状态保存)。
  • 发送javax.faces.ViewState隐藏输入字段的名称 - 值对。
  • 发送虚拟按下的提交按钮的名称 - 值对。

关于维护HTTP会话,在使用URLConnection时,在创建第一个URLConnection之前添加以下行

CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));

或者在使用HttpClient时,请使用以下命令:

HttpContext httpContext = new BasicHttpContext();
httpContext.setAttribute(ClientContext.COOKIE_STORE, new BasicCookieStore());
// ...
HttpResponse getResponse = httpClient.execute(someHttpMethod, httpContext);

为了保持JSF视图状态的活动,必须发送javax.faces.ViewState隐藏输入字段的name = value对。发送提交按钮的name = value对是强制性的,以便让JSF调用该操作。如果它没有自动生成的客户端ID,这是最简单的,所以给它和它的父表单一个固定的ID。

另见: