上一篇JSP学习笔记我们已经学习了通过JDBC如何与数据库交互这一次我们就来初步了解一下JSP“大脑”:Servlet!
📚 00:Hello Servlet
0.1 Servlet是什么?
- Servlet是Java编写的服务器端程序,运行在Web服务器(如Tomcat)中
- 它遵循"请求-响应"模型:接收客户端(浏览器)的请求,处理业务逻辑,返回响应
- 相比CGI,Servlet更高效,因为Java虚拟机常驻内存
0.2 Servlet生命周期
- 加载:服务器启动时,或通过
<load-on-startup>
配置 - 初始化:调用
init()
方法(只执行一次) - 处理请求:每次请求调用
service()
方法(根据HTTP方法分派到doGet()
/doPost()
) - 销毁:服务器关闭时调用
destroy()
方法
🎮 开篇:为什么我们要学Servlet?
在JSP中,Servlet的作用是处理客户端的请求并生成动态的内容。需要使用Servlet是因为它能够帮助我们与客户端进行交互,处理表单数据、数据库操作等,使网页变得更加动态和交互性。简单来说,就好比Servlet是网页的大厨,负责把客人点的菜做好并上桌,让整个用餐体验更加丰富和美味。
想象一下,你正在开发一个酷炫的网站,用户可以在上面注册账号、登录、发表动态……而这一切的背后,都离不开一个核心角色——Servlet!它就像网站的大脑,处理用户的请求,返回动态的内容。今天,就让我们踏上Servlet的探险之旅,用一个简单的登陆注册页面例子带你入门!
🛠️ 第一步:搭建开发环境
1.1 安装JDK
- 打开浏览器,搜索"JDK 8 下载"(注意:Servlet对JDK版本有一定要求,Tomcat 10以下建议用JDK 8,当然你也可选择高版本Java但是必须同时选择高版本Tomcat)
- 在Oracle官网下载JDK( https://www.oracle.com/cn/java/technologies/downloads/ )Windows x64 Installer
- 安装路径建议保持默认(比如
C:\Program Files\Java\jdk1.8.0_291
) - 配置环境变量(参考之前的Minecraft开服教程里有提及,这里不再赘述)
1.2 安装Tomcat
- 浏览器搜索"Tomcat 9 下载"(注意:Tomcat 10+需要JDK 11+,且包名从
javax.servlet
改为jakarta.servlet
,容易出错) - 官网下载Windows Service Installer(32-bit/64-bit)
- 安装时选择默认端口8080,管理员账号自己设置
- 关键步骤:安装完成后,找到
conf/server.xml
,检查<Connector>
标签的端口是否被占用
1.3 配置IDE(以IntelliJ IDEA为例)
- 新建Java项目 → 选择"Java Enterprise" → 勾选"Web Application"
- 在"Project Structure" → "Libraries" → 添加Tomcat依赖
- 在"Deployment" → 添加"Artifact" → 选择你的项目
🛡️ 第二步:创建第一个Servlet
2.1 编写Servlet类
- 继承
HttpServlet
类 - 重写
doGet()
或doPost()
方法 - 使用
@WebServlet
注解配置URL映射(或配置web.xml
)
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>Hello Servlet!</h1>");
}
}
2.2 部署并运行
- 将项目部署到Tomcat
- 浏览器访问
http://localhost:8080/你的项目名/hello
- 如果看到"Hello Servlet!",恭喜你,第一个Servlet运行成功!
🔑 第三步:实战案例——登录注册系统
3.1 创建数据库(MySQL示例)
- 新建数据库
userdb
创建表
users
:CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(50) NOT NULL );
3.2 编写注册Servlet
- 处理表单提交的POST请求
- 连接数据库,插入新用户
- 注意密码加密(这里简单示例用明文,实际项目请用MD5/SHA等)
@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// 数据库连接(需添加JDBC驱动)
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/userdb", "root", "123456")) {
String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, password);
stmt.executeUpdate();
response.sendRedirect("login.html");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3.3 编写登录Servlet
- 验证用户名和密码
- 使用
RequestDispatcher
跳转页面
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/userdb", "root", "123456")) {
String sql = "SELECT * FROM users WHERE username=? AND password=?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
request.setAttribute("username", username);
RequestDispatcher dispatcher = request.getRequestDispatcher("welcome.jsp");
dispatcher.forward(request, response);
} else {
response.sendRedirect("login.html?error=1");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3.4 创建JSP页面
login.html
:登录表单register.html
:注册表单welcome.jsp
:登录成功页面
<%-- welcome.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>欢迎</title>
</head>
<body>
<h1>欢迎,${username}!</h1>
</body>
</html>
💡 第四步:解决版本兼容问题
4.1 Tomcat 10+的坑
- 如果你用了Tomcat 10+,可能会遇到
java.lang.ClassNotFoundException: javax.servlet.Servlet
错误 - 原因:Tomcat 10+遵循Jakarta EE 9+,包名从
javax.servlet
改为jakarta.servlet
解决方案:
- 方法一:改用Tomcat 9(推荐新手)
方法二:在
pom.xml
中添加依赖(Maven项目):<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency>
- 方法三:修改代码中的包名为
jakarta.servlet
(需要改所有相关类)
4.2 JDBC驱动问题
- 下载对应版本的MySQL Connector/J(比如8.0.x)
- 将
mysql-connector-java-8.0.x.jar
放到Tomcat的lib
目录下 - 或在IDE中配置库依赖
🔧 第五步:运行与调试
- 启动Tomcat服务器
- 访问
http://localhost:8080/你的项目名/register.html
注册账号 - 访问
http://localhost:8080/你的项目名/login.html
登录测试 - 检查数据库是否插入数据
- 查看控制台输出,调试错误
🎉 结语:Servlet的奇妙世界
通过这个小案例,你已经掌握了Servlet的基本用法!当然,这只是一个简单的示例,实际项目中还需要考虑:
- 密码加密存储
- 防止SQL注入(使用PreparedStatement)
- 会话管理(Cookie/Session)
- 验证码功能
- 记住我功能
接下来,你可以尝试学习JSP标签库、EL表达式、JSTL等,让页面更动态!也可以研究Spring MVC等框架,简化Servlet的开发流程。记住,实践是检验真理的唯一标准,多动手写代码,你会越来越熟练!
评论 (0)