《Servlet程序设计》PPT课件.ppt

上传人:w****2 文档编号:7342828 上传时间:2020-03-20 格式:PPT 页数:92 大小:969KB
返回 下载 相关 举报
《Servlet程序设计》PPT课件.ppt_第1页
第1页 / 共92页
《Servlet程序设计》PPT课件.ppt_第2页
第2页 / 共92页
《Servlet程序设计》PPT课件.ppt_第3页
第3页 / 共92页
点击查看更多>>
资源描述
1 第十一章Servlet程序设计 郑莉 JAVA语言程序设计 2 目录 11 1Java网络程序设计的基本概念11 2Servlet基础11 3Servlet的生命周期11 4与客户端交互11 5客户端跟踪11 6协作与通讯11 7程序举例11 8本章小结 3 11 1Java网络程序设计的基本概念 网络将世界联系在一起 使世界变得更加丰富多彩 同时网络互连是一个内容丰富而复杂的主题 所以这方面的程序设计涉及面很广且不易掌握与其他语言相比 Java语言在网络应用程序方面具有一定的优势 Java提供了很多内置的网络功能 使得基于Internet和Web的应用开发变得更加容易 4 11 1 1协议 所有使用或实现某种Internet服务的程序都必须遵从一个或多个网络协议 这种协议很多 而IP TCP UDP是最为根本的三种协议 是所有其它协议的基础IP InternetProtocol Internet协议 是最底层的协议定义了数据按照数据报 Datagram 一种自带寻址信息的 独立地从数据源走到终点的数据包 传输的格式和规则TCP TransportControlProtocol 传输控制协议 建立在IP之上 定义了网络上程序到程序的数据传输格式和规则 提供了IP数据包的传输确认 丢失数据包的重新请求 将收到的数据包按照它们的发送次序重新装配的机制是面向连接的协议 在开始数据传输之前 必须先建立明确的连接UDP UserDatagramProtocol 用户数据报协议 与TCP相似 比TCP具有更好的传输效率 不可靠的 不保证数据的传输 也不提供重新排列次序或重新请求功能 是一种无连接协议 Java网络程序设计的基本概念 5 HTTP协议 HyperTextTransferProtocol 是Internet众多协议中的一种 表示超文本传输协议 它构成了WWW的基础具有简单快速 灵活 无状态 无连接等特点基于请求 Request 响应 Response 模式 其工作过程如下首先客户端与服务器建立连接然后客户端发送一个请求给服务器服务器接到请求后 给予相应的响应信息 最后关闭连接 完成一次操作 11 1 1协议 续 HTTP协议 Java网络程序设计的基本概念 6 客户端发送给服务器的请求有很多类型 被称为方法 其中最常用的是GET POSTGET方法用来从服务器读取信息 比如从服务器读取文件 表格 数据库查询结果等POST方法用来向服务器传送信息 比如把信用卡号 表格 存储于数据库的数据等传送到服务器HEAD方法用来读取服务器响应头 ResponseHead 得到诸如文件大小 文件最后修改时间 服务器类型等信息PUT方法将文件直接传到服务器DELETE方法将文件直接从服务器删除TRACE方法用来协助程序调试OPTIONS方法用来查询服务器所支持的方法 11 1 1协议 续 HTTP协议中客户端发送给服务器的请求 Java网络程序设计的基本概念 7 11 1 2关于URI URI UniformResourceIdentifier 统一资源标志符 HTTP协议用URI标识定位网络上的数据如果知道了公布在网络上的某个HTML文件的URI 不管文件位于什么地方 都可以通过HTTP访问该文档通常所说的URL是URI的一种 Java网络程序设计的基本概念 8 URL类Java语言提供了URL类让我们能在源代码层使用URL有六个构造函数 其中最简单的是URL Stringurl 每个URL对象都封装了资源的标识符和协议处理程序 可以调用URL的方法来提取URL的组件把URL对象作为AppletContext接口的showDocument方法的参数 就可以使执行applet的浏览器显示URL所指定的资源 11 1 2关于URI 续 URL类 Java网络程序设计的基本概念 9 applet浏览指定URL举例 ShowD importjava util importjava awt importjava awt event importjava applet AppletContext importjavax swing importjavax swing event publicclassShowDocumentextendsJApplet publicvoidinit JButtongoButton newJButton L ContainermyContainer getContentPane myContainer add newJLabel LinktoSOHU BorderLayout NORTH myContainer add goButton BorderLayout SOUTH goButton addActionListener newButtonListener 11 1 2关于URI 续 例11 1 Java网络程序设计的基本概念 10 classButtonListenerimplementsActionListener publicvoidactionPerformed ActionEvente try URLnewDocument newURL AppletContextbrowser getAppletContext browser showDocument newDocument catch ExceptionURLException 11 1 2关于URI 续 例11 1 Java网络程序设计的基本概念 11 11 1 3基于套接字的有连接通信 基于套接字 socket 的有连接通信使用TCP协议一个socket必须在发送数据之前与目的地的socket取得连接一旦连接建立了 sockets就可以使用一个流接口完成打开 读 写 关闭 所有的发送的信息都会在另一端以同样的顺序被接收面向连接的操作比无连接的操作效率低 但是数据的安全性高 Java网络程序设计的基本概念 12 用Java建立简单的服务器程序需要五个步骤Step1 创建ServerSocket对象ServerSocketmyServer newServerSocket intport intbacklog Port指定一个可用的端口号 用来定位服务器上的服务器应用程序backlog指定能够连接到服务器的最多客户数 连接客户达到由backlog指定的最大客户数量时 服务器将拒绝客户连接Step2 通过ServerSocket的accept方法监听客户连接 服务器无限期的监听客户连接Socketconnection myServer accept 有一个客户连接时 将产生并返回一个socket 11 1 3基于套接字的有连接通信 续 服务器端 Java网络程序设计的基本概念 13 Step3 通过Socket的方法getInputStream和getOutputStream获取InputStream和OutputStream对象 通常将其他流类型和它们联系起来 如 ObjectInputStreaminput newObjectInputStream connection getInputStream ObjectOutputStreamoutput newObjectOutputStream connection getOutputStream Step4 客户和服务器通过OutputStream和InputStream对象进行通信Step5 通信传输完毕 服务器通过调用流和套接字的close方法关闭连接 11 1 3基于套接字的有连接通信 续 服务器端 Java网络程序设计的基本概念 14 在客户端建立简单连接的思路类似 可分为四步Step1 建立一个Socket 实现与服务器的连接Socketconnection newSocket InetAddressaddress intport address 服务器IP地址 port 端口号连接成功 将返回一个Socket 否则产生异常Step2 通过getInputStream和getOutputStream分别获取Socket的InputStream和OutputStream的引用 同样 也可以将其他流类型与InputStream和OutputStream联系起来Step3 客户与服务器通过InputStream和OutputStream进行通信Step4 传输完毕后 通过调用流和套接字的close方法关闭连接 11 1 3基于套接字的有连接通信 续 客户端 Java网络程序设计的基本概念 15 11 4数据报通信 数据报通信 DatagramCommunication 使用用户数据报协议 UserDatagramProtocol UDP 与TCP不同的一种协议不能保证数据会被成功地送达 也不保证数据抵达的次序与送出的次序相同 所以也被称为 不可靠的通信协议 虽然可靠性不高 但是它的速度很快 所以有些场合也有很大的用处服务器通过DatagramSocket接收或发送信息 这些信息以DatagramPackets的形式存在DatagramSocketmySocket newDatagramSocket intport port表示端口 上述语句将服务器绑定到一个可以从客户端接收packet的端口上 如果绑定失败 将产生SocketException异常 Java网络程序设计的基本概念 16 客户端应用程序的工作流程Step1 通过创建一个DatagramSocket对象来建立数据报通讯的Socket 有如下两种构造方法publicDatagramSocket 构造一个数据报socket 并使其与本地主机任一可用的端口连接 若打不开socket则抛出SocketException异常 publicDatagramSocket intport 构造一个数据报socket 并使其与本地主机指定的端口连接 若打不开socket或socket无法与指定的端口连接则抛出SocketException异常 11 1 4数据报通信 续 客户端 Java网络程序设计的基本概念 17 Step2 用DatagramPacket类来创建一个数据报包 用来实现无连接的包传送服务DatagramPacket对象封装了数据报包的数据 bufferedarray 包长度 length 目标地址 address 目标端口 port length必须小于等于bufferedarry lengthDatagramPacket bytebufferedarray intlength InetAddressaddress intport DatagramPacket类提供了四个方法来获取信息publicbyte getData 返回一个字节数组 包含收到或要发送的数据报中的数据publicintgetLength 返回发送或接收到的数据的长度publicInetAddressgetAddress 返回一个发送或接收此数据报包文的机器的IP地址publicintgetPort 返回发送或接收数据报的远程主机的端口号 11 1 4数据报通信 续 客户端 Java网络程序设计的基本概念 18 Step3 调用DatagramSocket对象的send DatagramPacketp 方法发送数据报文包Step4 调用DatagramSocket对象的receive DatagramPacketp 方法接收从服务器返回的结果数据报文包该DatagramPacket对象用到另一种构造方法 只需指明存放接收的数据报的缓冲区和长度DatagramPacket bytebufferedarray intlength receive方法会一直阻塞 直到收到一个数据报文包 此时DatagramPacket的缓冲区中包含的就是接收到的数据 也包含发送者的IP地址 发送者机器上的端口号等信息Step5 处理接收缓冲区内的数据 获取服务结果Step6 通讯完成后 使用DatagramSocket对象的close 方法来关闭数据报通讯Socket 11 1 4数据报通信 续 客户端 Java网络程序设计的基本概念 19 服务器端应用程序的工作流程与客户端应用程序的通讯过程使非常相似建立数据报通讯DatagramSocket构建数据报文包DatagramPacket接收数据报和发送数据报 处理接收缓冲区内的数据通讯完毕后 关闭数据报通讯Socket不同的是 服务器应用程序要面向网络中的所有计算机 所以服务器应用程序收到一个包文后要分析它 得到数据报的源地址信息 这样才能创建正确的返回结果报文给客户机 11 1 4数据报通信 续 服务器端 Java网络程序设计的基本概念 20 11 5Servlet Servlet是用java技术来实现CGI CommonGatewayInterface 通用网关接口 功能的编程介于浏览器 或其他HTTP客户端 与服务器之间 起到桥梁的作用 具体作用为 读取客户端发送的数据获取客户请 request 中所包含的信息产生响应结果 并将结果包含到一个文件中 比如HTML文件中设置HTTP响应参数 比如告诉浏览器 文件类型为HTML将文件返回给客户端Servlet的应用并不限于处理HTTP请求的网页或者应用程序服务中 还可以置入到邮件或FTP服务程序中 Java网络程序设计的基本概念 21 与传统的CGI相比 Servlet具有很多优点高效率通过Servlet Java虚拟机用轻量级的Java线程处理每个请求 同时有N个请求的情况下 CGI程序需要被调入到服务器内存N次 对于Servlet将开启N个线程 但仅仅调入一个Servlet实例到内存中应用方便Servlet在解析和译码HTML数据 读取设置HTML标题 操作Cookie等很多方面 应用更加方便 继承自java的特点 其可靠性与复用性好功能强大Servlet可以直接与Web服务程序对话 多个Servlet可以共享数据 Servlet与数据库的连接也比较简单等 11 1 5Servlet 续 优点 Java网络程序设计的基本概念 22 便携性好Servlet用Java语言编写 遵循标准的API 因此Servlet编写的程序可以无任何修改的在Apache MicrosoftInternetInformationServer IIS IBMWebSphere 或者StarNineWebStar上运行 同样具有一次编译 到处运行移植性好的特点安全基于Java语言的安全特性 Servlet的安全性也比较可靠成本低有很多免费或相对比较便宜的Web服务器 适合做个人的或者小容量的网站 而且很多商业级的Web服务器相对也比较便宜 而且使一个服务器支持Servlet所需的额外花费也很少 11 1 5Servlet 续 优点 Java网络程序设计的基本概念 23 11 2Servlet基础 本节内容包括Servlet容器 web服务器 应用服务器Web应用程序ServletAPIServlet的基本结构Servlet编译和安装 24 11 2 1Servlet容器 Web服务器和应用服务器 Servlet容器也称为Servlet引擎是一个编译好的可执行程序 它是web服务器与servlet间的的媒介负责将请求翻译成Servlet能够理解的形式传递给servlet 同时传给servlet一个对象使之可以送回响应负责管理servlet的生命周期 Servlet基础 25 web服务器能够处理Http请求的服务器可以提供静态页面 图像等有的web服务器也支持动态页面的生成 支持JSP Servlet等 具有JVM应用服务器可以处理基于多种协议的请求 当然也包括Http协议可以支持servlets和JSP 以及所有其他J2EE服务 包括JNDI EJBs JMS等 11 2 1Servlet容器 Web服务器和应用服务器 续 Servlet基础 26 servlet容器可以与web服务器协作提供对servlet的支持一些servlet容器 如ApacheTomcat 自己也可以作为独立的web服务器运行随着servlet和JSP的流行 一些主要的Web服务器和应用程序服务器都直接或者通过插件支持servlet和JSP 如 SunONEApplicationServerLotusDominoGoWebServerBEAweblogicTengahServerWebSphere应用服务器JigsawNetForgeAcmeServerMotBaysJetty 11 2 1Servlet容器 Web服务器和应用服务器 续 Servlet基础 27 ApacheTomcat5是servlet2 4和JSP2 0规范的官方参考实现完全免费 并且提供完整的源代码可以到http jakarta apache org tomcat 下载最新版本初始设置设置JAVA HOME 假设JDK安装在C j2sdk1 4 2 可以仿照path和classpath的设置方法 新建一个环境变量 JAVA HOME C j2sdk1 4 2 11 2 1Servlet容器 Web服务器和应用服务器 续 ApacheTomcat5服务器及其初始设置 Servlet基础 28 为方便调试 还可进行如下设置启动servlet重新载入功能 所请求servlet类文件发生变化后 自动重新载入到服务器内存 打开install dir conf server xml 在注释后插入语句开启servlet调用器invokerservlet 可以不修改Web应用的web xml文件即可运行servlet 打开install dir conf web xml 将servlet mapping元素取消注释invoker servlet 11 2 1Servlet容器 Web服务器和应用服务器 续 ApacheTomcat5服务器及其初始设置 Servlet基础 29 11 2 2Web应用程序 Web应用程序组成部分包括servlet JSP及其支持文件这些组成部分需要进行部署通常部署在Tomcat的webapps子目录中 一般其目录结构包括根目录 contextroot 和几个子目录 也可以把子目录捆绑到一个类型为war的存档文件中 Servlet基础 30 11 2 2Web应用程序 续 webapps子目录一般包括 WEB INF包含Web应用程序的部署描述文件 web xml 在web xml文件中配置Web应用程序 可以制订各种配置参数 调用servlet的名称 servlet的描述 servlet的完全的类名和servlet容器调用servlet的路径修改web xml的部署描述符后 需要重新启动Tomcat服务器WEB INF classes包括Web应用程序中所使用的servlet和实用工具类文件 如果类文件是包的组成部分 则包的目录结构从该目录开始WEB INF lib包含Java存档文件 JAR文件 是servlet和实用工具类文件 Servlet基础 31 11 2 2Web应用程序 续 Servlet基础 32 11 2 3ServletAPI ServletAPI开发servlet和JSP程序 需要参考ServletAPI文档包含javax servlet和javax servlet http两个包中所有servlet须实现javax servlet Servlet接口 通常继承如下两个类中的一个GenericServletHttpServlet Servlet基础 33 Servlet接口所有servlets必须实现这一接口Servlet接口的所有方法都是被自动调用的HttpServlet类覆盖了javax servlet Servlet接口的service方法service方法由servlet容器调用 对客户端的请求作出响应 它会根据请求类型的不同自动调用doGet或doPost等方法能够处理两个最普通的HTTP请求类型doGet方法响应get请求doPost方法响应post请求 Servlet基础 11 2 3ServletAPI 续 34 11 2 3ServletAPI 续 HttpServletRequest接口由Web服务器创建该接口的一个对象 并将其传递给servlet的service方法该类对象含有来自于客户端的请求HttpServletResponse接口由Web服务器创建该接口的一个对象 并将其传送给servlet的service方法通过该类对象服务器端可以对客户端发出响应信息 Servlet基础 35 11 2 3ServletAPI 续 HttpServletRequest接口 Servlet基础 36 11 2 3ServletAPI 续 HttpServletResponse接口 Servlet基础 37 11 2 4Servlet的基本结构 Servlet的基本结构一般扩展自HttpServlet复写doGet或者doPost方法doGet或doPost都接收两个类型的参数 HttpServletRequest和HttpServletResponse通过HttpServletRequest 可以得到所有的输入数据 比如表单数据 HTTP请求报头等客户信息通过HttpServletResponse可以指定输出信息由于doGet和doPost方法可能生成异常 必须在方法名称后声明抛出异常或者用try catch语句处理异常 Servlet基础 38 GET请求是WEB浏览器请求的常见类型 用来请求Web页面 本例中通过doGet方法处理GET请求 在doGet方法中通过HttpServletResponse对象得到PrintWriter 然后将一个文档发给客户 最终在客户端生成一个网页importjava io importjavax servlet importjavax servlet http publicclassMyServletextendsHttpServlet publicvoiddoGet HttpServletRequestreq HttpServletResponseres throwsServletException IOException res setContentType text html PrintWriterout res getWriter out println out println MyFirstServlet out println out println FirstServlet out println 11 2 4Servlet的基本结构 续 例11 2 Servlet基础 39 11 2 5Servlet编译和安装 编译 在设置好path和classpath的前提下 servlet的编译和普通的java程序完全相同可以通过javac exe编译 比如可以在Dos环境下输入 javacMyServlet java也可以通过集成开发环境 IDE 编译复制 编译成功之后 将生成的类文件复制到相应的目录下即可 在Tomcat服务器上 此目录可能是install dir webapps ROOT WEB INF classes 运行 启动Tomcat服务器 在地址栏输入http localhost 8080 servlet MyServlet Servlet基础 40 11 3Servlet的生命周期 首先服务器仅创建servlet的一个实例创建servlet实例时 它的init方法都会被调用针对每个客户端的每个请求 都会创建一个线程该线程调用servlet实例的service方法Service方法根据收到HTTP请求得类型 调用doGet doPost或者其他方法多个并发请求 一般会导致多个线程同时调用service方法 通过单线程模式 SingleThreadModel 也可以规定任何时间仅允许一个线程运行最后 卸载servlet服务器调用servlet的destroy方法 41 11 3Servlet的生命周期 续 Servlet生命周期示意图 服务器 服务器 Servlet代码 服务器 客户端 客户端 装载 Servlet代码 卸载 Servlet代码 处理客户端请求 Servlet的生命周期 42 11 3 1初始化 servlet的初始化服务器启动 servlet被用户首次调用 服务器构造servlet实例之后 即立刻调用init ServletConfig 方法 执行servlet实例的初始化工作ServeletConfig对象包含servlet初始化所需的很多参数 比如计数器 默认值等init方法都会在servlet处理客户请求 request 之前被调用一旦init方法被调用 只有服务器通过destroy方法销毁servlet之后 init方法才能再次被调用 Servlet的生命周期 43 11 3 1初始化 续 init方法的定义publicvoidinit ServletConfigconfig throwsServletException super init config Stringgreeting getInitParameter greeting Initializationcode Servlet的生命周期 44 11 3 2销毁 servlet的销毁服务器卸载servlet实例之前 需要先调用servlet的destroy方法释放servlet所获得的资源使servlet有机会关闭数据库连接 停止后台运行的线程 将cookie列表和点击数写入到磁盘执行其他清理活动 Servlet的生命周期 45 11 4与客户端交互 HTTPservlet与客户端的交互通过service方法处理客户端的请求service方法根据请求 request 类型的不同 调用不同的方法对于GET请求 调用doGet 方法进行处理对于POST请求 调用doPost 方法进行处理 46 11 4 1提取Servlet信息 注册的servlet都有相关的很多初始化参数这些初始化参数写在web xml中 具体语法格式请参阅Tomcat文档getInitParameter 方法可以得到servlet初始化的一些参数返回一个指定参数的值 String类型 如果指定参数不存在 则返回nullgetInitParameterNames 方法可以得到初始化参数名称返回String类型的Enumeration类型数据如果不存在初始化参数 则返回一个null的Enumeration 与客户端交互 47 通过servlet初始化参数建立一个数据库连接的程序段如下java sql Connectioncon null publicvoidinit ServletConfigconfig throwsServletException super init config Stringhost getInitParameter host intport Integer parseInt getInitParameter port Stringdb getInitParameter db Stringuser getInitParameter user Stringpassword getInitParameter password Stringproxy getInitParameter proxy con establishConnection host port db user password proxy 11 4 1提取Servlet信息 续 通过初始化建立数据库连接 与客户端交互 48 输出全部初始化参数名称importjava io importjava util importjavax servlet publicclassPrintInitParaNamesextendsGenericServlet publicvoidservice ServletRequestreq ServletResponseres throwsServletException IOException res setContentType text plain PrintWriterout res getWriter out println InitParametersAsFollowing Enumerationenum getInitParameterNames while enum hasMoreElements Stringname String enum nextElement out println name getInitParameter name 11 4 1提取Servlet信息 续 PrintInitParaNames java 与客户端交互 49 11 4 2提取服务器信息 servlet可以得到很多服务器相关的信息 同时可以将这些信息发送到客户端getServerName 返回服务器名称getServerPort 返回服务器监听端口getServerInfo 输出服务器程序和版本 之间用 分开getAttribute 返回服务程序的属性得到路径相关的信息publicStringHttpServletRequest getPathInfo publicStringHttpServletRequest getPathTranslated 与客户端交互 50 提取服务器信息举例importjava io importjava util importjavax servlet publicclassServerSnoopextendsGenericServlet publicvoidservice ServletRequestreq ServletResponseres throwsServletException IOException res setContentType text plain PrintWriterout res getWriter out println req getServerName output req getServerName out println req getServerPort output req getServerPort out println getServletContext getServerInfo output getServletContext getServerInfo out println getServletContext getAttribute attribute output getServletContext getAttribute attribute 11 4 2提取服务器信息 续 例11 3 与客户端交互 51 11 4 3提取客户端信息 服务器可以从request得到很多客户端的信息getRemoteAddr 得到IP地址getRemoteHost 得到客户端机器的名称利用InetAddress getByName 方法可以将IP地址或客户端机器名称转换成一个 InetAddress类型的对象InetAddressremoteInetAddress InetAddress getByName req getRemoteAddr 通过获取客户端的地址 并判断是否隶属某个范围 可以限制某个地区的用户访问你的网站 与客户端交互 52 11 4 3提取客户端信息 续 服务器可以得到客户想做的事情客户请求表现为表单数据 由 名 值 对组成 当提交某一个网页的时候常常在浏览器地址栏中看到类似格式的数据格式name value 每对之间用 隔开 表达式为param1 value1 param2 value2 param3 value3 request getParameter 得到表单参数的值request getParameterValues 得到多次出现的参数值reques getParameterNames 得到当前请求中所有参数的完整列表 调用形式如下publicStringServletRequest getParameter Stringname publicString ServletRequest getParameterValues Stringname 与客户端交互 53 书本查询的一个HTML网页 DOCTYPEHTMLPUBLIC W3C DTDHTML4 01Transitional EN ASampleFormforQueryaBookBooktolookup 11 4 3提取客户端信息 续 Query html 与客户端交互 54 获取客户端信息的servletimportjava io importjavax servlet importjavax servlet http publicclassQueryServletextendsHttpServlet publicvoiddoGet HttpServletRequestreq HttpServletResponseres throwsServletException IOException res setContentType text html charset UTF 8 StringqueryBookValue req getParameter Book PrintWriterout res getWriter out println Thebookyouwantedis queryBookValue out close 11 4 3提取客户端信息 续 QueryServlet java 与客户端交互 55 11 4 3提取客户端信息 续 query html与QueryServlet运行结果 与客户端交互 56 11 4 4发送HTML信息 Web服务器响应 response 的构成状态行由http版本 HTTP 1 1 一个状态代码 200 和一段对应状态代码的简短消息 OK 组成一些响应报头 Content Type text html指定后面文档MIME类型 后面的其他报头可选 常用MIME类型有 text html HTML文档text plain 纯文本text xml XMLimage jpeg JEPG图像application msword MicrosoftWord文档application pdf crobat文件application zip Zip档案一个空行和响应的文档 与客户端交互 57 HTTP 1 1200OK 状态行Content Type text html 报头Header2 HeaderN 空行 文档headcode 11 4 4发送HTML信息 续 与客户端交互 58 向客户端输出一个简单网页 显示 HelloWorld importjava io importjavax servlet importjavax servlet http publicclassHelloWorldextendsHttpServlet publicvoiddoGet HttpServletRequestreq HttpServletResponseres throwsServletException IOException res setContentType text html PrintWriterout res getWriter out println out println HelloWorld out println out println HelloWorld out println 11 4 4发送HTML信息 续 例11 4 与客户端交互 59 程序说明HelloWorld继承了HttpServlet 然后重写doGet方法在doGet方法中 首先将HTTPContent Type响应报头设置为text html 即指定响应的类型为HTML文档 然后通过getWriter 得到PrintWriter类型的一个对象out 按照HTML格式输出一个简单网页运行结果 11 4 4发送HTML信息 续 例11 4运行结果 与客户端交互 60 11 5客户端跟踪 客户端跟踪HTTP是无状态协议 服务器不能自动维护客户连接的上下文信息许多情况下 Web服务器必须要能够跟踪用户的状态比如购物网站和电子邮件网站 当用户登录以后 其身份和一系列的操作状态都需要被跟踪并保持servletAPI提供了两种可以跟踪客户端状态的方法CookieSession 61 11 5 1使用Cookie Cookie是Web服务器保存在用户硬盘上的一段文本 Web服务器将它发送到浏览器之后 当再次访问同一网络时 浏览器将它原封不动的返回其中的信息片断以 名 值 对 name valuepairs 的形式储存使用这种方法 网站可以维护客户的连接 这种用途可以体现在如下几点在电子商务中标识用户 实现短期跟踪用户记录用户名和用户密码 允许用户下次自动登陆定制站点 记录用户的偏好定向广告 记录用户感兴趣的主题 并显示与之相关的广告 客户端跟踪 62 调用Cookie的构造函数可创建一个cookie构造方法接受两个字符串参数cookie名称cookie的值例如创建一个名为CookieName 值为John的cookie 可以使用下面的语句Cookielogin newCookie CookieName John 客户端跟踪 11 5 1使用Cookie 续 创建Cookie对象 63 创建了一个名为login的cookie之后 可通过很多现有的方法设置cookie的值和属性可通过如下语句设置cookie的注释 login setComent YoucangetUserNameformthiscookie 创建cookie并将它发送到浏览器后 默认情况下 它是会话级的cookie 仅仅存储在浏览器内存中 用户退出浏览器后 cookie将被删除 如果希望将cookie存储在磁盘上 则需要设定MaxAge 给出一个以秒为单位的生命周期 如下可以将生命设置为一天login setMaxAge 60 60 24 onedaysetPath setValue setVersion setDomain setSecure 等 相关的具体用法请查看servletAPI 11 5 1使用Cookie 续 设置Cookie属性 客户端跟踪 64 刚创建的cookie存在于服务器内存中 必须将它发送到客户端 cookie才能真正的发挥作用 发送cookie需要使用HttpServletResponse的addCookie方法 将cookie插入到一个HTTP响应报头 发送的语句如下publicvoiddoGet HttpServletRequestreq HttpServletResponseres throwsServletException IOException Cookielogin newCookie UserName John login setComent YoucangetUserNameformthiscookie res addCookie login 客户端跟踪 11 5 1使用Cookie 续 发送Cookie到客户端 65 从客户端读取你感兴趣的cookie 需要两个步骤首先调用request getCookies得到一个Cookie对象的数组然后调用每个cookie的getName方法 从数组中寻找所需的cookieStringnameString UserName Cookie cookies request getCookies for inti 0 i cookies length i Cookiecookie cookies i if nameString equals cookie getName dosomething cookies setMaxAge 0 找到感兴趣的cookie之后 便可以操作此cookie 如通过getValue方法得到相关cookie的值 设置MaxAge等 客户端跟踪 11 5 1使用Cookie 续 从客户读取Cookie 66 11 5 2使用Session Session一段时间内 单个客户与web服务器的一连串的交互过程在一个Session中客户可能会多次请求访问同一个网页 也有可能请求访问各种不同的服务器资源 其间用户的状态需要跟踪并保持存在于服务器端 不在网络上传送它的好处是可以用来记录客户端私有的信息 并且在时间范围内不会消失 客户端跟踪 67 11 5 2使用Session 续 Session的使用可以分为三个步骤获得一个session存储数据到session或从session读取数据销毁session 客户端跟踪 68 通过调用httpServletRequest的getSession方法可以得到一个sessionHttpSessionsession request getSession 为了保持正确的会话 必须在发送任何文档到客户程序之前获得一个sessionpublicclassSessionServletextendsHttpServlet publicvoiddoGet HttpServletRequestrequest HttpServletResponseresponse throwsServletException IOException Gettheuser ssessionHttpSessionsession request getSession true out response getWriter 客户端跟踪 11 5 2使用Session 续 获得一个Session 69 SessionIDServlet容器为HttpSession分配的一个唯一标识符作为Cookie保存在客户的浏览器中sessioncookie每次客户发出HTTP请求时 Servlet容器可以从HttpRequest对象中读取SessionID 然后根据SessionID在服务器端找到相应的HttpSession对象 从而获取客户的状态信息 这样的cookie叫做sessioncookie存储于浏览器内存中的 并不写到硬盘上的针对某一次会话而言 会话结束也就随着消失了 客户端跟踪 11 5 2使用Session 续 存储或读取数据 70 URL重写浏览器不支持Cookie 或者将浏览器设置为不接受Cookie的情况 可通过URL重写来实现会话管理向URL连接添加参数 并把sessionID作为值包含在连接中 为servlet响应部分的每个连接添加sessionID 可以使用一对方法response encodeURL 使URL包含sessionIDresponse encodeRedirectURL 使用重定向 客户端跟踪 11 5 2使用Session 续 存储或读取数据 71 从Session中读取数据session getAttribute name 查找以前存储的值如果不存在则返回null在调用此方法返回的对象前 一定要检查它是否为null向session中设置相关信息setAttribute替换掉此前设定的任何值removeAttribute移除而不是替换某个值 客户端跟踪 11 5 2使用Session 续 存储或读取数据 72 publicclassSessionServletextendsHttpServlet publicvoiddoGet HttpServletRequestrequest HttpServletResponseresponse throwsServletException IOException Gettheuser ssessionHttpSessionsession request getSession true SomeClassscl SomeClass session getAttribute name1 IftheuserhasnoSomeClassobject createanewoneif scl null scl newSomeClass session putAttribute name1 scl 11 5 2使用Session 续 SessionServlet java 客户端跟踪 73 销毁Session意味着从系统删除session对象及其值自动销毁在一段时间 时间长短依赖与Web服务器的设定 没有request的情况下 Web服务器会自动销毁session手动销毁通过调用session的invalidate方法可以手动的销毁sessionlogout在支持servlet2 4的服务器中 可调用logout将客户从Web服务器中注销 同时废弃所有与该用户相关联的会话需要注意的是 这个动作会影响到此servlet之外的其他servlet 因此一定要与网站的其他开发人员协调使用 11 5 2使用Session 续 销毁Session 客户端跟踪 74 11 6协作与通信 协作与通信为了更好的响应客户端的请求 servlet有时需要和网络上的其他资源进行通讯 比如HTML网页其他servletJSP网页Servlet协作通讯的第一步是获得分发器 dispatcher 即RequestDispatcher接口的一个对象 75 RequestDispatcher接口产生一个RequestDispatcher接口的对象RequestDispatcherdispatcher getServletContext getRequestDispatcher SomePath SomeString 通过设置字符串参数 可以获得servlet HTML网页 JSP网页等 资源 forward方法将本servlet的request请求传递给 其他资源 响应通过利用此方法可实现 servlet先预处理request 然后将处理后的request传递给 其他资源 处理include方法引入 其他资源 来响应客户端的请求 11 6 协作与通信 续 RequestDispatcher接口 协作与通信 76 MyServlet1获取另外一个servlet MyServlet2 并用它来响应用户的请求importjava io importjavax servlet importjavax servlet http publicclassMyServlet1extendsHttpServlet publicvoiddoGet HttpServletRequestreq HttpServletResponseres throwsServletException IOException res setContentType text html RequestDispatchersummary getServletContext getRequestDispatcher servlet MyServlet2 协作与通信 11 6 协作与通信 续 MyServlet1 java 77 if summary null try summary include req res catch IOExceptione catch ServletExceptione elseif summary null PrintWriterout res getWriter out println out println Error out println out println SummaryisNull out println 协作与通信 11 6 协作与通信 续 MySe
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


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

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


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