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 生命周期详解

  1. 初始化阶段:init()方法加载配置参数
  2. 服务阶段:service()方法路由请求到doGet()/doPost()
  3. 销毁阶段: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);
        }
    }
}

关键点说明:

  1. 使用PreparedStatement防止SQL注入
  2. 事务管理通过Connection的commit/rollback实现
  3. 结果集处理推荐使用DTO对象封装
posted @   f-52Hertz  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示