JSP

JSP 快速入门

JSP Quick Start

Posted by Marlin on November 3, 2025

JSP 技术详解:JavaWeb 开发的核心组件

一、JSP 是什么?

JSP 是 Sun Microsystems(现 Oracle)开发的一种动态网页技术标准,它允许开发者在 HTML 页面中嵌入 Java 代码,实现动态内容生成。JSP 本质上是 Servlet 的高级抽象,最终会被 Web 容器(如 Tomcat)编译成 Servlet 执行。

核心特点

  • “HTML 为主,Java 为辅”:在熟悉的 HTML 结构中嵌入 Java 代码
  • 一次编写,到处运行:继承 Java 的跨平台特性
  • 组件重用:通过 JavaBean 和自定义标签实现代码复用
  • 分离关注点:配合 MVC 架构实现业务逻辑与表现层分离

二、JSP 的工作原理

JSP 的执行过程分为三个阶段:

  1. 翻译阶段(Translation)
    • 首次请求时,Web 容器将 JSP 文件转换为 Java 源代码(Servlet)
    • 例如:index.jspindex_jsp.java
  2. 编译阶段(Compilation)
    • 将生成的 Java 源代码编译成字节码文件(.class)
    • 例如:index_jsp.javaindex_jsp.class
  3. 执行阶段(Execution)
    • 容器加载编译后的类,实例化并调用其服务方法
    • 生成的 HTML 内容返回给客户端浏览器

关键点:JSP 第一次访问较慢(需要翻译和编译),后续请求直接执行编译好的 Servlet,速度很快。

三、JSP 核心语法元素

1. 指令元素(Directives)

通过 <%@ ... %> 语法控制 JSP 页面整体行为

指令 说明 示例
page 定义页面属性 <%@ page language="java" contentType="text/html; charset=UTF-8" %>
include 静态包含文件 <%@ include file="header.html" %>
taglib 声明标签库 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

2. 脚本元素(Scripting Elements)

在 JSP 中嵌入 Java 代码

类型 语法 作用域 示例
声明 <%! ... %> Servlet 类成员 <%! private int counter = 0; %>
脚本片段 <% ... %> _jspService() 方法内 <% for(int i=0; i<5; i++) { %>
表达式 <%= ... %> 输出表达式值 <%= new Date() %>

3. 动作元素(Standard Actions)

预定义的 XML 标签,执行特定操作

动作 用途 示例
<jsp:include> 动态包含页面 <jsp:include page="footer.jsp"/>
<jsp:forward> 请求转发 <jsp:forward page="result.jsp"/>
<jsp:useBean> 实例化 JavaBean <jsp:useBean id="user" class="com.example.User"/>
<jsp:setProperty> 设置 Bean 属性 <jsp:setProperty name="user" property="name" value="张三"/>
<jsp:getProperty> 获取 Bean 属性 <jsp:getProperty name="user" property="name"/>

4. 隐含对象(Implicit Objects)

JSP 容器自动创建的 9 个内置对象,无需声明即可使用

对象 类型 作用
request HttpServletRequest 客户端请求对象
response HttpServletResponse 服务器响应对象
session HttpSession 会话管理对象
application ServletContext 应用上下文对象
out JspWriter 输出流对象
config ServletConfig Servlet 配置对象
pageContext PageContext 页面上下文对象
page Object 当前页面实例(相当于 this)
exception Throwable 异常对象(仅在错误页面可用)

四、JSP 与 Servlet 的关系

  • 本质相同:JSP 最终会被编译成 Servlet
  • 分工不同
    • Servlet:适合处理业务逻辑和控制流程(Controller)
    • JSP:适合生成动态 HTML 内容(View)
  • 最佳实践:在 MVC 架构中,Servlet 作为控制器接收请求,处理业务逻辑,然后将结果转发给 JSP 页面进行展示

五、JSP 开发示例

示例:用户登录页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
    <h2>用户登录</h2>
    <form action="LoginServlet" method="post">
        用户名:<input type="text" name="username" required><br><br>
        密码:<input type="password" name="password" required><br><br>
        <input type="submit" value="登录">
        <input type="reset" value="重置">
    </form>
    
    <%-- 显示错误信息 --%>
    <%
    if (request.getAttribute("error") != null) {
    %>
        <p style="color:red;"><%= request.getAttribute("error") %></p>
    <%
    }
    %>
</body>
</html>

示例:结果显示页面(使用 JSTL)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>用户信息</title>
</head>
<body>
    <h2>欢迎回来,${user.name}!</h2>
    
    <h3>您的详细信息:</h3>
    <table border="1">
        <tr>
            <th>属性</th>
            <th></th>
        </tr>
        <tr>
            <td>用户名</td>
            <td>${user.username}</td>
        </tr>
        <tr>
            <td>邮箱</td>
            <td>${user.email}</td>
        </tr>
        <tr>
            <td>注册时间</td>
            <td><fmt:formatDate value="${user.registerDate}" pattern="yyyy-MM-dd"/></td>
        </tr>
    </table>
    
    <a href="logout">退出登录</a>
</body>
</html>

六、JSP 的优缺点

优点

  • 开发效率高:对 Web 设计师友好,无需深入了解 Java
  • 组件重用:通过 JavaBean 和自定义标签实现代码复用
  • 平台独立:基于 Java,可在任何支持 Java 的服务器上运行
  • 功能强大:可访问所有 Java API 和企业级服务

缺点

  • 学习曲线:需要同时掌握 HTML、Java 和 JSP 语法
  • 性能问题:首次访问较慢;过度使用脚本会导致难以维护
  • 调试困难:JSP 错误可能映射到生成的 Servlet 代码中
  • 违反关注点分离:过度使用脚本元素会使业务逻辑与表示层耦合

七、JSP 在现代 Web 开发中的地位

虽然随着前端框架(如 React、Vue)和模板引擎(如 Thymeleaf)的兴起,JSP 的使用有所减少,但它仍然在以下场景发挥重要作用:

  • 传统企业应用:大量遗留系统仍在使用 JSP
  • 服务器端渲染:对于 SEO 要求高的应用,服务器端渲染仍有优势
  • 快速原型开发:简单应用的快速实现
  • 与 Spring MVC 集成:作为视图层技术,在 Spring 框架中仍有广泛应用

八、最佳实践建议

  1. 避免在 JSP 中编写复杂 Java 代码:将业务逻辑放在 Servlet 或 Service 层
  2. 使用 JSTL 和 EL 表达式:替代脚本片段,提高可读性和可维护性
  3. 采用 MVC 架构:Servlet 作为控制器,JSP 仅负责展示
  4. 使用自定义标签:封装复杂逻辑,提高代码复用性
  5. 考虑替代技术:对于新项目,评估 Thymeleaf、FreeMarker 等现代模板引擎

总结

JSP 作为 JavaWeb 开发的重要技术,通过将 Java 代码嵌入 HTML 的方式,极大简化了动态网页的开发。理解其工作原理、核心语法和最佳实践,对于掌握 JavaWeb 开发至关重要。尽管现代前端框架发展迅速,JSP 作为服务器端渲染技术,在企业级应用中仍有其独特价值。

提示:学习 JSP 时,建议结合 Servlet 一起学习,理解两者的关系和分工,这对掌握 JavaWeb 架构设计非常有帮助。