Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Web服务器将使用JSON进行响应_Java_Json_Http_Servlets - Fatal编程技术网

Java Web服务器将使用JSON进行响应

Java Web服务器将使用JSON进行响应,java,json,http,servlets,Java,Json,Http,Servlets,我正在尝试创建一个简单的JavaWeb应用程序,它使用JSON字符串响应GET请求to/test 我的环境是Java、Intellij和Tomcat8.5.4 到目前为止,我已经上了3节课: CSV-用于CSV到JSON的转换 CleanUp-实际转换数据的类 Servlet—响应GET请求的类 我的Servlet类: import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import

我正在尝试创建一个简单的JavaWeb应用程序,它使用JSON字符串响应GET请求to/test

我的环境是Java、Intellij和Tomcat8.5.4

到目前为止,我已经上了3节课:

CSV-用于CSV到JSON的转换 CleanUp-实际转换数据的类 Servlet—响应GET请求的类 我的Servlet类:

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 java.io.IOException;


@WebServlet(name = "Servlet")
public class Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("GET request received");
    CleanUp cleanup = new CleanUp();
    cleanup.cleanupData();

    // Logic needed here to send the data to client

    }
}
CleanUp类当前将结果数据发送到控制台,如:

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.writeValue(System.out, list);

我是个新手,甚至不确定我想要的东西是否可以作为javax.http.servlet的一部分来完成,还是需要另一个依赖项?

答案是首先将输出数据存储在字符串对象中

outputData = mapper.writeValueAsString(list);
然后在servlet中:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("Get Response");
    ConvertCSV cleanup = new ConvertCSV();
    String outputData = cleanup.cleanupData();
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println(outputData);
    out.close();
}

您的解决方案无疑适合您,但将来您可能需要按如下方式更新它:

public class Cleanup {
  ...

  public void cleanupData(Writer output) {
     ObjectMapper mapper = new ObjectMapper();
     mapper.enable(SerializationFeature.INDENT_OUTPUT);
     mapper.writeValue(output, list);
  } 

  ...
}

正确设置内容类型将使Javascript更容易处理响应,而不会被浏览器弄乱,因为您告诉它它的HTML


其次,将JSON直接写入响应将提高servlet的可伸缩性,因为它消除了在字符串变量中创建的JSON副本。如果您的JSON很短,这不会有多大区别,但是想象一下CleanUpdatea是否正在生成大量输出,例如当列表包含1000个条目时。

因此您收到了需要响应的GET请求。您需要决定要发送回客户端的内容类型。数据可以写入Response.getOutputStream。如果它是文本或html,那么您不需要其他库。它是JSON,所以我可以将其视为纯文本?在doPost中,添加Response.getOutPutStreammapper.writeValueSystem.out,list;,是否与添加Response.getOutPutStreammapper.writeValueSystem.out一样简单?是的,如果将JSON对象转换为字符串,则可以写入响应。如果您不关心发布的内容,doPost可以调用doGet。但是system.out是否正确?我不再需要发送到控制台。您可以使用System.out将内容写入控制台…可能用于记录或调试信息。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("Get Response");
    response.setContentType("application/json");
    ConvertCSV cleanup = new ConvertCSV();
    String outputData = cleanup.cleanupData(response.getWriter());
    ...