Bootstrap

【Java教程】Day21-07 Web开发:使用JSP简化HTML输出

1. 课程目标

在本篇教程中,我们将学习如何通过JSP(Java Server Pages)来简化HTML输出。通过这个教程,你将了解JSP与Servlet的关系、基本语法以及如何利用JSP实现动态网页内容的生成。

2. 前言

在前面的章节中,我们学习了如何使用Servlet来处理HTTP请求,并通过PrintWriter输出HTML内容。虽然通过Servlet输出HTML是可行的,但直接通过PrintWriter输出HTML会非常繁琐,尤其是当页面内容比较复杂时,直接编写HTML代码会显得比较难管理。因此,为了更高效地生成动态HTML,JSP应运而生。

3. JSP简介

JSP(Java Server Pages)是Java平台提供的一个Web开发技术,它允许开发者在HTML页面中嵌入Java代码,以实现动态网页内容的输出。与Servlet不同的是,JSP页面直接包含HTML内容,而Java代码通过特定的标记嵌入其中。

3.1 创建第一个JSP页面

让我们通过编写一个简单的JSP文件来展示如何使用JSP生成动态HTML页面。

在你的项目的/src/main/webapp目录下创建一个文件hello.jsp,内容如下:

html<html><head>    <title>Hello World - JSP</title></head><body>    <%-- JSP Comment --%>    <h1>Hello World!</h1>    <p>        <%            out.println("Your IP address is ");        %>        <span style="color:red">            <%= request.getRemoteAddr() %>        </span>    </p></body></html>

 

在这个示例中:

  • <%-- ... --%> 是JSP注释,这些内容不会被浏览器渲染。

  • <% ... %> 包含Java代码,可以执行任意Java操作。

  • <%= ... %> 用于输出Java表达式的结果。

3.2 访问JSP页面

你可以通过浏览器访问JSP页面,例如 http://localhost:8080/hello.jsp。在浏览器中,你将看到一个带有用户IP地址的欢迎页面。

4. JSP与Servlet的关系

很多开发者可能会问,JSP与Servlet到底有什么区别呢?实际上,JSP本质上是一个Servlet,只不过在执行之前,JSP会被自动转换成Servlet。

4.1 JSP编译成Servlet

当JSP页面被请求时,Web容器(如Tomcat)会将JSP文件转换为一个Servlet。例如,hello.jsp会被转换成名为hello_jsp.java的Servlet类。这个Servlet类在运行时会输出动态生成的HTML。

你可以在Tomcat的work目录中找到这个生成的Java文件,里面包含了类似下面的内容:

javapackage org.apache.jsp;import ...;public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase {    public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) {        out.write("<html>");        out.write("<body>");        out.write("<h1>Hello World!</h1>");        ...    }}

 

从中可以看到,JSP转换成Servlet后,内容通过out.write()输出HTML。

4.2 自动编译与刷新

当JSP文件修改时,Web容器会自动重新编译生成Servlet,确保我们能看到最新的页面内容。因此,JSP的一个优点就是可以实时编辑而无需手动编译。

5. JSP的高级功能

JSP除了提供基本的动态输出功能外,还有一些高级功能,可以帮助开发者更灵活地使用Java类、引入其他JSP文件等。

5.1 引入Java类

你可以在JSP中使用<%@ page import="..." %>指令引入Java类,允许你在后续的Java代码中直接使用这些类。

例如:

jsp<%@ page import="java.util.Date" %><html><body>    <h1>Current Date: <%= new Date() %></h1></body></html>

 

5.2 包含其他JSP文件

通过<%@ include file="..." %>指令,你可以将多个JSP文件合并在一起。这对于重复的页面组件(如页眉和页脚)非常有用。

例如:

jsp<html><body>    <%@ include file="header.jsp" %>    <h1>Main Content</h1>    <%@ include file="footer.jsp" %></body></html>

 

5.3 使用JSP Tag

JSP还支持自定义标签(JSP Tags)。例如,你可以使用JSP标准标签库(JSTL)来简化代码,提升页面的可维护性。一个常见的例子是输出一个会话属性:

jsp<c:out value="${sessionScope.user.name}" />

 

注意:使用JSP Tag需要引入对应的taglib的jar包,并进行声明。

6. 实践练习

通过练习来加深对JSP的理解:

1. 创建一个date.jsp文件,输出当前的日期和时间。

jsp<html><body>    <h1>Current Date and Time: <%= new java.util.Date() %></h1></body></html>

2. 在浏览器中访问该页面,确认它是否正确输出当前日期和时间。

7. 小结

在本篇教程中,我们学习了如何使用JSP来简化HTML的动态输出。JSP使得开发者可以直接在HTML页面中嵌入Java代码,而不需要手动拼接HTML和Java。JSP本质上就是一种特殊类型的Servlet,它通过转换为Servlet并动态生成页面内容,提供了更简洁的编程模型。

要点总结

  • JSP页面本质上是Servlet,但JSP更易于开发和维护。

  • 通过JSP注释、Java代码和输出表达式,你可以灵活地控制页面内容。

  • JSP的高级功能如importinclude和JSP Tags可以帮助开发者更高效地开发Web应用。

 

JSP虽然已不如一些现代模板引擎那样流行,但它的基本用法仍然是理解和开发Java Web应用的重要技能。

 

 

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;