我在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请求来上传表单。 现在我已经尝试了this和this,但没有成功。
在这两种情况下,我都会收到HTTP/1.1 200 OK
响应,然后我会收到表单页面,就好像没有发送POST一样。
有什么想法吗?
答案 0 :(得分:0)
以编程方式将表单提交到JSF Web应用程序时,您需要确保考虑以下3项内容:
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。