这里写目录标题
- 1.Servlet
- 1.1 入门
- 1.2 什么是Servlet
- 1.3 Servlet的作用
- 1.4 Servlet生命周期
- 1.5 Servler的体系结构
- 1.6 Servler的两种配置方式
- 2.Filter
- 2.1 Filter拦截路径配置
- 2.2 过滤器链
- 2.2 入门
- 2.3 过滤器链
- 2.4 过滤器生命周期
- 3.Listener
- 3.1 监听器分类
- 3.1.1 一类监听器
- 4.ServletContext
- 4.1 ServletContext的生命周期
- 4.2 ServletContext的作用
- 5.Cookie
- 5.1 Cookie的分类
- 5.2 Cookie唯一标识
- 6.Session
1.Servlet
Servlet是JavaWeb三大组件之一,且最重要.
- Servlet
- Filter
- Listener
Servlet是javaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
1.1 入门
1.导入Servlet依赖坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
2.自定义类实现Servlet接口,并重写接口中的所有方法
public class ServletDemo implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init执行");
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service执行");
}
public String getServletInfo() {
return null;
}
public void destroy() {
System.out.println("destroy执行了");
}
}
3.在类上使用@WebServlet 注解,配置该 Servlet的访问路径
@WebServlet("/demo")
public class ServletDemo implements Servlet {
}
1.2 什么是Servlet
servlet是用来给浏览器响应动态资源
1.3 Servlet的作用
用来处理客户端发送过来的请求,并对该请求进行响应
- 获取请求数据
- 处理请求
- 完成响应
1.4 Servlet生命周期
- 当用户通过浏览器首次访问某个Servlet时,tomcat会调用servlet的构造函数创建
一个Servlet对象,之后调用servlet下的init方法(仅执行一次) - 调用servlet下的service方法,在service方法中判断本次是GET/POST方法,调用servlet下的doget/dopost方法
- 以后从客户端浏览器每次向服务端对当前servlet发起请求,仅仅只执行其下的
service__>doget/dopost - 停止服务器(正常/中断)/重新加载项目 servlet销毁
正常停止服务器/重新加载项目会执行destory方法
1.5 Servler的体系结构
我们将来开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会继承HttpServlet
@WebServlet("/demo2")
public class HttpServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get方法执行");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post方法执行");
}
}
1.6 Servler的两种配置方式
Servlet 从3.0版本后开始支持使用注解配置,3.0版本前只支持 XML 配置文件的配置方式
- 注解方式:
- xml方式:
2.Filter
作用:在HttpServletRequest到达 目标资源(Servlet/jsp,png,css.js) 之前,拦截客户的HttpServletRequest .根据需要检查HttpServletRequest,也可以修HttpServletRequest 头和数据.
2.1 Filter拦截路径配置
Filter 可以根据需求,配置不同的拦截资源路径
- 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截。
- 目录拦截:/user/*:访问/user下的所有资源,都会被拦截
- 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
- 拦截所有:/*:访问所有资源,都会被拦截
2.2 过滤器链
- 一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链
- 注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序
2.2 入门
@WebFilter("/*")
public class MyFirstFilter implements Filter {
static {
// 加载:JVM将硬盘上的MyFirstFilter.class字节码中的内容通过流的方式读取到内存
System.out.println("字节码正在被加载到内存.....");
}
public MyFirstFilter() {
System.out.println("构造函数被执行了");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("正在初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter begin");
//放行,继续访问本次的目标资源,本次请求的是index.jsp,index.jsp目标资源
//chain.doFilter(request, response);
System.out.println("doFilter end");
}
@Override
public void destroy() {
System.out.println("destroy被执行了");
}
}
2.3 过滤器链
注解配置Filter,而这种配置方式的优先级是按照过滤器类名(字符串)的自然排序。
比如有如下两个名称的过滤器 : BFilterDemo 和 AFilterDemo 。那一定是 AFilterDemo 过滤器先执行。
这个也是注解配置过滤器链的缺点
2.4 过滤器生命周期
- 服务器启动就创建
- 当过滤器文件发生改变/服务器正常关闭,会执行destroy方法,销毁过滤器
如果中断服务器,destroy方法没有执行,过滤器会被销毁
Filter的生命周期和WEB应用的生命周期一致(ServletContext)
Web核心技术之Filter过滤器
复习_过滤器
3.Listener
监听器可以监听就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件
Listener分类:JavaWeb中提供了8个监听器
3.1 监听器分类
一类监听器:监听域对象的创建和销毁
- 监听ServletContext的创建和销毁
- 监听session的创建和销毁
- 监听request的创建和销毁
二类监听器:监听域对象的属性变更
- 监听ServletContext域对象的属性变更
- 监听Session域对象的属性变更
- 监听request域对象的属性变更
所谓的域对象的属性变更,就是向域对象中进行以下操作时
- *.setAttribute(name,obj);
- *.removeAttribute(name);
- *.getAttributeNames();
- *.getAttribute(name);
三类监听器:监听JAVABEAN对象在Sessioin中的状态变更(绑定,解绑,钝化,活化)
- 1.当我们将一个JAVABEAN对象绑定在Session中时,称为JAVABEAN对象被绑定了
session.setAttribute(“k1“,new User()); - 2.当我们将一个JAVABENA对象从Session中移除时,称为JAVABEAN对象被解绑了.
session.removeAttribute(“k1“); - 3.服务器正常关闭的时候,session被序列化到硬盘上了.当session中的对象也被序列化到硬 盘上,这个过程称之为钝化
- 4.当服务器再次启动的时候,将硬盘上的session读取到内存,而且session中的对象也被读
取到内存,这个过程称之为JAVABEAN对象的活化
3.1.1 一类监听器
1.监听ServletContext的创建和销毁
@WebListener
public class ServletContextListenerDemo implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext被创建了");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext被销毁了");
}
}
应用场景:
- contextInitialized:取配置文件是非常耗时的事情,我们可以将读取配置文件等类似程序放置在监听ServletContext的区域来执行
- contextDestroyed:可以将WEB中我们声明过的资源在这里统一进行回收
2.监听Session的创建和销毁
@WebListener
public class SessionListenerDemo implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("session被创建了");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("session被销毁了");
}
}
session的生命周期
- 何时创建
访问服务端的动态资源首次遇到request.getSession(); - 何时销毁
- session.invalidate();
- session超时
- 非正常关闭服务器
应用场景:
- 通过监听session的创建和销毁我们可以粗略的估计某段时间内,访问web的人数
- 如果有需要,我们可以通过监听session的销毁:我们可以将session中的数据保存下来
3.监听Request的创建和销毁
…
4.ServletContext
Tomcat启动的时候,需要识别webapps下的各个WEB应用,识别各个WEB应用的同
时为每个WEB应用创建对应的对象ServletContext,一个WEB应用对应一个
ServletContext.
每个ServletContext中都有一个很大的MAP,并且tomcat在启动之初就向
这个MAP中放入了大量的键值对的数据.当然我们也可以通过程序向这个大的MAP中
放入键值对的数据.
注意:一个web应用对应唯一的一个ServletContext对象
4.1 ServletContext的生命周期
同整个web应用的生命周期一致
4.2 ServletContext的作用
-
1.如何获取ServletContext对象
ServletContext servletContext=getServletContext(); -
2.多个Servlet之间共享数据
由于一个WEB应用只有一个ServletContext对象,当我们在访问服务端的Servlet时,都可以在Servlet中获取到当前应用唯一的ServletContext对象,所以可以利用ServletContext对象来实现共享数据. -
3.获取到WEB项目下指定资源
-
4.获取到整个WEB全局的配置信息
-
5.获取到文件的mime类型
5.Cookie
客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问
Cookie是保存在客户端的,Session是保存在服务端的
5.1 Cookie的分类
- 会话级别:不设置有效期,默认的,关闭了浏览器Cookie就销毁了.
- 持久级别:设置有效期,关闭浏览器也不会销毁的Cookie.
5.2 Cookie唯一标识
domain(域名) + path(路径) + name
如果路径和名称一样,两次addCookie(),后者将覆盖前者。
Cookie
6.Session
服务端会话跟踪技术:将数据保存到服务端