javaee笔记3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 映射Filter的细节
1)在传统方式下,有以下几种方式过虑
>>在地址拦上直接输入URL
>>通过超链接
>>重定向
2)Filter过虑的几种方式:
>>REQUEST方式----默认
>>FORWARD方式----只处理转发情况下的Filter
>>INCLUDE方式----只处理包含情况下的Filter
*>>ERROR方式------只处理出错情况下的Filter,如果不出错,不会执行Filter
直接访问某个jsp页面,如果该jsp页面出错,同时又在web.xml文件中声明了全局出错处理
(ng.NumberFormatException<------->Integer.parse("abc"))
如果使用exception-code:3次经过Filter
如果使用exception-type:2次经过Filter
*2 装饰设计模式
1)当一个类的某个方法不能满足业务需求情况下,你会怎么办呢?
解决方案:写一个类,继承父类(前提父类是非final类型),重写不满足需求的方法2)装饰设计模式能解决什么问题?
以上解决方案,叫做装饰设计模式。
3)装饰设计模式开发步骤?
>>写一个类继承被装饰类
>>写一个实例变量,记录被装饰类
>>通过构造方法,为被装饰类设置值
*>>重写不能满足需求的方法
[可选]>>对于已满足需求的方法,直接调用被装饰类对应的方法
4)什么情况,会使用装饰设计模式?
当一个类的某个方法不能满足业务需求情况下,该类又是一个非final类型,可以使用装饰设计模式。
*3 Filter + 装饰设计模式案例
>>GET和POST中文编码统一处理
如果对于post请求来讲,request.setCharacerEncoding("UTF-8"),一定要位于
request.getParameter("username")之前,否则一律都是取得乱码
例如:
String username = request.getParameter("username")
request.setCharacerEncoding("UTF-8")
username = request.getParameter("username")
username = request.getParameter("username")
username = request.getParameter("username")
这时username是乱码
>>字节压缩流(最难)
ServletOutputStream不具有缓存功能
将中英文进行压缩后,输出到浏览器
*>>字符压缩流(较难,常用)
PrintWriter具有缓存功能
将文字和图像进行字符压缩
>>缓存数据
使用字符+ Map容器
注意:
》通常数据不变,或很少变化,
》缓存的数据较小
4 总结Servlet和Filter[比较适合]的用法:
>>Servlet用于完成核心的业务控制,例如:收集表单参数,转发或重定向到指定的页面,Filter用于完成预处理和后处理操作,例如:压缩游和编码统一处理
>>在分层结构中,Servlet位于控制层
>>在分层结构中,Filter位于控制层
>>Servlet和Filter是一个互补的技术,
不是相互替换的技术
Filter细节:
在默认情况下通过地址栏进行提交,或者使用超链接则会过滤,如果通过转发的话
在默认情况下是不会过滤的。这种方法叫做request方式,这种方式是默认的。
改变默认做法:
1、在
REQUEST:默认方式。
FORWORD:只能过滤转发情况下的资源
INCLUDE:只能过滤在包含情况下的资源
ERROR:错误方式下过滤,需要在web.xml配置全局出错处理,如果全局配置是使用exception-type
的话,那么只能访问当前的错误页面,才能够进行过滤,但是如果使用code进行过滤,那么
可以通过include,forword都可以过滤,因此,提倡使用code方式进行配置.
2 web监听器详解
1)什么是监听器
一个对象可以监听另一个对象的一切活动,例如:对象显示,隐藏,关闭等等操作
2)什么是web监听器
一个普通类,实现了SUN公司规定的一个特定接口XxxListener,以监听【域对象】的属性变化/创建销毁情况。
那么该类叫做web监听器。
----------------------------------------------------------------------------------------------
>>ServletContextListener
监听ServletContext域对象的初始化和销毁
在部署该Web应用时,创建并初始化Servlet
在重新部署该Web应用时或停止Web服务器后重新启动,先销毁原ServletContext 域对象,
再创建并初始化新的ServletContext域对象
>>ServletContextAttributeListener
监听ServletContext域对象的属性增加、更新、移除
事件源:ServletContext/application/域对象
事件:setAttribute或removeAttribute,注意:
setAttribute()具有二种含义:属性增加、属性更新(当key一样时)事件监听器:Web服务器---Tomcat6/7
事件处理程序:
attributeAdded()
attributeReplaced()
attributeRemoved()
>>ServletRequestListener:域对象的初始化和销毁
每次请求开始时,创建并初始化,页面结束后,ServletRequest销毁
第二次请求会产生新的数据,二次ServletRequest中的数据不能共享>>ServletRequestAttributeListener:域对象的属性增加、更新、移除
>>HttpSessionListener:HttpSession域对象的创建和销毁
1)访问jsp页面,在默认情况下,Web服务器自动产生HttpSession对象,存于服务器2)关闭浏览器,原HttpSession[不能]立即销毁
3)在默认情况下,HttpSession有30分钟的生命时间,最终由Web服务器负责销毁其中的第一个HttpSession
4)Web服务器删除HttpSession的时间不精确
5)在HttpSession的生命周期内,不断在同一个浏览器中刷新,不会产生新的HttpSession
6)打开一个新的浏览器,再次访问jsp页面,会产生新的HttpSession
注意:IE6开一个新浏览器,访问jsp,会产生新的HttpSession
其它高版浏览器,开选项卡,是和原来,共享同一个HttpSession
其它浏览器,开选项卡或新的浏览器窗口,也是和原来,共享同一个HttpSession
7)对于高版本浏览器的解决方式:
文件-->新建会话--->会打开一个新窗口,该窗口再访问jsp,会产生新的HttpSession,
不会共享原HttpSession。
8)销毁HttpSession的几种方式:
>>web.xml配置session的有效时间
>>session.invalidate()
>>重新部署web应用