Servlets & JSP 学习笔记(二)

1.会话管理基本原理

web应用程序的请求与响应是基于HTTP的,为无状态的通信协议。服务器不会记得这次请求与下次请求之间的关系,然而有些功能必须多次请求来完成,例如购物车。这种记得两次请求之间关系的方式,就称为会话管理。

2.几种实现会话管理的基本方式

使用隐藏域:即将前一页的答案以隐藏域的方式响应给浏览器,以便下一次再发送给服务器。

使用Cookie:cookie是在浏览器存储信息的一种方式

使用url重写:其实就是GET请求参数的应用

使用HttpSession进行会话管理:

getSession()方法取得session对象,setAttribute()和getAttribute()方法来设置和获取对应属性。

invalidate():销毁回收HttpSession对象

使用HttpSession与url重写相结合

因为HttpSession默认使用Cookie存储Session ID,如果用户关掉Cookie,就需要用HttpSession与URL重写的方式来进行会话管理。

encodeURL方法:当Cookie被禁用时,该方法自动产生带有Session的URL重写。

3.servlet进阶API

一些基本概念

每个servlet都必须由web容器读取servlet的设置信息、初始化等。对于每个servlet设置信息,web容器会为其生成一个servletConfig作为代表对象,可以从该对象取得servlet基本参数,以及代表整个web应用程序的ServletContext对象。

在web容器启动后,会读取servlet设置信息,将servlet类加载并实例化,并为每个servlet设置信息产生一个ServletConfig对象,而后调用Servlet接口的init方法,并将ServletConfig对象当作参数传入,之后的每次请求都会调用Servlet对象的service方法。

GenericServlet主要的目的,就是将初始的Servlet调用init方法传入ServletConfig封装起来。

4.ServletConfig的使用

对象中定义了getInitParameter()、getInitParameterNames()方法,可以取得设置servlet的初始参数。

若要使用标注设置个别Servlet的初始参数,@WebInitParam设置initparams属性。

getServletConfig().getInitParameter() = getInitParameter()  因为GenericServlet定义了一些方法,将servletConfig封装起来,便于取得一些信息。

5.ServletContext的使用

当整个web容器加载完web容器之后,容器会生成一个servletContext对象作为整个应用程序的代表,并设置给servletConfig,只要通过servletConfig的getServletContext方法就可以取得servletContext对象。

一些需要注意的方法:

context.getRequestDispatcher("/pages/some.jsp").forward(request,response)   注意:使用时必须以“/”开头,这个斜杠代表应用程序环境根目录。

和之前request调用的getRequestDispatcher的联系:

context.getResourcePaths("/")    可以知道web应用程序的某个目录里有哪些文件

context.getResourceAsStream()   如果想在web容器中读取某个文件的内容,则可以使用该方法,运行结果返回一个InputStream实例

6.ServletContext事件、监听器

ServletContextListener监听器

是生命周期监听器,监听web程序何时初始化以及即将结束销毁。web应用程序初始化后调用contextInitialised()方法,即将销毁前调用contextDestoryed()方法。例如,在程序初始化时可以准备好数据连接对象、读取应用程序设置等操作。

实现方法:webListener标注、实现ServletContextListener接口

当容器调用上面两个方法时,会传入ServletContextEvent对象,可以通过该对象调用getServletContext来得到对象。

ServletContextAttributeListener监听器

是监听属性改变的监听器,监听servletContext属性被设置、移除和替换,相对的被调用的方法为attributeAdded()、attributeRemoved()、attributeReplaced()。

实现方法:webListener标注、实现ServletContextAttributeListener接口

7.HttpSession事件、监听器

HttpSessionListener监听器

是生命周期监听器,监听HttpSession对象的创建和结束,分别调用sessionCreated()方法以及sessionDestoryed()方法。通过传入的HttpSessionEvent对象的getSession方法获得HttpSession对象。例如可以用于防止用户在两个浏览器之间重复登录。

疑问:ServletContext对象与HttpSession对象何时产生和消亡,有什么区别

实现方法:略

HttpSessionAttributeListener监听器

属性改变监听器,监听HttpSession属性被设置、移除和替换,相对的被调用的方法为attributeAdded()、attributeRemoved()、attributeReplaced()。并传入HttpSessionBindingEvent对象,该对象调用getName方法可以得到改变的属性名,getValue方法可以得到改变的属性对象。

HttpSessionBindingListener监听器

对象绑定监听器,当有属性加入或者移除HttpSession时,会调用对应的valueBound方法以及valueUnbound方法,并传入HttpSessionBindingEvent对象,该对象调用getSession方法取得HttpSession对象。

问题:上面两个监听器功能是不是有些重复。

HttpSessionActivationListener监听器

8.HttpServletRequest事件、监听器

ServletRequestListener监听器

生命周期监听器,初始化后以及销毁前调用

ServletRequestAttributeListener监听器

属性改变监听器

AsyncListener监听器

与异步有关,下面会讲解

9.过滤器概念

介于servlet之前,可拦截过滤浏览器对servlet的请求,也可改变servlet对浏览器的响应。常用于性能测评、用户验证、字符替换、编码设置等需求。

10.实现与设置过滤器

过滤器的基本方法及其代表含义

过滤器的设置

filename设置过滤器名称,urlPatterns设置哪些url请求必须调用该过滤器

粗体部分代表触发过滤器的时机。

11.举例说明请求封装器

实现字符替换过滤器

目标:将html语言直接出现在页面中而被浏览器当作html的一部分

实现编码设置过滤器

目标:设置请求编码,不像之前一样在单个servlet中实现,而是在过滤器中实现。request的setCharacterEncoding方法是针对请求body内容,对于GET请求,必须取得请求参数的字节矩阵,重新指定编码构建字符串。

12.响应封装器

继承HttpServletResponseWrapper类来对HttpServletResponse对象进行封装,使其具备能对响应的内容进行压缩处理。

13.异步处理

14.AsyncContext简介

servletrequest上提供了startAsync方法,有两种形式,一种无参,一种参数为Servletrequest和Servletresponse。该方法可以取得AsyncContext对象,然后此次请求的响应会被延后,并释放容器分配的线程。此次对客户端的响应暂缓至调用AsyncContext的complete方法以及dispatch方法,前者表示响应完成,后者表示指派特定的url进行响应。

使用时必须使用webServlet来标注,可以设置其asyncSupported为true。

如果servlet前端有过滤器,则过滤器也需标识其支持异步处理。将webFilter中的asyncSupported属性设置为true。

15.模拟服务器推播

16.更多AsyncContext细节

你可能感兴趣的:(Servlets & JSP 学习笔记(二))