第5章 Servlet技术

上传人:gu****n 文档编号:243125330 上传时间:2024-09-16 格式:PPT 页数:82 大小:729.50KB
返回 下载 相关 举报
第5章 Servlet技术_第1页
第1页 / 共82页
第5章 Servlet技术_第2页
第2页 / 共82页
第5章 Servlet技术_第3页
第3页 / 共82页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,5,章,Servlet,编程,5.1 Servlet,概述,5.2,会话跟踪,5.3,Servlet,的异常处理机制,5.4,开发线程安全的,Servlet,5.1.1 Servlet,定义:,Servlet,是基于,Java,技术的,Web,组件,由容器管理并产生动态的内容。,Servlet,引擎作为,WEB,服务器的扩展提供支持,Servlet,的功能。,Servlet,与客户端通过,Servlet,容器实现的请求,/,响应模型进行交互,注意:,Servlet,不是从命令行启动的,而是由包含,Java,虚拟机的,Web,服务器进行加载,5.1 Servlet,概述,1)Servlet,是按照,Servlet,规范编写的,Java,类。,2)Servlet,应用请求,/,响应模型,扩展了服务器的功能。,Servlet,是,WEB,应用程序中的一个组件。,WEB,组件对应的,JavaBean,、,Servlet,及其它公用文件的源文件的目录,编译后的,class,文件放置在,WEB-INFclasses,目录中,WEB,组件对应的配置文件,web.xml,、,jboss-web.xml,的目录,(,名字固定,),WEB,组件对应的,jsp,、,html,文件的目录,系统配置文件,application.xml,的目录,(,与根目录,Library,中的,META-INF,子目录一样,),WEB,应用程序目录结构,5.1.2 WEB,应用系统目录结构,(,针对,JBoss4.0,中间件,),WEB,组件对应的,JavaBean,、,Servlet,及其它公用文件的源文件的目录,编译后的,class,文件放置在,WEB-INFclasses,目录中,WEB,组件对应的,JavaBean,、,Servlet,及其它,公用文件的,class,文件的目录,JavaBean,、,Servlet,、,JSP,等,WEB,组件,需要引用相关类对应的,jar,文件:,mssqlserver.jar,、,msbase.jar,、,msutil.jar,、,javaee.jar,、,servlet.jar,、,jbossall-client.jar,标签库目录,展开,(2):,WEB,应用程序目录结构,5.1.3,编写,HelloWorldServlet,步骤,:,1),编辑,HelloWorldServlet.java,2),编译,HelloWorldServlet.java,3),部署,(deploy),HelloWorldServlet,:,编辑,WEB-INF,目录下,web.xml,配置文件,4),对,web,应用程序打包,(jar),5),指定,web,应用程序的上下文根,(context root),6),生成应用程序的,EAR,文件,7),将应用程序,EAR,文件部署到中间件服务器中,(JBOSS4.0),1),例,:,编辑,HelloWorldServlet.java,HelloWorldServlet.java,HelloWorldServlet.,class,编译后产生的类文件存放的位置,package,servlet,;,import,java.io,.*;,import,javax.servlet,.*;,import,javax.servlet.http,.*;,public class,HelloWorldServlet,implements Servlet,private,ServletConfig,config,;,public void,destroy()System.out.println(destroy():started,!);,public,ServletConfig,getServletConfig,(),System.out.println(getServletConfig():started,!);,return,config,;,public String,getServletInfo,(),System.out.println(getServletInfo():started,!);,return null;,public void,init(ServletConfig,config)throws,ServletException,this.config,=,config,;,System.out.println(init():started,);,public void service (,ServletRequest,req,ServletResponse,res)throws,ServletException,IOException,System.out.println(service():started,!);,PrintWriter,out=,res.getWriter,();,out.println(Hello,World!);,public static void,main(String,args,) ,HelloWorldServlet,a=new,HelloWorldServlet,();,System.out.println(main,() );,HelloWorldServlet.java,2),编译,HelloWorldServlet.java,compile-web-,src.cmd,说明,:,编译前,需在环境变量,classpath,中加入,servlet.jar,(,在,classeslib,目录中,),.,编译后的类文件要放在,classes,目录下相对应的子目录,(package),中,set,java_home,=C:jdk1.6.0,set path=%,path%;%java_home,%bin,set,AppSys_home,=.,set,AppSys_ejb_home,=%,AppSys_home%Library-ejb,set,AppSys_web_home,=%,AppSys_home,%Library-web,set,AppSys_lib,=%,AppSys_web_home,%WEB-INFclasseslib,set,AppSys_ejb_src,=%,AppSys_ejb_home%src,set,AppSys_web_src,=%,AppSys_web_home%src,set,classpath,=,.;d:save;%java_home%libtools.jar;%java_home%libdt.jar;%AppSys_lib%msbase.jar;%AppSys_lib%mssqlserver.jar;%AppSys_lib%msutil.jar;%AppSys_lib%,servlet.jar,set,jboss_home,=C:jboss-4.0.0,set,jboss_app_home,=%,jboss_home,%serverdefaultdeploy,cd,%,AppSys_web_home,%,javac,%,AppSys_web_src,%*.java,javac,%,AppSys_web_src%servlet,*.java,javac,%,AppSys_web_src%javabean,*.java,copy %,AppSys_web_src,%*.class %,AppSys_web_home,%WEB-INFclasses,copy %,AppSys_web_src%servlet,*.class %,AppSys_web_home%WEB-INFclassesservlet,copy %,AppSys_web_src%javabean,*.class %,AppSys_web_home%WEB-INFclassesjavabean,pause,3),部署,(deploy),HelloWorldServlet,编辑,WEB-INF,目录下,web.xml,配置文件,web.xml,配置文件,对自身包含的,web,组件进行说明,ServletContext,的初始化参数,Session,的配置,说明,Servlet/JSP,及其,URL,映射信息,应用程序生命周期监听器类,过滤器定义和过滤器映射,MIME,类型映射,欢迎文件列表,错误页面,语言环境和编码映射,声明式安全配置,JSP,配置,!DOCTYPE web-app,PUBLIC -/Sun Microsystems, Inc./DTD Web Application 2.2/EN, to Library, Welcome to Library ,HelloWorldServlet,servlet.HelloWorldServlet,HelloWorldServlet,/,HelloWorldServlet,web.xml,配置文件,指定,Servlet,的名字,(,唯一,),声明,Servlet,指定,Servlet,类的,完整限定名,Servlet,与,URL,间的映射,名字必须与,元素中,子元素中的名字相同,指定,Servlet,的,URL,路径,(,该路径是相对于,WEB,应用程序上下文根的路径,),4),对,web,应用程序打包,(jar),jar_web_components.cmd,打包实际是将,Library-web,目录,下所有的文件和子目录以,压缩文件,的形式存储,(,除了,java,源文件,).,一般,当前目录,是在,Library-web,目录,下,运行,jar,命令,set,java_home,=C:jdk1.6.0,set path=%,path%;%java_home,%bin,set App=,LibraryWeb,set,AppSys_home,=.,set,AppSys_ejb_home,=%,AppSys_home%Library-ejb,set,AppSys_web_home,=%,AppSys_home,%Library-web,set,AppSys_lib,=%,AppSys_web_home,%WEB-INFclasseslib,set,AppSys_ejb_src,=%,AppSys_ejb_home%src,set,AppSys_web_src,=%,AppSys_web_home%src,set,classpath,=,.;d:save;%java_home%libtools.jar;%java_home%libdt.jar;%AppSys_lib%msbase.jar;%AppSys_lib%mssqlserver.jar;%AppSys_lib%msutil.jar;%AppSys_lib%servlet.jar,set,jboss_home,=C:jboss-4.0.0,set,jboss_app_home,=%,jboss_home,%serverdefaultdeploy,cd,%,AppSys_web_home,%,rem,jar -,cvf,%,App%.war,*,jar -,cvf,%,App%.war,*.html *.,htm,*.,jsp,WEB-INF/ web/,copy %,App%.war,%,AppSys_home,%deploy,pause,(2),压缩文件的,源,来自当前目录,Library-web,下所有的,*,.html *.,htm,*.,jsp,WEB-INF,目录及该目录下所有的内容,,web,目录及该目录下所有的内容,(1),该命令在,当前目录,Library-web,下生成一个,LibraryWeb.war,的压缩文件。,(3),生成,LibraryWeb.war,压缩文件,生成的,LibraryWeb.war,压缩文件,源,(,被压缩的文件),运行,jar,命令的批处理文件,5),指定,web,应用程序的上下文根,(context root),一个,web,应用程序的上下文根确定了,Jboss,为该,Web,应用定义的,URL.,一个,web,应用程序的上下文根将根据该应用的部署而确定。,()当一个,web,应用程序在,EAR,文件内部部署时,其上下文根将在,EAR,的,application.xml,文件中指定。,系统配置文件,application.xml,的目录, Library Application,LibraryWeb.war,/Library,application.xml,web,应用程序的上下文根,LibraryWeb.war,压缩文件,在,WEB-INF/jboss-web.xml,文件内指定,(,如果没有被,绑定到一个,EAR,文件中,), Library,如果没有指定上下文根,上下文根将是,WAR,文件的名称,.,(2),对于部署在,EAR,文件之外,的,Web,应用,上下文根可以通过两种方式指定,6),生成应用程序的,EAR,文件,EAR,文件是一个压缩文件,该压缩文件可在中间件服务器中部署运行,EAR,文件主要包含,:,(1)EJB,组件的压缩文件,jar,(2)web,应用程序的压缩文件,war,(3),系统配置文件,application.xml,源,(,被压缩的文件),生成的,Library.ear,压缩文件,运行,jar,命令的批处理文件,set,java_home,=C:jdk1.6.0,set path=%,path%;%java_home,%bin,set App=Library,set,AppSys_home,=.,set,AppSys_ejb_home,=%,AppSys_home%Library-ejb,set,AppSys_web_home,=%,AppSys_home,%Library-web,set,AppSys_lib,=%,AppSys_web_home,%WEB-INFclasseslib,set,AppSys_ejb_src,=%,AppSys_ejb_home%src,set,AppSys_web_src,=%,AppSys_web_home%src,set,classpath,=,.;d:save;%java_home%libtools.jar;%java_home%libdt.jar;%AppSys_lib%msbase.jar;%AppSys_lib%mssqlserver.jar;%AppSys_lib%msutil.jar;%AppSys_lib%servlet.jar,set,jboss_home,=C:jboss-4.0.0,set,jboss_app_home,=%,jboss_home,%serverdefaultdeploy,cd,%,AppSys_home,%deploy,jar -,cvf,%,App%.ear,*.jar *.war META-INF/,copy %,App%.ear,%,jboss_app_home,%,pause,(2),压缩文件的,源,来自当前目录,deploy,下所有的,*,.jar,、*,.war,、,META-INF,目录及该目录下的系统配置文件,application.xml,(1),该命令在,当前目录,deploy,下生成一个,Library.ear,的压,缩文件。,(3),生成,Library.ear,压缩文件,7),将应用程序,EAR,文件部署到中间件服务器中,(JBOSS4.0),将应用程序,EAR,文件,copy,到,JBoss,相关目录,(C:jboss-4.0.0 serverdefaultdeploy),5.1.4,调用,Servlet,1),启动,JBoss,2),在,IE,地址栏中输入:,http:/localhost:8080/Library/HelloWorldServlet,3),调用,HelloWorldServlet,后,Jboss,后台运行情况,init,应用系统,ear,deploy,临时,web,应用系统,war,调用,HelloWorldServlet,后,Jboss,后台输出的内容,Start,应用系统,ear,5.1.5 DOS,命令行,调用,Servlet(,很少,),run-,HelloWorldServle.cmd,5.1.6,Servlet Life Cycle,Servlet,运行在,WEB,容器中,其生命周期由容器管理:,1,)加载和实例化,2,)初始化,3,)处理请求,4,)服务结束,javx.servlet.Servlet,接口,init(),service(),destroy(),(1),加载和实例化谁:,WEB,容器负责,时间:实例化和加载能够发生在引擎启动的时候,也能,够推迟到容器需要该,servlet,为客户请求服务的时候。,过程:,首先,容器必须,先定位,servlet,类,(本地、远程、网络服务),然后,容器使用,Java,类加载工具,加载该,servlet,。,最后,容器加载,servlet,类以后,会,实例化该类,的一个实例。,说明:,需要注意的是可能会,实例化多个实例,,例如一个,servlet,类因为有不同的初始参数而有多个定义,或,servlet,实现,SingleThreadModel,而导致容器为之生成,一个实例池。,因为容器是通过,Java,的,反射,API,来创建,Servlet,实 例,,调用的是,Servlet,的,默认构造方法,(即不带参数的构造方法),所以我们在编写,Servlet,类的时候,不应该提供带参数的构造方法。,(2),初始化时间:,servlet,实例化后,容器必须在他能够处理客户端,请求前初始化该,servlet,实例,(,Servlet,的,init(),。,目的:读取永久的配置信息,昂贵资源(例如,JDBC,连,接)以及其他仅仅需要执行一次的任务。,异常:,UnavailableException,或,ServletException,。,servlet,实例被容器立即释放,(,垃圾回收,),。,HelloWorldServlet.java,说明:,对于每一个,Servlet,实例、,init(),方法只被调用一次。,在初始化阶段,,Servlet,实例可以使用容器为它传递的,ServletConfig,对象从,WEB,应用系统的配置信息,(web.xml),中获取初始化的参数信息。这个配置对象同时给,servlet,提供了访问实现了,ServletContext,接口的具体对象的方法,该对象描述了,servlet,的运行环境。,(3),处理请求 容器调用,Servlet,实例的,service(),方法对请求进行处理。,异常:,ServletException,或,UnavailableException,异常,如何获得用户信息:,当用户请求到来时,容器创建一个,ServletRequest,对象,封装请求数据;同时创建一个,ServletResponse,对象,封装响应数据。,在,service(),方法中,,Servlet,通过,ServletRequest,对象得到客户端的相关信息和请求信息。,如何响应:,在对请求进行处理后,调用,ServletResponse,的方,法设置响应信息。,这些对象由容器创建,并且被作为,service,方法的参数传递给,servlet,。,(4),服务结束当容器检测到一个,Servlet,需要删除时(原因可能是保存内存资源或自己被关闭),将调用,destroy(),。,一旦,destroy,方法被调用,容器就不会再向该实例发送任何请求。,Servlet,生命周期,5.1.7,Servlet API,依赖关系,实现关系,SessionServlet,5.1.8,Servlet,上下文,1),每一个,WEB,应用程序都有一个与之相关的,Servlet,上下文。,2)Java,Servlet,API,提供了一个,ServletContext,接口用来表示,上下文。,Servlet,可以通过该接口的方法与,WEB,容器通信。,3)ServletContext,对象是,WEB,容器中的一个已知路径的根。,例如:,http:/localhost:8080/Library,4)WEB,容器负责,ServletContext,接口的实现。,容器在,WEB,应用程序加载时创建,ServletContext,对象,作为,WEB,应用程序的运行时表示,,ServletContext,对象可以被该,WEB,应用程序中所有的,Servlet,访问。,5.1.8,Servlet,与,URL,的映射,HelloWorldServlet,servlet.HelloWorldServlet,HelloWorldServlet,/,HelloWorldServlet,LibraryWeb.war,中,web.xml,的,Servlet,与,URL,的映射,访问,HelloWorldServlet,:,http:/localhost:8080/LibraryWeb,/HelloWorldServlet,HelloWorldServlet,的,name,HelloWorldServlet,的,name,HelloWorldServlet,对应的类,(,在,classes,目录下,),HelloWorldServlet,对应的,URL,1),映射请求 :,哪一个,WEB,应用程序,:,比较请求,URL,的开始部分与,WEB,应用程序的,上下文路径,来确定的。,哪一个,servlet,:,请求,URL,减去上下文路径 之后,按照下面规则的顺序对剩余部分的路径进行匹配,:,尝试找一个精确匹配的,Servlet,请求路径。,2.,尝试匹配最长的路径前缀。使用,“,/”,字符作为路径分隔符,按照路径树逐级递减匹配,选择最长匹配的,servlet,来处理请求。,3.,若在,URL,路径中最后包含扩展名,(,比如:*,.,jsp,),,,servlet,容器将会匹配有这个扩展名的,servlet,。,4.,若按上述规则没有找到匹配的结果,那么容器将会尝试提供合理的请求资源:,若定义了“,defalut”servlet,,那么这个“,default”,的,servlet,被启用;若没有定义“,defalut”servlet,,容器将向客户端发送,HTTP404,错误信息。,2),映射规范,在,Web,应用程部署文件中,下面语义用作定义映射:,以,“,/”,字符开始并且以,“,/*”,结束的字符串被用作路径映射。,HelloWorldServlet,/,HelloWorld,/*,如果没有精确匹配,那么对,/,HelloWorld,/,路径下的资源的所有请求将由映射了上述,URL,样式的,Servlet,来处理。,http:/localhost:8080/Library/HelloWorld/a.jsp,http:/localhost:8080/,Library/,HelloWorld/b.htm,以,“*,.”,前缀开始的字符串用作路径映射。,HelloWorldServlet,/,HelloWorld,/*.do,如果没有精确匹配,那么对具有,.do,扩展名的,资源的所有请求将由映射了上述,URL,样式的,Servlet,来处理。,http:/localhost:8080/,Library/,HelloWorld/a.do,仅包含,“,/”,字符的字符串指示,WEB,应用程序的,“,default”,servlet,。,HelloWorldServlet,/,如果没有精确匹配,那么使用,WEB,应用程序的,“,default”,servlet,其他所有字符仅被用于精确匹配。,HelloWorldServlet,/,HelloWorldServlet,http:/localhost:8080/,Library/,HelloWorldServlet,例子,映射路径,Servlet,/,foo,/bar/*servlet1/,baz,/* servlet2/catalogservlet3*.bopservlet4,下面行为结果:,去掉上下文路径的剩余路径处理请求的,Servlet,/,foo/bar/index.html,servlet1/,foo/bar/index.bop,servlet1/,baz,servlet2/,baz/index.html,servlet2/catalog,servlet3/catalog/,index.html,“default”,servlet,/catalog/,racecar.bop,servlet4/,index.bop,servlet4,5.2,会话跟踪,客户与服务器间的,request/response,模式,是基于,HTTP,协议的。,每当用户发出请求时,服务器就做出响应;响应后,连接就关闭了。,它意味着:当用户在同一网站的多个页面之间转换时,,Web,应用根本无法知道是否是,同一个客户,及以前,请求的信息,。,唯一地标识一个用户,同时记录该用户的状态?,HTTP,是一种无状态的协议:,为了实现以上需求,需要以下两种机制:,)会话:服务器应该能够标识出来自单个客户的一,系列请求,并把这些请求组成一个单独的 ”会话”。,)状态:服务器应当能够记住前面请求的信息,以及对,前一请求作出的处理信息。,通过把,特定请求,与一个,特定会话,相联系,购物车等,WEB,应用系统就能够把一个用户与另一个用户区分开。,.2.1,用于会话跟踪的技术,Servlet,API,使用,Session,来跟踪会话和管理,会话内的状态。,利用,Session,,服务器可以把一个客户的所有请求联系在一起,并记住客户的操作状态。,当客户第一次连接到服务器的时候,服务器为其建立一个,Session,,并分配给客户一个唯一的标识,(Session ID),。以后客户每次提交请求,都要将标识一起提交。服务器根据标识找出特定的,Session,,用这个,Session,记录客户的状态。,从上面的过程中,可以看出,通过在每一个请求和响应中包含,Session ID,,服务器就可以将一个用户与另一个用户区分开。,1.SSL,:是一种运行在,TCP/IP,之上和,HTTP,这种应用层协,议之下的,加密技术,。,在,Servlet,规范中,支持三种机制用于会话跟踪,:,1.SSL,2.Cookies,3.URL,重写,4,隐藏表单域,在建立连接的过程中,客户端和服务器都可以产生名叫,“,会话密匙,”,的东西,它是一种用于加密和解密消息的,对称密匙,。,SSL,是在,HTTPS,协议中使用的加密技术,在客户端和服务器之间保持一种,加密的连接,。,基于,HTTPS,协议的服务器都可以使用这个客户的对称密匙来建立会话,2.Cookies: Netscape,公司发明,是最常用的跟踪用户会话的方式。,是一种由服务器发送给客户端的片段信息,存储在客户端浏览器的内存或者硬盘上,在客户对该服务的请求中发回它。,在,Servlet,规范中,用于会话跟踪的,Cookie,的名字必须是,JSESSIONID,。,Cookie,以键值对的方式记录会话跟踪的内容,服务器利用响应报头,Set-Cookie,来发送,Cookie,信息。,在,RFC2109,中定义的,Set-Cookie,响应报头的格式为:,Set-Cookie: Name=Value; Comment=Value; Domain=Value; Max-Age=Value; Secure; Path=Value; Version=1*DIGIT,Name,是,Cookie,的名字,Comment,是可选的。,Cookie,可能包含关于用户私有的信息,这个属性允许服务器说明这个,Cookie,的使用,用户可以检查这个信息,然后决定是否加入或者继续会话。,Domain,是可选的。指定,Cookie,在哪一个域中有效,所指定的域必须以,(.),开始。,Max-Age,是可选的。定义了,Cookie,的生存时间,以秒为单位。如果超过了这个时间,客户端就会丢弃这个,Cookie,。,Path,是可选的。用于指定,Cookie,在那个,URL,子集下有效。,Secure,是可选的。它没有值,用于指示浏览器使用安全的方式与服务器交互。,该值为,0,代表:删除,Cookie,。该值为正数代表:当浏览器关闭时,,Cookie,会被删除。该值为负数代表:,Cookie,会保存在客户机内存中,当进程退出时自动消失。,Version,是必须的。它的值是一个十进制的整数,标识,Cookie,依照的状态管理规范的版本,对于,RFC2109,,,Version,应设为,1,。,例:,Set-Cookie:,uid,=,lisi,; Domain=.,; Max-Age=3600; Secure; Path=/,bbs,; Version=1,上面响应报头发生了一个名为,uid,值为,lisi,的,cookie,cookie,的生存时间为,3600,秒,在,域的,/,bbs,路径下有效。在,3600,秒后,客户端浏览器应该丢弃这个,Cookie,。,当浏览器收到上面这个响应报头后,可以选择拒绝或接受这个,Cookie,。,如果 浏览器 接受这个,Cookie,,当浏览器下一次发送请求给,http:/www., URL,重写是在客户端不接受,cookie,时,在,URL,中嵌入标识客户的,SessionID,Servlet,容器取出,URL,取出,SessionID,根据,SessionId,将请求与特定的,Session,关联。,SessionID,被编码为,URL,字符串中的路径参数,在,Servlet,规范中,这个参数的名字必须是,jsessionid,下面是一个包含了编码后的路径信息的,URL,的例子:, TYPE=HIDDEN NAME=session VALUE=.,。,这意味着,当表单被提交时,隐藏域的名字和数据也被包含到,GET,或,POST,数据里,我们可以利用这一机制来维持会话信息。然而,这种方法有一个很大的缺点,它要求所有页面都是动态生成的,因为整个问题的核心就是每个会话都要有一个唯一标识符。,5.2.2 Java,Servlet,API,的会话跟踪,在,Servlet,API,中,,HttpSession,接口封装了,Session,的概念,,Servlet,容器提供了这个接口的实现。,当请求一个会话时,,Servlet,容器就创建一个,HttpSession,对象,有了这个对象后,就可以利用这个对象保存客户的状态信息。,Servlet,容器为,HttpSession,对象分 一个唯一的标识,(Session ID),,将其作为,Cookie,(或者作为,URL,的一部分哦,利用,URL,重写机制)发送给浏览器,浏览器在内存中保留这个,Cookie,。,当这个客户再次发送,HTTP,请求时,浏览器将,COOKIE,随请求一起发送,,Servlet,容器从请求对象中读取,SessionID,,然后根据,SessionID,找到对应的,HttpSession,对象,从而得到客户的状态信息。,整个过程如图所示:,Web,服务器,Web,容器,Servlet,实例,id=123,username=,lisi,浏览器,HttpSession,对象,创建,得到新创建的,HttpSession,对象,保存客户状态,username=,lisi,请求,id=123,响应,第,1,次请求,Web,服务器,Web,容器,Servlet,实例,id=123,username=,lisi,浏览器,HttpSession,对象,根据,id,值找到,HttpSession,对象,读取客户状态,id=123,请求,哦,你是,lisi,响应,第,2,次请求,会话跟踪过程示意图,说明:,HttpSession,API,是一个基于,Cookie,或者,URL,改写机制的高级会话状态跟踪接口:,如果浏览器支持,Cookie,,则使用,Cookie,;如果浏览器不支持,Cookie,或者,Cookie,功能被关闭,则自动使用,URL,改写方法。,Servlet,开发者无需关心细节问题,也无需直接处理,Cookie,或附加到,URL,后面的信息,,API,自动为,Servlet,开发者提供一个可以方便地存储会话信息的地方。,整个过程对于客户和开发人员都是透明的(由,Servlet,容器完成),开发人员只需要得到,HttpSession,对象,然后调用这个对象的,setAttribute,(),和,getAttribute,(),方法来保存或读取客户的状态信息。,例子:,SessionServlet.java,SessionServlet2.java,SessionServlet3.java,HttpSession,httpsession,=,request.getSession,();,Session ID:,httpsession.getId,(),创建时间,:,httpsession.getCreationTime,(),上次访问时间,:,httpsession.getLastAccessedTime,(),httpsession.setAttribute(“user”,user,),;,httpsession.setAttribute(age,age,);,httpsession.getAttribute(“user,“,),httpsession.getAttribute(age, ) );,禁止,Cookie:,IE,工具,internet,选项,隐私,高级,替代自动,cookie,处理,第一方、第三方,cookie,禁止,http:/localhost:8080/Library/SessionServlet,禁止,cookie,对,localhost,访问不起作用,http:/192.168.1.101:8080/Library/SessionServlet,基于,Cookie,的会话跟踪机制失效。,解决办法:利用,URL,重写机制跟踪用户会话,例子:,EncodeURLSessionServlet.java,EncodeURLSessionServlet2.java,EncodeURLSessionServlet3.java,http:/192.168.1.101:8080/Library/servlet/EncodeURLSessionServlet2;,jsessionid=74A25D07FA2C0AAE26BB18DE0FCA9496,SessionID,作为请求,URL,的一部分被发送到服务器,服务器根据这个,SessionID,就可以跟踪用户的会话了。,在使用,URL,重写机制的时候要注意,为了保证会话跟踪的正确性,所有的链接和重定向语句中的,URL,都需要调用,encodeURL,(),或,encodeRedirectURL,(),方法进行编码。,在开发,WEB,应用程序的时候,如何去判断客户端是否禁用了,cookie,从而决定是否采用,URL,重写机制去跟踪用户的会话。,实际上,客户端是否禁用了,cookie,,不需要程序员去判断,,Servlet,容器会帮我们做这件事情。,在开发,WEB,应用程序的时候,只需要对所有的链接和重定向语句中的,URL,都调用,encodeURL,(),或,encodeRedirectURL,(),方法进行编码就可以了。,1),当容器看到一个对,getSession,(),的调用,而且它从客户的请求中没有得到会话,ID,时,它就知道必须尝试与客户建议一个新的会话。,2),此时,容器并不知道,cookie,是否工作,所以在向客户返回第一个响应时,它会同时使用,Cookie,和,URL,重写机制,不仅在响应中发送,set-cookie,报头,而且会向,URL,附加,Session ID,(假设这个,URL,使用了,response.encodeURL,(),进行了编码,如果没有调用该方法,当然也就不会有,URL,重写)。,3),如果客户发出了下一个请求,那么在请求中会包含,SessionID,Cookie,同时在,URL,后也会有附加的,SessionID,。,4),当,Servlet,调用,request.getSession,(),时,容器首先尝试从,cookie,中获取,SessionID,,它发现能够得到,SessionID,,于是就知道这个客户接受,cookie,,那么在随后的响应中,它就会使用,cookie,来跟踪会话。,5),如果从,cookie,没有获取,SessionID,,而在,URL,中得到,SessionID,,于是在随后的响应中将使用,URL,重写机制来跟踪会话。而在,encodeURL,(),和,encodeRedirectURL,(),方法的实现中,他们首先判断当前的,Servlet,是否已经执行了,HttpSession,对象的,invalidate(),方法,如果已经执行了,直接返回参数,URL,。接下来,判断客户端是否禁用了,Cookie,,如果没有禁用,则直接返回参数,URL,;如果禁用了,cookie,,则在参数,URL,中附加,SessionID,,返回编码后的,URL,。,Cookie,的应用,CookieServlet.java,CookieServlet2.java,CookieServlet3.java,Cookie,与,session,的区别,1 session,是一种服务器端技术,,session,对象在服务器端创建。,2 cookie,是服务器发送给客户的片段信息,存储在客户端浏览器的内存中或硬盘上,在客户随后对该服务器的请求中发回它。,3 session,与,cookie,的最大区别是:,session,在服务器端保存信息,,cookie,在客户端保存信息。,用于会话跟踪的,cookie,叫做会话,cookie,,在,servlet,规范中,用于会话跟踪的,cookie,的名字必须是,JSESSION,它通常保存在浏览器的内存中。,而在浏览器内存中的会话,cookie,不能被不同的浏览器,进程所共享。,保存在硬盘中 的,cookie,能被不同的浏览器进程所共享。,不建议使用,Cookie,5.3,Servlet,的异常处理机制,5.3.1,在,Servlet,中,有两种服务器端异常处理机制,声明式异常处理,(declarative exception handling),程序式异常处理,(programmatic exception handling),1,)声明式异常处理,声明试异常处理是在,web.xml,文件中声明对各种异常的处理方法,这是通过,元素来声明的,.,or,其中,元素指定,HTTP,的错误代码,元素指定,JAVA,异常类的完整限定名,.,元素给出用于响应,HTTP,错误代码或者,JAVA,异常的资源的路径,该路径是相对于,WEB,应用程序根路径的位置,.,元素可以声明两种类型的错误处理,:,一是指定对,HTTP,错误代码的处理,二是指定对程序中产生的,JAVA,异常的处理,.,(,1,),HTTP,错误代码的处理,在,WEB.XML,文件中对,HTTP404,错误指定相应的错误处理页面,.,404,/,FileNotFound.html,在上例中,元素指定了,HTTP,的错误代码,子元素指定了响应,HTTP404,错误的页面路径,该路径为相对于,WEB,应用程序根路径的位置,必须以,/,开头,.,(,2,),JAVA,异常的处理,利用,元素还可以声明对程序中产生的,JAVA,异常的处理,例如一个,SERVLET,从文件中读取配置信息,如果该文件不存在,就会抛出,java.io.FileNotFoundException,例,:,java.io.FileNotFoundException,/,ExcepHandler,在,元素中,子元素指定了,JAVA,异常类的名字,子元素指定了对异常进行处理的,servlet,类,当然,也可以指定一个静态页面对异常进行响应,.,声明试异常处理主要是在,WEB.XML,文件中声明对各种异常的处理方法,他的好处是开发人员在开发,WEB,应用程序时无须考虑什么时候会产生,HTTP,错误或抛出,JAVA,异常,这些都交给,SERVLET,容器进行处理,他的缺点是,必须针对可能出现的各种错误情况定义处理页面或,SERVLET,否则某些,HTTP,错误或异常将无法处理,.,2,),程序,式,异常处理,程序异常处理就是在,WEB,程序中利用,TRY-CATCH,语句来捕获的异常,并对捕获的异常进行相应的处理,.,public class,HelloServlet,extends,HttpServlet,public void,doPost(HttpServletRequest,req,HttpServletResponse,res,) throws,ServletException,IOException,try,.,catch(Exception,e),public void,doGet(HttpServletRequest,req,HttpServletResponse,res,) t
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!