-
Servlet体系结构
Servlet:接口
|(继承)
GenericServlet:抽象类
|(继承)
HttpServlet:抽象类
|(继承)
MyServlet extends HttpServletservlet常用方法: void init(ServletConfig config):初始化 void service(ServletRequest request,ServletResponse response):服务 处理业务逻辑 void destroy():销毁 ServletConfig getServletConfig() :获取当前servlet的配置对象 GenericServlet常用方法: 除了service方法没有显示,其他都实现了 空参的Init() 若我们自己想对servlet进行初始化操作,重写这个init()方法即可 HttpServlet常用方法: service做了实现,把参数强转,调用了重载的service方法 重载的service方法获取请求的方式,根据请求方式的不同调用相应doXxx()方法 doGet和doPost方法
-
Servlet生命周期
void init(ServletConfig config)
:初始化
初始化方法
执行者:服务器
执行次数:一次
执行时机:默认第一次访问的时候
void service(ServletRequest request,ServletResponse response)
:服务 处理业务逻辑
服务
执行者:服务器
执行次数:请求一次执行一次
执行时机:请求来的时候
void destroy()
:销毁
销毁
执行者:服务器
执行次数:只执行一次
执行时机:当servlet被移除的时候或者服务器正常关闭的时候serlvet是单实例多线程
默认第一次访问的时候,服务器创建servlet,并调用init
实现初始化操作。并调用一次service
方法
每当请求来的时候,服务器创建一个线程,调用service
方法执行自己的业务逻辑
当servlet被移除的时候或者服务器正常关闭的时候,服务器调用servlet的destroy
方法实现销毁操作。 -
ServletContext
上下文(全局管理者)
一个项目的引用.代表了当前项目.(整个Java项目)
当项目启动的时候,服务器为每一个web项目创建一个servletcontext对象.
当项目被移除的时候或者服务器关闭的时候servletcontext销毁
作用:
1.获取全局的初始化参数
2.共享资源(xxxAttribute)
3.获取文件资源
4.其他操作
获取servletcontext:
方式1:了解
getServletConfig().getServletContext()
方式2:
getServletContext()
上述两种方式没有本质区别,因为
ServletContext
是所有Servlet共享的内容,可以用它进行通信。 常用方法:
1.了解
String getInitParameter(String key)
:通过名称获取指定的参数值
Enumeration getInitParameterNames()
:获取所有的参数名称
在根标签下有一个context-param
子标签 用来存放初始化参数<context-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </context-param>
2.
setAttribute(String key,Object value)
、Object getAttribute(String key)
,可以用此来统计登录总人数之类的信息
3.String getRealPath(String path)
:获取文件部署到tomcat上的真实路径(带tomcat路径)
getRealPath("/")
😄:\javaTools\apache-tomcat-7.0.52\webapps\day09
InputStream getResourceAsStream(String path)
:以流的形式返回一个文件
4.获取文件的mime类型 大类型/小类型
String getMimeType(String 文件名称)
-
ServletConfig
servlet配置对象
作用:
1.获取当前servlet的名称
2.获取当前servlet的初始化参数
3.获取全局管理者
方法:
String getServletName()
:获取当前servlet的名称(web.xml配置的servlet-name)
String getInitParameter(String key)
:通过名称获取指定的参数值
Enumeration getInitParameterNames()
:获取所有的参数名称
初始化参数是放在 web.xml文件
servlet标签下子标签init-param
getServletContext()
:获取全局管理者servletconfig
是由服务器创建的,在创建servlet的同时也创建了它,通过servlet的init(ServletConfig config)
将config对象传递给servlet,由servlet的getServletConfig
方法获取 -
response:响应
-
作用:
往浏览器写东西
组成部分:
响应行 响应头 响应体
操作响应行
格式:
协议/版本 状态码 状态码说明
状态码:
1xx:已发送请求
2xx:已完成响应
200:正常响应
3xx:还需浏览器进一步操作
302:重定向 配合响应头:location
304:读缓存
4xx:用户操作错误
404:用户操作错误.
405:访问的方法不存在
5xx:服务器错误
500:内部异常
常用方法:
setStatus(int 状态码):针对于 1 2 3
了解 :
sendError(int 状态码):针对于 4xx和5xx
操作响应头
格式:key/value(value可以是多个值)
常用的方法:
setHeader(String key,String value)
:设置字符串形式的响应头
setIntHeader(String key,int value)
:设值整形的响应头
setDateHeader(String key,long value)
:设值时间的响应头addHeader(String key,String value)
:添加置字符串形式的响应头 之前设置过则追加,若没有设置过则设置
addIntHeader(String key,int value)
:添加整形的响应头
addDateHeader(String key,long value)
:添加时间的响应头
常用的响应头:
location:重定向
refresh:定时刷新
content-type:设置文件的mime类型,设置响应流的编码及告诉浏览器用什么编码打开
content-disposition:文件下载
重定向:
方式1:
★response.sendRedirect("/day10/loc2");
方式2:response.setStatus(302); response.setHeader("location","/day10/loc2"); 定时刷新: 方案1:设置头 refresh response.setHeader("refresh","秒数;url=跳转的路径"); 方案2:http的meta标签
操作响应体:
页面上要展示的内容
常用方法:
Writer getWriter()
:字符流
ServletOutputStream getOutputStream()
:字节流
自己写的东西用字符流,其他一概用字节流. 处理响应中文乱码:
方式1:★
response.setContentType("text/html;charset=utf-8");
方式2:理解
response.setHeader("content-type", "text/html;charset=utf-8");
注意:
两个流互斥
当响应完成之后,服务器会判断一下流是否已经关闭,若没有关闭,服务器会帮我们关闭.(底层使用的缓冲流) -
-
request:请求
作用:获取浏览器发送过来的数据
组成部分:
请求行 请求头 请求体
操作请求行
格式:
请求方式 请求资源 协议/版本
常用方法:HttpServletRequest
掌握
String getMethod()
:获取请求方式
String getRemoteAddr()
:获取ip地址
String getContextPath()
:在java中获取项目名称 (/day10)了解:
getRequestURI()
:获取的是 从项目名到参数之前的内容 /day10/regist
getRequestURL()
:获取的带协议的完整路径 http://localhost/day10/regist
String getQueryString()
:get请求的所有参数 username=tom&password=123
String getProtocol()
:获取协议和版本
例如:请求行
GET /day10/row?username=tom&password=123 HTTP/1.1操作请求头
格式:key/value(value可以是多个值)
常用方法:
★String getHeader(String key)
:通过key获取指定的value (一个)
了解:
Enumeration getHeaders(String name)
:通过key获取指定的value(多个)
Enumeration getHeaderNames()
:获取所有的请求头的名称
int getIntHeader(String key)
:获取整型的请求头
long getDateHeader(String key)
:获取时间的请求头重要的请求头:
user-agent:浏览器内核 msie firefox chrome
referer:页面从那里来 防盗链操作请求参数 ★
username=tom&password=123&hobby=drink&hobby=sleep
常用方法:
String getParameter(String key)
:获取一个值
String[] getParameterValues(String key)
:通过一个key获取多个值
Map<String,String[]> getParameterMap()
:获取所有的参数名称和值username:tom
---------values---------
hobby:[drink, sleep]
=map===
username::[tom]
password::[123]
hobby::[drink, sleep]请求的中文乱码:
对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码
通用的方法:
new String(参数.getBytes("iso-8859-1"),"utf-8");
针对于post请求来说:只需要将请求流的编码设置成utf-8即可
request.setCharacterEncoding("utf-8");
请求转发:
request.getRequestDispatcher("内部路径").forward(request,response);
-
会话技术
会话技术
当用户打开浏览器的时候,访问不同的资源,知道用户将浏览器关闭,可以认为这是一次会话.
作用:
因为http协议是一个无状态的协议,它记录不论上次访问的内容.用户在访问过程中难免会产生一些数据,
通过会话技术就可以将起保存起来.
例如:
用户登录
验证码
购物车
访问记录
…
分类:
cookie:浏览器端会话技术
session:服务器端会话技术cookie:
小饼干 小甜点
cookie是由服务器生成,通过response将cookie写回浏览器(set-cookie),保留在浏览器上,
下一次访问,浏览器根据一定的规则携带不同的cookie(通过request的头 cookie),我们服务器就可以接受cookie
cookie的api:
new Cookie(String key,String value)
写回浏览器:
response.addCookie(Cookie c)
获取cookie:
Cookie[] request.getCookies()
cookie的常用方法:
getName()
:获取cookie的key(名称)
getValue
:获取指定cookie的值
setMaxAge(int 秒)
:设置cookie在浏览器端存活时间 以秒为单位
若设置成 0:删除该cookie(前提必须路径一致)
setPath(String path)
:设置cookie的路径.
当我们访问的路径中包含此cookie的path,则携带
默认路径:
访问serlvet的路径,从"/项目名称"开始,到最后一个"/“结束
例如:
访问的serlvet路径:
/day11/a/b/hello
默认路径为:
/day11/a/b
手动设置路径:以”/项目名"开始,以"/"结尾;session:
服务器端会话技术.(主要是由服务器设置的,对于tomcat容器来说,当服务端的session被创建时,Response中自动添加了一个Cookie:JSESSIONID:xxxx,再后续的请求中,浏览器也是自动的带上了这个Cookie,服务端根据Cookie中的JSESSIONID取到了对应的session。这验证了一开始的说法,客户端服务端是通过JSESSIONID进行交互的,并且,添加和携带key为JSESSIONID的Cookie都是tomcat和浏览器自动帮助我们完成的,这很关键。)
当我们第一次访问的服务器的时候,服务器获取id,
如果能获取id
要拿着这个id去服务器中查找有无此session
若查找到了:直接拿过来时候,将数据保存,需要将当前session的id返回给浏览器
若查找不到:创建一个session,将你的数据保存到这个session中,将当前session的id返回给浏览器
如果不能获取id
创建一个session,将你的数据保存到这个session中,将当前session的id返回给浏览器获取一个session:
HttpSession request.getSession()
域对象:
xxxAttribute
生命周期:
创建:第一次调用request.getSession()
创建
销毁:
服务器非正常关闭
session超时
默认时间超时:30分钟 web.xml有配置
手动设置超时:setMaxInactiveInterval(int 秒)
了解
手动干掉session
★session.invalidate()
存放的私有的数据. -
四大域对象总结
-
ServletContext
-
生命周期:web应用被加入容器时,创建代表整个web应用的ServletContext对象,当服务器关闭或者该web应用被移除时,ServletContext被销毁
-
作用范围:整个web应用,所有的servlet都能知晓他
-
应用:由于一个web应用中的所有Servlet共享同一个ServletContext对象:因此Servlet对象之间可以通过ServletContext来是实现通讯。ServletContext对象通常也被称为context域对象。
-
多个Servlet通过ServletContext对象实现数据共享。
-
获取web应用的初始化参数(getInitParameter)。
-
用ServletContext实现请求转发(this.getServletContext().getRequestDispatcher().forward())。
-
利用ServletContext对象读取资源文件。
servletContext.getRealPath("/xx.properties")
,servletContext.getResourceAsStream()
。
另外,顺便说一下,如果要在非servlet中获取资源文件,无法取得ServletContext对象,这时候就得通过类加载器ClassLoader来getResourceAsStream()
,此方法通过类加载器将资源文件直接加载到内存中,有更新延迟的问题,适合小文件的读取,对于大资源文件,将会占用较大的内存。还有,通过classLoader也可以获取资源文件路径,具体通过ClassLoader.getResource("/xx.properties").getPath()
,没有更新延迟问题。
-
-
-
ServletRequest
-
生命周期:在service方法前由服务器创建,并作为参数传入service方法内,直到整个请求结束,ServletRequest生命周期才结束。
-
作用范围:整个请求链(包括请求转发)
-
作用:
-
在整个请求链中共享数据,主要可通过getAttribute、setAttribute将数据带到jsp页面中进行显示。
-
获得客户端信息,可通过getRequestURL()、getRequestURI()、getQueryString()、getPathInfo()、getRemoteAddr()、getRemoteHost()、getRemotePort()、getLocalAddr()、getLocalName()。
-
获得客户机请求头,getHeader(String s)、getHeaders(String s)、getHeaderNames()。
-
获得客户机请求参数(客户端提交的数据):getParameter()等。
-
-
-
HttpSession
-
生命周期:
在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。
(1)当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。
(2)如果服务器非正常关闭,没有到期的session也会跟着销毁。
(3)如果调用session提供的invalidate(),可以立即销毁session。
用户打开浏览器访问,创建session(开始),session超时或者被声明失效,该对象生命周期结束; -
作用范围:一次会话(取决于服务端)
-
应用:短时间内访问无需重新登录,长时间则需要设置cookie
-
-
PageContext
- 生命周期:当对JSP的请求开始时创建,当响应结束时销毁。
- 作用域:仅当前JSP页面
-
-
Listener监听器接口
作用:监听三大域对象:ServletContext、ServletRequest、HttpSession
监听内容:监听这三个对象的创建和销毁、属性变化、监听session中javabean的状态
监听三个对象的创建和销毁
ServletContextListener
ServletRequestListener
HttpSessionListener
监听三个对象属性的变化
ServletContextAttributeListener
ServletRequestAttributeListener
HttpSessionAttributeListener
监听session中javabean的状态-
HttpSessionActivationListener(钝化和活化)
当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser”)的形式存储在tomcat 的work 目录下,这个过程叫做Session 的钝化。
当服务器再次正常开启时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢复之前保存起来的Session 对象,这个过程叫做Session的活化。
想要随着Session 被钝化、活化的对象它的类必须实现Serializable 接口
-
HttpSessionBindingListener(绑定和解绑)
检测javabean是否添加到session或者从session中移除
这两个接口需要javabean自己实现
-
-
Filter过滤器
作用:服务器通过URL访问相应的资源的时候,过滤请求和响应
应用:自动登录、统一编码、过滤关键字等
生命周期:单实例多线程,在服务器启动的时候创建,并调用
init
方法,对每个请求创建一个线程,根据XML中的路径调用不同filter内的doFilter
方法,当Filter被移除或者服务器正常关闭时调用destroy
方法,生命周期结束FilterChain过滤链:通过chain的dofilter方法,可以将请求放行到下一个过滤器,直到最后一个过滤器放行才可以访问到servlet或者jsp,通过
chain.doFilter()
放行方法filterConfig:过滤器的配置对象
作用:获取全局管理者、获取当前filter的名称、获取当前filter的初始化参数
Servlet总结
最新推荐文章于 2021-08-06 09:58:05 发布