当前位置: 首页 > news >正文

Java基础知识(十五)

1. Servlet 基本概念

Servlet 是运行在 Web 服务器或应用服务器上的 Java 程序,它是客户端请求(通常是 HTTP 请求)和服务器响应之间的中间层。

  • 主要功能:处理客户端请求并生成动态响应
  • 运行环境:需要 Servlet 容器(如 Tomcat、Jetty 等)
  • 生命周期:由 Servlet 容器管理,而非开发者手动控制

2. Servlet 生命周期

Servlet 生命周期包含以下几个阶段:

  1. 初始化阶段init() 方法

    • 当 Servlet 第一次被请求时调用
    • 用于初始化资源,只调用一次
  2. 服务阶段service() 方法

    • 每次客户端请求时调用
    • 根据请求类型(GET、POST 等)调用相应的 doXXX 方法
  3. 销毁阶段destroy() 方法

    • 当 Servlet 被移除或服务器关闭时调用
    • 用于释放资源

3. 实现 Servlet 的方式

方式一:实现 Servlet 接口

import javax.servlet.*;
import java.io.IOException;public class MyServlet implements Servlet {@Overridepublic void init(ServletConfig config) throws ServletException {// 初始化操作}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {// 处理请求逻辑}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {// 资源释放操作}
}

方式二:继承 GenericServlet 类

GenericServlet 实现了 Servlet 接口,提供了默认实现:

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;public class MyGenericServlet extends GenericServlet {@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {// 只需重写 service 方法}
}

方式三:继承 HttpServlet 类(最常用)

HttpServlet 继承 GenericServlet,专门用于处理 HTTP 请求:

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class MyHttpServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 处理 GET 请求}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 处理 POST 请求}
}

4. Servlet 配置方式

方式一:XML 配置(web.xml)

<web-app><servlet><servlet-name>MyServlet</servlet-name><servlet-class>com.example.MyHttpServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/myServlet</url-pattern></servlet-mapping>
</web-app>

方式二:注解配置(Servlet 3.0+)

import javax.servlet.annotation.WebServlet;@WebServlet("/myServlet")
public class MyHttpServlet extends HttpServlet {// 实现代码...
}

5. 请求与响应处理

获取请求信息

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 获取请求参数String username = req.getParameter("username");String[] hobbies = req.getParameterValues("hobby");// 获取请求方法String method = req.getMethod();// 获取请求 URIString uri = req.getRequestURI();
}

发送响应

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 设置响应内容类型resp.setContentType("text/html;charset=UTF-8");// 获取输出流PrintWriter out = resp.getWriter();// 发送响应内容out.println("<html>");out.println("<head><title>响应示例</title></head>");out.println("<body>");out.println("<h1>Hello, Servlet!</h1>");out.println("</body>");out.println("</html>");
}

6. 会话管理

使用 HttpSession

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 获取或创建会话HttpSession session = req.getSession();// 设置会话属性session.setAttribute("username", "张三");// 获取会话属性String username = (String) session.getAttribute("username");// 设置会话超时时间(秒)session.setMaxInactiveInterval(30 * 60);// 销毁会话// session.invalidate();
}

7. 请求转发与重定向

请求转发(服务器内部跳转)

// 转发到另一个 Servlet 或页面
RequestDispatcher dispatcher = req.getRequestDispatcher("/anotherServlet");
dispatcher.forward(req, resp);

重定向(客户端跳转)

// 重定向到另一个资源
resp.sendRedirect("http://example.com");
// 或相对路径
resp.sendRedirect("/anotherServlet");

8. Servlet 上下文(ServletContext)

ServletContext 代表整个 Web 应用,所有 Servlet 共享:

// 获取 ServletContext 对象
ServletContext context = getServletContext();// 设置属性
context.setAttribute("siteName", "我的网站");// 获取属性
String siteName = (String) context.getAttribute("siteName");// 获取初始化参数(在 web.xml 中配置)
String paramValue = context.getInitParameter("paramName");// 获取资源路径
String realPath = context.getRealPath("/WEB-INF/config.properties");

9. 过滤器(Filter)

过滤器用于在请求到达 Servlet 之前或响应发送到客户端之前进行处理:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/myServlet")
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 请求处理前的逻辑System.out.println("过滤器处理前...");// 继续执行后续过滤器或Servletchain.doFilter(request, response);// 响应处理后的逻辑System.out.println("过滤器处理后...");}@Overridepublic void destroy() {// 销毁}
}

10. 监听器(Listener)

监听器用于监听 Web 应用中的事件,如 ServletContext、HttpSession、ServletRequest 的创建和销毁等。

常用监听器接口:

  • ServletContextListener:监听 ServletContext 的创建和销毁
  • HttpSessionListener:监听 HttpSession 的创建和销毁
  • ServletRequestListener:监听 ServletRequest 的创建和销毁


文章转载自:

http://KXVyfgcU.qfwfj.cn
http://UoBgfIKQ.qfwfj.cn
http://mCeQRTv6.qfwfj.cn
http://itaUdg4B.qfwfj.cn
http://HmkeG9fA.qfwfj.cn
http://8Q1mDEuF.qfwfj.cn
http://REUEN5Uj.qfwfj.cn
http://fsIhKWyD.qfwfj.cn
http://7d7HWe5C.qfwfj.cn
http://nirugkU5.qfwfj.cn
http://1LaFrrIA.qfwfj.cn
http://749WkxsW.qfwfj.cn
http://pbwc5cu6.qfwfj.cn
http://2pvpsRVD.qfwfj.cn
http://mYMgY6kf.qfwfj.cn
http://FwMmbyfX.qfwfj.cn
http://8ZxjQZr6.qfwfj.cn
http://pRjD0FHy.qfwfj.cn
http://7k5afzYq.qfwfj.cn
http://f1MNfCf3.qfwfj.cn
http://Pcrtgxoz.qfwfj.cn
http://uvJEgwi5.qfwfj.cn
http://PL5zIUIs.qfwfj.cn
http://bnqN36yd.qfwfj.cn
http://M6UVAr4a.qfwfj.cn
http://pwFfQdJT.qfwfj.cn
http://pYYGl9Vu.qfwfj.cn
http://4ey1BLot.qfwfj.cn
http://XveDiwip.qfwfj.cn
http://b9bLzMEe.qfwfj.cn
http://www.dtcms.com/a/382024.html

相关文章:

  • 2025.9.14英语红宝书
  • Easy系列PLC枚举变量类型(为什么可以不实例化直接使用)
  • python全栈-自动化office
  • smartctl_exporter smartctl 统计信息
  • 软件测试常见Bug清单
  • 大数据电商流量分析项目实战:可视化 数据分析(九)
  • Kafka核心概念深入浅出:消费者组(Consumer Group)机制全解析
  • ZYNQ PS读写PL BRAM
  • [数据结构] 队列 (Queue)
  • Git : 基本操作
  • Vue模板中传递对象或数组时,避免直接使用字面量[]和{}
  • 26考研——内存管理_虚拟内存管理(3)
  • FastAPI如何用契约测试确保API的「菜单」与「菜品」一致?
  • PDFgear:免费全能的PDF处理工具
  • 贪心算法应用:K-Means++初始化详解
  • Linux相关概念和易错知识点(43)(数据链路层、ARP、以太网、交换机)
  • 交换机数据管理
  • 【Redis#11】Redis 在 C++ 客户端下的安装使用流程(一条龙服务)
  • leetcode 315 计算右侧小于当前元素的个数
  • MYSQL端口号3306被占用
  • Python核心技术开发指南(062)——静态方法
  • [Windows] 整容脸比对系统
  • C语言:指针从入门到精通(上)
  • 【MySQL】--- 表的约束
  • SpringBoot 轻量级一站式日志可视化与JVM监控
  • Java零基础学习Day10——面向对象高级
  • JavaScript中ES模块语法详解与示例
  • 系统核心解析:深入操作系统内部机制——进程管理与控制指南(三)【进程优先级/切换/调度】
  • Roo Code:用自然语言编程的VS Code扩展
  • 第8.4节:awk的内置时间处理函数