JSP 系统学习指南
一、JSP 是什么?
JSP(JavaServer Pages) 是一种动态网页技术,允许在 HTML 中嵌入 Java 代码,用于生成动态内容。JSP 本质上是 Servlet 的扩展,最终会被 Web 容器(如 Tomcat)编译为 Servlet 执行。
二、JSP 的核心作用
- 分离动态逻辑与静态页面:在 HTML 中嵌入 Java 代码,简化动态内容开发。
- 快速构建视图层:与 Servlet 配合实现 MVC 模式(JSP 作为视图)。
- 支持标签库:通过 EL 表达式、JSTL 标签减少 Java 代码嵌入。
三、JSP 与 Servlet 的关系
特性 |
JSP |
Servlet |
定位 |
视图层(View) |
控制层(Controller) |
语法 |
基于 HTML + Java 标签 |
纯 Java 代码 |
开发效率 |
快速编写页面 |
更适合处理复杂逻辑 |
本质 |
最终被编译为 Servlet |
直接继承 HttpServlet 类 |
四、JSP 的生命周期
- 转换阶段:JSP 文件被转换为
.java
文件(Servlet 源码)。
- 编译阶段:编译为
.class
字节码文件。
- 初始化:调用
jspInit()
方法(仅一次)。
- 执行阶段:调用
_jspService()
方法处理请求。
- 销毁阶段:调用
jspDestroy()
方法释放资源。
五、JSP 的核心语法
1. JSP 脚本元素
语法 |
说明 |
示例 |
<% ... %> |
嵌入 Java 代码片段 |
<% int count = 0; %> |
<%= ... %> |
输出表达式结果(自动转义 HTML) |
<%= "Hello, " + name %> |
<%! ... %> |
声明 成员变量或方法 |
<%! private String title = "JSP"; %> |
2. JSP 指令
指令 |
说明 |
示例 |
<%@ page ... %> |
定义页面属性(编码、错误页等) |
<%@ page contentType="text/html;charset=UTF-8" %> |
<%@ include ... %> |
静态包含其他文件(如页眉、页脚) |
<%@ include file="header.jsp" %> |
<%@ taglib ... %> |
引入标签库(如 JSTL) |
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> |
3. JSP 动作标签
标签 |
说明 |
示例 |
<jsp:include> |
动态包含其他页面 |
<jsp:include page="footer.jsp"/> |
<jsp:useBean> |
创建或获取 JavaBean |
<jsp:useBean id="user" class="com.example.User" scope="session"/> |
<jsp:setProperty> |
设置 JavaBean 属性 |
<jsp:setProperty name="user" property="name" value="Alice"/> |
<jsp:forward> |
请求转发到其他页面 |
<jsp:forward page="result.jsp"/> |
六、JSP 内置对象
JSP 预定义了 9 个可直接使用的对象(无需声明):
对象名 |
类型 |
作用 |
request |
HttpServletRequest |
封装客户端请求信息 |
response |
HttpServletResponse |
封装服务器响应操作 |
session |
HttpSession |
存储用户会话数据 |
application |
ServletContext |
存储全局共享数据 |
out |
JspWriter |
输出内容到页面(类似 PrintWriter ) |
pageContext |
PageContext |
获取其他内置对象,管理页面作用域 |
page |
Object |
当前 Servlet 实例(极少使用) |
config |
ServletConfig |
获取 Servlet 配置信息 |
exception |
Throwable |
仅在错误页中可用,捕获异常信息 |
七、EL 表达式(Expression Language)
简化 JSP 中的数据访问,语法为 ${expression}
。
1. 访问作用域属性
1 2 3 4
| ${requestScope.user.name} <!-- 从 request 作用域获取 --> ${sessionScope.cart.total} <!-- 从 session 作用域获取 --> ${applicationScope.appName} <!-- 从 application 作用域获取 --> ${user.age} <!-- 自动从 page → request → session → application 查找 -->
|
2. 运算符与内置对象
1 2 3 4
| ${empty userList} <!-- 判断集合是否为空 --> ${10 + 5} <!-- 算术运算 --> ${param.username} <!-- 获取请求参数(等价于 request.getParameter("username") --> ${header["User-Agent"]} <!-- 获取请求头 -->
|
八、JSTL 标签库(JavaServer Pages Standard Tag Library)
通过标签库替代 Java 代码,提升可维护性。
1. 核心标签库(Core)
1 2 3 4 5 6 7 8 9 10 11
| <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 条件判断 --> <c:if test="${user.vip}"> <p>尊贵的 VIP 用户!</p> </c:if>
<!-- 循环遍历 --> <c:forEach items="${userList}" var="user" varStatus="status"> <p>${status.index + 1}. ${user.name}</p> </c:forEach>
|
1 2 3 4 5 6 7
| <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!-- 格式化日期 --> <fmt:formatDate value="${order.date}" pattern="yyyy-MM-dd HH:mm"/>
<!-- 格式化数字 --> <fmt:formatNumber value="${product.price}" type="currency"/>
|
九、JSP 在 MVC 模式中的应用
- Model(模型):JavaBean 或 Service 类,处理数据和业务逻辑。
- View(视图):JSP 负责展示数据,使用 EL 和 JSTL。
- Controller(控制器):Servlet 接收请求,调用 Model,转发到 JSP。
示例代码:
1 2 3 4 5 6
| protected void doGet(HttpServletRequest request, HttpServletResponse response) { List<Product> products = productService.getAllProducts(); request.setAttribute("products", products); request.getRequestDispatcher("/product-list.jsp").forward(request, response); }
|
1 2 3 4 5 6 7
| <!-- JSP(View) --> <c:forEach items="${products}" var="product"> <div class="product"> <h3>${product.name}</h3> <p>价格:<fmt:formatNumber value="${product.price}" type="currency"/></p> </div> </c:forEach>
|
十、JSP 的现代替代方案
尽管 JSP 仍在使用,但现代开发更倾向于以下技术:
- 模板引擎:Thymeleaf、Freemarker(语法更简洁,与 HTML 兼容性更好)。
- 前后端分离:Vue.js、React + RESTful API(彻底分离前端与后端)。
十一、常见问题与调试技巧
中文乱码:
- 在 JSP 顶部设置
<%@ page contentType="text/html;charset=UTF-8" %>
。
- 确保 Tomcat 的
server.xml
中 <Connector>
配置了 URIEncoding="UTF-8"
。
JSP 未编译:
- 检查 Tomcat 的
work
目录,确认 JSP 是否已生成对应的 .java
和 .class
文件。
EL 表达式不生效:
- 确保 JSP 版本支持 EL(在
web.xml
中设置 <el-ignored>false</el-ignored>
)。
十二、学习资源推荐
- 书籍:
- 《Head First Servlets and JSP》
- 《Java Web 开发详解》
- 文档:
- 实战项目:
- 博客系统(文章发布、评论展示)
- 电商商品列表页(分页、排序、过滤)
总结
JSP 是 JavaWeb 开发中构建动态页面的核心技术,通过掌握其语法、内置对象、EL 表达式和 JSTL 标签库,可以高效实现视图层开发。结合 Servlet 和 MVC 模式,能够构建结构清晰、易于维护的 Web 应用。建议通过实际项目练习,逐步过渡到现代模板引擎或前后端分离架构。