如何在浏览器而不是控制台中显示 servlet 提供的信息?

Posted

技术标签:

【中文标题】如何在浏览器而不是控制台中显示 servlet 提供的信息?【英文标题】:How to show information given by the servlet in the browser instead of the console? 【发布时间】:2020-12-17 19:50:25 【问题描述】:

我在 Eclipse 中创建了一个 servlet,并在 Tomcat 服务器上运行它。 servlet 正在使用用户名和 apitoken 从 API 获取一些数据。

我创建了一个文件,即 index.jsp。它有一个导航栏和几个按钮。

现在我在我的 index.jsp 中单击一个按钮时调用 servlet。单击按钮后,控制台会显示 JSON 数据,而在 Tomcat 上运行的浏览器上什么也没有。

理想情况下,我希望浏览器在浏览器上显示 JSON 数据。有人能帮我写一些代码吗?

这是我在 index.jsp 中调用服务器的按钮:

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
      function callServlet() 
          document.forms[0].action = "testing";
          document.forms[0].submit();
      
  </script>
</head>

<body>
..
.
.
<form id="WhatsNewFormID" name="WhatsNewForm" method="post">
  <div id="WhatsNewBtn"><input id="btn" type="submit" value="Hello World" style="float:right" class="w3-button w3-bar-item" onclick="callServlet();" /></div>
  </form>
  .
  .
  
 </body>

这是我的 servlet 的一部分:

String theUrl="TheURLForTheApiZZZ";
          URL url = new URL(theUrl);

// 创建一个 urlconnection 对象 URLConnection urlConnection = url.openConnection();

 String userpass = "usernameXXX" + ":" + "apitokenYYY; 
              String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());
              urlConnection.setRequestProperty ("Authorization", basicAuth);
             
          
          // wrap the urlconnection in a bufferedreader
          BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));

          String line;

          // read from the urlconnection via the bufferedreader
          while ((line = bufferedReader.readLine()) != null)
          
            content.append(line + "\n");
          
          bufferedReader.close();
        
        catch(Exception e)
        
          e.printStackTrace();
        
        
     output= content.toString();
     System.out.println(output);

【问题讨论】:

【参考方案1】:

您错过了将内容写入负责将内容发送到浏览器的响应对象 (HttpServletResponse response)。在 System.out.println(output) 行之前,将以下代码放入您的 servlet:

response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.write(output);

如果您不想在控制台上显示内容,只需删除 System.out.println(output); 这一行即可

【讨论】:

谢谢。通过仅添加您的代码,它表示未创建“响应”。然后我通过编写创建“响应”对象 - HttpServletResponse response;在你提到的 4 行之前。它现在说响应未初始化,并要求我将其初始化为空。一旦我将它初始化为 null - 它会给我一个“java.lang.NullPointerException”。然后,我只需通过编写来扩展我的类 -> public class Testing extends HttpServletResponseWrapper implements Servlet .... 。在此之后,它会自动创建一个构造函数 -> public Testing(HttpServletResponse response) super(response); ...(contd.) 即使在这之后,它给了我一个 NullPointerException。你能看出问题所在吗? 只是补充一下 - 我在公共 void 服务中执行所有这些(ServletRequest arg0,ServletResponse arg1) throws ServletException, IOException ................ ... @stuti - 在public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException ...内完成所有这些工作 您好,感谢您的帮助。它不适用于确切的代码。我最终所做的是从 servlet 返回响应并将 JSON 附加到我的 JS 和 CSS 容器中。但是,我认为 doGet 也可以!再次感谢。

以上是关于如何在浏览器而不是控制台中显示 servlet 提供的信息?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置servlet中并发请求数的限制?

从 mongodb 获取的数据显示在控制台而不是浏览器中 [重复]

java之servlet之文件下载

控制Ktor 0.9.0 servlet中的cookie生命周期

如何在项目中间使用显示视图控制器而不是初始视图控制器

如何在调用 servlet 后使用 ajax 在 iframe 中显示 PDF