常用接口介绍
在j2ee的开发中,需要熟练掌握以下几个接口的用法和作用
- Listener, 事件监听器
- Filter,过滤器
- Servlet,请求处理器(囧。感觉叫法有点怪,但理解意思就好了)
Listener
从容器启动到容器关闭的整个生命周期里,存在各种各样的事件发生。servlet技术为我们提供了一系列的接口,让我们可以对这些事件进行监听处理。如:
容器初始化(ServletContextListener)
设置容器属性(ServletContextAttributeListener)
收到请求(ServletRequestListener)
请求对象设置参数(ServletRequestAttributeListener)
会话建立(HttpSessionListener)
会话设置属性(HttpSessionAttributeListener)
Filter
可以直接实现Filter接口,并配置到应用中。后面会讲解Filter的三种配置方法
Servlet
为了方便,servlet技术为我们创建了一个抽象类HttpServlet。在开发中,一般继承该接口即可
配置方法
在servlet3.0之前,所有的配置都只能通过WEB-INF/web.xml文件进行配置。在servlet3.0面世之后,我们可以通过注解的方式(当然可以同时使用注解和xml进行配置)配置。
Listener
以ServletContextListener为例,有两种配置方式
定义一个ServletContextListener的实现
public class FirstServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("容器初始化");
// 从ServletContextEvent获取ServletContext.
ServletContext servletContext = sce.getServletContext();
// 第三种配置filter的方式:通过ServletContext动态设置Filter
FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("FirstFilter", FirstFilter.class);
filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD),
false, "/*");
// 第三种配置servlet的方式:
ServletRegistration.Dynamic servletRegistration = servletContext.addServlet("ThirdServlet", ThirdServlet.class);
servletRegistration.addMapping("/servlet3");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("容器销毁");
}
}
- xml方式
com.luhuancheng.listener.FirstServletContextListener
- 注解方式,容器会扫描到被@WebListener注解,把其标记的Listener加入到容器中
@WebListener
// 第二种配置Listener的方式
public class SecondServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("SecondServletContextListener 监听到容器开始初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("SecondServletContextListener 监听到容器开始销毁");
}
}
Filter
- xml方式
SecondFilter
com.luhuancheng.filter.SecondFilter
SecondFilter
/*
- 注解方式
@WebFilter(filterName = "ThirdFilter", urlPatterns = {"/*"})
public class ThirdFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("ThirdFilter init... ");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("ThirdFilter doFilter... ");
chain.doFilter(request, response);
System.out.println("ThirdFilter endFilter... ");
}
@Override
public void destroy() {
System.out.println("ThirdFilter destory... ");
}
}
- 编程式,在ServletContextListener中,动态注册filter
// 第三种配置filter的方式:通过ServletContext动态设置Filter
FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("FirstFilter", FirstFilter.class);
filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD),
false, "/*");
Servlet
- xml方式
FirstServlet
com.luhuancheng.servlet.FirstServlet
FirstServlet
/servlet1
- 注解方式
// 第二种配置Servlet的方式, loadOnStartup=1,指定让容器启动的时候初始化
@WebServlet(urlPatterns = "/servlet2", loadOnStartup = 1) // Servlet3.x注解式配置
public class SecondServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("SecondServlet init...");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("SecondServlet doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("SecondServlet doPost");
}
}
- 编程式,在ServletContextListener中,动态注册Servlet
public class FirstServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("容器初始化");
// 从ServletContextEvent获取ServletContext.
ServletContext servletContext = sce.getServletContext();
// 第三种配置servlet的方式:
ServletRegistration.Dynamic servletRegistration = servletContext.addServlet("ThirdServlet", ThirdServlet.class);
servletRegistration.addMapping("/servlet3");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("容器销毁");
}
}
- 编程式,在ServletContainerInitializer中,动态注册Servlet
// Servlet3.x提供的方式:在容器初始化时,给开发框架时提供定制化配置的机会.
// 需要在resources/META-INF/services/javax.servlet.ServletContainerInitializer文件中列出该类(可以有多个)
// 第四种配置servlet的方式:通过HandlesTypes注解收集指定的接口(或抽象类)的实现类
@HandlesTypes(value = AbstractServlet.class)
public class FirstServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set> c, ServletContext ctx) throws ServletException {
if (c != null) {
for (Class cls : c) {
System.out.println(cls.getName());
ServletRegistration.Dynamic servletRegistration = ctx.addServlet("FourServlet", (Class) cls);
servletRegistration.addMapping("/servlet4");
}
}
System.out.println("FirstServletContainerInitializer: 对容器进行初始化配置,可以进行filter、servlet的注册, 以及配置参数等");
}
}