Servlet体系结构
Servlet:接口 |(继承) GenericServlet:抽象类 |(继承) HttpServlet:抽象类 |(继承) MyServlet extends HttpServlet
servlet常用方法: 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的初始化参数
