写在前面
前面几篇文章基本学习了Java Servlet的基本用法,但是Servlet有两个缺点是无法克服的: 首先, 写在Servlet中的所有HTML标签必须包含Java字符串, 这使得处理HTTP响应报文的工作十分烦琐; 第二, 所有的文本和HTML标记是硬编码,导致即使是表现层的微小变化, 如改变背景颜色, 也需要重新编译。
因此可以通过JSP来弥补Java Servlet的缺点,现代的Java Web应用会同时使用Servlet和JSP页面。
JSP概述
JSP页面本质上是一个Servlet。 然而, 用JSP页面开发比使用Servlet更容易, 主要有两个原因。 首先, 不必编译JSP页面; 其次, JSP页面是一个以.jsp为扩展名的文本文件, 可以使用任何文本编辑器来编写它们。
JSP页面在JSP容器中运行, 一个Servlet容器通常也是JSP容器。 例如, Tomcat就是一个Servlet/JSP容器。
当一个JSP页面第一次被请求时, Servlet/JSP容器主要做以下两件事情:
- 转换JSP页面到JSP页面实现类, 该实现类是一个实现javax.servlet.jsp.JspPage接口或子接口javax.servlet.jsp.HttpJspPage的Java类。 JspPage是javax.servlet.Servlet的子接口, 这使得每一个JSP页面都是一个Servlet。 该实现类的类名由Servlet/JSP容器生成。 如果出现转换错误, 则相关错误信息将被发送到客户端。
- 如果转换成功, Servlet/JSP容器随后编译该Servlet类, 并装载和实例化该类, 像其他正常的Servlet一样执行生命周期操作。
对于同一个JSP页面的后续请求, Servlet/JSP容器会先检查JSP页面是否被修改过。 如果是, 则该JSP页面会被重新翻译、 编译并执行。 如果不是, 则执行已经在内存中的JSP Servlet。 这样一来, 一个JSP页面的第一次调用的实际花费总比后来的花费多, 因为它涉及翻译和编译。 为了解决这个问题, 可以执行下列动作之一:
- 配置应用程序, 使所有的JSP页面在应用程序启动时被调用(实际上也可视为翻译和编译) , 而不是在第一次请求时调用。
- 预编译JSP页面, 并将其部署为Servlet。
JSP API
JSP自带的API包含4个包:
- javax.servlet.jsp。 包含用于Servlet/JSP容器将JSP页面翻译为Servlet的核心类和接口。 其中的两个重要成员是JspPage和HttpJspPage接口。 所有的JSP页面实现类必须实现JspPage或HttpJspPage接口。 在HTTP环境下, 实现HttpJspPage接口是显而易见的选择。
- javax.servlet.jsp.tagext。 包括用于开发自定义标签的类型。
- javax.el。 提供了统一表达式语言的API。
- javax.servlet.jsp.el。 提供了一组必须由Servlet/JSP容器支持, 以便在JSP页面中使用表达式语言的类。
可以在以下网址查看JSP API:Package javax.servlet.jsp。
两个简单的JSP页面
JSP-Welcome页面:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Welcome Page</title>
</head>
<body>
Welcome
</body>
</html>
与前面的Servlet类似,也可以使用URL对JSP进行调用:
http://localhost:8080/app01a/Welcome.jsp
效果图如下所示:
JSP-显示当前时间页面,代码如下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Welcome Page</title>
</head>
<body>
Welcome
</body>
</html>
使用URL对该JSP进行调用:
http://localhost:8080/app01a/todayDate.jsp
效果图如下所示:
当然这个页面目前不能动态显示实时时间,只能显示当前调用JSP的时候的时间。这个就需要后面继续的学习了。
写在最后
这一篇博客主要帮助我重新认识了JSP,他也是一种和Servlet容器,在实际的JavaWeb应用开发中,二者应该结合起来使用(虽然不知道现在还用不用这种东西了)。还需要继续的学习。