在 Java Servlet 中生成 HTML 响应

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 的知识,请继续访问以下链接。

Our Servlets wiki page How do servlets work? Instantiation, sessions, shared variables and multithreading doGet and doPost in Servlets Calling a servlet from JSP file on page load How to transfer data from JSP to servlet when submitting HTML form Show JDBC ResultSet in HTML in JSP page using MVC and DAO pattern How to use Servlets and Ajax? Servlet returns "HTTP Status 404 The requested resource (/servlet) is not available"

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

【讨论】:

这仍然是一种有效的方法吗?我总是听到我们的首席架构师说根本不要使用 JSP,但后来我问自己应该如何创建所有 HTML?以编程方式一个一个地创建每个元素?这可能需要很长时间。 @Timo:要么你误解了你的架构师,要么你的架构师需要阅读 ***.com/questions/3177733/…、***.com/questions/2095397/… 和 ***.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();

【讨论】:

以上是关于在 Java Servlet 中生成 HTML 响应的主要内容,如果未能解决你的问题,请参考以下文章

如何在JSP网页中生成动态图表

JAVA中生成菜单树结构常用方法总结

Java 之 Response 发送验证码案例

如何在 OSGi 中使用 servlet

什么是FreeMarker

从数据库中生成XML文件