Jsp学习指南

JSP 系统学习指南


一、JSP 是什么?

JSP(JavaServer Pages) 是一种动态网页技术,允许在 HTML 中嵌入 Java 代码,用于生成动态内容。JSP 本质上是 Servlet 的扩展,最终会被 Web 容器(如 Tomcat)编译为 Servlet 执行。


二、JSP 的核心作用

  1. 分离动态逻辑与静态页面:在 HTML 中嵌入 Java 代码,简化动态内容开发。
  2. 快速构建视图层:与 Servlet 配合实现 MVC 模式(JSP 作为视图)。
  3. 支持标签库:通过 EL 表达式、JSTL 标签减少 Java 代码嵌入。

三、JSP 与 Servlet 的关系

特性 JSP Servlet
定位 视图层(View) 控制层(Controller)
语法 基于 HTML + Java 标签 纯 Java 代码
开发效率 快速编写页面 更适合处理复杂逻辑
本质 最终被编译为 Servlet 直接继承 HttpServlet

四、JSP 的生命周期

  1. 转换阶段:JSP 文件被转换为 .java 文件(Servlet 源码)。
  2. 编译阶段:编译为 .class 字节码文件。
  3. 初始化:调用 jspInit() 方法(仅一次)。
  4. 执行阶段:调用 _jspService() 方法处理请求。
  5. 销毁阶段:调用 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>
2. 格式化标签库(Formatting)
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 模式中的应用

  1. Model(模型):JavaBean 或 Service 类,处理数据和业务逻辑。
  2. View(视图):JSP 负责展示数据,使用 EL 和 JSTL。
  3. Controller(控制器):Servlet 接收请求,调用 Model,转发到 JSP。

示例代码

1
2
3
4
5
6
// Servlet(Controller)
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 仍在使用,但现代开发更倾向于以下技术:

  1. 模板引擎:Thymeleaf、Freemarker(语法更简洁,与 HTML 兼容性更好)。
  2. 前后端分离:Vue.js、React + RESTful API(彻底分离前端与后端)。

十一、常见问题与调试技巧

  1. 中文乱码

    • 在 JSP 顶部设置 <%@ page contentType="text/html;charset=UTF-8" %>
    • 确保 Tomcat 的 server.xml<Connector> 配置了 URIEncoding="UTF-8"
  2. JSP 未编译

    • 检查 Tomcat 的 work 目录,确认 JSP 是否已生成对应的 .java.class 文件。
  3. EL 表达式不生效

    • 确保 JSP 版本支持 EL(在 web.xml 中设置 <el-ignored>false</el-ignored>)。

十二、学习资源推荐

  1. 书籍
    • 《Head First Servlets and JSP》
    • 《Java Web 开发详解》
  2. 文档
  3. 实战项目
    • 博客系统(文章发布、评论展示)
    • 电商商品列表页(分页、排序、过滤)

总结

JSP 是 JavaWeb 开发中构建动态页面的核心技术,通过掌握其语法、内置对象、EL 表达式和 JSTL 标签库,可以高效实现视图层开发。结合 Servlet 和 MVC 模式,能够构建结构清晰、易于维护的 Web 应用。建议通过实际项目练习,逐步过渡到现代模板引擎或前后端分离架构。