8.监听器
=================================================
注册监听器两种方法:
1.@WebListener注解
@WebListener
public class ListenerClass implements ListenerInterface{}
2.web.xml中使用一个listener元素。
<listener>
<listener-class>fully-qualified listener class</listener-class>
</listener>
Servlet Context监听器 -- 实现接口ServletContextListener
1.ServletContextListener:对ServletContext的初始化和解构做出响应。
void contextInitialized(ServletContextEvent event); --->主要重写的方法
void contextDestroyed(ServletContextEvent event);
2.ServletContextAttributeListener:
void attributeAdded(ServletContextAttributeEvent scae);
void attributeRemoved(ServletContextAttributeEvent scae);
void attributeReplaced(ServletContextAttributeEvent scae);
Session监听器 -- 实现接口HttpSessionListener
1.HttpSessionListener
2.HttpSessionActivationListener
3.HttpSessionAttributeListener
4.HttpSessionBindingListender
用户计数器实例
ServletRequest监听器 -- 实现接口ServletRequestListener
1.ServletRequestListener
2.ServletRequestAttributeListener
3.AsyncListener
用户访问时间
9.过滤器
=================================================
过滤器是指拦截请求,并对传给被请求资源的ServletRequest或ServletResponse进行处理的一个对象。
Filter API
包括:Filter,FilterConfig和FilterChain。
过滤器必须实现javax.servlet.Filter接口。3个方法:
void init(FilterConfig filterConfig);
void doFilter(ServletRequest req, ServletResponse resp, FilterChain fc);
void destory()
FilterConfig接口的方法:
public String getFilterName();
public ServletContext getServletContext();
public String getInitParameter(String name);
public Enumeration<String> getInitParameterNames();
FilterChain接口的方法:
public void doFilter(ServletRequest request, ServletResponse response);
配置过滤器方法:
1.@WebFilter注解
2.web.xml中使用filter和filter-mapping元素
<filter>
<filter-name>xxx</filter-name>
<filter-class>yyy</filter-class>
</filter>
<filter-mapping>
<filter-name>xxx</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
范例1:日志过滤器
范例2:图片保护过滤器
范例3:下载计数过滤器
过滤器的顺序:按web.xml中写的顺序调用。
10.应用程序设计
配置JNDI Datasource步骤:
1.拷贝JDBC驱动mysql-connector-java-5.1.44-bin.jar到tomcat/lib/目录下。
2.Context配置:META-INF/context.xml
<Context>
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxTotal="100" maxIdle="30" maxWaitMillis="10000"
username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.15.45:3307/a_spider_test"/>
</Context>
3.web.xml配置:WEB-INF/web.xml
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
4.编写代码:
Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/TestDB");
Connection con = dataSource.getConnection();
12.异步处理
=================================================
异步Servlet,Filter
1.方法一:WebServlet注解
@WebServlet(asyncSupported=true ...)
@WebFilter(asyncSupported=true ...)
2.方法二:利用web.xml中的servlet或filter元素的元素async-supported。
<servlet>
<servlet-name>AsyncServlet</servlet-name>
<servlet-class>servlet.MyAsyncServlet</servlet-class>
<async-supported>true</async-supported>
</servlet>
编写异步Servlet步骤:
1.在ServletRequest中调用startAsync().返回一个AsyncContext;
2.在AsyncContext中调用setTimeout(),设置一个容器必须等待指定任务完成的毫秒数。任务没在规定时间完成,将抛出异常;
3.调用asyncContext.start方法,传递一个Runnable;
4.任务完成时,通过Runnable调用asyncContext.complete方法或者asyncContext.dispatch方法;
=================================================
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("===============>start");
AsyncContext context = req.startAsync();
req.setAttribute("mainThread", Thread.currentThread().getName());
context.setTimeout(5000);
context.start(()->{
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("=============>thread");
req.setAttribute("workerThread", Thread.currentThread().getName());
context.dispatch("/jsp/threadNames.jsp");
});
}
}
=================================================
异步监听器
void onComplete(AsyncEvent event) throws IOException;
void onTimeout(AsyncEvent event) throws IOException;
void onError(AsyncEvent event) throws IOException;
void onStartAsync(AsyncEvent event) throws IOException;
asyncContext.addListener(new MyAsyncListener())
15.安全性
=================================================
conf/tomcat-users.xml文件可以创建用户和角色。
javax.servlet.annotation中与安全相关的3个注解类型:
1.ServletSecurity
2.HttpConstraint
3.HttpMethodConstraint