← 返回首页

Java Servlet详解

📂 java ⏱ 3 min 532 words

什么是Servlet

Servlet是Java Web应用的核心组件,用于处理HTTP请求和生成动态Web内容。

Servlet基本结构

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().println("<h1>Hello Servlet!</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

Servlet生命周期

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/lifecycle")
public class LifecycleServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("Servlet初始化");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("处理请求: " + req.getMethod());
        super.service(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("处理GET请求");
        resp.getWriter().println("GET请求处理完成");
    }

    @Override
    public void destroy() {
        System.out.println("Servlet销毁");
    }
}

请求处理

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/request")
public class RequestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");

        String method = req.getMethod();
        String uri = req.getRequestURI();
        String queryString = req.getQueryString();
        String remoteAddr = req.getRemoteAddr();

        resp.getWriter().println("<h2>请求信息</h2>");
        resp.getWriter().println("<p>请求方法: " + method + "</p>");
        resp.getWriter().println("<p>请求URI: " + uri + "</p>");
        resp.getWriter().println("<p>查询字符串: " + queryString + "</p>");
        resp.getWriter().println("<p>客户端IP: " + remoteAddr + "</p>");

        resp.getWriter().println("<h3>请求头</h3>");
        Enumeration<String> headers = req.getHeaderNames();
        while (headers.hasMoreElements()) {
            String name = headers.nextElement();
            resp.getWriter().println("<p>" + name + ": " + req.getHeader(name) + "</p>");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().println("<h2>POST请求处理</h2>");
        resp.getWriter().println("<p>用户名: " + username + "</p>");
        resp.getWriter().println("<p>密码: " + password + "</p>");
    }
}

会话管理

HttpSession

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/session")
public class SessionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        HttpSession session = req.getSession();

        Integer visitCount = (Integer) session.getAttribute("visitCount");
        if (visitCount == null) {
            visitCount = 0;
        }
        visitCount++;
        session.setAttribute("visitCount", visitCount);

        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().println("<h2>会话管理</h2>");
        resp.getWriter().println("<p>会话ID: " + session.getId() + "</p>");
        resp.getWriter().println("<p>访问次数: " + visitCount + "</p>");
        resp.getWriter().println("<p>创建时间: " + session.getCreationTime() + "</p>");
        resp.getWriter().println("<p>最后访问: " + session.getLastAccessedTime() + "</p>");
    }
}

Cookie

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/cookie")
public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();

        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().println("<h2>Cookie处理</h2>");

        if (cookies != null) {
            for (Cookie cookie : cookies) {
                resp.getWriter().println("<p>" + cookie.getName() + ": " +
                    cookie.getValue() + "</p>");
            }
        }

        Cookie userCookie = new Cookie("user", "zhangsan");
        userCookie.setMaxAge(3600);
        userCookie.setPath("/");
        resp.addCookie(userCookie);

        resp.getWriter().println("<p>Cookie已设置</p>");
    }
}

转发和重定向

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/forward")
public class ForwardServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        req.setAttribute("message", "转发消息");
        RequestDispatcher dispatcher = req.getRequestDispatcher("/target");
        dispatcher.forward(req, resp);
    }
}

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.sendRedirect("/target");
    }
}

Servlet过滤器

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/*")
public class LogFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        long start = System.currentTimeMillis();
        chain.doFilter(request, response);
        long elapsed = System.currentTimeMillis() - start;
        System.out.println("请求处理时间: " + elapsed + "ms");
    }

    @Override
    public void destroy() {
        System.out.println("过滤器销毁");
    }
}

Servlet最佳实践

  1. 使用@WebServlet注解简化配置
  2. 正确处理字符编码
  3. 使用HttpSession管理用户状态
  4. 合理使用过滤器处理横切关注点
  5. 避免在Servlet中存放业务逻辑

总结

Servlet是Java Web开发的基础。掌握Servlet的生命周期、请求处理和会话管理,是学习Web开发的重要基础。