JavaWeb Servlet 核心技术

一、Servlet 技术概述

  1. 核心定位与运行原理
    Servlet 是 JavaEE 规范中处理 HTTP 请求的核心组件,通过 请求-响应模型 实现动态网页交互。其运行依赖 Web 容器(如 Tomcat),生命周期由容器管理,支持多线程处理并发请求。

!

// 典型 Servlet 类结构
@WebServlet("/demo")
public class HelloServlet extends HttpServlet {
    // 初始化方法
    public void init() { System.out.println("Servlet 初始化"); }
    
    // 处理 GET 请求
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
        resp.getWriter().print("<h1>Hello Servlet</h1>");
    }
}

二、Servlet 生命周期详解

  1. 生命周期阶段
// 生命周期方法重写示例
public class LifecycleServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("---- init() executed ----");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("---- service() processing ----");
    }

    @Override
    public void destroy() {
        System.out.println("---- destroy() invoked ----");
    }
}

三、Servlet 开发全流程

  1. 配置方式对比
    XML 配置(传统方式)
<!-- web.xml 配置示例 -->
<servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.example.HelloServlet</servlet-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

注解配置(Servlet 3.0+)

@WebServlet(
    name = "userServlet",
    urlPatterns = {"/user", "/member"},
    initParams = {@WebInitParam(name="maxOnline", value="1000")}
)
public class UserServlet extends HttpServlet { ... }

四、核心 API 深度解析

  1. HttpServletRequest 对象
// 获取请求参数与头信息
String username = req.getParameter("uname");
String userAgent = req.getHeader("User-Agent");
Part filePart = req.getPart("uploadFile");  // 文件上传处理

// 请求域属性操作
req.setAttribute("currentTime", LocalDateTime.now());
RequestDispatcher rd = req.getRequestDispatcher("/result.jsp");
rd.forward(req, resp);  // 请求转发
  1. HttpServletResponse 对象
// 设置响应头与状态码
resp.setContentType("text/html;charset=utf-8");
resp.setHeader("Cache-Control", "no-cache");
resp.sendError(404, "页面不存在");  // 发送错误状态

// 重定向与输出流
resp.sendRedirect("https://www.example.com");
try (PrintWriter out = resp.getWriter()) {
    out.println("<html><body>响应内容</body></html>");
}

五、会话管理技术

  1. Cookie 应用
// 创建与读取 Cookie
Cookie cookie = new Cookie("lastVisit", LocalDateTime.now().toString());
cookie.setMaxAge(60*60*24);  // 有效期1天
resp.addCookie(cookie);

// 读取客户端 Cookie
Cookie[] cookies = req.getCookies();
Arrays.stream(cookies)
      .filter(c -> "lastVisit".equals(c.getName()))
      .findFirst()
      .ifPresent(c -> System.out.println("上次访问时间:" + c.getValue()));
  1. Session 机制
// Session 的创建与使用
HttpSession session = req.getSession(true);
session.setAttribute("loginUser", userObj);
session.setMaxInactiveInterval(1800);  // 30分钟超时

// 监听器实现会话销毁
@WebListener
public class SessionLogger implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("Session ID: " + se.getSession().getId());
    }
}

六、过滤器与监听器

  1. Filter 实现请求拦截
@WebFilter(urlPatterns = "/*", initParams = @WebInitParam(name="exclusions", value="/static/"))
public class AuthFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) 
        throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        if (request.getSession().getAttribute("user") == null) {
            resp.getWriter().write("请先登录!");
            return;
        }
        chain.doFilter(req, resp);  // 放行请求
    }
}
  1. ServletContextListener 应用
// 容器启动时加载全局配置
@WebListener
public class AppInitializer implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        String dbUrl = sce.getServletContext().getInitParameter("jdbcUrl");
        // 初始化数据库连接池
        DataSource pool = DatabaseUtil.createConnectionPool(dbUrl);
        sce.getServletContext().setAttribute("connectionPool", pool);
    }
}

posted @   f-52Hertz  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示