Servlet 如何给前端响应 Json 数据?

这是我原先的代码

js代码

$.get('http://localhost:8080/raxly-original/page?id=1', function(res) {
    console.log(res);
})

Servlet 代码

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setHeader("Access-Control-Allow-Origin", "*");
    String id = request.getParameter("id");
    if (id != null) {
        Page resultPage = pageService.getById(Integer.valueOf(id));
        PrintWriter writer = response.getWriter();
        writer.print(resultPage); // print一个普通实体, 前端接收后是一串字符串
        writer.flush();
        writer.close();
    }
}

image.png

然后自己改良了一下, 就是在前端手动把String转成json, 代码如下

$.get('http://localhost:8080/raxly-original/page?id=1', function(res) {
    console.log(JSON.parse(res));
})
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setHeader("Access-Control-Allow-Origin", "*");
    String id = request.getParameter("id");
    String responseContent = null;
    if (id != null) {
        Page resultPage = pageService.getById(Integer.valueOf(id));
        // { "pageId":"%s", "pageName":"%s" }
        responseContent = String.format("{ \"pageId\":\"%s\", \"pageName\":\"%s\" }", resultPage.getPageId(), resultPage.getPageName());

        PrintWriter writer = response.getWriter();
        writer.print(responseContent);
        writer.flush();
        writer.close();
    }
}

image.png

有没有更优的方案?
可以实现后端直接传对象, 前端自动解析成json的?

阅读 2.5k
4 个回答

用jackson, Gson, fastjson等, 把对象转成json字符串, 写到输出 流, 再加个header content-type: application/json 就行.

别听那些说什么用spring的. 用spring当然 好. 但你要求用servlet, 就是答非所问.

更优方案是上springmvc,@ResponseBody @RequestBody全搞定
建议一步到位spring-boot

servelt+jquery,你说现在是2012年我都信……

这个问题提的不好

可能只是一个小小的功能, 需要成千上万的代码

  1. Spring框架集成了Jackson
  2. Content-Type: application/json 需要设置响应头为application/json

最终结论还是使用框架实现

用Controller
单纯依靠Servlet可能实现不了前后端分离的项目, 除非自己写定义注解, 没有必要

得到resultPage对象后,这样输出下,下面用的是hutool的json工具包

response.setContentType("text/json;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String str =JSONUtil.toJsonStr(resultPage);
out.println(str);
out.flush();
out.close();
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏