目录
(一)、实现Servlet接口或者继承HttpServlet类
(二)、重写HttpServlet类的doGet()和doPost()方法
(三)、配置web.xml文件或者使用注解对servlet进行配置
1、首先在maven配置文件pom.xml中导入Servlet - API的依赖
(一)、通过web.xml文件来配置load-on-startup(tomcat启动时就加载)优先级
(二)、通过注解来配置load-on-startup(启动时加载)优先级
编辑 (二),获取浏览器传递过来的参数,post、get都一样
3. 获取一个key对应多个值,比如获取checkbox的值
(三),解决通过post请求获取浏览器传递过来的数据乱码问题
2.方式2: 设置编码格式(推荐使用,但是不适用于get请求)
1、转发 — 也就是携带客户端发送的请求转发跳转到下一个页面,使用的是request请求对象。
2、重定向 — 服务器接收到前端请求,通过响应将要跳转的页面地址响应给客户端,客户端再重新发送请求跳转到目标页面。
1.共享数据方法: setAttribute, getAttribute,removeAttribute
3、ServletContext(不推荐使用):应用服务器,跨多个浏览器,只要不关闭服务器,永远存在数据。如果存储过多会导致内存泄漏;
(八)、多个Filter(过滤链(FilterChain))执行顺序
1、ServletContext共享范围,属性新增、属性更改、属性删除
一、Servlet简介
Servlet是Server Applet的简称,翻译过来就是服务程序。是由sun公司提供的一门用于开发动态Web资源的技术。简单的讲,Servlet就是运行在服务器上的一个小程序,用来处理服务器接收到的请求。
二、Servlet的作用
接受前端请求处理数据给浏览器响应数据
servlet在其中承担的作用是Controller(控制器),起到对数据进行操作的作用。
三、Servlet处理的信息有哪些
Servlet底层的实现类以及实现类的子类。
我们看一下servlet接口定义那些规范(接口)
- void init(ServletConfig var1):初始化方法,对象创建成功以后默认调用一次,且只调用一次
- ServletConfig getServletConfig():Servlet配置对象
- void service(ServletRequest var1, ServletResponse var2):提供前后端交互的服务方法 核心方法
- String getServletInfo():获取Servlet信息
- void destroy():摧毁方法 ,释放内存空间
还有GenericServlet实现类,该实现类中的service()方法没有实现接口中对应的方法,而是继续抽象下去。增强了servlet接口的功能,增加其他功能
继续查找service()方法是在哪个类中实现的。随之就找到了HttpServlet这个子类
我们找到service方法,service就是对我们的请求进行处理。客户端传过来的请求类型进行判断,更具传过来的类型执行对应的处理请求数据的方法 ;
四、Tomcat介绍
(一)、tomcat的作用
tomcat是Web 应用服务器,专门运行Web应用 的服务器软件程序;
(二)、tomcat的优点
- 中小型应用系统常用的应用服务器,免费,没有实现JavaEE所有规范 支持jsp及servlet规范;
- 轻巧灵活的 免费 web应用服务器
(三)、tomcat目录结构介绍
- bin:命令目录
- conf:配置目录
- lib:jar包目录
- logs:日志目录
- temp:临时数据目录
- webapps:部署目录 开发的项目需要部署在该目录下,才能被服务器运行
tomcat服务器启动的时候,会读取 conf 下配置文件 以及 webapps下各个项目的web.xml文件!
五、Servlet的开发流程
(一)、实现Servlet接口或者继承HttpServlet类
(二)、重写HttpServlet类的doGet()和doPost()方法
(三)、配置web.xml文件或者使用注解对servlet进行配置
1、首先在maven配置文件pom.xml中导入Servlet - API的依赖
2、使用web.xml配置servlet访问路径
我们解释一下为什么要这么配置
-
<servlet> :我们知道tomcat服务器启动会读取web.xml文件,当读到<servlet>告诉tomcat创建一个对象 (注册一个Servlet)
-
<servlet-name>RegiesterLx05</servlet-name>:给servlet创建的对象起个名字
- <servlet-class>com.zxb.web.test01Lx.RegiesterLx05</servlet-class>:从上面我们知道需要注册一个tomcat对象,那我们需要注册那个类的对象呢?我们需要告诉对应类的路径。为什么要告诉类的路径,它是怎么创建的呢? **反射** 通过反射创建。这行的配置就是
4. <servlet-mapping>:配置访问路径与注册的类的关系
5. <url-pattern>:表示访问 /RegiesterLx05 路径,就是访问RegiesterLx05对象的类;
3、使用注解配置servlet访问路径
注意:配置访问路径,注解和web.xml两者二选一即可,避免混淆!
(四)、重新doget、dopost方法
六、Servlet的生命周期
所谓生命周期,就是Servlet什么时候创建,调用了何种方法,最后在什么时候被销毁。我们之前学过的对象都是自己手动创建的,最后由JVM来销毁,而Servlet的整个生命周期,都是由tomcat服务器来控制的。
由上图所示,程序运行后得出结论,Servlet的生命周期是:
实例化 (构造方法)--》初始化(init方法) --》多次调用service服务 (对应get、post方法)--》 tomcat容器关闭时销毁(destroy方法)
默认情况下Servlet是在第一次访问的时候实例化和初始化的
第一次访问就会调用service()服务方法
直到关闭服务器时,Servlet才会被销毁
(一)、通过web.xml文件来配置load-on-startup(tomcat启动时就加载)优先级
(二)、通过注解来配置load-on-startup(启动时加载)优先级
注意:配置load-on-startup启动时加载时,web.xml和注解两种方式,二选一即可。
七、Servlet获取参数的方法
(一),从web.xml文件中传递参数。获取参数
1. 获取单个Servlet的参数数据
2. 获取全局参数
(二),获取浏览器传递过来的参数,post、get都一样
从浏览器发送数据,浏览器发送的数据都是存在HttpServletRequest中
1. 单个数据获取
2. 获取所有请求数据,返回一个枚举
3. 获取一个key对应多个值,比如获取checkbox的值
4. 获取所有请求数据,返回一个Map
(三),解决通过post请求获取浏览器传递过来的数据乱码问题
什么情况下会乱码?原因是:编码和解码按照标准不一致;
为什么浏览器发送过来的数据,idea显示乱码?
数据的传递路径:浏览器发送数据----->tomcat------------------->idea;
我们发现浏览器将数据发送给tomcat,tomcat进行编码和解码,在发送给idea,idea在解码发现乱码。
原因就是:tomcat使用的编码格式 "ISO-8859-1",idea使用的"UTF-8"进行解码
1.方式1: 逆向解码
逆向解码是,获取到的数据按照原有的编码格式解码后,在使用当前的编码格式进行编码(不适用多次数据传输过程中多次的编码,多次解码的场景)
2.方式2: 设置编码格式(推荐使用,但是不适用于get请求)
get请求传递中文参数,不会进行乱码,因为idea给处理了
八、Servlet响应页面和数据
(一)、Servlet响应页面
响应页面,也就是收到前端的请求响应需要跳转的页面。Servlet响应页面有转发和重定向两种方式
1、转发 — 也就是携带客户端发送的请求转发跳转到下一个页面,使用的是request请求对象。
2、重定向 — 服务器接收到前端请求,通过响应将要跳转的页面地址响应给客户端,客户端再重新发送请求跳转到目标页面。
(二)、Servlet响应数据
我们知道如果将一个数据传送到另一个地方,需要通过流来完成(流就是通道,数据就是通道里面的
1.设置响应编码格式
2.使浏览器按照指定编码格式解码
九、Servlet 共享范围(共享域)
(一)、共享数据介绍
1.共享数据方法: setAttribute, getAttribute,removeAttribute
- pageContext 可以共享数据 jsp页面里
- request 可以共享数据 一次请求 一个request
- session 可以共享数据 浏览器和服务器的连接(一个有效时常) 是一个业务
- servletContext == application 可以共享数据 共享范围最大
如上4种对象其共享数据范围不同。
- pageContext 简称 page 范围,其共享范围仅限于 JSP 页面内部,相当于JSP内部的局部变量。
- request 范围,是一次请求过程范围
- session 范围,是一次用户会话过程范围,浏览器不关闭与服务器的多次请求的范围。
- application 范围,是最大的共享范围,一个Web应用的全体Servlet、JSP共享的范围。 适合保存公共静态数据。
使用建议:
- 数据共享范围越小越好,最常用的是 request
- 与当前用户有关的数据,共享到 session,比如用户登录状态
- 全局数据,可以共享到 application (不建议用)
(二)、三种共享范围使用
场景:比如servlet1的功能不满足,需要使用servlet2的功能。我们怎么将请求servlet1的参数,在servlet1中传递给servlet2 ?
我们可以使用request数据共享范围
1、request: 一次请求范围,仅限本次请求的范围
浏览器访问,提交数据。我们就会发现服务端将请求转发到/RegiesterLx11上。打印出数据
2、session:浏览器和服务端会话范围内数据共享
我们发现使用session共享范围,不需要指定转发路由。因为session是浏览器的会话,浏览器只要和服务端保持会话,你访问任何路径都可以获取到session共享范围内的数据。
我们在同一个浏览器,调用post请求,访问/RegiesterLx13路径,获取到session共享的数据
3、ServletContext(不推荐使用):应用服务器,跨多个浏览器,只要不关闭服务器,永远存在数据。如果存储过多会导致内存泄漏;
ServletContext设置的共享数据,只要一次设置,在不同的访问路径,不同的浏览器都可以获取到共享范围的数据。
我们在chrome端访问/RegiesterLx15获取数据,我们在iE上访问/RegiesterLx15获取数据,我们发现都可以获取到数据;
十、Filter 过滤器
(一)、Filter定义
Filter是一个过滤器或者拦截器,它是一个部署在web应用的组件。
(二)、Filter作用
Filter可以设置被客户访问的资源(静态资源和动态资源)的执行,如果请求路径配置了Filter,所有的请求资源都会先交给Filter进行处理,然后由Filter觉得是否访问目标资源,带目标资源执行完毕,请求会再次交给Filter处理
(三)、Filter在实际项目中的作用
Filter不会像 Servlet那样,直接给客户端访问提供服务;在实际应用中,Filter经常被用于过滤请求和保护资源,主要体现在如下几点:
- 改变请求或者响应头信息
- 字符集编码统一
- 登陆身份验证
- 记录日志
- 权限认证
- XML 转换
- 请求和响应包装
(四)、Filter的实现
必须实现 javax.servlet.Filter接口,该接口中定义了实现过滤器的接口方法;
- 初始化方法:init(),Filter被实例化后调用
- 过滤方法:doFilter(),客户请求到来时调用
- 销毁方法:destory(),在 Filter实例被卸载之前调用
(五)、Filter的生命周期
Filter的生命周期与 Servlet类似,在web应用装载的时候,系统会自动创建Filter对象调用构造方法并且调用init方法,然后将其缓存到tomcat服务器中,当Filter过滤资源被访问时,系统会自动调用Filter对象的doFilter()方法,当系统关闭的时候,调用Filter对象的destory()方法。一旦destory方法执行完退出,Filter对象就会被垃圾回收,释放内存空间。
从上面也可以看出,Filter和Servlet对象都是单例模式。不会每次创建对象。
(六)、创建Filter过滤器步骤
- 实现 Filter接口
- 配置 web.xml文件
- 部署服务器
(七)、Filter过滤器结合Servlet 的生命周期
注意: 如果那个Filter的doFilter方法中没有chain.doFilter(req, resp)方法代码,当执行那个Filter的doFilter方法时,代码一直停留该方法内,不会继续执行,不会执行到Servlet的方法。
(八)、多个Filter(过滤链(FilterChain))执行顺序
我们可以发现
- 服务器不同Filter实例的创建先后顺序与,web.xml文件中Filter配置的<filter>的位置无关;
- Filter的 doFilter的执行顺序,是按照web.xml文件中Filter配置的<filter-mapping>的顺序执行,由上至下,依次执行。
(九)、Filter使用
统一字符集
2、 登录校验![](https://img-blog.csdnimg.cn/17b9ec34dbd24ae989cfa5e37aa16caa.png)
十一、Listener 监听器
(一)、监听器简介
主要用于监听域(共享范围)对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件 ;
(二)、监听对象、监听内容、监听作用
1、监听对象
- ServletContext:整个应用只存在一个
- HttpSession:针对每一个对话
- ServletRequest:针对每一个客户请求
2、监听内容
对象的创建、销毁、属性改变事件
3、监听作用
可以在事件发生前、发生后进行一些处理,一般可以用来统计在线人数和在线用户、统计网站访问量、系统启动时初始化信息等
(三)不同共享范围,对象创建和销毁
1、ServletContext共享范围
1.1、实现接口
1.2 创建
我们可以看见,当启动Tomcat启动,完成装载,执行contextInitialized方法,关闭Tomcat,销毁对象,执行contextDestroyed方法
2、Session 共享范围
2.1 Session 什么创建,什么时候销毁
- 当浏览器和服务器第一次建立连接,就会创建一个Session,浏览器再次访问服务器,Session没有销毁,就不会继续创建(单例模式)。
- 当Session失效了,就会进行销毁。我们可以通过服务器设置Session失效时间,不设置默认就是30分支
2.2 设置Session失效时间
在web.xml 设置。不设置默认30分钟,这里单位是分钟 ,下面代表1分钟后失效。
2.3 实现接口
- 浏览器启动首次访问,服务端,生成session对象,执行创建触发的方法;
- session失效后,执行销毁的方法;
- session有效器同一个浏览器多次访问服务端,不会继续生成session,不会执行创建触发的方法 ;
- session失效后,同一个浏览器再次访问服务端,会生成新的session对象,执行创建触发的方法;
3、request共享范围
每次请求url就会创建一个request对象,执行完成,销毁对象
3.1、实现接口
没访问一次url,就会创建request对象,执行完成后,销毁request对象
(四)不同共享范围,属性的改变
1、ServletContext共享范围,属性新增、属性更改、属性删除
1.1、实现接口
2、Session共享范围,属性新增、属性更改、属性删除
2.1、实现接口
3、Request共享范围,属性新增、属性更改、属性删除
3.1、实现接口
(五)、监听器使用,统计网站访问量、活跃量
十二、Cookie
(一)、cookie机制
当客户第一次访问服务器的动态资源的时候,服务器端会给客户端写一小段数据(cookie),cookie存放在客户端的硬盘上(浏览器缓存),下次再访问服务器浏览器会带着对应的cookie一起访问服务器,服务器根据cookie中的内容,来识别你是哪个客户端。如果cookie有效期为0,那么不会写在硬盘上,而是保存在浏览器的缓存中(浏览器关闭,cookie会被删除);如果cookie有效期大于0,例如:cookie = 60 ,客户端访问浏览器,cookie60s后会被删除。如果60s后关闭浏览器,则需求重新登录。如果60s后不关闭浏览器,可以继续使用;cookie有效期小于0,删除cookie;
(二)、cookie常用方法
- setValue(String newValue):给当前 cookie重新赋值
- setComment(String purpose):对该 cookie进行描述的信息(说明作用),浏览器显示 cookie信息时能看到
- setDomain(String pattern):符合该 pattern(域名正则)的就可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该 Cookie。注意第一个字符必须为“.”
- setMaxAge(int expiry):该Cookie失效时间,单位秒。如果为正数,则该Cookie在expiry秒之后失效。如果为0,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为负数,表示删除该Cookie。默认为–1
- setHttpOnly(boolean httpOnly):设为 true后,只能通过 http访问,javascript无法访问,还可防止xss读取
- cookie setPath(String uri):设置Cookie的使用路径。后面紧接着详解。如果设置为“/agx/”,则只有uri为“/agx”的程序可以访问该Cookie。如果设置为“/”,则本域名下的uri都可以访问该Cookie。注意最后一个字符必须为”/”
- setSecure(boolean flag):是否使用安全传输协议。为true时,只有当是https请求连接时cookie才会发送给服务器端,而http时不会,但是服务端还是可以发送给浏览端的
(三)、Cookie 常用场景
自动登陆:保存用户名、密码,在一定时间不用重新登录
十三、Session
是客户端连接服务端的会话,它可以把客户端信息保存在Web服务器中
(一)、Session机制
客户端浏览器第一次访问服务器动态资源的时候,服务器会给每个客户端咱内存中分配一个内存空间(session),并且会为该空间取一个唯一标识(JSESSIONID-->D93A0D048044E9B37C420BBF2DE8F51D),服务器通过Cookie技术,将Session的唯一标识,发送给客户端,客户端每次请求服务端,cookie里面就会带上Session的唯一标识。服务端通过唯一标识来确定那个空间是属于该客户的;
(二)、Session 常用方法
(三)、Session使用场景
- 网上商城中的购物车
- 保存登陆用户的信息
- 将某些数据放入到 session 中,供同一用户的各个方面使用
- 防止用户非法登陆到某个页面
(四)、Session 与 Cookie 区别
- 存在的位置:cookie 保存在客户端,session 保存在服务器端
- 安全性:比较而言,cookie 的安全性比 session 要弱
- 网络传输量:cookie 通过网络在客户端与服务器端传输,而 session 保存在服务器端,不需要传输
(五)、注意事项
- session 中属性存在的默认时间是30min,可以通过修改 web.xml 改变存在的时间 上面说的这个 30min 指的是用户的发呆时间,而不是累计时间
- 当某个浏览器访问网站时,服务器会给浏览器分配一个唯一的 session id,并以此来区分不同的浏览器
- 因为 session 的各个属性要占用服务器的内存,因此软件公司都是在迫不得已的情况下才使用