动态注册
容器启动时,将组件注册在web.xml。所有我们也应当容器启动时将组件动态注册。
1.创建一个监听容器启动监听器。并将组件注册到其中。
package com.javaweb.servlet3.listeners;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRegistration;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyServletContextListener implements ServletContextListener {
public MyServletContextListener() {
// TODO Auto-generated constructor stub
}
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
public void contextInitialized(ServletContextEvent sce) {
//获取servlet上下文
ServletContext servletContext = sce.getServletContext();
//servlet名字和class名,可以放到xml文件。
String servletname="some-Servlet";
String classname="com.javaweb.servlet3.serlvets.SomeServlet";
//注册servlet
ServletRegistration.Dynamic servlet = servletContext.addServlet(servletname, classname);
//设置servlet<url-parttern/>
servlet.addMapping("/some");
//filter 的名字和class名
String filtername = "Some-filter";
String filterClassname="com.javaweb.servlet3.filters.SomeFilter";
//注册filter
FilterRegistration.Dynamic Filter = servletContext.addFilter(filtername, filterClassname);
//参数1设置filterDispathcerType值,参数3监听的对象,可以是servletname
Filter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
String ListenerClassname="com.javaweb.servlet3.listeners.MyRequestListener";
servletContext.addListener(ListenerClassname);
}
}
2.需要动态注册的组件
(1)Servlet
public class SomeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("执行Somservlet");
}
}
(2)filter
public class SomeFilter implements Filter {
public SomeFilter() {
// TODO Auto-generated constructor stub
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("filter注册成功");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
(3)Listener
public class MyRequestListener implements ServletRequestListener{
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
System.out.println("listener被注册了");
}
}