好的,各位靓仔靓女,欢迎来到“Java Web 基础:Servlet 与 JSP”技术讲座现场!我是你们的老朋友,也是你们今天的主讲人,江湖人称“代码小王子”。今天咱们不搞那些高大上的理论,就聊聊 Java Web 开发的“老两口”——Servlet 和 JSP。
别一听“老两口”就觉得枯燥,他们可是 Java Web 世界里不可或缺的灵魂人物,一个负责“搬砖”,一个负责“美化”,配合默契,相爱相杀,共同构建了无数精彩纷呈的网页应用。准备好了吗?让我们一起揭开他们的神秘面纱吧!😎
第一幕:Servlet——默默奉献的“搬砖工”
Servlet,你可以把它想象成一个勤勤恳恳的“搬砖工”,专门负责处理来自客户端的请求,然后根据请求的内容,进行相应的业务逻辑处理,最后再把处理结果返回给客户端。说白了,它就是个“中间人”,负责沟通客户端和服务器,并完成一些“脏活累活”。
1. 什么是 Servlet?
Servlet 是运行在 Web 服务器或应用服务器上的 Java 程序,用于处理 HTTP 请求并生成响应。它并非独立的进程,而是寄生在 Web 服务器中,由服务器负责管理其生命周期。
- 官方定义: Servlet 是使用 Java Servlet API 实现的 Java 类,运行在支持 Servlet 规范的 Web 服务器中。
- 通俗解释: Servlet 就像一个邮局分拣员,负责接收信件(HTTP 请求),根据信件上的地址(URL)进行分类,然后交给相应的处理人员(Java 代码)进行处理,最后再把处理结果(HTTP 响应)发送给收信人(客户端)。
2. Servlet 的生命周期
Servlet 的生命周期由 Web 服务器管理,大致分为以下几个阶段:
| 阶段 | 描述 |
|---|---|
| 加载与实例化 | 当服务器第一次收到对该 Servlet 的请求时,或者服务器启动时(如果配置了自动加载),服务器会加载 Servlet 类,并创建 Servlet 实例。 |
| 初始化 | 服务器调用 Servlet 的 init() 方法,进行一些初始化操作,例如读取配置文件、建立数据库连接等。init() 方法只会被调用一次。 |
| 请求处理 | 当客户端发送请求到该 Servlet 时,服务器会调用 Servlet 的 service() 方法,根据 HTTP 请求的方法(GET、POST 等),调用对应的 doGet() 或 doPost() 方法来处理请求。service() 方法会被多次调用。 |
| 销毁 | 当服务器关闭或 Servlet 需要被卸载时,服务器会调用 Servlet 的 destroy() 方法,释放资源。destroy() 方法只会被调用一次。 |
3. 如何编写一个 Servlet?
编写 Servlet 非常简单,只需要以下几步:
- 创建一个 Java 类,继承
javax.servlet.http.HttpServlet类。HttpServlet类是 Servlet API 中专门用于处理 HTTP 请求的类,它提供了一些方便的方法,例如doGet()、doPost()等。 - 重写
doGet()或doPost()方法,处理 GET 或 POST 请求。 在这些方法中,你可以编写你的业务逻辑代码,例如从数据库中读取数据、进行计算等。 - 配置 Servlet。 你需要在
web.xml文件(或者使用注解)中配置 Servlet,指定 Servlet 的名称、URL 映射等信息。
代码示例:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello") // 使用注解配置 Servlet
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应内容类型为 HTML
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
// 获取 PrintWriter 对象,用于向客户端输出内容
PrintWriter out = response.getWriter();
// 输出 HTML 内容
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Hello Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello, Servlet! 👋</h1>");
out.println("<p>这是一个简单的 Servlet 示例。</p>");
out.println("</body>");
out.println("</html>");
// 关闭 PrintWriter
out.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理 POST 请求
doGet(request, response); // 这里简单地调用 doGet 方法处理 POST 请求
}
}
web.xml 配置(如果未使用注解):
<web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
4. Servlet 的优点与缺点
- 优点:
- 灵活性: Servlet 可以处理各种复杂的业务逻辑,具有很高的灵活性。
- 性能: Servlet 运行在服务器端,可以充分利用服务器的资源,提高性能。
- 可扩展性: Servlet 可以方便地进行扩展,满足不断变化的需求。
- 缺点:
- 代码复杂: Servlet 的代码通常比较复杂,需要编写大量的 Java 代码。
- 维护困难: Servlet 的代码与 HTML 代码混合在一起,维护起来比较困难。
- 开发效率低: Servlet 的开发效率相对较低,需要花费较多的时间。
第二幕:JSP——精通化妆的“设计师”
JSP,你可以把它想象成一个精通化妆的“设计师”,专门负责美化网页,让网页看起来更加漂亮、更加吸引人。它在 Servlet 的基础上,增加了对 HTML 代码的支持,使得开发者可以更加方便地编写网页。
1. 什么是 JSP?
JSP(JavaServer Pages)是一种动态网页技术,它允许开发者在 HTML 页面中嵌入 Java 代码,从而实现动态内容的生成。
- 官方定义: JSP 是一种基于 Java 的动态网页技术,它允许开发者在 HTML 页面中嵌入 Java 代码,从而实现动态内容的生成。
- 通俗解释: JSP 就像一个化妆师,它可以在 HTML 页面上涂脂抹粉,让页面看起来更加漂亮。同时,它还可以根据不同的情况,动态地调整页面的内容,让页面更加个性化。
2. JSP 的工作原理
JSP 的工作原理可以用一句话概括:JSP 页面会被 Web 服务器编译成 Servlet。
具体来说,当 Web 服务器收到对 JSP 页面的请求时,它会首先检查该 JSP 页面是否已经被编译成 Servlet。如果还没有被编译,服务器会调用 JSP 引擎将 JSP 页面编译成一个 Servlet。然后,服务器会像处理普通的 Servlet 一样,调用该 Servlet 的 service() 方法来处理请求,并生成响应。
3. JSP 的语法
JSP 的语法主要包括以下几种:
- 指令(Directives): 用于设置 JSP 页面的属性,例如页面编码、导入类等。常用的指令有
page、include、taglib等。 - 声明(Declarations): 用于声明 JSP 页面中使用的变量和方法。
- 脚本表达式(Expressions): 用于在 JSP 页面中输出变量的值。
- 脚本代码(Scriptlets): 用于在 JSP 页面中编写 Java 代码。
- 注释(Comments): 用于在 JSP 页面中添加注释。
代码示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Hello JSP</title>
</head>
<body>
<h1>Hello, JSP! 👋</h1>
<p>这是一个简单的 JSP 示例。</p>
<%-- Java 代码 --%>
<%
String name = "代码小王子";
int age = 18;
%>
<%-- 输出变量的值 --%>
<p>姓名:<%= name %></p>
<p>年龄:<%= age %></p>
<%-- 使用表达式 --%>
<p>你好的两倍是:<%= age * 2 %></p>
<%-- 循环输出 --%>
<ul>
<% for (int i = 1; i <= 5; i++) { %>
<li>第 <%= i %> 项</li>
<% } %>
</ul>
</body>
</html>
4. JSP 的优点与缺点
- 优点:
- 开发效率高: JSP 的开发效率相对较高,可以快速地编写网页。
- 易于维护: JSP 的代码与 HTML 代码分离,维护起来比较容易。
- 可重用性: JSP 可以方便地进行重用,提高开发效率。
- 缺点:
- 代码复杂: JSP 的代码中混合了 Java 代码和 HTML 代码,容易造成代码混乱。
- 性能: JSP 页面需要被编译成 Servlet,会影响性能。
- 安全性: JSP 页面中可能存在安全漏洞,需要注意安全性。
第三幕:Servlet + JSP——珠联璧合的“黄金搭档”
Servlet 和 JSP 各有优缺点,单独使用都有一定的局限性。因此,在实际开发中,通常会将 Servlet 和 JSP 结合起来使用,Servlet 负责处理业务逻辑,JSP 负责展示页面,形成一种“Model-View-Controller”(MVC)的设计模式。
1. MVC 设计模式
MVC 是一种常用的软件设计模式,它将应用程序分为三个部分:
- Model(模型): 负责处理数据和业务逻辑。
- View(视图): 负责展示数据。
- Controller(控制器): 负责接收用户的请求,调用模型处理数据,然后将处理结果传递给视图进行展示。
在 Java Web 开发中,通常使用 Servlet 作为 Controller,负责接收用户的请求,调用 Model 处理数据,然后将处理结果传递给 JSP 作为 View 进行展示。
2. Servlet + JSP 的工作流程
Servlet + JSP 的工作流程大致如下:
- 客户端发送 HTTP 请求到 Servlet。
- Servlet 接收到请求后,调用 Model 处理数据。
- Model 处理完数据后,将处理结果返回给 Servlet。
- Servlet 将处理结果存储到 request 或 session 作用域中。
- Servlet 将请求转发(forward)或重定向(redirect)到 JSP 页面。
- JSP 页面从 request 或 session 作用域中获取数据,并进行展示。
- JSP 页面生成 HTML 响应,返回给客户端。
代码示例:
Servlet:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/user")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 模拟从数据库中获取用户信息
String username = "代码小王子";
int age = 18;
// 将用户信息存储到 request 作用域中
request.setAttribute("username", username);
request.setAttribute("age", age);
// 将请求转发到 user.jsp 页面
request.getRequestDispatcher("/user.jsp").forward(request, response);
}
}
JSP:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>用户信息</title>
</head>
<body>
<h1>用户信息</h1>
<p>姓名:${username}</p>
<p>年龄:${age}</p>
</body>
</html>
3. ServletContext, ServletConfig, and Session
这三个对象在Servlet和JSP中扮演着重要的角色,理解它们对于构建健壮的Web应用至关重要。
-
ServletContext: 整个Web应用的“大管家”,它在Web应用启动时创建,并在Web应用关闭时销毁。所有Servlet和JSP都可以访问同一个ServletContext。你可以把ServletContext看作是Web应用的全局存储,可以用来存储一些共享的信息,例如数据库连接池、应用程序配置等。使用
getServletContext()方法获取。- 特点: 全局唯一,生命周期长(随Web应用启动和停止)。
- 用途: 存储全局配置信息,共享资源,记录日志等。
-
ServletConfig: 每个Servlet的“小助手”,它在Servlet初始化时创建,并在Servlet销毁时销毁。每个Servlet都有自己的ServletConfig对象,其中包含了该Servlet的初始化参数。 你可以把ServletConfig看作是Servlet的局部配置,可以用来存储一些Servlet特有的信息,例如Servlet的名称、初始化参数等。使用
getServletConfig()方法获取。- 特点: 每个Servlet独有,生命周期与Servlet一致。
- 用途: 获取Servlet的初始化参数。
-
HttpSession: 每个用户的“专属空间”,它在用户第一次访问Web应用时创建,并在用户会话结束时销毁。每个用户都有自己的HttpSession对象,可以用来存储用户的会话信息,例如用户名、登录状态、购物车内容等。使用
request.getSession()方法获取。- 特点: 每个用户独有,生命周期与用户会话一致。
- 用途: 存储用户会话信息,实现用户登录、购物车等功能。
总结:
Servlet 和 JSP 是 Java Web 开发的基石,掌握它们对于构建 Web 应用至关重要。Servlet 负责处理业务逻辑,JSP 负责展示页面,两者配合使用,可以构建出功能强大、界面美观的 Web 应用。希望今天的讲座能够帮助大家更好地理解 Servlet 和 JSP,并在实际开发中灵活运用它们。
划重点:
- Servlet 是“搬砖工”,负责处理请求。
- JSP 是“设计师”,负责美化页面。
- Servlet + JSP 是“黄金搭档”,共同构建 Web 应用。
- ServletContext 是“大管家”,ServletConfig 是“小助手”,HttpSession 是“专属空间”。
好了,今天的讲座就到这里,感谢大家的聆听!如果大家还有什么问题,可以在评论区留言,我会尽力解答。下次再见!👋