目录
1.Web Servlet
Ⅰ.什么是Servlet?
Ⅱ.Servlet的架构
Ⅲ.Servlet的任务
Ⅳ.Servlet的生命周期
init()方法
service()方法
destroy()方法
Ⅴ.ServletRequest接口
Ⅵ.ServletResponse接口
Ⅶ.模糊映射
2.Filter过滤器(非常重要)
Ⅰ.什么是过滤器?
Ⅱ.过滤器的使用?
@WebFilter
3.监听器Listener
4.Session 超时
1.Web Servlet
Ⅰ.什么是Servlet?
Servlet是运行在web服务器和应用服务器上的程序,它是作为来自web浏览器或其他Http客户端的请求和Http服务器上的数据库和应用程序之间的中间层;
使用Servlet可以收集来自页面表单的输入记录,以及呈现数据库记录或起来数据来源记录,以及可以动态创建网页;
Ⅱ.Servlet的架构
下图显示了 Servlet 在 Web 应用程序中的位置。
Ⅲ.Servlet的任务
Servlet 执行以下主要任务:
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
Ⅳ.Servlet的生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。
- Servlet 通过调用 init () 方法进行初始化。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 通过调用 destroy() 方法终止(结束)。
- Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
init()方法
init 方法被设计成只调用一次。
它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。
因此,它是用于一次性初始化。
Servlet 创建于用户第一次方位该Servlet的URL 时,但是也可以指定 Servlet 在服务器第一次启动时被加载。
每一个用户请求都会创建一个 Servlet 实例,并且产生一个新的线程。
init() 方法简单地创建或加载一些数据,这些数据将作用于 Servlet 的整个生命周期。
service()方法
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
destroy()方法
destroy() 方法只会在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
Ⅴ.ServletRequest接口
ServletRequest
->
HttpServletRequest
相关方法
方 法 | 说 明 |
---|---|
getAttributeNames() | 返回当前请求的所有属性的名字集合 |
getAttribute(String name) | 返回name指定的属性值 |
getCookies() | 返回客户端发送的Cookie |
getsession() | 返回和客户端相关的session,如果没有给客户端分配session,则返回null |
getsession(boolean create) | 返回和客户端相关的session,如果没有给客户端分配session,则创建一个session并返回 |
getParameter(String name) | 获取请求中的参数,该参数是由name指定的 |
getParameterValues(String name) | 返回请求中的参数值,该参数值是由name指定的 |
getCharacterEncoding() | 返回请求的字符编码方式 |
getContentLength() | 返回请求体的有效长度 |
getInputStream() | 获取请求的输入流中的数据 |
getMethod() | 获取发送请求的方式,如get、post |
getParameterNames() | 获取请求中所有参数的名字 |
getProtocol() | 获取请求所使用的协议名称 |
getReader() | 获取请求体的数据流 |
getRemoteAddr() | 获取客户端的IP地址 |
getRemoteHost() | 获取客户端的名字 |
getServerName() | 返回接受请求的服务器的名字 |
getServerPath() | 获取请求的文件的路径 |
Ⅵ.ServletResponse接口
ServletResponse
->
HttpServletResponse
相关方法
方 法 | 说 明 |
---|---|
addCookie(Cookie cookie) | 将指定的Cookie加入到当前的响应中 |
addHeader(String name,String value) | 将指定的名字和值加入到响应的头信息中 |
containsHeader(String name) | 返回一个布尔值,判断响应的头部是否被设置 |
encodeURL(String url) | 编码指定的URL |
sendError(int sc) | 使用指定状态码发送一个错误到客户端 |
sendRedirect(String location) | 发送一个临时的响应到客户端 |
setDateHeader(String name,long date) | 将给出的名字和日期设置响应的头部 |
setHeader(String name,String value) | 将给出的名字和值设置响应的头部 |
setStatus(int sc) | 给当前响应设置状态码 |
setContentType(String ContentType) | 设置响应的MIME类型 |
Ⅶ.模糊映射
同一个 Servlet 可以被匹配映射到多个 URL 上,即多个元素的子元素的设置值可以是同一个 Servlet 的注册名。Servlet 的匹配分为精确匹配和模糊匹配。
精确匹配
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>userAddServlet</servlet-name>
<url-pattern>/user/add</url-pattern>
</servlet-mapping>
模糊匹配
<servlet-mapping>
<servlet-name>allServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>userAllServlet</servlet-name>
<url-pattern>/user/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>actionServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
注意:
1.servlet 的路径映射必须以 / 开头或者 * 开头。例如直接写 login服务器会报错。
2.servlet 的路径映射中,不能同时存在两种"模糊匹配"的规则。例如/test/*.do会报错。
3.当浏览器的路径同时匹配多个 servlet 的时候
a)精确度越高的 URL(最像url的)优先被匹配。如上面的 /user/* 大于 /*
b)以后缀名结尾的 URl 优先级最低。
4./* 会使所有请求 jsp 的请求都会匹配并转向 Servlet,如果想要匹配除精确匹配外的的其他请求,可以使用 / 匹配。
2.Filter过滤器(非常重要)
Ⅰ.什么是过滤器?
Servlet 过滤器与 Servlet 十分相似,对于程序开发人员而言,过滤器实质上就是在 Web 应用服务器上的一个 Web 应用组件,用于拦截客户端(浏览器)与目标资源(Servlet)的请求,并对这些请求进行一定过滤处理再发送给目标资源。Servlet 过滤器可以改变请求中的内容,来满足实际开发中的需要。
过滤器(Filter)核心对象放置在 javax.servlet 包中,其名称为 Filter,它是一个接口。除这个接口外,与过滤器相关的对象还有 FilterConfig(过滤器的配置对象)对象与 FilterChain(过滤器传递对象),在实际开发中,定义过滤器对象只需要直接或间接地实现 Filter 接口即可。
每一个过滤器对象都要直接或间接地实现 Filter接口,在 Fiter 接口中定义了 3 方法,分别为 init(过滤器初始化方法,该方法在过滤器初始化时调用)、doFilter(对请求进行过滤处理)和 destroy(销毁方法,以便释放资源)。
在 doFilter 方法中调用 filterChain.doFilter(servletRequest, servletResponse); 方法即可完成放行操作,若没有放行操作。客户端浏览器本次请求将接收不到任何数据,浏览器一般表现为白屏
Ⅱ.过滤器的使用?
过滤器与 Servlet 十分相似,在创建之后同样需要对其进行配置,过滤器的配置主要分为两个步骤,分别为声明过滤器对象和创建过滤器映射。
<filter>
<filter-name>myFilter</filter-name>
<filter-class>cn.hx.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
标签用于声明过滤器对象,在这个标签中必须配置两个子元素,分别为过滤器的名称与过滤器完整类名,其中用于定义过滤器的名称,用于指定过滤器的完整类名。标签用于创建过滤器的映射,它的主要作用就是指定 Web 应用中,哪些 URL 应用哪一个过滤器进行处理。在标签中需要指定过滤器的名称与过滤器的 URL 映射,其中用于定义过滤器的名称,用于指定过滤器应用的 URL。
案例:
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FirstFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器");
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
if (request.getRequestURI().endsWith("login.jsp")) {
filterChain.doFilter(servletRequest, servletResponse);//放行
} else {
response.sendRedirect("login.jsp");
}
}
@Override
public void destroy() {
}
}
注意:过滤器配置时需要考虑静态资源,如:css、js、图片等的放行,否则将不能访问静态资源。
案例:过滤器参数
在配置 web.xml 时增加参数如下。
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>cn.hx.FirstFilter</filter-class>
<init-param>
<param-name>param</param-name>
<param-value>参数</param-value>
</init-param>
</filter>
在过滤器初始化方法中获取参数。
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String param = filterConfig.getInitParameter("param");
System.out.println(param);
}
@WebFilter
Servlet 3.0 之后可以使用
@WebFilter
来配置
Filter
@WebFilter 的属性
属性名 | 类型 | 描述 |
---|---|---|
filterName | String | 指定过滤器的 name 属性,等价于 |
value | String[] | 该属性等价于 urlPatterns 属性。但是两者不应该同时使用。 |
urlPatterns | String[] | 指定一组过滤器的 URL 匹配模式。等价于 标签。 |
servletNames | String[] | 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 的取值。 |
dispatcherTypes | DispatcherType | 指定过滤器的转发模式。具体取值包括: ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。 |
initParams | WebInitParam[] | 指定一组过滤器初始化参数,等价于 标签。 |
asyncSupported | boolean | 声明过滤器是否支持异步操作模式,等价于 标签。 |
description | String | 该过滤器的描述信息,等价于 标签。 |
displayName | String | 该过滤器的显示名,通常配合工具使用,等价于 标签。 |
3.监听器Listener
监听器的作用是监听 Web 容器的有效期事件,因此它是由容器管理的。利用 Listener 接口监听在容器中的某个执行程序,并且根据其应用程序的需求做出适当的响应。
监听通常有下面三类 8 种监听,分别监听 ServletContext(jsp 里面的 application)变化、session 变化和 request 变化。
1.ServletContextListener:完成 Servlet 上下文整体监听,主要有以下方法:
- contextInitialized(ServletContextEvent event)监听 application 上下文初始化。
- contextDestroyed(ServletContextEvent event)监听 application 上下文被载出,即关闭。
2.ServletContextAttributeListener:完成 Servlet 上下文内容监听,主要有以下方法:
- attibuteAdded(ServletContettributeEevent event)监听对象加入 application 的范围时。
- atributeReplaced(ServetContexttributeEvent event)监听在 application 的范围有对象取代另一个对象时。
- atributeRemoved(erleCotettributcEvent event)监听对象从 application 的范围移除时。
3.HttpSessionListener:完成 Session 整体监听,主要有以下方法:
- sessionCreated(HttpSessionEvent event)监听 session 初始化。
- sessionDetoyed(HtpSessionEvent event)监听 session 销毁。
4.HttpSessionActivationListener:完成 Session 状态监听,主要有以下方法:
- sessionDidActivate(HtpSessionEvent event)监听 session 变为有效状态。
- sessionWillPassivae(HttpSessionEvent event)监听 session 变为无效状态。
5.HttpSessionAttributeListener:完成 Session 内容监听,主要有以下方法:
- attributeAdded(HttpSessionBindingEvent event)监听对象加入 session 中。
- attributeReplaced(HttpSessionBindingEvent event)监听 session 中有对象取代另一个对象时。
- attributeRemoved(HttpSessionBindingEvent event)监听对象从 session 中移除时。
6.HttpSessionBindingListener:完成 Session 绑定监听,主要有以下方法:
- valueBound(HttpSessionBindingEvent event)监听对象加入 session 中。
- valueUnBound(HttpSessionBindingEvent event)监听对象从 session 中移除。
7.ServletRequestListener:完成 ServletRequest 监听,主要有以下方法:
- requestInitalized(ServletRequestEvent event)监听 ServletRequest 已经被初始化。
- requestDestroyed(ServletRequestEvent event)监听 ServletRequest 已经被销毁。
8.ServletRequestAttributeListener:完成 ServletRequest 内容监听,主要有以下方法:
- attributeAdded(ServletRequestAttributeEvent event)监听对象加入 request 中。
- attributeReplaced(ServletRequestAttributeEvent event)监听 request 中有对象取代另一个对象。
- attributeRemoved(ServletRequestAttributeEvent event)监听对象从 request 中移除时。
监听能够有效的向我们展示各个对象的创建与销毁,内容的变化等。使用时也和 Servlet 一样需要在 web.xml 中配置。
<listener>
<listener-class>cn.hx.MyListener</listener-class>
</listener>
4.Session 超时
在 Java Web 开发中,Session 为我们提供了很多方便,Ssession 是由浏览器和服务器之间维护的。Session 超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(默认 30 分钟)没有与服务器交互,服务器将此 Session 销毁,客户端再一次与服务器交互时之前的 Session 就不存在了。
在正常使用 session 过程中调用 invalidate() 也可以将当前的客户端浏览器的会话清除。
session.invalidate();
一般用于用户退出时销毁 session。清除 session 后再次请求网站,tomcat 服务器又会为客户端浏览器分配新的 session 空间,并将 session 的 ID 通过响应头发送给客户端浏览器并设置到 cookie 里面。
而在实际开发中,需要监听 session 的创建和销毁,以及往 session 中存入的值等。这些功能都只能通过监听来完成。
设置 Session 超时时间通常在 web.xml 中设置 session-config
<session-config>
<session-timeout>2</session-timeout>
</session-config>
如上客户端连续两次与服务器交互间隔时间最长为 2 分钟,2 分钟后 session.getAttribute() 获取的值为空。
注意:
1.若访问服务器 session 超时(本次访问与上次访问时间间隔大于 session 最大的不活动的间隔时间)了,即上次会话结束服务端会清除 session,在客户端会又发生请求时,服务端会产生一个新的会话,将之前的 sessionId 替换掉。从而保证数据安全。
2.记录 session 的 cookie 使用周期一般为浏览器关闭前,若用户关闭客户端浏览器,则上次登录的 cookie 将失效,从而无法获取 session,此时服务端的 session 还是存在的,只是客户端浏览器无法访问该空间。所以 session 常见销毁方法有:在某个请求周期内调用了 session.invalidate()方法,此请求周期结束后,session 被销毁;或者是 session 超时后自动销毁;或者关闭客户端浏览器;重启 tomcat 所有 session 都会清空。