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
第一组
-
ServletContextListener:监听ServletContext对象的创建和销毁的过程
-
HttpSessionListener:监听HttpSession对象的创建和销毁的过程
-
ServletRequestListener:监听ServletRequest对象的创建和销毁的过程
第二组
-
ServletContextAttributeListener:监听ServletContext的保存作用域的变动事件(add,remove,replace)
-
HttpSessionAttributeListener:监听HttpSession的保存作用域的变动事件(add,remove,replace)
-
ServletRequestAttributeListener:监听ServletRequest的保存作用域的变动事件(add,remove,replace)
第三组
- HttpSessionBindingListener:监听某个对象在session域中的创建与移除
- 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) {
}
}