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文件,里面包含了类似下面的内容:
java
package 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的高级功能如
import
、include
和JSP Tags可以帮助开发者更高效地开发Web应用。
JSP虽然已不如一些现代模板引擎那样流行,但它的基本用法仍然是理解和开发Java Web应用的重要技能。