以编程方式提交JSF生成的表单时,需要确保考虑以下三点:
否则,可能根本不会调用该动作。对于剩余部分,它与“常规”形式没有什么不同。流程基本上如下:
- 使用表单在页面上发送GET请求。
- 提取JSESSIonID cookie。
javax.faces.ViewState
从响应中提取隐藏字段的值。如有必要(确保它具有动态生成的名称,从而可能更改每个请求),请提取输入文件字段的名称以及提交按钮。j_id
前缀可识别动态生成的ID /名称。- 准备
multipart/form-data
POST请求。 null
根据该请求设置JSESSIonID cookie(如果不是)。- 设置
javax.faces.ViewState
隐藏字段和按钮的名称/值对。 - 设置要上传的文件。
您可以使用任何HTTP客户端库来执行任务。
java.net.URLConnection为此,标准的Java SE
API提供了相当低的水平。为了减少冗长的代码,您可以使用Apache
HttpClient发出HTTP请求并管理cookie,并使用Jsoup从HTML中提取数据。
这是一个启动示例,假设页面只有一个
<form>(否则,您需要在Jsoup的CSS选择器中包括该表单的唯一标识符):
String url = "http://localhost:8088/playground/test.xhtml";String viewStateName = "javax.faces.ViewState";String submitButtonValue = "Upload"; // Value of upload submit button.HttpClient httpClient = new DefaultHttpClient();HttpContext httpContext = new BasicHttpContext();httpContext.setAttribute(ClientContext.cookie_STORE, new BasiccookieStore());HttpGet httpGet = new HttpGet(url);HttpResponse getResponse = httpClient.execute(httpGet, httpContext);document document = Jsoup.parse(EntityUtils.toString(getResponse.getEntity()));String viewStatevalue = document.select("input[type=hidden][name=" + viewStateName + "]").val();String uploadFieldName = document.select("input[type=file]").attr("name");String submitButtonName = document.select("input[type=submit][value=" + submitButtonValue + "]").attr("name");File file = new File("/path/to/file/you/want/to/upload.ext");InputStream fileContent = new FileInputStream(file);String fileContentType = "application/octet-stream"; // Or whatever specific.String fileName = file.getName();HttpPost httpPost = new HttpPost(url);MultipartEntity entity = new MultipartEntity();entity.addPart(uploadFieldName, new InputStreamBody(fileContent, fileContentType, fileName));entity.addPart(viewStateName, new StringBody(viewStatevalue));entity.addPart(submitButtonName, new StringBody(submitButtonValue));httpPost.setEntity(entity);HttpResponse postResponse = httpClient.execute(httpPost, httpContext);// ...
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)