プログラムでJSF-生成されたフォームを送信すると、あなたはアカウントに次の3つの事取ることを確認する必要があります。ウェブサイトは、JSFサーバー側状態保存がオンになっている確か場合
- は、(HTTPセッションを維持します)。
javax.faces.ViewState
非表示フィールドの名前と値のペアを送信します。
- 仮想的に押されるボタンの名前と値のペアを送信します。
これ以外の場合、アクションはまったく呼び出されない可能性があります。残りの人にとっては、それは「通常の」形式と変わらない。フローは基本的に次のとおりです。
- フォームのページでGETリクエストを送信します。
- JSESSIONID Cookieを抽出します。
javax.faces.ViewState
隠しフィールドの値を応答から抽出します。必要に応じて(動的に生成された名前があり、すべての要求が変更される可能性があることを確認するには)、入力ファイルのフィールド名と送信ボタンを適切に抽出します。動的に生成されたID /名前は、接頭辞j_id
で認識できます。
multipart/form-data
POSTリクエストを準備します。
- JSESSIONIDクッキー(該当しない場合は
null
)をその要求に設定します。
javax.faces.ViewState
隠しフィールドとボタンの名前と値のペアを設定します。
- アップロードするファイルを設定します。
任意のHTTPクライアントライブラリを使用してタスクを実行できます。標準のJava SE APIにはpretty low levelというjava.net.URLConnection
があります。より冗長なコードで終了するには、Apache HttpClientを使用してHTTP要求を行い、Cookieを管理し、Jsoupを使用してHTMLからデータを抽出することができます。ここで
は、キックオフの例ですが、(そうでなければ、JsoupのCSSセレクタにそのフォームの固有の識別子を含める必要がある)ページには、一つだけ<form>
を持っていると仮定:
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);
// ...
あなたはそれのためのワーキングサンプルコードを保つことができます。 – spt