1 Servlet

1.1 生命周期方法

1.1.1 void init(ServletConfig):

加载和实例化:当客户端发送一个请求时,Servlet容器(Tomcat)会查找内存中是否存在Servlet实例,如果不存在,就创建一个Servlet实例。如果存在Servlet实例,就直接从内存中取出该实例来响应请求

初始化:初始化Servlet时,可以设置数据库连接参数,建立JDBC连接,或是建立对其他资源的引用。初始化阶段,init()方法被调用

1.1.2 void service(ServletRequest request, ServletResponse response):Servlet初始化后,就处于响应请求的就绪状态

1.1.3 void destory():销毁由容器完成,销毁调用Servlet的destroy()方法

1.2 特性

1.2.1 单例,只创建一个对象,线程不安全,效率是高的

1.2.2 Servlet类我们来写,对象由服务器创建,并且由服务器调用其中的方法

1.3 动态资源,处理请求

1.4 配置

1.4.1 正常是第一次访问服务器时创建servlet,启动时就完成创建

<servlet><load-on-startup>

</load-on-startup></servlet> 非负整数

1.4.2 <url-pattern>

访问路径中使用通配符

<url-pattern>/*<url-pattern>匹配所有

<url-pattern>*.do<url-pattern>匹配扩展名是.do的所有路径

<url-pattern>/servlet/*</url-pattern>匹配/servlet路径候的所有的路径

1.5 创建servlet

1.5.1 实现javax.servlet.servlet接口

1.5.2 继承javax.servlet.genriticservlet类

1.5.3 继承javax.servlet.http.httpservlet类型

httpServletRequest

String getParamater(String paramaterName): 获取请求参数 String geMethod():获取请求方法

String getHeader(String headerName):获取请求头

void setCharacterEncoding(Encoding):设置请求字符编码

httpServletResponse

PrintWriter getWriter():获取字符响应流

ServletOutputStream getOutputStream():获取字节响应流

void setCharacterEncoding(String encoding):获取响应编码

void setHeader(String name,String value): 设置响应头

void getContextType(String contextType): 获取响应头类型

void sendError(int code, String errorMesg): 向客户发送错误响应码和错误信息

1.6 Session

1.6.1 Cookie

cookie是由服务器创建的,浏览器第一次访问,服务会创建一个cookie给浏览器带回去。当浏览器第二次访问时,把cookie带给服务器,服务器用来跟踪浏览器的状态

cookie是键值对组成

cookie的头设置

浏览器发送给服务器的头:Cookie

服务器发送给浏览器的头 : Set-Cookie

Cookie的发送和接收

Servlet发送

Cookie cookie = new Cookie("aaa", "AAA") response.addCookie("aaa") Servlet接收

Cookie[] cookies = request.getCookies() if(cookies != null){ for( Cookie cookie : cookies){ cookie.getName(); cookie.getValue(); } } Cookie的细节

Cookie的maxAge

cookie.setMaxAge(-1) : 只在内存中存活,关闭浏览器cookie就会消失 cookie.setMaxAge(60*60): cookie能够在硬盘中存活1个消失

cookie.setMaxAge(0): 表示这个cookie作废,最终这个cookie在内存和硬盘上不存在

Cookie的path

Cookie的Domain:二级域名

Cookie的保存中文,需要对中文编码解码

1.6.2 Session

HttpSession的作用

会话跟踪

域功能

登入信息回现

原理

Session依赖Cookie

浏览器第一次访问服务器时,服务器会创建一个session对象,同时创建一个cookie,把sessionid放在cookie中给浏览器带回去,只要session还存活,浏览器还存在,下次浏览器再次访问时,浏览器就会通过cookie把sessionID返回给服务器,只要浏览器不关闭,下次就可以共享session中的数据了

由于服务器端创建的cookie只能在浏览器中存活,如果客户关闭浏览器,请求中就没有sessionId,再次访问需要重新创建sessionid放在cookie中给浏览器带回

如果Session超过了最大活动时间,失效,此时即使没有关闭浏览器。浏览器的提供的SessionID也没有用了

设置Session有效活动时间

<Session-

config><Session-timeout>30</Session-timeout></Session-config> Session相关API

String # getId() : 获取SessionId

void setMaxInactiveInterval(time) : 设置session最大不活动时间,默认是30分钟

int getMaxInactiveInterval():获取session可以的最大不活动时间(秒),默认为30分钟。当session在30分钟内没有使用,那么Tomcat会在session池中移除这个session

long getCreationTime():返回session的创建时间,返回值为当前时间的毫秒值

long getLastAccessedTime():返回session的最后活动时间,返回值为当前时间的毫秒值

void invalidate():让session失效!调用这个方法会被session失效,当session失效后,客户端再次请求,服务器会给客户端创建一个新的session,并在响应中给客户端新session的sessionId

boolean isNew():查看session是否为新。当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端时,这时session的状态为新 URL重写

session依赖Cookie,这是因为服务器需要把sessionId保存到客户端。如果用户的浏览器关闭了Cookie功能,那么session不能使用了!还可以在浏览器关闭了Cookie后使用URL重写的方法保存sessionId,这需要在每个URL后面都加上sessionId!这样用户的请求中就包含了sessionId,服务器就可以通过sessionId找到对应的session对象了

1.7 ServletContext

1.7.1 获取

ServletConfig getServletContext()

服务器启动时会创建一个servletcontext对象,它负责在应用程序间传递数据

GenericSevlet getServletContext()

HttpSession getServletContext()

ServletContextEvent getServletContext()

1.7.2 域对象功能:所有域对象都有存取数据的功能 void setAttribute(String name , Object value)

Object getAttribute(String name)

void removeAttribute(String name)

Enumernation getAttributeNames()

1.7.3 方法

获取初始化参数的方法

String getInitParameter(String name)

获取资源相关方法

获取绝对路径

this.getServletContext.getRealPath("/a.txt")

this.getServletContext.getRealPath("/WEB-INF/b.txt")

获取资源流

InputStream # this.getServletContext.getResourceAsStream("/a.txt") InputStream

this.getServletContext.getResourceAsStream("/WEB-INF/b.txt") #

获取指定资源下所有资源路径

Set # this.getServletContext.getResourcePaths("/WEB-INF")

InputStream # this.getClassLoader().getResourceAsStream("a.txt")======相对于classes文件目录

InputStream # this.getClass().getReasourceAsStream("a.txt")=======相对于.class文件目录

InputStream # this.getClsss().getReasourceAsStream("/a.txt")========相对于classes文件目录

1.8 Request

1.8.1 处理字符编码问题

request.getParameter("username") String name bytes = = byte[]

name.getBytes("ISO-8859-1") name = new String(bytes, "utf-8")

1.8.2 request域方法

1.8.3 request获取请求参数

1.8.4 request获取请求表头的方法

1.8.5 request其他方法

String # getMethod() : 获取请求方法

void # setCharacterEncoding("utf-8") : 设置请求编码 String # getContextPath() : 获取上下文路径, /项目名 String # getRemoteAdrr() : 获取请求的IP地址

1.8.6 请求转发; 一次请求,一次响应,留头不留体

request.getRequestDispatcher("/BServlet").forword(request, response)

1.8.7 请求包含: 一次请求,一次响应,留头留体

requet.getRequestDispatcher("/BServlet").include(request, response)

1.8.8 路径

客户端路径

服务器路径

1.9 Response

1.9.1 处理字符编码问题response.setContextType("text/html",charset="utf-8")

1.9.2 字符流: PrintWriter # response.getWriter()

1.9.3 字节流: ServletOutputStream response.getOutStream()

1.9.4 response.fulshBuffer(): 刷新缓冲流

1.9.5 响应码

302:重定向

response.sendRedirect("www.baidu.com")

200:响应成功

304: 找不到资源

1.10 Servlet三个域对象

1.10.1 request

1.10.2 session

1.10.3 application

1.11 Javaweb四大域 : #

1.11.1 pageContext

这个对象代表页面上下文,该对象主要用于访问JSP之间的共享数据

1.11.2 session

一个会话只创建一个sessionContext对象

void session.setAttribute(String name, Object value)

Object session.getAttribute(String name)

void session.removeAttribute(String name)

1.11.3 request

一次请求只创建一个requestContext对象

1.11.4 servletContext

一个应用程序只创建一个servletContext对象

2 Filter

2.1 基本知识

2.1.1 创建一个过滤器

自定一个过滤器需要实现Filter接口,实现接口中的方法

web.xml中配置

<filter><filter-name>AFilter</filter-name><filter-class>过滤器的全限定名</filter-class></filter><filter-mapping><filter-name>AFilter</filter-name> <url-partten>拦截的资源</url-partten></filter-mapping<

2.1.2 过滤器的生命周期

void # init(FilterConfig) :

在服务器启动时会创建Filter实例,并且每个类型的Filter只创建一个实例,从此不再创建

在创建完Filter实例后,会马上调用init()方法完成初始化工作,这个方法只会被执行一次

void # doFilter( ServletRequest request, ServletResponse response, FilterChain chain)

参数FilterChain中有一个方法doFilter(ServletRequest,ServletResponse): 表示放行

这个方法会在用户每次访问“目标资源(<url->pattern>index.jsp</url-pattern>)”时执行

如果需要“放行”,那么需要调用FilterChain的doFilter(ServletRequest,ServletResponse)方法,如果不调用FilterChain的doFilter()方法,那么目标资源将无法执行

void # destroy():

服务器会在创建Filter对象之后,把Filter放到缓存中一直使用,通常不会销毁它

一般会在服务器关闭时销毁Filter对象,在销毁Filter对象之前,服务器会调用Filter对象的destory()方法

2.1.3 参数类型

FilterChain

参数FilterChain中有一个方法doFilter(ServletRequest,ServletResponse): 表示放行

这个方法会在用户每次访问“目标资源(<url->pattern>index.jsp</url-pattern>)”时执行

FilterConfig

ServletContext getServletContext():获取ServletContext的方法

String getFilterName():获取Filter的配置名称;与<filter-name>元素对应

String getInitParameter(String name):获取Filter的初始化配置,与<init-param>元素对应

Enumeration getInitParameterNames():获取所有初始化参数的名称

2.1.4 多个过滤器执行顺序

filter1 start... filter2 start... index.jsp filter2 end... filter1 end...

2.1.5 四种拦截方式

REQUEST

FORWARD

INCLUDE

ERROR

2.2 案例

3 Listener

3.1 基本了解

3.1.1 监听器是个接口,内容由我们实现

第16 / 20页

3.1.2 必须要注册事件源上

3.1.3 监听器中的方法会在特殊事件发生时被调用

3.2 事件源

3.2.1 javaweb域

ServletContext

生命周期监听

ServletContextListener

void # contextInitialized(ServletContextEevent sce): 创建servletContext时调用 void contextDestroyed(ServletContextEvent sce): 销毁servletcontext时调用 属性监听

ServletContextAttributeListener

void # attributeAdded(ServletContextAtrributeEvent evc): 添加属性时调用 void # atrributeReplaced(ServletContextAttributeEvent evc): 替换属性时调用 void # attributeRemoved(ServletContextAttributeEvent evc): 移除属性时调用 HttpSession

生命周期监听

HttpSessionListener

void # sessionCreated(HttpSessionEvent se)

第17 / 20页

void # sessionDestroyed(HttpSessionEvent se)

属性监听

HttpSessionAttributeListener

void # attributeAdded(HttpSessionBindingEvent event)

void # attributeReplaced(HttpSessionBindingEvent event)

void # attributeRemoved(HttpSessionBindingEvent event)

ServletRequest

生命周期监听

ServletRequestListener

void # requestInittialized(ServletRequestEvent sre)

void # requestDestroyed(ServletRequestEvent sre)

属性监听

SevletRequestAttributeListener

void # attributeAdded(ServletRequestAttribteEvent srae)

void # attributeReplaced(ServletRequestAttributeEvent srae)

void # atrributeRemoved(ServletRequestAtributeEvent srac)

3.2.2 javabean

HttpSessionBindingListener

第18 / 20页

void # valueBound(HttpSessionBindingEvent hsbe):把java对象加入到session中会调用此方法

void # valueUnbound(HttpSessionBindingEvent hsbe): 当把监听对象从session中移除会调用此对象

HttpSessionActivationListener

先不管HttpSessionActivationListener监听器接口,先来配置Tomcat钝化session的参数,把下面配置文件放到tomcat\conf\catalina\localhost目录下!文件名称为项目名称。

第19 / 20页

void # sessionWillPassivate(HttpSessionEvent se): 当对象感知要被持久化到硬盘中时调用此方法

void # sessionDidActiver(HttpSessionEvent se): 当对象感知要被从硬盘中加载到内存中(活化)时调用

3.3 事件

3.3.1 获取域对象

3.3.2 获取属性名

3.3.3 获取属性值



Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐