【问题标题】:Generate an HTML Response in a Java Servlet在 Java Servlet 中生成 HTML 响应
【发布时间】:2011-01-23 04:18:24
【问题描述】:

如何在 Java servlet 中生成 HTML 响应?

【问题讨论】:

    标签: html servlets


    【解决方案1】:

    您通常将请求转发到 JSP 以进行显示。 JSP 是一种视图技术,它提供了一个模板来编写普通的 HTML/CSS/JS,并提供了在 taglibs 和 EL 的帮助下与后端 Java 代码/变量交互的能力。您可以使用 JSTL 之类的标签库来控制页面流。您可以在任何请求、会话或应用程序范围内将任何后端数据设置为属性,并在 JSP 中使用 EL(${} 事物)来访问/显示它们。您可以将 JSP 文件放在 /WEB-INF 文件夹中,以防止用户在不调用预处理 servlet 的情况下直接访问它们。

    启动示例:

    @WebServlet("/hello")
    public class HelloWorldServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String message = "Hello World";
            request.setAttribute("message", message); // This will be available as ${message}
            request.getRequestDispatcher("/WEB-INF/hello.jsp").forward(request, response);
        }
    
    }
    

    /WEB-INF/hello.jsp 看起来像:

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <title>SO question 2370960</title>
        </head>
        <body>
             <p>Message: ${message}</p>
        </body>
    </html>
    

    打开 http://localhost:8080/contextpath/hello 时会显示

    消息:Hello World

    在浏览器中。

    这使 Java 代码免于 HTML 混乱,并大大提高了可维护性。要学习和练习更多关于 servlet 的知识,请继续访问以下链接。

    也可以浏览the "Frequent" tab of all questions tagged [servlets] 查找常见问题。

    【讨论】:

    • 这仍然是一种有效的方法吗?我总是听到我们的首席架构师说根本不要使用 JSP,但后来我问自己应该如何创建所有 HTML?以编程方式一个一个地创建每个元素?这可能需要很长时间。
    • @Timo:要么你误解了你的架构师,要么你的架构师需要阅读 stackoverflow.com/questions/3177733/…stackoverflow.com/questions/2095397/…stackoverflow.com/tags/servlets/info 如果仍然不相信,解雇自己并寻找另一个项目。
    • 我必须删除字符串中的 /WEB-INF/ 才能使其正常工作。 +1
    • @BjörnHallström:如果您没有按照示例中的说明实际将 JSP 放置在 /WEB-INF 文件夹中,则可能会发生这种情况。这样,最终用户将能够直接打开 JSP,而无需调用 servlet,只需在浏览器的地址栏中输入 JSP 的 URL。这是你想要允许的吗?
    【解决方案2】:

    你需要有一个 doGet 方法:

    public void doGet(HttpServletRequest request,
            HttpServletResponse response)
    throws IOException, ServletException
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
    
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hola</title>");
        out.println("</head>");
        out.println("<body bgcolor=\"white\">");
        out.println("</body>");
        out.println("</html>");
    }
    

    您可以看到this 链接以获得一个简单的 hello world servlet

    【讨论】:

    • 不建议以这种方式从 servlet 生成 HTML。这是 1998 年的一句老话。更好的解决方案是使用 JSP。
    • 或者使用一些框架/工具,如 dojo、GWT 等,并将客户端 html 与服务器端代码完全分开。
    • @duffymo:但有时,在某些情况下,我想从 Servlet 生成持续的进度 html 响应。并非所有东西都适合 MVC。
    • @duffymo:我确实有一个实际案例。我有一个旧的 servlet,它计算了许多数据源中每个数据源的数量,直到今天。它使用 wget 运行。所以为了让 wget 捕获它的输出。我需要直接生成html。(注意:这是一个老程序,没有人会费力地重写它。
    • “旧程序” - 完全正确。人们过去常常在其中编写带有 scriptlet 的 JSP,但是一旦他们知道这些 JSP 是多么不可读和不可维护,他们就不会继续这样做了。
    【解决方案3】:

    除了直接在从响应中获取的 PrintWriter 上写入 HTML(这是从 Servlet 输出 HTML 的标准方式),您还可以使用 RequestDispatcher 将 HTML 片段包含在外部文件中:

    public void doGet(HttpServletRequest request,
           HttpServletResponse response)
           throws IOException, ServletException {
       response.setContentType("text/html");
       PrintWriter out = response.getWriter();
       out.println("HTML from an external file:");     
       request.getRequestDispatcher("/pathToFile/fragment.html")
              .include(request, response); 
       out.close();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多