【发布时间】:2015-04-22 04:12:04
【问题描述】:
我刚刚完成这个项目。我有一个 JSON 字符串
{"data":{"id":"YPekRdk","title":null,"description":null,"datetime":1429674575,"type":"image\/png","animated":false,"width":600,"height":200,"size":85694,"views":0,"bandwidth":0,"vote":null,"favorite":false,"nsfw":null,"section":null,"account_url":null,"account_id":0,"deletehash":"AZi041RwarCFD3I","name":"","link":"http:\/\/i.imgur.com\/YPekRdk.png"},"success":true,"status":200}
我从我的 servlet 发送它
response.getWriter().write(new Gson().toJson(imgurImageJson));
到我的 ajax
$(document).ready(function () {
$('#button').click(function () {
var array1 = [];
$('#sortable2 .selectedItemImg').each(function () {
array1.push($(this).attr('src'));
});
$.ajax({
url: 'generate',
type: 'POST',
contentType: 'text/plain',
dataType: 'html',
data: array1.join('\n'),
success: function (data) {
$.each(JSON.parse(data), function (listID, mapData) {
$("#displayGeneratedURL").append("<p>" + mapData.id + "</p>");
});
}
});
});
return false;
});
并尝试在我的 jsp 上查看它
#displayGeneratedURL{
color: white; font-family: Geneva,Tahoma,Verdana,sans-serif; font-size: 12px;
}
<div id="displayGeneratedURL">Result should be here somewhere</div>
我收到了一条浏览器消息:
Uncaught SyntaxError: Unexpected token <
我将我的数据类型更改为 application/json 和其他一些内容,但该错误消息消失了,而是什么都没有发生(作为屏幕或控制台的输出)。
我正在使用的代码主要是从我与另一个 servlet 一起使用的工作代码中复制而来的,但是在带有该 json 字符串的 Gson 调用中使用它仍然可能不合适/错误,但我不知道。也可能是我在ajax中的函数完全错误。
你能看出哪里不对吗?
更新:
我尝试将 servlet 响应更改为
response.getWriter().write(imgurImageJson);
数据类型为dataType: 'text/html',仍然没有显示任何内容,也没有错误消息(当数据类型仅保留为文本时,这会出现 > 错误)
更新:我把我的 ajax 函数改成了这个
success: function (data) {
alert("Hello");
}
它不会发出警告框或做任何事情
我的控制台图像在这里
http://i.stack.imgur.com/IZivJ.jpg
(额外的普通链接,否则它会变得非常小)
更新:
这是我的开发者控制台 POST 响应
编辑:这是我的完整 servlet 代码(非常混乱):
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package mainClasses;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//import static jdk.nashorn.internal.objects.NativeDebug.getContext;
/**
*
* @author J
*/
@WebServlet(name = "ImageGenerationServlet", urlPatterns = { "/generate" })
public class ImageGenerationServlet extends HttpServlet {
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request
* servlet request
* @param response
* servlet response
* @throws ServletException
* if a servlet-specific error occurs
* @throws IOException
* if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following sample code. */
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet ImageGenerationServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet ImageGenerationServlet at "
+ request.getContextPath() + "</h1>");
out.println("</body>");
out.println("</html>");
}
}
// <editor-fold defaultstate="collapsed"
// desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request
* servlet request
* @param response
* servlet response
* @throws ServletException
* if a servlet-specific error occurs
* @throws IOException
* if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request
* servlet request
* @param response
* servlet response
* @throws ServletException
* if a servlet-specific error occurs
* @throws IOException
* if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
// List imageList = Arrays.asList(request.getParameter("button"));
//
// System.out.println(imageList);
//
// ArrayList <String> imageURLs = new
// ArrayList(Arrays.asList(imageList));
//
// System.out.println(imageURLs);
// ArrayList <String> imageURLs = new
// ArrayList(request.getParameter("button"));
// String postResponse = request.getParameter("button");
// ArrayList<Map> imageMap = new ArrayList<Map>();
// String[] urls1 = postResponse.split(",");
// ImageController.controlImage(urls1);
List<String> imageURLs = new ArrayList<String>();
try {
BufferedReader reader = request.getReader();
String line;
do {
line = reader.readLine();
if (line !=null){
imageURLs.add(line);
}
} while (line != null);
} catch (Exception e) {
}
;
try {
// int size = imageURLs.length();
// Our steps are:
// 1) Retrieve array of image srcs from our jsp via jquery and parse
// to string array.
// 2) Process the array in ImageController to create composite
// image, upload to local server
// and return local image url.
// 3) Transfer the image to imgur by sending our local image url to
// the imgur API.
// Retrieve the image's new imgur url in json string.
// 4) Parse the string so that we have just the url in json format.
// 5) Send this back to our jsp via jquery and print to screen.
ImageController imageController = new ImageController();
String filePath = imageController.controlImage((ArrayList<String>) imageURLs);
System.out.println(filePath);
// String generatedImageFilePath =
// ImageController.controlImage((ArrayList<String>) imageURLs);
// UploadController uploadController = new UploadController();
String imgurImageJson = UploadController.getImgurContent(filePath);
// response.setContentType("json");
response.setCharacterEncoding("UTF-8");
// response.getWriter().write("hello");
response.getWriter().write(new Gson().toJson(imgurImageJson));
// response.getWriter().write(new Gson().toJson(imgurImageJson));
// System.out.println(imgurImageJson);
//
// Scanner file = new Scanner("imgurImageJson.json");
// String imgurImageJsonSample = file.nextLine();
// file.close();
//
// JsonParser parser = new JsonParser();
// JsonObject obj = parser.parse(imgurImageJsonSample)
// .getAsJsonObject();
// String imgurl = obj.get("link").toString();
// System.out.println(imgurl);
// uploadedImageJson
// 1) retrieve array of urls
// 2) send to imagegenerationcontroller
// 3) send to uploadcontroller
// 4) retrieve and parse the json response to get the imgur url
// 5) response from here to user
} catch (Exception ex) {
Logger.getLogger(ImageGenerationServlet.class.getName()).log(
Level.SEVERE, null, ex);
}
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
【问题讨论】:
-
仅供参考,如果您的内容类型是
application/json,那么您不需要解析它,否则您应该解析它。同时使用浏览器开发工具检查服务器发送的响应 -
感谢您的回复。我在显示我的开发人员日志的图像中进行了编辑。我将我的代码(如图所示)更改为仅发出警报,但不会触发。
-
该图像显示 404 响应。你的 servlet 网址是什么?鉴于您的成功函数根本没有触发并看到 404 响应,您确定 Servlet 端没有发生错误吗?
-
请向我们展示来自开发者工具的网络选项卡的请求和响应,而不是控制台。
-
我想我找到了答案,我在 servlet 的 getPost 方法开始时调用了
processRequest(request, response);。生病继续工作,然后确认。非常感谢您的帮助 CERLIN 老板