【问题标题】:When I run java servlet to view JSON result -- it pops up file download instead of http://localhost:8080/当我运行 java servlet 来查看 JSON 结果时——它会弹出文件下载而不是 http://localhost:8080/
【发布时间】:2017-05-16 03:46:43
【问题描述】:

gif of file download pop up

我如何在浏览器中测试 JSON 字符串,而无需执行下载 json 文件的步骤,因为当我运行 servlet 时会弹出文件下载对话框,然后在浏览器中查看下载的 json 文件。

以下是邮递员的屏幕截图 - 邮递员返回 404

postman on localhost 8080

下面是映射的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

  <!-- General Description of the web application -->  

  <display-name>webData</display-name>
  <description>data managed in web data table grid</description>  

     <!-- For directory request -->

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

     <!-- Define servlets -->

  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>queryreturn</servlet-name>
    <servlet-class>com.queryData.Return.QueryReturn</servlet-class>  
  </servlet>

     <!-- Note: All <servlet> elements MUST be grouped together and
         placed IN FRONT of the <servlet-mapping> elements -->  

   <!-- Define servlet's URL mapping -->    

  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>queryreturn</servlet-name>
    <url-pattern>/queryreturn</url-pattern>
  </servlet-mapping>

  <context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>

  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>

  <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  </listener>

</web-app>

下面是成功生成JSON字符串但不会在浏览器中运行的bean

package com.queryData.Return;
//Import required java libraries
import java.io.*;
import java.util.List;
import javax.servlet.*;
import javax.servlet.http.*;
import org.json.JSONObject;
import com.queryData.main.Main;
// Extend HttpServlet class
public class QueryReturn extends HttpServlet 
{
    private static final long serialVersionUID = 1L;
    public void init() throws ServletException
      {
          // Do required initialization
      }
      public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
                throws ServletException, IOException
      {
          Main m = new Main();
          List<JSONObject> jObj = m.getJsonObject();
          StringBuilder sb = new StringBuilder();
          for(int i =0 ; i < jObj.size(); i++) 
          {
             sb.append(jObj.get(i).toString());
          }         
          String responseStr = "{\"data\":[" + sb + "]}";

          // Set response content type
          response.setContentType("application/json");
          // Actual logic goes here.
          PrintWriter out = response.getWriter();
          out.println(responseStr);

      }
      public void destroy()
      {
          // do nothing.
      }
}

【问题讨论】:

  • 邮递员图片和您的摘要引用了两个不同的 URL。哪个是正确的?
  • @nitind 邮递员是给 localhost 8080 的,在 servlet 上运行的 Eclipse 并没有去 localhost 8080,它会弹出一个 FILE DOWNLOAD,如果你看到 gif,你可以看到反应。
  • 你可以说服IE在浏览器中显示JSON。见stackoverflow.com/a/2492211

标签: java json eclipse tomcat postman


【解决方案1】:

我正在阅读您的问题和答案。我认为这种行为只是 IE 问题。请检查打开 Google Chrome、Mozilla、Opera 或其他的相同代码。你的代码很好。或者您可以将内容类型更改为“text/plain”并检查它。

您可以尝试使用 Spring 来制作健壮且可扩展的 REST 解决方案,Servlet 很好(用于简单的事情)。

我希望你能得到它。问候!

【讨论】:

  • 谢谢。 HttpServlet 是我使用的,我目前正在尝试决定学习和使用 Path (JAX-RS) 或 RequestMapping (Spring)。
  • 伟大的 Jon,祝你在 Servlets 上取得成功。
  • 谢谢你,我剩下的问题是从头开始,如何在我的网格中加载数据 - 如果你有时间,请查看我的下一篇文章 [link]stackoverflow.com/questions/41426096/…
【解决方案2】:

找到了!解决方案分为两部分,首先,您删除

response.setContentType("application/json;charset=UTF-8");

来自 servlet,它运行 PERFECT 并在 Eclipse 中显示。 其次,网址不正确,我找到了这篇令人难以置信的文章 - 必读 - 新加坡南洋理工大学

article regarding the absolute URL for this servlet INCLUDES the Project name

就是这样, (1) 去掉 setContentType 和 (2) 使用带有项目名称的绝对 URL

http://localhost:8080/webData/queryreturn

【讨论】:

    【解决方案3】:

    postman 报错的原因是 uri 不正确。看起来您错过了应用程序名称。请试试这个“http://localhost:8080/webData/queryreturn

    “下载”问题的原因可能是由于内容类型不正确。请检查您在实际代码中使用的类型是否正确。在这里,看起来不错。

    【讨论】:

    • 是的,你是对的,我在新加坡的一个网站上通过大量 google search-a-thon 找到了解决方案,谢谢。
    【解决方案4】:

    您可以在 Chrome、Firebox 和 Safari 中使用 Advanced Rest Client 插件 https://github.com/wiztools/rest-client, https://insomnia.rest/ 用于 Windows

    【讨论】:

    • GetPostman 效果很好,现在我有了带有项目名称的绝对 URL。谢谢。
    【解决方案5】:

    Internet Explorer 将“application/json”作为文本文件处理。您的代码没有问题,只是由于您的浏览器而令人讨厌。

    这可能会有所帮助:What problems may using the MIME type application/json cause?

    【讨论】:

    • 是的,你是对的。我只需要删除 setContentType。我在新加坡的一个网站上通过大量的谷歌搜索发现了这一点。
    • 请保留application/json 内容类型。由于内容类型不匹配(JSON 返回为 text/html),其他浏览器(如 Firefox 和 Chrome)会阻止脚本解析它。
    • 不...它在 Firefox、Chrome 和 Internet Explorer 以及 Eclipse 内部浏览器中运行相同
    • 您是正确的,它们返回相同。对我来说,我必须确保内容类型与我返回的内容相匹配,因为我的系统管理员按照 OWASP (link) 的建议添加了一个 X-Content-Type-Options=nosniff (related question) 安全标头。
    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 2015-11-12
    • 1970-01-01
    • 2023-03-19
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多