JavaWeb三大组件Servlet,Filter,Listener
ServletServlet可以理解为一个接口,提供前后端交互可以从后端获取数据,并传入前端也可以从前端获取数据,使用后端逻辑Servlet生命周期:Servlet的生命周期开始于项目运行,并且在一个项目中,通常情况下,一个Servlet之后初始化建立一次第二次访问通过一个对象,当项目关闭时,Servlet就消亡了,生命周期结束Servlet线程不安全前面的文章...
Servlet
Servlet可以理解为一个接口,提供前后端交互
可以从后端获取数据,并传入前端
也可以从前端获取数据,使用后端逻辑
Servlet生命周期:
Servlet的生命周期开始于项目运行,并且在一个项目中,通常情况下,一个Servlet之后初始化建立一次
第二次访问通过一个对象,
当项目关闭时,Servlet就消亡了,生命周期结束
Servlet线程不安全
前面的文章就有提到,使用Servlet时会涉及到线程不安全
就是因为使用了域对象或者全局变量的原因
ServletContext
(1)ServletContext管理所有servlet,ServletContext是servlet他爹。
(2)ServletContext生命周期:天地同寿,项目启动就有了。
(3)ServletContext也是域对象,生命周期最长的对象,不要轻易往ServletContext写数据。
可以通过这个方法获取到文件的绝对路径,在实现文件上传时会用到
String path = getServletContext().getRealPath("文件夹");
过滤器Filter
使用场景:
用户登录之后,将用户信息放置到Session中,访问一些个人相关的页面,只有session存在用户信息才能访问(只有登录成功之后才能访问。)
访问所有的servlet之前都需要 先从Session里面去除用户信息进行判断
Filter是什么
这个filter就相当于路上的关卡,设了几道关卡就要拦截几次,只要有一个拦截器没通过,这个请求就结束了。
每一个关卡认为是一个功能
建立Filter
方法一:传统方法,建立好Filter后在web.xml中配置,此处,如果没有登录信息就访问其他页面,是不成功的:
import javax.servlet.*;
import java.io.IOException;
public class Filter implements javax.servlet.Filter {
public void destroy() {
System.out.println("destroy");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("doFilter");
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
resp.setContentType( "text/html;charset=utf-8" );
String uri = request.getRequestURI();
User user = (User) req.getAttribute( "user" );
if(user !=null || uri.contains( "login" )){
chain.doFilter( req, resp );
}else {
response.getWriter().write( "{\"code\":1,\"message\":\"未登入\"}" );
}
}
public void init(FilterConfig config) throws ServletException {
System.out.println("init");
}
}
<filter>
<filter-name>Filter</filter-name>
<filter-class>com.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter</filter-name>
<!--
完全匹配:/userServlet
目录匹配:/servlet/*,请求路径包含/servlet/
扩展名匹配:*.action/ *.jsp
-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
方式二:注解方式:
@WebFilter(filterName = "Filter",urlPatterns = {"","",""}) //要过滤的Servlet
监听器Listener
是什么
监听器就是监听某个对象的状态 发送变化的组件。
事件源:被监听的对象
监听器:监听事件源的对象。
相应的行为:监听的事件发生了,应该怎么处理。
8个监听器
接口名 | 作用 |
ServletContextListener | servletContext对象的创建 |
HttpSessionListener | Session对象的创建 |
ServletRequestListener | Request对象的创建 |
ServletContextAttibuteListener | servletContext属性变化 |
HttpSessionAttributeListener | Session属性变化 |
ServletRequestAriibuteListenr | Request属性变化 |
HttpSessionActivationListener | Session钝化与活化 |
HttpSessionBindingListener | Session与对象的绑定 |
6个分别是对3个域对象(ServletContext、HttpSession、ServletRequest)的监听,每个域对象分别对应 (监听创建和销毁)、(属性的变化)。
HttpSessionBindingListener:
用户成功登陆之后,一般会将用户信息(User)存储在Session中,会触发该事件
从Session中将User对象移除的时候,也会触发该事件。
HttpSessionActivationListener:
钝化:将内存中Session持久化磁盘中。
活化:将磁盘上的Session恢复到内存中。
建立监听器:
方法一,直接建立,通过web.xml文件配置,本监听器的作用是设置一段时间,在该时间之后,每隔一秒输出一次我被调用
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
public class Listener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext创建");
/**做一些准备工作:
* (1)初始化对象,初始化数据加载,加载数据库驱动,连接池初始化
* (2)一些配置文件的加载,
* (3)定时任务调度---定时器 */
Timer timer = new Timer();
Calendar calendar = Calendar.getInstance();
calendar.set( Calendar.HOUR,5 );
calendar.set( Calendar.MINUTE,0 );
calendar.set( Calendar.SECOND,0 );
SimpleDateFormat sf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
System.out.println(sf.format( calendar.getTime()));
timer.scheduleAtFixedRate( new TimerTask() {
public void run() {
System.out.println("我被调用了");
}
},calendar.getTime(),1000 );
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext死亡");
}
}
配置web.xml
<listener>
<listener-class>com.Listener</listener-class>
</listener>
方式二,注解:
@WebListener()
更多推荐
所有评论(0)