Servlet 知识点汇总与简析

Servlet 知识点汇总与简析

一、Servlet 基础概念

1. Servlet 定义

Servlet 是用 Java 编写的服务器端程序,运行在 Web 服务器或应用服务器上,作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

2. Servlet 生命周期

  • 初始化阶段:调用 init() 方法

    • 在 Servlet 实例创建后立即调用
    • 只调用一次
    • 用于一次性初始化工作
  • 服务阶段:调用 service() 方法

    • 每次请求都会调用
    • 根据请求类型调用 doGet()doPost() 等方法
  • 销毁阶段:调用 destroy() 方法

    • 在 Servlet 被卸载前调用
    • 只调用一次
    • 用于释放资源

3. Servlet 接口层次结构

Servlet (接口)
  ↑
GenericServlet (抽象类)
  ↑
HttpServlet (抽象类)

二、Servlet 核心组件

1. Servlet API 主要接口和类

  • javax.servlet.Servlet:核心接口
  • javax.servlet.GenericServlet:与协议无关的抽象类
  • javax.servlet.http.HttpServlet:HTTP 协议专用的抽象类
  • javax.servlet.ServletConfig:Servlet 配置接口
  • javax.servlet.ServletContext:Servlet 上下文接口
  • javax.servlet.http.HttpServletRequest:HTTP 请求接口
  • javax.servlet.http.HttpServletResponse:HTTP 响应接口

2. HttpServletRequest 详解

  • 获取请求信息

    • getParameter(String name):获取请求参数
    • getParameterValues(String name):获取多个同名参数
    • getParameterMap():获取所有参数Map
    • getHeader(String name):获取请求头
    • getMethod():获取请求方法(GET/POST等)
  • 请求转发

    • getRequestDispatcher(String path):获取请求转发器

3. HttpServletResponse 详解

  • 设置响应

    • setContentType(String type):设置内容类型
    • setCharacterEncoding(String charset):设置字符编码
    • getWriter():获取PrintWriter输出文本
    • getOutputStream():获取ServletOutputStream输出二进制
  • 重定向

    • sendRedirect(String location):发送重定向

三、Servlet 配置

1. web.xml 配置

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.example.MyServlet</servlet-class>
    <init-param>
        <param-name>config</param-name>
        <param-value>value</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/myservlet</url-pattern>
</servlet-mapping>

2. 注解配置 (Servlet 3.0+)

@WebServlet(
    name = "MyServlet",
    urlPatterns = {"/myservlet"},
    initParams = {
        @WebInitParam(name = "config", value = "value")
    },
    loadOnStartup = 1
)
public class MyServlet extends HttpServlet {
    // ...
}

四、Servlet 高级特性

1. 过滤器(Filter)

  • 用于预处理请求和后处理响应
  • 实现 javax.servlet.Filter 接口
  • 配置方式:
    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.example.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    或使用注解:
    @WebFilter("/*")
    public class MyFilter implements Filter {
        // ...
    }
    

2. 监听器(Listener)

  • 用于监听 Web 应用中的事件
  • 常用监听器:
    • ServletContextListener:监听上下文生命周期
    • HttpSessionListener:监听会话生命周期
    • ServletRequestListener:监听请求生命周期

3. 异步处理(Servlet 3.0+)

@WebServlet(urlPatterns = "/async", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        AsyncContext asyncContext = req.startAsync();
        asyncContext.start(() -> {
            // 长时间处理
            asyncContext.complete();
        });
    }
}

五、Servlet 会话管理

1. Cookie

// 创建Cookie
Cookie cookie = new Cookie("name", "value");
cookie.setMaxAge(3600); // 设置有效期(秒)
response.addCookie(cookie); // 添加到响应

// 读取Cookie
Cookie[] cookies = request.getCookies();
for (Cookie c : cookies) {
    if (c.getName().equals("name")) {
        String value = c.getValue();
    }
}

2. HttpSession

// 获取Session
HttpSession session = request.getSession();

// 设置属性
session.setAttribute("key", "value");

// 获取属性
Object value = session.getAttribute("key");

// 使Session失效
session.invalidate();

六、Servlet 异常处理

1. 错误页面配置

<error-page>
    <error-code>404</error-code>
    <location>/error404.jsp</location>
</error-page>
<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/error.jsp</location>
</error-page>

2. 异常处理方式

  • 在Servlet中捕获异常并处理
  • 使用过滤器统一处理异常
  • 配置错误页面

七、Servlet 安全

1. 基本认证配置

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Protected Area</web-resource-name>
        <url-pattern>/admin/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Protected Area</realm-name>
</login-config>

2. 编程式安全

// 检查用户角色
boolean isAdmin = request.isUserInRole("admin");

// 获取用户信息
String username = request.getRemoteUser();

八、Servlet 最佳实践

  1. 线程安全:Servlet 是单例多线程的,避免使用实例变量
  2. 资源管理:在 init() 中获取资源,在 destroy() 中释放
  3. 性能优化:使用缓冲、合理设置内容类型和编码
  4. 异常处理:统一处理异常,提供友好的错误页面
  5. 日志记录:使用日志框架记录重要事件

九、Servlet 3.0+ 新特性

  1. 注解支持:@WebServlet, @WebFilter, @WebListener
  2. 异步处理:AsyncContext 支持
  3. 可插拔性:模块化部署
  4. 文件上传:Part API
  5. 动态注册:ServletContext 动态添加组件

十、Servlet 与 JSP 关系

  1. Servlet:适合处理业务逻辑和控制流程
  2. JSP:适合生成动态HTML内容
  3. MVC 模式
    • Servlet 作为控制器(Controller)
    • JavaBean 作为模型(Model)
    • JSP 作为视图(View)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值