我在我的应用中使用Extjs 4和Java Servlets。我想以json格式将一些数据发布到服务器。
JSON的格式应该是这样的:
{
"credentials":[
{
"username":"george",
"password":"xyz"
}
]
}
我在extjs代码中这样做了:
buttons: [{
text: 'Submit',
handler: function() {
Ext.Ajax.request({
url: '/Model/FormServlet',
method: 'POST',
jsonData : {
//Hardcoded values
username: "george",
password: "xyz"
},
callback: function (options, success, response) {
alert(response.responseText);
}
});
}
}]
1)我相信我不会得到上面发布的JSON格式。请告诉我如何使用jsonData
获取该格式。
2)如何在servlet的doPost方法中检索它?由于我没有使用params
并将其替换为jsonData
,因此request.getParameter
无法在servlet doPost
方法中使用。
请让我知道如何使这项工作。
此致
答案 0 :(得分:3)
1)你没事。
2)这是一个POST请求;数据不会出现在参数中(例如,不是multipart / form-data),而是HTTP请求的内容。在doPost
中,只需阅读request.getInputStream()
中的所有内容,然后使用正确的编码将其转换为字符串,或者如果您注册了request.getContent()
,则直接调用ContentHandler
。
的内容
byte[] ba = IOUtils.toByteArray( req.getInputStream( ) );
String charset = TypedContentUtils.extractCharset( req.getContentType( ) );
String json = new String( ba, charset );
IOUtils
是Apache Commons IO(编写自己的10行,并进行适当的异常处理); TypedContentUtils.extractCharset
是一个简单的自制方法,从Content-Type中提取字符集或默认为utf-8。
答案 1 :(得分:3)
我在doPost方法中尝试了这段代码并且它有效:
StringBuffer jb = new StringBuffer();
String line = null;
try {
BufferedReader reader = req.getReader();
while ((line = reader.readLine()) != null)
jb.append(line);
System.out.println(jb.toString());
} catch (Exception e) {
e.printStackTrace();
}
参考文章:
答案 2 :(得分:2)
1)它会按原样发布数据。内容将是:{username:“george”,密码:“xyz”},如果您想要上面的格式并且它是硬编码的,那么您可以更换它。
2)您可以使用genson库http://code.google.com/p/genson/轻松地将json反序列化为java对象。
UserCredentials userCredentials = new Genson().deserialize(request.getReader(), UserCredentials.class);