Java Servlet详解
什么是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最佳实践
- 使用@WebServlet注解简化配置
- 正确处理字符编码
- 使用HttpSession管理用户状态
- 合理使用过滤器处理横切关注点
- 避免在Servlet中存放业务逻辑
总结
Servlet是Java Web开发的基础。掌握Servlet的生命周期、请求处理和会话管理,是学习Web开发的重要基础。