开始完整的学习Servlet&Jsp

虽然目前来说利用Servlet&JSP来完成工作已经完全没有问题,但是还是要打好基础,不然今天一个框架明天一个框架的 身体不行了实在是跟不上节奏了~
先学两个包中的内容吧
javax.servlet
javax.servlet.http
-------------------------------------------------------------------------
Interface Filter

过滤器是一个对象,执行过滤任务可以在请求一个资源(一个servlet或静态内容),或者从一个资源的响应,或者两者。

过滤器执行过滤在doFilter方法。每个过滤器能够访问一个FilterConfig对象,它可以获得它的初始化参数,并引用它可以使用d的ServletContext,例如,负载所需的资源过滤任务。
在过滤器应用的场景如下:
身份验证过滤器

日志记录和审核过滤器

图像转换过滤器

数据压缩过滤器

加密过滤器

分过滤器

过滤器,触发资源访问事件

XSL / T过滤器

mime类型链过滤器ks。

------------------------------------------------------
Filter中方法:
init(FilterConfig)
destroy()
doFilter(ServletRequest request,ServletResponse response,FilterChain chain)

FilterChain中的方法:
FilterChain是Filter链条,这个链条中Filter的执行顺序是按照在web.xml中filter的配置顺序来排序的。

doFilter(ServletRequest request,ServletResponse response)



在Filter中doFilter()中调用 FileterChain.的doFilter()方法如果有在Filter链条中有下一个filter 则将当前filter中的request和response 转发给第二个filter。如果已经到达filter的终端的话。则中止传递,进行相应的过滤功能

在Filter中的init(FilterConfig)方法中通过FilterConfig参数 可以获得:
1.FilterName
2.FilterConfig的名/值
3.还可以通过FilterConfig获得上下文ServletContext.


FilterConfig中方法:

getFilterName()
getInitParameter()
getInitParameterNames()
getServletContext()


RequestDispatcher接口:

forward()
include()
两者之间的区别 我个人理解为 两者都是将ServletRequest和ServletResponse两者传递给一个新的servlet/jsp 但是不同的是 forward()是有 request和response两者的控制权,而include()虽然转发到了新的servlet/jsp 但是request和response两者的控制权还是由原先的servlet/jsp来控制

<!--以下内容是在网上找到的,帮助我理解下-->
forward是转发的另一个页面.
include是把另一个页面加载到当前页面.

include和forward的区别:

include 是去而复返,forward 是前不见古人,后不见来者。

include 是把别人包含进来,forward 是丢掉了自己。


Interface Servlet:
最最基本的Servlet接口,javax.servlet.GenericServlet和javax.servlet.http.HttpServlet都是继承Servlet接口。
包括 serlvet 的 init() destroy() service()
方法:
init()
destroy()
service()
getServletConfig()
getServletInfo()

ServletConfig方法:
getInitParameter()
getInitParameterNames()
getServletContext()
getServletName()
ps: ServletConifg与FilterConfig 相类似。

在看到这部分api的时候发现了一个问题。 为什么通过ServletConfig能获得ServletContext,但是通过ServletContext却不能获得ServletConifg对象。按照道理来说ServletContext是整个应用全局的上下文,而ServletConfig是针对具体Servlet的。ServletContext的作用范围比ServletConfig大。不能够获得不到啊。
自己想了下又通过谷姐查找资料 还真验证了自己想法。
就是ServletContext是先创建的 而ServletConfig是后创建的。很有可能在ServletContext的时候ServletConfig还没有被实例化。
因为在web.xml配置文件的Servlet中支持一个参数
loadOnStartup 如果参数大于零的话就会启动就加载Servlet。不过默认是0


Interface ServletContainerInitializer
这个接口以前从来没有接触过,自己不敢妄加猜测,只能在网上找了段相关的信息,
等到用到的时候再仔细研究下。
ServletContainerInitializer也是Servlet3.0新增的一个接口,容器在启动时使用JAR服务API(JARServiceAPI)来发现ServletContainerInitializer的实现类,并且容器将WEB-INF/lib目录下JAR包中的类都交给该类的onStartup()方法处理,我们通常需要在该实现类上使用@HandlesTypes注解来指定希望被处理的类,过滤掉不希望给onStartup()处理的类。
而且该接口是Servlet3.0新规范里面提供的接口,需要在tomcat7.0以上版本才能够得到支持

Interface ServletContext:
method:
setInitParameter()
getInitParameter()
getInitParameterNames()
setAttribute()
getAttribute()
removeAttribute()
getServletInfo()
getAttributeNames()

以前没有了解过的方法:
createListener
createFilter
addListener
addFilter

Interface ServletContextAttributeListener:
主要用于监听ServletContext属性改变的情况。监听的是整个应用的全局有 增加,取代和删除 这三种情况。
方法:
attributeAdded()
attributeRemoved()
attributeReplaced()
这三个方法 分别在属性进行相应操作的时候会执行方法内部的代码。
共有的参数是ServletContextAttributeEvent。可以用过这个event参数来获得发生改变属性的 属性名称,和属性名对应的值。
class ServletContextAttributeEvent:
getName()
getValue()


Interface ServletContextListener

用于监听ServletContext整个生命周期发生的改变
方法:
void contextInitialized(ServletContextEvent sce)
void contextDestroyed(ServletContextEvent sce)
一个是context的初始化一个是context的销毁(关闭应用时候context会销毁)
class ServletContextEvent
通过ServletContextEvent. getServletContext()  就可以获得ServletContext对象。
这样就可以对上下文就行操作了。! 赞。

经过我自己写的小例子测试发现,即使在ServletContextListener的init方法中给ServletContext增加属性的话也会触发ServletContextAttributeListener。去执行其中的
attributeAdded等三个方法。
可见ServletContextAttributeListener和ServletContextListener是同时被容器初始化的。并行的。即使在初始化servletcontext的时候 增加属性也可以被监听。

Interface ServletRequest:
下面的内容是我自己尝试将j2ee的api来翻译成的:
公共接口ServletRequest 定义了一对象能将客户端的请求信息提供给servlet。servlet容器创建了一个ServletRequest对象并且把它作为servlet的service的传递参数。
一个ServletRequest对象提供的数据包括: 参数的名值,属性和input stream。继承ServletRequest接口的类 能够提供一些附加的特殊数据(比如http的 数据就是由HttpServletRequest提供的)
下面一些方法是经常能用到的:
setAttribute(String name,Object obj)
getAttribute(String name)
removeAttribute(String name)
getParameter(String  name)
getParameterValues(String name)
getInputStream()
isSecure()判断是否是https
getServletContext()
getRequestDispatcher()
getDispatcherType() 能够获得dispatcher的类型。ASYNC ERROR FORWARD INCLUDE REQUEST

Interface ServletRequestListener:
void requestInitialized(ServletRequestEvent sre)
void requestDestroyed(ServletRequestEvent sre)

Class ServletRequestEvent:
getServletContext()
getServletRequest()

Interface ServletRequestAttributeListener:
void attributeAdded(ServletRequestAttributeEvent srae)
void attributeRemoved(ServletRequestAttributeEvent srae)
void attributeReplaced(ServletRequestAttributeEvent srae)

Class ServletRequestAttributeEvent:
getName()
getValue()


Interface ServletResponse:
response跟request这对难兄难弟。经常被人传来传去。。。。。苦逼命
ServletResponse主要返回的是OutputStream和getWriter() 回应客户端的请求。
api中的其他方法也主要是围绕这功能来提供的。
method:
getOutputStream()
getWriter()
setContentType()
getContentLength()
getContentType()
这些常用的。  自己还写了一个下servlet下载的代码例子地址: http://ren2881971.iteye.com/admin/blogs/1705163

Interface SessionCookieConfig
这是Servlet3.0新增加的接口
Interface SingelThreadModel
这是Servlet2.4以后就不再建议使用的。


还剩下两个异常类:
1.ServletException;
2.UnavailableException


到此为止javax.servlet 包中的内容都已经看完了。自己没事的时候也可以拿出来复习下。
明天开始着手学习javax.servlet.http中的内容 这个包里的内容平时工作中运用的比较多。

到此为止

你可能感兴趣的:(servlet)