《Servlet核心技术.ppt》由会员分享,可在线阅读,更多相关《Servlet核心技术.ppt(52页珍藏版)》请在三一办公上搜索。
1、第6章 Servlet核心技术,6.1 Servlet基础,6.2 Servlet生命周期,6.3 使用Servlet,6.4 获取运行环境信息,6.5 Servlet中会话设置,6.6 Servlet中异常设置,6.7 Servlet过滤器,6.8 Servlet监听器,6.1 Servlet基础,6.1.1 Servlet技术功能,Servlet特征,Servlet是1997年由Sun和其它的几个公司提出的一项技术,使用该技术能将HTTP请求和响应封装在标准Java类中来实现各种Web应用方案。Servlet是使用Java语言编写的服务器端程序,它能够接受客户端的请求并产生响应。与常规的C
2、GI程序相比,Servlet具有更好的可移植性和安全性、以及更强大的功能等特点。,返回,Servlet是对支持Java的服务器的一般扩充,它最常见的用途就是扩展Web服务器,即:每当请求到达服务器时,Servlet负责对请求做出相应的响应。Servlet最常见的功能包括以下几种:,Servlet技术功能,基于客户端的响应,给客户端生成并返回一个包含动态内容的HTML 页面。可生成一个HTML片段,并能将其嵌入到现有HTML页面中。能够在其内部调用其它的Java资源并与多种数据库进行交互。可同时与多个客户机进行连接,包括接收多个客户机的输入以及并将 结果返回给多个客户机。在不同的情况下,可将服务
3、器与Applet的连接保持在不同的状态。对特殊的处理采用MIME类型过滤数据。将定制的处理提供给所有服务器的标准例行程序。例如,Servlet可以 修改如何认证用户。,返回,Servlet是传统CGI的替代品,它能够动态的生成Web页面,与其他的动态网页编程技术相比,Servlet具有以下几点非常明显的特征:,Servlet特征(1),高效性传统CGI中,对每个请求都要启动一个新的进程,启动进程所需要的开销在有些情况下就可能很大,而Servlet在服务器上仅有一个Java虚拟机在运行,每个Servlet请求都作为持久性进程中的一个单独线程得以执行,相对于传统CGI而言,显然效率要高得多。方便性
4、Servlet提供了大量的实用工具例程。例如,自动解析和编码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话等等。功能强大许多传统CGI程序很难完成的工作使用Servlet就可轻松完成。例如Serlet能够直接和Web服务器交互,而普通的CGI程序则不能。Servlet还能够在各个应用程序之间共享数据,使得数据库连接池之类的功能很容易实现。,Servlet特征(2),跨平台性Servlet采用Java语言编写,在有Java运行环境的任何操作系统上都可运行。成本低许多廉价甚至免费的Web服务器可供个人或小规模网站使用,而且对于现有的服务器,即使它不支持Servlet,要加上这部
5、分功能也往往是免费的(或只需要极少的投资)。可扩展性Servlet采用Java语言编写,而且得到了广泛的支持,因此基于Servlet的应用具有很好的扩展性。,返回,6.2 Servlet生命周期,6.2.1 加载并初始化Servlet,6.2.2 处理客户端请求,6.2.3 卸载Servlet,Servlet的生命周期如图所示:,返回,加载并初始化Servlet,Servlet加载和实例化是由容器来负责完成的。加载和实例化Servlet其实指的是将Servlet类载入JVM(Java虚拟机)中并初始化。将Servlet类载入JVM中的时机存在一下3种可能:,当服务器启动时。浏览器第一次接收请求
6、时。根据管理员要求。,当服务器启动时,首先容器会定位Servlet类,然后加载它,容器加载Servle类以后,就会实例化该类的一个或者可能多个实例,Servlet被实例化后,容器会在客户端请求以前首先初始化它,其方式就是调用它的init()方法,并传递实现ServletConfig接口的对象。执行完init()方法后,Servlet就会处于“已初始化”状态。,在初始化阶段,Servlet实例可能会抛出ServletException异常或UnavailableException异常。,返回,处理客户端请求,Servlet初始化完毕以后,就可以用来处理客户端的请求了。当客户端发来请求时,容器会首
7、先为请求创建一个ServletRequest对象和ServletResponse对象,其中ServletRequest代表请求对象,ServletResponse代表响应对象。然后会调用service()方法,并把请求和响应对象作为参数传递,从而把请求委托给Servlet。在每次请求中,ServletRequest对象负责接受请求,ServletResponse对象负责响应请求。,在HTTP请求的情况下,容器会调用与HTTP请求的方法相应的doXXX()方法,例如,若HTTP请求的方式为GET,容器会调用doGet()方法,若HTTP请求的方式为POST,容器会调用doPost()方法。,Se
8、rvlet在处理客户端请求的时候有可能会抛出ServletException异常或者UnavailableException异常。,返回,卸载Servlet,Servlet的卸载是由容器定义和实现的,因为资源回收或其他原因,当Servlet需要销毁时,容器会在所有Servlet的service()线程完成之后(或在容器规定时间后)调用Servlet的destroy()方法,以此来释放系统资源,比如数据库的连接等等。在destroy()方法调用之后,容器会释放Servlet实例,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Se
9、rvlet实例。,返回,6.3 使用Servlet,6.3.1 认识第一个Servlet,6.3.2 使用HttpServlet,在应用程序中,所有的Servlet都必须直接或者间接地实现javax.servlet.Servlet接口,而我们在开发过程中最常使用的则是扩展javax.servlet.Servlet接口的实现类javax.servlet.GenericServlet和其子类javax.servlet.http.HttpServlet。,返回,认识第一个Servlet(1),一个普通的Servlet只需扩展javax.servlet.GenericServlet即可,Generic
10、Servlet类定义了一个普通的、协议无关的Servlet,使用GenericServlet类可使编写Servlet变得简单。例如,创建一个简单的Servlet,主要代码如下:,public class ServletSample extends GenericServletpublic void service(ServletRequest request,ServletResponse response)throws ServletException,IOException response.setCharacterEncoding(GBK);/设置响应的编码类型为GBKPrintWrit
11、er out=response.getWriter();/获取输出对象 out.println();out.println(这是第一个Servlet的例子);out.println();out.close();/关闭输出对象,认识第一个Servlet(2),配置web.xml文件,通过元素和元素实现,其中元素用来定义,元素用来为Servlet配置映射路径。,ServletSample sunyang.ServletSample ServletSample/servlet,程序的运行结果如图所示:,返回,使用HttpServlet(1),创建用于Web的Servlet,需要扩展javax.ser
12、vlet.http.HttpServlet。HttpServlet可用于处理HTTP请求,例如,创建用于Web的Servlet:,使用HttpServlet(2),配置web.xml文件,ServletSample sunyang.HttpServletSample ServletSample/httpServlet,程序的运行结果如图所示:,返回,6.4 获取运行环境信息,6.4.1 获取Servlet信息,6.4.2 获取服务器端信息,6.4.3 获取客户端信息,运行环境信息包括Servlet信息、服务器端信息和客户端信息。,返回,获取Servlet信息(1),Servlet信息包括Ser
13、vlet的初始化参数、Servlet的初始化参数名和Servlet名称,这些信息通常都是配置在web.xml中的,可通过javax.servlet.ServletConfig接口中定义的方法来获取。,1.获取Servlet的初始化参数,在Web.xml文件中,元素的相关配置代表Servlet的初始化参数,在Servlet中这些参数的获取是通过ServletConfig接口的getInitParameter()方法来完成的,getInitParameter()方法的语法格式如下:,public String getInitParameter(String name),语句中,参数name为元素的
14、值。getInitParameter()方法的返回值为元素的值。,获取Servlet信息(2),2获取Servlet初始化参数名,在web.xml文件中,元素的值即为Servlet初始化参数名。获取Servlet初始化参数名通过ServletConfig接口的getInitParameterNames()方法来完成,该方法的语法格式如下:,public Enumeration getInitParameterNames(),getInitParameterNames()方法的返回值为一个枚举对象(Enumeration),和getInitParameter()方法一样,该方法也可在Generi
15、cServlet的子类中直接调用。,获取Servlet信息(3),3获取Servlet名称,可通过ServletConfig接口的getServletName()方法来获取Servlet在web.xml文件中的注册名称,该方法的语法格式如下:,public String getServletName(),getServletName()方法的返回值为元素的值,若Servlet未注册,则返回类名。,返回,获取服务器端信息(1),服务器端信息包括服务器名、服务器端口号、服务器的属性信息等,Servlet通过ServletContext和ServletRequest接口提供的相关方法可获取这些服务器
16、端信息,这些方法的名称及其作用如表所示:,获取服务器端信息(2),应用举例:Servlet主要代码如下:,获取服务器端信息(3),在XML文件中配置之后,运行结果如图所示:,返回,获取客户端信息(1),客户端信息包括客户端主机名、客户端IP地址、客户端端口号、客户端的请求参数等,Servlet通过ServletRequest接口或其子接口HttpServletRequest提供的相关方法可获取客户端信息,这些方法的名称及其作用如表所示:,获取客户端信息(2),实例:Servlet主要代码如下:,获取客户端信息(3),配置Web.xml文件,运行结果如图所示:,返回,6.5 Servlet中会话
17、设置,6.5.1 获取HttpSession对象,6.5.2 在HttpSession对象中保存数据,6.5.3 在HttpSession对象中读取数据,返回,获取HttpSession对象,当需要为客户端建立session时,Servlet容器会给每一个用户建立一个HttpSession对象。获取HttpSession对象的方式是通过调用HttpServletRequest 接口提供的以下两个方法:,public HttpSession getSession()public HttpSession getSession(Boolean create),使用无参数的getSession()方法
18、会获取一个HttpSession对象,而对于带参数的getSession()方法,如果当前请求不属于任何会话,而且参数create值为true,则创建一个新会话,否则返回null,此后所有来自同一个的请求都属于这个会话。,返回,在HttpSession对象中保存数据,获取到HttpSession对象后,通过HttpSession对象的setAttribute()方法通过绑定一对名字/值数据,可将相关数据保存到当前会话中,如果会话中已经存在该名字则替换它,setAttribute()方法的语法格式如下:,public void setAttribute(String name,Object va
19、lue),参数name是绑定到会话中的属性名称,参数value是属性的值。,返回,在HttpSession对象中读取数据,HttpSession提供的getAttribute()方法可读取存储在会话中的对象,该方法的语法格式如下:,public Object getAttribute(String name),参数name的值为setAttribute(String name,Object value)方法中设置的name的值。,返回,6.6 Servlet中异常设置(1),在Servlet中,可使用两种处理异常的方式:,在try/catch语句的catch语句块中直接生成并输出异常信息的 页
20、面,或者将异常转发到异常处理的Servlet或JSP页面中。在web.xml文件中通过元素指定异常处理。,第一种方式和普通的Java类中处理异常的方式类似,第二种方式则是由Servle规范提出的,其优点就是这种处理方式属于整个Web程序的异常处理,它使得Web程序以一种统一的方式在不同的服务器中显示异常信息。,下面看一个实例:,6.6 Servlet中异常设置(2),(1)创建两个JSP页面,名称分别为“exception.jsp”和“notFind.jsp”,其中exception.jsp用来处理数组下标越界的异常,notFind.jsp用来处理404错误代码。,数组下标越界异常页面请求中出
21、现数组下标越界异常,404错误处理页面当前请求的页面不存在,notFind.jsp,exception.jsp,6.6 Servlet中异常设置(3),(2)创建Servlet类ExceptionServlet.ava,该类可产生一个数组下标越界异常,代码如下:,public class ExceptionServlet extends HttpServletprotected void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException this.doPost(re
22、q,resp);protected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException int num=new int2;num3=0;/数组下标越界,6.6 Servlet中异常设置(4),(3)在web.xml中配置类ExceptionServlet和元素:,6.6 Servlet中异常设置(5),(4)运行结果,当请求ExceptionServlet时,则出现如图1所示的页面:,当请求一个不存在的页面时,则出现如图2所示的页面:,图1,图2,返回,6
23、.7 Servlet过滤器,6.7.1 Servlet过滤器工作原理,6.7.2 Servlet过滤器配置,6.7.3 Servlet过滤器典型应用,返回,Servlet过滤器工作原理,Servlet过滤器其实就是一种小型的、可插入的Web组件,它能够对Servlet容器的请求和响应进行拦截和处理,不能生成请求和响应。,Servlet过滤器介于与之相关的Servlet或JSP页面与客户端之间,工作原理:当某个资源与Servlet过滤器关联后,对该资源的所有请求都会经过Servlet过滤器,Servlet过滤器在Servlet被调用之前会检查请求对象(Request对象),并决定是将请求转发给过
24、滤器链中的下一个资源还是中止该请求并响应用户。若请求被转发给过滤器链中的下一个资源处理后,Servlet过滤器会检查响应对象(Response对象),进行处理后返回给用户,其工作原理如图所示:,返回,Servlet过滤器配置(1),配置Servlet过滤器包括下面两个步骤:,(1)命名Servlet过滤器和指定Servlet 过滤器相应的实现类,并且可选择指定传递至Servlet过滤器的初始化参数。配置代码如下:,FilterName package.className ParamName1 ParamValue1 ParamName1 ParamValue1,Servlet过滤器配置(2),
25、(2)将Servlet 过滤器映射至 URL 或 Servlet,这是通过元素来实现的。将Servlet 过滤器映射至 URL的配置代码如下:,FilterName/path,元素和元素的子元素一致。元素指定了过滤器的映射路径,Servlet过滤器还可映射至Servlet:,FilterNameServletName,元素和元素的子元素一致。元素指定过滤器映射的Servlet的名称,返回,Servlet过滤器典型应用(1),创建过滤器须实现javax.servlet.Filter接口,该接口内定义了3个方法:,init(FilterConfig config):用于初始化过滤器,并其内获取we
26、b.xml 文件中配置的过滤器初始化参数。doFilter(ServletRequest reg,ServletResponse res,FilterChain chain):用于进行过滤操作,该方法的第一个参数为ServletRequest对象,此对象给过滤器提供了对进入的信息(包括表单数据、Cookie和 HTTP请求头)的完全访问;第二个参数为ServletResponse,用于 响应使用ServletRequest对象访问的信息,通常在简单的过滤器中 忽略此参数;最后一个参数为 FilterChain,该参数用来调用过滤 器链中的下一个资源。destroy():用于销毁过滤器。,Ser
27、vlet过滤器典型应用(2),创建过滤器实例:,(1)创建Servlet过滤器“IPFilter.java”,它可以过滤用户的IP地址,以进行访问控制。该过滤器IPFilter的关键代码如下:,public class IPFilter implements Filterprotected FilterConfig filterConfig;protected String filterIP;/需要过滤的IP地址/*初始化过滤器*/public void init(FilterConfig config)throws ServletException this.filterConfig=con
28、fig;filterIP=config.getInitParameter(filterIP);/获取被过滤的IP地址if(filterIP=null)filterIP=;,Servlet过滤器典型应用(3),/*过滤操作*/public void doFilter(ServletRequest reg,ServletResponse res,FilterChain chain)throws IOException,ServletException RequestDispatcher reqDispatcher=reg.getRequestDispatcher(error.jsp);String
29、 remoteIP=reg.getRemoteAddr();/获取本地IP地址 if(remoteIP.equals(filterIP)/如果该IP地址被过滤,将转向错误页面 reqDispatcher.forward(reg,res);else/否则将请求转发给过滤器链中的其他资源 chain.doFilter(reg,res);/*销毁过滤器*/public void destroy()this.filterConfig=null;,Servlet过滤器典型应用(4),(2)在web.xml文件中配置IPFilter过滤器,在配置文件中定义了一个名为filterIP的参数,它的值为,表示I
30、P地址为的用户将被拒绝访问。在web.xml文件中配置过滤器如下:,IPFilter sunyang.IPFilter filterIP 192.168.70.82 IPFilter/*,Servlet过滤器典型应用(5),(3)建立测试IPFilter过滤器的JSP页面“success.jsp”和“error.jsp”。,欢迎页面 欢迎访问吉林省三扬科技咨询有限公司!,拒绝访问 对不起,您的IP地址禁止访问该网站,success.jsp,error.jsp,Servlet过滤器典型应用(6),(4)运行结果:,当IP地址非的用户访问success.jsp时,运行结果如图1所示:,当IP地址非
31、的用户访问success.jsp时,运行结果如图2所示:,图1,图2,返回,6.8 Servlet监听器,6.8.1 Servlet监听器工作原理,6.8.2 Servlet监听器类型,6.8.3 Servlet监听器典型应用,返回,Servlet监听器工作原理,Servlet监听器是Web应用程序事件模型的一部分,当Web应用中的某些状态发生改变时,Servlet容器就会产生相应的事件,比如创建ServletContext对象时触发ServletContextEvent事件,创建HttpSession对象时触发HttpSessionEvent事件,Servlet监听器可接收这些事件,并可以在
32、事件发生前、发生后可以做一些必要的处理。,返回,Servlet监听器类型(1),根据监听对象的不同,Servlet2.4规范将Servlet监听器划分为以下3种:,ServletContext事件监听器:用于监听应用程序环境对象。HttpSession事件监听器:用于监听用户会话对象。ServletRequest事件监听器:用于监听请求消息对象。,1ServletContext事件监听器,对ServletContext对象进行监听的接口有ServletContextAttributeListener和ServletContextListener,其中ServletContextAttribut
33、eListener用于监听ServletContext对象中属性的改变,包括增加属性、删除属性和修改属性。ServletContextListener用于监听ServletContext对象本身的改变,例如ServletContext对象的创建和销毁。,Servlet监听器类型(2),ServletContext事件监听器中的接口和方法如表所示:,Servlet监听器类型(3),2HttpSession事件监听器,对会话对象进行监听的接口有HttpSessionAttributeListener、HttpSessionListener、HttpSessionActivationListener
34、和HttpSessionBindingListener。其中HttpSessionAttributeListener用于监听HttpSession对象中属性的改变,例如属性的增加、删除和修改。HttpSessionListener用于监听HttpSession对象的改变,例如HttpSession对象的创建与销毁,HttpSessionActivationListener用于监听HttpSession对象的状态,例如HttpSession对象是被激活还是被钝化。HttpSessionBindingListener用于监听HttpSession对象的绑定状态,例如添加对象和移除对象。,Servl
35、et监听器类型(4),HttpSession事件监听器中的接口和方法如表所示:,Servlet监听器类型(5),3ServletRequest事件监听器,对请求消息对象进行监听的接口有ServletRequestListener和ServletRequestAttributeListener,其中ServletRequestListener用于监听ServletRequest对象的变化,例如ServletRequest对象的创建和销毁。ServletRequestAttributeListener用于监听ServletRequest对象中属性的变化,例如属性的增加、删除和修改。ServletR
36、equest事件监听器的接口和方法如表所示:,返回,Servlet监听器典型应用(1),(1)创建Servlet监听器OnlineListener,OnlineListener监听器用于监听网站的在线人数,代码如下:,public class OnlineListener implements HttpSessionListener private int onlineCount;/定义一个代表在线人数的变量 public OnlineListener()onlineCount=0;public void sessionCreated(HttpSessionEvent sessionEvent
37、)/会话创建时的处理 onlineCount+;sessionEvent.getSession().getServletContext().setAttribute(online,new Integer(onlineCount);public void sessionDestroyed(HttpSessionEvent sessionEvent)/会话销毁时的处理 onlineCount-;sessionEvent.getSession().getServletContext().setAttribute(online,new Integer(onlineCount);,Servlet监听器典型应用(2),(2)在web.xml文件中配置OnlineListener监听器,相关代码如下:,(3)创建JSP页面“online.jsp”,测试OnlineListener监听器,代码如下:,使用监听器监听在线人数的例子 当前的在线人数:,运行程序,显示结果如图所示:,sunyang.OnlineListener,返回,