[英]Null or empty JSON object from AJAX request
最终删除了我之前发布的与此相关的另一个问题,因为它已经过时了,还有另一件事要解决。 下面的答案非常清楚,比其他答案更清楚,我相信这对其他有类似困惑的人会有所帮助。
本质上,我想在 Java 中使用来自客户端 JS 的 String。 我的 JS 警报在下面工作正常,但是我的 JSON 对象在我的 Servlet 中为 null 或为空。 我真的只需要将一个字符串传递给我的 servlet,这样我就可以运行 SQL 查询,但是我遇到了很多麻烦。
谢谢!
html文件
<div class="jumbotron" id="jumboframe">
<h1>Enter your URL below</h1>
<input class="txtUrl" type="text" id="txtUrl" value="...." onfocus="if(this.value == '....') { this.value = ''; }"/>
<p><a class="btn btn-lg submitButton" href="testpage.html" onclick="getURL()" role="button">Start searching!</a></p>
</div>
<script>
function getURL() {
var urlString = document.getElementById("txtUrl").value;
var params = {url: urlString};
$.ajax({
type: "POST",
url: "testpage.html",
contentType: "application/json",
dataType: "text", // "JSON" here doesn't call alerts below
data: {
'url': urlString
},
success: function(data) {
alert("did it!");
alert(JSON.stringify(params));
alert(JSON.stringify(data));
}
});
}
</script>
小服务程序
public class JavaServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter();
StringBuilder builder = new StringBuilder();
BufferedReader reader = request.getReader();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
out.println(builder.toString());
String url = request.getParameter("url");
Map<String, String[]> map = request.getParameterMap(); // empty {}
out.println(map.toString()); // null
out.println(url); // null
网页.xml
<servlet>
<servlet-name>JavaServlet</servlet-name>
<servlet-class>path.to.my.JavaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JavaServlet</servlet-name>
<url-pattern>/testpage.html</url-pattern>
</servlet-mapping>
再次感谢
如果你想从请求数据中获取一个 Json,那么你应该将它作为一个字符串传递,然后,你的 html 可能看起来像这样(我已经将 servlet 路径更改为 JavaServlet.do)
<div class="jumbotron" id="jumboframe">
<h1>Enter your URL below</h1>
<input class="txtUrl" type="text" id="txtUrl" value="...." onfocus="if(this.value == '....') { this.value = ''; }"/>
<p><a class="btn btn-lg submitButton" href="#" onclick="getURL()" role="button">Start searching!</a></p>
</div>
<script>
function getURL() {
var urlString = document.getElementById("txtUrl").value;
var params = {url: urlString};
var jsonDataStr = JSON.stringify(params); // Here you get the json String
$.ajax({
type: "POST",
url: "JavaServlet.do",
contentType: "application/json",
dataType: "text", // "JSON" here doesn't call alerts below * Because the servlet thrown an error, you should handle it *
data: jsonDataStr,
success: function(data) {
alert("Your URL is " + data); // **get the response text**
alert("Handle it");
},
error: function(data) { // Handle the error
alert(data.error().getResponseHeader());
}
});
}
</script>
现在,JavaServlet 将接收一个 Json 作为字符串,您必须解析它(使用第三方库,如 Gson)。
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter();
StringBuilder builder = new StringBuilder();
BufferedReader reader = request.getReader();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
String jsonString = builder.toString(); // get the json from client
UrlDto urlDto = new Gson().fromJson(UrlDto.class,jsonString); // parse you json to Java object
String yourUrl = urlDto.getUrl();
out.print(yourUrl); // **Set the response text**
out.close();
WEB.XML 和 UrlDto
class UrlDto {
private String url;
// G&S ...
}
<servlet>
<servlet-name>JavaServlet</servlet-name>
<servlet-class>servlet.JavaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JavaServlet</servlet-name>
<url-pattern>/JavaServlet.do</url-pattern>
</servlet-mapping>
我希望这对你有帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.