java开发面试资料Word文档下载推荐.docx
- 文档编号:6427366
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:24
- 大小:68.86KB
java开发面试资料Word文档下载推荐.docx
《java开发面试资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《java开发面试资料Word文档下载推荐.docx(24页珍藏版)》请在冰点文库上搜索。
每个对Servlet的请求由一个ServletRequest对象代表。
Servlet给客户端的响应由一个ServletResponse对象代表。
当客户端有一个请求时,ServletEngine将ServletRequest和ServletResponse对象都转发给Servlet,这两个对象以参数的形式传给Service方法。
这个方法由javax.servlet.Servlet定义并由具体的Servlet实现。
Servlet还可以实现ServletRequest和ServletResponse接口。
ServletRequest接口可以让Servlet获取客户端请求中的参数,如formdata、request信息、协议类型,等等。
Servlet可以从ServletInputStream流中读取request数据。
ServletResponse接口允许Servlet设置responseheaders和statuscodes。
实现这个接口可以使Servlet能访问ServletOutputStream流用来向客户端返回数据。
Servlet如何被释放
ServletEngine没有必要在Servlet生命周期的每一段时间内都保持Servlet的状态。
ServletEngine可以随时随意使用或释放Servlet。
因此,你不能依赖Servletclass或其成员存储信息。
当ServletEngine判断一个Servlet应当被释放时(比如说Engine准备Shutdown或需要回收资源),Engine必须让Servlet能释放其正在使用的任何资源,并保存持续性的状态信息。
这些可以通过调用Servlet的destroy方法实现。
在ServletEngine释放一个Servlet以前,必须让其完成当前实例的service方法或是等到timeout(如果Engine定义了timeout)。
当Engine释放一个Servlet以后,Engine将不能再将请求转发给它,Engine必须彻底释放该Servlet并将其标明为可回收的(给garbagecollection)。
在ServletAPI中最重要的是Servletinterface。
所有的Servlets执行这个interface的方式有很多种:
或者是直接的,或者通过extending这个class执行它,如HttpServlet。
这个Servletinterface提供并安排Servlet与客户端联系的方法。
Servlet编写者可以在他们开发Servlet程序时提供更多一些或所有这样的方法。
当一个Servlet接收来自客户端的调用请求时,它接收两个对象:
一个是ServletRequest,另外一个是ServletResponse。
这个ServletRequestclass概括从客户端到服务器之间的联系,而ServletResponseclass概括从Servlet返回客户端的联系。
ServletRequestinterface可以获取到这样一些信息,如由客户端传送的参数名称,客户端正在使用的协议,产生请求并且接收请求的服务器远端主机名。
它也提供获取数据流的Servlet、ServletInputStream,这些数据是客户端引用中使用HTTPPOST和PUT方法递交的。
一个ServletRequest的子类可以让Servlet获取更多的协议特性数据。
例如,HttpServletRequest包含获取HTTP-specific头部信息的方法。
ServletResponseinterface给出相应客户端的Servlet方法。
它允许Servlet设置内容长度和回应的MIME类型,并且提供输出流ServletOutputStream,通过编写者可以发回相应数据。
ServletResponse子类可以给出更多protocol-specific容量的信息。
例如,HttpServletResponse包含允许Servlet操作HTTP-specific头部信息的方法。
总结与运用:
在实践中可以配置一个loadonstartup的Servlet,它随服务器启动而初始化,在其init方法中启用一些参数设置,例如把某些变量存入ServletContext,这样以后在其他Servlet中就可以获得该参数了;
而在其destroy中写入一些资源回收的代码,当服务器关闭时就可以自动关闭相遇的资源了。
2、过滤器
以前以为Filter只是一个特殊点的Servlet,用进只需在web.xml中配置一下拦截路径就可以了,可经过这两天的深入学习,才知道以前对Filter类的了解和使用都太过浅薄了。
在网上看了很多篇相关的技术文章,现提取它们中的精髓(我认为能说明问题的东西)及我个人的一些学习经验作如下总结,希望能帮助大家更好地理解Filter的过滤机制。
要学习Filter,就必须先理解和掌握servlet的调用机制和流程。
关于servlet,网上也有很多相关文章,大家若有不明白的可以到XX中搜一下,我这里为了突出重点就不多说了。
好,下面进入正题。
一、什么是Filter
Filter技术是servlet2.3新增加的功能.servlet2.3是sun公司与2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则.由于众多的参与者的共同努力,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高.
它新增加的功能包括:
1.应用程序生命周期事件控制;
2.新的国际化;
3.澄清了类的装载规则;
4.新的错误及安全属性;
5.不赞成使用HttpUtils类;
6.各种有用的方法;
7.阐明并扩展了几个servletDTD;
8.filter功能.
其中最重要的就是filter功能.它使用户可以改变一个request和修改一个response.Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response.换种说法,filter其实是一个”servletchaining”(servlet链).一个filter包括:
1.在servlet被调用之前截获;
2.在servlet被调用之前检查servletrequest;
3.根据需要修改request头和request数据;
4.根据需要修改response头和response数据;
5.在servlet被调用之后截获.
你能够配置一个filter到一个或多个servlet;
单个servlet或servlet组能够被多个filter使用.几个实用的filter包括:
用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLTfilter等.
一个filter必须实现javax.servlet.Filter接口定义的三个方法:
doFilter、init和destroy。
(在三个方法在后面后有详细的介绍).
二、Filter体系结构
2.1、Filter工作原理(执行流程)
当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。
请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。
当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。
同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。
************************************************************************************************************************
在这里,我要插几句——关于过滤链的问题:
上面说了,当一个请求符合某个过滤器的过滤条件时该请求就会交给这个过滤器去处理。
那么当两个过滤器同时过滤一个请求时谁先谁后呢?
这就涉及到了过滤链FilterChain。
所有的奥秘都在Filter的FilterChain中。
服务器会按照web.xml中过滤器定义的先后循序组装成一条链,然后一次执行其中的doFilter()方法。
(注:
这一点Filter和Servlet是不一样的,具体请参看我的另一篇文章:
<
Ahref="
target=_blank>
Servlet和Filter映射匹配原则之异同)执行的顺序就如下图所示,执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码,请求的资源,第二个过滤器的chain.doFilter()之后的代码,第一个过滤器的chain.doFilter()之后的代码,最后返回响应。
这里还有一点想补充:
大家有没有想过,上面说的“执行请求的资源”究竟是怎么执行的?
对于“执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码”这些我可以理解,无非就是按顺序执行一句句的代码,但对于这个“执行请求的资源”我刚开始却是怎么也想不明白。
直到我见到上面这张图片才恍然大悟(我说过了,这篇文章中的资料都是我从网上收集来的,当我看到上面的文字时是没有图片看的)。
其实是这样的:
通常我们所访问的资源是一个servlet或jsp页面,而jsp其实是一个被封装了的servlet(每个jsp执行前都会被转化为一个标准的servlet,这点若还有不明白的请自己到网上查一下吧),于是我们就可以统一地认为我们每次访问的都是一个Servlet,而每当我们访问一个servlet时,web容器都会调用该Servlet的service方法去处理请求。
而在service方法又会根据请求方式的不同(Get/Post)去调用相应的doGet()或doPost()方法,实际处理请求的就是这个doGet或doPost方法。
写过servlet的朋友都应该知道,我们在doGet(或doPost)方法中是通过response.getWriter()得到客户端的输出流对象,然后用此对象对客户进行响应。
到这里我们就应该理解了过滤器的执行流程了:
执行第一个过滤器的chain.doFilter()之前的代码——>
第二个过滤器的chain.doFilter()之前的代码——>
……——>
第n个过滤器的chain.doFilter()之前的代码——>
所请求servlet的service()方法中的代码——>
所请求servlet的doGet()或doPost()方法中的代码——>
第n个过滤器的chain.doFilter()之后的代码——>
第二个过滤器的chain.doFilter()之后的代码——>
第一个过滤器的chain.doFilter()之后的代码。
以上是我的理解,若有不对之处,还有大家不吝指教啊,大家一起学习!
!
2.2、Servlet过滤器API
Servlet过滤器API包含了3个接口,它们都在javax.servlet包中,分别是Filter接口、FilterChain接口和FilterConfig接口。
2.2.1
publicInterfaceFilter
所有的过滤器都必须实现Filter接口。
该接口定义了init,doFilter0,destory()三个方法:
(1)publicvoidinit(FilterConfigfilterConfig)throws
ServletException.
当开始使用servlet过滤器服务时,Web容器调用此方法一次,为服务准备过滤器;
然后在需要使用过滤器的时候调用doFilter(),传送给此方法的FilterConfig对象,包含servlet过滤器的初始化参数。
(2)publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)
throwsjava.io.IOException,ServletException.
每个过滤器都接受当前的请求和响应,且FilterChain过滤器链中的过滤器(应该都是符合条件的)都会被执行。
doFilter方法中,过滤器可以对请求和响应做它想做的一切,通过调用他们的方法收集数据,或者给对象添加新的行为。
过滤器通过传送至此方法的FilterChain参数,调用chain.doFilterO将控制权传送给下一个过滤器。
当这个调用返回后,过滤器可以在它的Filter方法的最后对响应做些其他的工作。
如果过滤器想要终止请求的处理或得到对响应的完全控制,则可以不调用下一个过滤器,而将其重定向至其它一些页面。
当链中的最后一个过滤器调用chain.doFilterO方法时,将运行最初请求的Servlet。
(3)publicvoiddestroy()
一旦doFilterO方法里的所有线程退出或已超时,容器调用
此方法。
服务器调用destoryO以指出过滤器已结束服务,用于释
放过滤器占用的资源。
2.2.2publicinterfaceFilterChain
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse)
thlowsjava.io.IOException,ServletException
此方法是由Servlet容器提供给开发者的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤
器,如果是最后一个过滤器,则下一个就调用目标资源。
2.2.3publicinterfaceFilterConfig
FilterConfig接口检索过滤器名、初始化参数以及活动的Servlet上下文。
该接口提供了以下4个方法:
(1)publicjava.1ang.StringgetFilterName0
返回web.xml部署文件中定义的该过滤器的名称。
(2)publicServletContextgetServletContextO
返回调用者所处的servlet上下文。
(3)publicjava.1ang.StringgetlnitParameter(java.1ang.Stringname)
返回过滤器初始化参数值的字符串形式,当参数不存在时,返回nul1.name是初始化参数名。
(4)publicjava.util.EnumerationgetlnitParameterNames()
以Enumeration形式返回过滤器所有初始化参数值,如果没有初始化参数,返回为空。
2.3、过滤器相关接口工作流程
从编程的角度看,过滤器类将实现Filter接口,然后使用这个过滤器类中的FilterChain和FilterConfig接口。
该过滤器类的
—个引用将传递给FilterChain对象,以允许过滤器把控制权传递给链中的下一个资源。
FilterConfig对象将由容器提供给过滤
器,以允许访问该过滤器的初始化数据。
详细流程如下图所示:
2.4、过滤器配置
过滤器通过Web应用程序中的配置描述符web.xml文件中的明,包括部分:
过滤器定义,由<
filter>
元素表示,主要包括<
filter-name>
和<
f'
flter-class>
两个必须的子元素和<
icon>
、<
init-param>
<
display-name>
description>
这4个可选的子元素。
子元素定义了—个过滤器的名字,<
filter-class>
指定了由容器载入的实际类,<
子元素为过滤器提供初始化参数。
<
filter-mapping>
主要由<
servlet-name>
url-pattem>
子元素组成。
将过滤器映射到一个或多个Servlet上,<
将过滤器映射到—个或多个任意特征的URL的JSP页面。
三、应用实例
从上面分析可知,实现Servlet过滤器,需要两步:
第一步开发过滤器,设计—个实现Fiker接口的类;
第二步通过web.xml配置过滤器,实现过滤器和Servlet、JSP页面之间的映射。
以下设计一个简单的IP地址过滤器,根据用户的IP地址进行对网站的访问控制。
(1)过滤器的设计ipfilter.java
packageipf;
imp0rtjava.io.IOException;
imp0rtjavax.servlet.*;
publicclassipfilterimplementsFilter//实现Filter接口
{protectedFilterConfigconfig;
protectedStringrejectedlP;
publicvoidinit(FilterConfigfilterConfig)throws
ServletException
{this.config=filterConfig;
//从Web)lE务器获取过滤器配置对象
rejectedlP=config.getlnitParameter(RejectedlP”):
,,从配置中取得过滤lP
if(rejectedlP=:
nul1)‘rejectedlP=)
)
publicvoiddoFilter(ServletRequestrequest,
ServletResponseresponse.FilterChainchain)throws
IOException,ServletException
{RequestDispatcherdispatcher=request.getRequestDispatcher("
"
);
StringremotelP=request.getRemoteAddrO;
//获取客户请求lP
inti=remotelP.1astlndexOf("
."
);
intr=rejectedlP.1astlndexOf(”.”):
StringrelPscope=rejectedlP.substring(0,r);
//过滤lP段
if(relPscope.equals(remotelP.substring(O.i)))
{
dispatcher.forward(request,response);
//重定向到rejectedError.jsp页面
retum;
//阻塞,直接返Web回客户端
}
else{chain.doFilter(request,response);
//调用过滤链上的下一个过滤器
publicvoiddestroy()
//过滤器功能完成后,由Web服务器调用执行,回收过滤器资源
注意:
chain.doFilterO语句以前的代码用于对客户请求的处理;
以后的代码用于对响应进行处理。
(2)配置过滤器
在应用程序Web—INF目录下的web.xml描述符文件中添加以下代码:
ipfIter<
/filter-name>
//过滤器名
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 开发 面试 资料