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细节

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • 目标 servlet的生命周期 servletConfig与ServletContext定义,及其二者的区别 监听...
    arkulo阅读 955评论 0 5
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,401评论 0 10
  • 经典的Java面试题(第二部分),这部分主要是与Java Web和Web Service相关的面试题。 96、阐述...
    nnngu阅读 690评论 0 8
  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 938评论 0 0
  • 广告也属于App创收的一种方式, 你在App内展示广告, 苹果会付一些广告费给你, 并且还会减少一些对你App内购...
    面糊阅读 589评论 0 51