0

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

<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
}

我正在尝试使用 stdalone java 客户端发出 multipart/form-data POST 请求以上传表单。Sinc 现在我已经尝试过这个这个但没有成功。

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

有任何想法吗?

4

1 回答 1

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

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

也可以看看:

于 2012-05-25T19:42:18.047 回答