您的位置:首页 > Web前端 > JavaScript

JSP&Servlet核心介绍

2006-10-19 15:54 519 查看
JSP&Servlet介绍
概述
主要介绍以下的技术:
第一章:Servlet
第二章:Listener
第三章:Filter
第四章:JSP
第五章:定制标签
第六章:web.xml

第一章 Servlet
1.1 Servlet的线程
Servlet是一项服务器端技术,它接收来自HTTP的请求并返回HTTP响应。默认情况下servlet是多线程的,servlet引擎只创建了一个servlet实例,用多个线程执行servlet的service方法。Servlet引擎向servlet提供了一些标准的服务,其中包括身份验证、并行执行、内存管理等。
线程安全的servlet应该保护共享资源不被同时访问。Synchronized是保护共享资源的代码的一个有效方法。
如果servlet代码不是线程安全的,那么修改servlet类实现SingleThreadModel接口,servlet引擎会认为该servlet是单线程的,并请求它一次只处理一个请求。

1.2 servlet
最常用的servlet类型是为满足HTTP请求而设计的HTTP Servlet,现大部分Web服务器只支持HTTP Servlet,如WebLogic Server。HttpServlet被扩展时,新类会继承一些方法实现包含init(ServletConfig c)、service(HttpServletRequest request,HttpServletResponse response)、destroy()。下面是HttpServlet的类继承结构:

HttpServlet继承了GenericServlet中的service方法,GenericServlet.service()方法根据HttpServletRequest判断HTTP请求的类型,根据类型调用更专业的方法。HTTP1.1协议中的标准方法为OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT,尽管实际上所有的Servlet只使用GET与POST方法,但HttpServlet类中的服务器方法可以处理doOptions、doGet、doHead、doPost、doPut、doDelete、doTrace等方法。

1.3 servlet生命周期
Servlet的生命周期如下图:

1.4 servlet 特性
HTTP Servlet提供了一下的特性:
l HttpServletRequest:Servlet引擎用HttpServletRequest对象将HTTP请求的细节传递给servlet;对象就包含了提交页面的请求细节信息,其中包括数据的可用性、协议类型、安全级别等,
l HttpSession:对象对应于在服务器中处理用户每个会话信息的每个用户。

l HttpServletResponse: Servlet用HttpServletResponse对象将响应细节传递给Servlet引擎。

1.4.1 HttpServletRequest
HttpServletRequest继承了ServletRequest的包装类HttpServletRequestWrapper。如图:

下面介绍HttpServletRequest接口中的一些常用的方法:
l BufferedReader getReader() BufferedReader一行一行地读取和分析请求体文本。
l ServletInputStream getInputStream() ServletInputStream类读取二进制数据。
l String getContentType() String获取内容的MIME类型。
l Int getContentLength() int 获取请求体中的字节数。
l Enumeration getParameterNames() 从请求分析出来的参数名作为Enumeration而不是String数组。
l String getParameter (String name) String值对应于参数名,如参数中没有返回null。
l String[] getParameterValues(String name) 如果有多个同名的参数,要用这个方法,返回String数组保持参数原有的顺序,如果没有返回null。
l String getMethod() String 表示请求中使用的HTTP方法。
l Cookie[] getCookies Cookies是web服务器发给web浏览器的文本块,web浏览器在下次事务中返回,请求中的Cookies数据分析成Cookie对象,以数组形式提供。
l String getHeader(String name) 反回与头名称相关联的String值,如果没有返回null。
l String getQueryString() 返回GET请求的URL中原先的查询String。
l HttpSession getSession() HttpSession获得会话。

1.4.2 HttpServletResponse
HttpServletResponse继承了ServletResponse的包装类HttpServletResponseWrapper。如图:

下面介绍HttpServletResponse接口中的一些常用的方法:
l setContentType 浏览器用ContentType来确定如何显示响应体中的信息。
l ServletOutputStream getOutputStream() 输出二进制数据
l getWriter 该方法返回一个PrintWriter流,servlet可以使用标准的print()方法把响应编写到这个流中,servlet引擎将编写到该流中的响应放入HTTP响应体中,发送回客户端。
l Void addCookie(Cookie c) 将各个cookie内容加到相应中,注意浏览器只从某个源接受20个cookies
l Void addHeader(String name,String value) 与void setHeader(String name,String value)这两个方法创建或修改响应头中的行
l Void sendRedirect (String neurl) 这个方法将用户浏览器重新定向到新的URL,调用这个方法等于终止响应。

1.4.3 Session
会话是在本地对象中存储状态信息并创建对该对象的引用来实现的。Servlet引擎将该引用传递回浏览器,以便在以后的请求中返回该引用。当浏览器发出另一个请求时,新请求中包括该引用。Servlet引擎使用该引用该请求与适当的会话对象进行匹配,并将这个会话提供给web应用程序。Servlet将引用或会话ID传递给浏览器有两个机制,URL重写和Cookie。Weblogic既使用URL重定向又使用cookie。在服务器断超时或显式失效session.invalidate(),客户端关闭浏览器、离开网站时,会话实效。
会话中常用的方法有:
l Enumeration getAttributeNames() 返回的Enumeration中每个加进对话的对象有个String对象名
l String getId() 返回引擎对这个会话生成的ID
l getAttribute(String name) 返回会话中的属性为name的属性值
l Void invalidate() 这个方法在不再需要会话时使用
l Boolean isNew() 返回true,说明对话在浏览器引用前是新的。
l Void removeAttribute(String name) 删除属性

1.4.4 Cookies
Cookies在用户系统中存储有限的信息,以便在后续事务中返回服务器,Cookies的属性有:
l Domain 控制发送Cookie的服务器范围的域,缺省值返回产生域,如www.sybex.com,但设置为.sybex.com可以让Cookie返回www2.sybex.com或ftp.sybex.com之类的服务器
l Max-Age 这个数字属性用于避免在浏览器中堆满过时信息,浏览器删除指定时间以前的Cookie
l Path 这个变量限制服务器中返回Cookie的路径,这是外部客户机看到的路径,而不是文件系统路径,设置为“/”可以返回服务器中的所有路径,而设置为“/servlets”则只让以“servlets”开头的URL访问这个Cookie,包括其所有子目录。
l Name 所有Cookies都有名称
l Value 返回服务器的文本

1.4.5 ServletContext
servletContext提供了一个跨web服务实例中的多个servlet来共享数据的机制,不过因为这些属性只存在于创建他们的那个web服务实例中,所以无法使用servletContext来今行跨多个服务器实例的通信。
servletContext接口提供了一些常用方法有:
l String getMimeType(String s) 返回MIME类型,没有时返回null
l Set getResourcePaths(String s) set为从web应用程序根目录开始在参数s目录下的文件或文件夹列表。如:getResourcePaths(“/”)返回根目录下的文件或文件夹列表。
l URL getResource(String s) s以“/”从根目录开始的文件路径,返回该文件路径的URL类,没有时返回null
l InputStream getResourceAsStream(String s) 返回一个指定路径文件的InputStream,这个文件流交给servlet处理。
l RequestDispatcher getRequestDispatcher(String s) 返回RequestDispatcher参数s文件路径以“/”开始
l RequestDispatcher getNamedDispatcher(String s) 参数s为Servlet名称,根据servlet名称返回一个RequestDispatcher对象

l String getRealPath(String s) 参数s为一个文件的相对路径,返回一个绝对路径
l String getServerInfo() 返回servlet运行的容器的名称和版本信息
l String getInitParameter(String s) 返回web.xml中参数为s的配置信息
l Enumeration getInitParameterNames() 返回web.xml中所有的参数名称
l String getServletContextName()
l Object getAttribute(String s) 根据属性名称,servlet容器返回属性值
l void setAttribute(String s, Object obj) 在servlet容器中放置属性
l void removeAttribute(String s) 在servlet容器中删除属性s

1.4.6 ServletConfig
Servletconfig这个接口对象保存Servlet初始化期间使用的信息。
Servletconfig提供的方法有:
l String getServletName() 返回servlet的名称
l ServletContext getServletContext() 返回ServletContext
l String getInitParameter(String s) 返回web.xml中servlet参数为s的配置参数
l Enumeration getInitParameterNames() 返回所有在web.xml中配置的servlet的参数名称

1.4.7 RequestDispatcher
不要对本地URL使用HttpResponse.sendRedirect()。在服务端内部处理请求时,可以使用RequestDispather.forward()方法将用户重定向到另一个资源。

这个接口将请求从当前的Servlet转发到另一个Servlet或JSP中进一步处理。
RequestDispatcher提供的方法有:
l void forward(ServletRequest servletrequest, ServletResponse
servletresponse) 传递request到一个servlet或jsp或html
l void include(ServletRequest servletrequest, ServletResponse
servletresponse)包含response中一个servlet或jsp或html文件资源

第二章:Listener
servletContextListener应用程序生命周期事件,提供了两个方法:
l contextInitialized(ServletContextEvent event):servlet引擎在初始化web应用程序期间调用。
l contextDestroyed(ServletContextEvent eent):servlet引擎在结束web应用程序服务时调用。

监听类的继承关系如下图:

2.1 ServletContextAttributeListener
ServletContextAttributeListener servletContext属性改变事件提供了以下方法:
l attributeAdded(ServletContextAttributeEvent event):在将属性添加到ServletContext时调用。
l attributeRemoved(ServletContextAttributeEvent event)-在从ServletContext中删除属性时调用。
l atributeReplaced(ServletContextAttributeEvent event)-在属性替换时调用。

2.2 HttpSessionListener
HttpSessionListener提供了一下一些方法:
l sessionCreated(HttpSessionEvent httpsessionevent);在一个新session创建时调用
l sessionDestroyed(HttpSessionEvent httpsessionevent);在session消除时调用

2.3 HttpSessionActivationListener
HttpSessionActivationListener提供了一下一些方法:
l sessionWillPassivate(HttpSessionEvent httpsessionevent);在将会话迁移到另一个JVM实例之前,要序列化会话,在进行序列化之前调用。
l sessionDidActivate(HttpSessionEvent httpsessionevent);当在目标服务器实例上还原会话之后调用。

2.4 HttpSessionAttributeListener
HttpSessionAttributeListener提供了一下一些方法:
l attributeAdded(HttpSessionBindingEvent httpsessionbindingevent);新增属性时调用
l attributeRemoved(HttpSessionBindingEvent httpsessionbindingevent);删除属性时调用
l attributeReplaced(HttpSessionBindingEvent httpsessionbindingevent);修改属性时调用

2.5 HttpSessionBindingListener
HttpSessionBindingListener与前面的监听器不同的是,实现HttpSessionBindingListener的类没有注册在web.xml部署描述中。
HttpSessionBindingListener提供了一下一些方法:
l valueBound(HttpSessionBindingEvent httpsessionbindingevent);当应用程序代码在会话上调用setAttribute()方法时,如果参数值对象实现了HttpSessionBindingListener,那么将被调用。
l valueUnbound(HttpSessionBindingEvent httpSessionbindingevent);当从会话中取消对属性值的绑定时,无论是removeAttribute()或会话超时或调用了invalidate()方法,都将被调用

第三章 Filter
3.1 类结构图
Filter的类结构图如下:

3.2 Filter提供的方法
Filter提供的方法:
l void init(FilterConfig filterconfig) 在web容器需要一个Filter,装入Filter时调用。
l void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) 在每次请求通过FilterChain时被调用, ServletRequest, ServletResponse经过处理后再传给FilterChain
l void destroy() 在web容器删除Filter时调用。

3.3 FilterChain
FilterChain提供的方法:
l void doFilter(ServletRequest servletrequest, ServletResponse servletresponse)

第四章 JSP
4.1 JSP运行机理
JSP页面的请求由Web服务器定向到JSP引擎,JSP引擎根据页面名查找相应的Servlet,如果Servlet存在且最新,则请求和普通的Servlet一样用HttpServletRequest和HttpServletResponse对象传递给Servlet _jspService方法;如果源页面已经改变或没有编译,则JSP引擎分析源代码,创建Servlet等价的Java代码,扩展HttpJSPServlet.然后编译这个代码,并执行Servlet。

4.2 类结构图

4.3 JSP特性
4.3.1 resquest
是HttpServletRequest类,和servlets中的HttpServletRequest一样,包装客户端的请求信息。
4.3.2 response
是HttpServletResponse类,和servlets中的HttpServletResponse一样,包装返回到客户端响应信息。

4.3.3 pageContext
pageContext是JSP中提供的一个包装其他所有特性的类。pageContext的方法如下:
l void setAttribute(String s, Object obj) 把对象存入jspContext自己的Hashtable中
l void setAttribute(String s, Object obj,int scope) 根据int把对象存入session或request或servletContext中。
l Object getAttribute(String s) 从jspContext的HashTable中获得对象
l Object getAttribute(String name, int scope) 从指定的int
(request、session、servletContext)中获得对象
l void removeAttribute(String s) 删除session、request、servletContext中的对应对象
l void removeAttribute(String s,int scope) 根据int(request、session、servletContext)删除对象
l JspWriter getOut() 获取JspWriter对象
l HttpSession getSession() 获取HttpSession对象
l Object getPage() 获取page对象(this对象)
l ServletRequest getRequest() 获取HttpServletRequest对象
l ServletResponse getResponse() 获取HttpServletResponse对象
l ServletConfig getServletConfig() 获取ServletConfig对象
l ServletContext getServletContext() 获取ServletContext对象
l void forward(String s) 把当前HttpServletRequest和HttpServletResponse转到另一个资源
l void include(String s) 把制定资源作为当前HttpServletRequest和HttpServletResponse的一部分

4.3.4 session
是HttpSession类,和servlets中的HttpSession一样。包装会话信息。

4.3.5 application
是ServletContext类,和servlets中的ServletContext一样,提供应用全局信息的类。

4.3.6 out
是JspWriter类,是JSP中新增的类。功能和servlets中的PrintWriter类类似。

4.3.7 config
是ServletConfig类,和servlets中的ServletConfig一样,包装servlet初始化的信息和提供全局信息类ServletContext。

第五章 标签
5.1 标签元素
Tgglib中的元素定义了标签库,这些元素包括:
l Tlib-version:这个标签库实现的版本
l Jsp-version:标签库所必需的JSP版本
l Short-name:在JSP中使用的默认的命名空间的前缀
l Uri:标识标签库的这个实现,就好像在web.xml中定义一样
l display-name:JSP编辑工具可以使用这个名称表示标签库
l small-icon:引用一幅图片表示标签库
l large-icon:引用一幅图片表示标签库
l desscriptoin:描述标签库
l Example:使用example标签演示库的使用
l Listener元素:一个tag库可能定义一些类做为它的事件侦听类
l Tag:使用tag元素来定义标签库中每个可用的标签
n name: 标签的名称
n Tag-class:指定实现了标签的处理程序
n Body-content:处理标签体的方式,一般为JSP
n Attribute:表明标签包含的属性
u Display-name:JSP编辑工具可以使用这个名称表示标签
u Small-icon:一幅图片
u Large-icon:一幅图片
u Descriptin:属性描述
u Example:演示使用的标签
u Name:属性名称
u Required:是否必须包含该属性
u Retexprvalue:属性是静态的还是会动态的接受一个表带式作为值
u Type:如果是动态的,定义值的类型

5.2一个例子
TLD的一个例子
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>stock</short-name>
<uri>http://www.learnweblogic.com/tlds/stock_1_0</uri>
<tag>
<name>stockPrice</name>
<tag-class>com.learnweblogic.examples.ch4.StockPriceHandler</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>tickerSymbol</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
</tag>
<taglib>
</taglib>

5.3 实现类
处理程序类实现了以下三个接口中的一个:Tag、IterationTag、BodyTag,常扩展TagSupport和BodyTagSupport中的一个,重写这些类中的方法:
l Public int doStartTag() 处理在JSP处理JSP中找到的定制标签的起始标签或空标签
l Public int doAfterBody() 在doStartTag()之后,在doEndTag()方法之前调用
l Public int doEndTag() 处理在JSP中找到的定制标签的终止标签或空标签
l Public void release() 释放资源,并重置标签处理器实例中的变量

5.4 类处理逻辑
方法处理逻辑顺序如图(注意:根据实现的接口不同,处理逻辑会稍有不同):

方法说明:
l Instantiation() JSP为被请求的处理程序类创建一个实例
l setPageContext() 通过JSP页面的PageContext来设置标签处理程序的PageContet
l setParent() JSP把标签处理程序的父亲程序传递给马上要封闭的定制标签
l setAttributeNames() 对于JSP标签中的每个属性,JSP页面都会在标签处理程序对象中调用setAttributeName()方法
l doStartTag()
l doAfterBody()
l doEndTag()
l Release()

5.5 JSP页面中标签声明
如果在web.xml中配置了标签库可以使用以下的声明方式:
<%@ taglib uri=“pathtolib” prefix=“ai” %>
Web.xml配置如下:
<taglib>
<taglib-uri> pathtolib</taglib-uri>
<taglib-location>/WEB-INF/jsp/example-taglib.tld</taglib-location>
</taglib>
如果没有在web.xml中配置,可以用以下的方法声明:
<%@ taglib uri="/WEB-INF/tlds/ch06.tld" prefix="ch06" %>

第六章:web.xml
6.1 web.xml中的元素
l web-app元素内的合法元素必需按一定的次序存放
l icon icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置
l display-name display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名称
l description description元素给出与此有关的说明性文本。
l context-param context-param元素声明应用范围内的初始化参数
l filter 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。
l filter-mapping 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。
l listener servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。
l servlet 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。
l servlet-mapping 服务器一般为servlet提供一个缺省的URL:
l session-config 如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。
l mime-mapping 如果Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保
l welcom-file-list welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。
l error-page error-page元素使得在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。
l taglib taglib元素对标记库描述符文件(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,而不用编辑使用这些文件的JSP页面。
l resource-env-ref resource-env-ref元素声明与资源相关的一个管理对象。
l resource-ref resource-ref元素声明一个资源工厂使用的外部资源。
l security-constraint security-constraint元素制定应该保护的URL。它与login-config元素联合使用
l login-config 用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。
l security-role security-role元素给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。
l env-entry env-entry元素声明Web应用的环境项。
l ejb-ref ejb-ref元素声明一个EJB的主目录的引用。
l ejb-local-ref ejb-local-ref元素声明一个EJB的本地主目录的应用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: