CT的JavaWeb学习(8)——Servlet API

本文详细介绍了Servlet的生命周期,包括初始化阶段的参数获取、过滤器的配置与过滤器链、事务管理在库存更新中的应用,以及Listener监听器的角色。涵盖了`ServletConfig`、`Filter`、`Transaction Management`和`Listener`的实战内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8 Servlet API

Servlet生命周期:实例化、初始化、服务、销毁

初始化方法:init()、init(Config config)。

如果我们需要在Servlet初始化时做一些准备工作,那么我们可以重写init方法

8.1 ServletConfig

获取ServletConfig的初始化数据

public class Demo01Servlet extends HttpServlet{
    @Override
    public void init() throws ServletException {
        ServletConfig config = getServletConfig();
        String initValue = config.getInitParameter("hello");
        System.out.println(initValue);
    }
}

xml配置

<servlet>
    <servlet-name>Demo01Servlet</servlet-name>
    <servlet-class>com.ct.servlet.Demo01Servlet</servlet-class>
    <init-param>
        <param-name>hello</param-name>
        <param-value>world</param-value>
    </init-param>
    <init-param>
        <param-name>uname</param-name>
        <param-value>jim</param-value>
    </init-param>
</servlet>

注解方式

@WebServlet(urlPatterns = {"/demo01"},
        initParams = {
            @WebInitParam(name = "hello",value = "world"),
            @WebInitParam(name = "uname",value = "jim")
        }
    )

获取上下文数据

获取ServletContext:

  • 在init方法中,可以直接通过get方法获取
  • 在service方法中也可以通过request获取
ServletContext servletContext = getServletContext();
String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
System.out.println(contextConfigLocation);//classpath:applicationContext.xml

xml配置

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

8.2 过滤器Filter

  • Filter也属于Servlet规范
  • 新建Filter类实现Filter接口,可以使用注解@WebFilter,也可以使用xml文件配置
  • Filter配置也可以使用通配符来实现多个Servlet的共同过滤
  • 过滤器链:多个过滤器同时生效,以链式传递。
    • 过滤器链生效顺序:
      • 注解配置:按文件的全类名字母顺序生效
      • xml配置:按xml先后顺序生效

xml配置

<filter>
    <filter-name>demo01</filter-name>
    <filter-class>com.ct.filters.Demo01Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>demo01</filter-name>
    <url-pattern>/demo01.do</url-pattern>
</filter-mapping>

注解配置(注意名称与Servlet的配置相同)

@WebFilter("/demo01.do")
public class Demo01Filter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("helloA");
        filterChain.doFilter(servletRequest,servletResponse);//执行servlet中的service
        System.out.println("helloA2");
    }

    @Override
    public void destroy() {

    }
}

我们在水果库存中将设置编码放到过滤器Filter中

8.3 事务管理

参考JDBC.md

水果库存更新组件

  • OpenSessionInViewFilter

  • TransactionManager

  • ConnUtil

  • BaseDAO

  • ThreadLocal

ThreadLocal

ThreadLocal称为本地线程

  • set():在当前线程上存储数据
  • get(Object):在当前线程上取出数据
  • 每一个线程Thread维护各自的一个容器ThreadLocalMap
  • ThreadLocal相当于key,维护一个value(例如Connection)

8.4 Listener

第一组

  1. ServletContextListener:监听ServletContext对象的创建和销毁的过程

  2. HttpSessionListener:监听HttpSession对象的创建和销毁的过程

  3. ServletRequestListener:监听ServletRequest对象的创建和销毁的过程

第二组

  1. ServletContextAttributeListener:监听ServletContext的保存作用域的变动事件(add,remove,replace)

  2. HttpSessionAttributeListener:监听HttpSession的保存作用域的变动事件(add,remove,replace)

  3. ServletRequestAttributeListener:监听ServletRequest的保存作用域的变动事件(add,remove,replace)

第三组

  1. HttpSessionBindingListener:监听某个对象在session域中的创建与移除
  2. HttpSessionActivationListener:监听某个对象在session域中的序列化和反序列化

配置方式

注解:@WebListener

xml配置:

<listener>
    <listener-class>com.ct.listener.MyServletContextListener</listener-class>
</listener>

应用

/**
* @Description: 在ServletContextListener中监听ServletContext的创建,并在此时创建beanFactory
*/
@WebListener
public class ContextLoaderListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        ServletContext application = servletContextEvent.getServletContext();
        String path = application.getInitParameter("contextConfigLocation");
        BeanFactory beanFactory = new ClassPathXmlApplicationContext(path);
        application.setAttribute("beanFactory",beanFactory);
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值