问题描述
我有一个基于引导框架的xpage,该框架使用jQuery $ post提交页面中包含的表单。这些内容使用multipart / form-data content-type发布,所以我对此无能为力。我已经建立了一个包含RESTService的REST.xsp,它调用了Java ServiceBean。我尝试过的最新方法如下:
private void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException {
// TODO Auto-generated method stub
try{
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iterator = upload.getItemIterator(request);
System.out.println("test");
while (iterator.hasNext()) {
System.out.println("test2");
FileItemStream item = iterator.next();
InputStream stream = item.openStream();
if (item.isFormField()) {
byte[] str = new byte[stream.available()];
stream.read(str);
String pFieldValue = new String(str,"UTF8");
System.out.println("text Value : "+pFieldValue);
if(item.getFieldName().equals("textBoxFormElement")){
System.out.println("text Value : "+pFieldValue);
}
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
但是我似乎无法让服务器接收POSTed表单数据。我可以在控制台上看到“测试”,但没有点击“ test2”。
我尝试了所有可以找到的建议,包括:
try {
InputStream inputStream = request.getInputStream();
Reader inputStreamReader = new InputStreamReader(inputStream);
String allChars = "";
System.out.println("test");
int data = inputStreamReader.read();
while(data != -1){
System.out.println("test2");
char theChar = (char) data;
System.out.println(theChar);
allChars = allChars + theChar;
data = inputStreamReader.read();
}
inputStreamReader.close();
}
catch (IOException e) {
System.out.println("No body data readable: " + e.getMessage() );
}
(仍然没有“ test2”)...并且:
String requestBody = extractPostRequestBody(request);
System.out.println(requestBody);
private static String extractPostRequestBody(HttpServletRequest request) {
Scanner s = null;
try {
s = new Scanner(request.getInputStream(),"UTF-8").useDelimiter("\\A");
} catch (IOException e) {
e.printStackTrace();
}
return s.hasNext() ? s.next() : "";
}
(没有打印到控制台)。
我也尝试过使用REST客户端将一些多部分表单数据值发布到URL,但是同样没有返回任何内容。但是,如果我尝试使用application / json content-type发布一些json并使用上面显示的最后一种方法,我会看到json被打印到控制台。
使用extLib REST控件和带有多部分POST的java servicebean可能存在一些问题吗?我知道您只能读取一次请求流,以便先前使用的例如request.properties将使此后的流为空,但这不是这种情况,并且假定json也不会显示。
非常感谢
解决方法
如果随POST请求一起发送的是multipart / formdata,则可以获取提交数据的句柄,如下所示:
for (Object e : req.getParameterMap().entrySet()) {
Map.Entry entry = (Map.Entry) e;
System.out.println("got " + entry.getKey() + "/" + entry.getValue().getClass().getCanonicalName());
}
地图中的条目可以是表单字段,也可以是上传的文件。