Servlet深度解析与实战
一、Servlet基础概念与生命周期
1.1 Servlet的本质
Servlet是JavaEE规范中用于处理HTTP请求的核心组件,其本质是运行在Web服务器中的Java程序。与静态网页不同,Servlet通过动态生成内容实现个性化响应。
// 基础Servlet结构示例
public class FirstServlet extends HttpServlet {
// 初始化方法(整个生命周期只执行一次)
public void init() throws ServletException {
System.out.println("Servlet初始化完成");
}
// 处理GET请求
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<h1>Hello Servlet World!</h1>");
}
// 销毁方法(服务器关闭时执行)
public void destroy() {
System.out.println("Servlet资源释放");
}
}
1.2 生命周期详解
- 初始化阶段:
init()
方法加载配置参数 - 服务阶段:
service()
方法路由请求到doGet()
/doPost()
- 销毁阶段:
destroy()
方法释放数据库连接等资源
实验发现:Servlet实例在服务器运行期间是单例的,多个请求共享同一个实例
二、Servlet核心配置实践
2.1 传统web.xml配置
<!-- 配置示例 -->
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>com.example.UserServlet</servlet-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/user</url-pattern>
</servlet-mapping>
2.2 注解配置(Servlet 3.0+)
@WebServlet(
name = "LoginServlet",
urlPatterns = {"/login"},
initParams = {
@WebInitParam(name = "maxAttempts", value = "5")
}
)
public class LoginServlet extends HttpServlet {
// 业务逻辑实现
}
三、数据库CRUD实战(Oracle示例)
3.1 数据库连接工具类
public class DBUtil {
private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String URL = "jdbc:oracle:thin:@localhost:1521:ORCL";
private static final String USER = "scott";
private static final String PASS = "tiger";
public static Connection getConnection() throws Exception {
Class.forName(DRIVER);
return DriverManager.getConnection(URL, USER, PASS);
}
}
3.2 增删改查Servlet实现
@WebServlet("/user")
public class UserServlet extends HttpServlet {
// 新增用户
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try(Connection conn = DBUtil.getConnection()) {
String sql = "INSERT INTO users(name,age) VALUES(?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, req.getParameter("name"));
pstmt.setInt(2, Integer.parseInt(req.getParameter("age")));
pstmt.executeUpdate();
resp.sendRedirect("list.jsp"); // 操作成功后重定向
} catch (Exception e) {
throw new ServletException("数据库操作失败", e);
}
}
// 查询用户列表
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
List<User> users = new ArrayList<>();
try(Connection conn = DBUtil.getConnection()) {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while(rs.next()) {
users.add(new User(
rs.getInt("id"),
rs.getString("name"),
rs.getInt("age")
));
}
req.setAttribute("userList", users);
req.getRequestDispatcher("/list.jsp").forward(req, resp);
} catch (Exception e) {
throw new ServletException("查询失败", e);
}
}
}
关键点说明:
- 使用PreparedStatement防止SQL注入
- 事务管理通过Connection的commit/rollback实现
- 结果集处理推荐使用DTO对象封装
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理