《第8章 JSP与Servlet编程.ppt》由会员分享,可在线阅读,更多相关《第8章 JSP与Servlet编程.ppt(61页珍藏版)》请在优知文库上搜索。
1、第第8章章 JSP与与Servlet编程编程主要内容主要内容Servlet概述概述编写一个简单的编写一个简单的Servlet处理客户端提交的数据处理客户端提交的数据返回数据到客户端返回数据到客户端返回返回JSP+Servlet编程实例编程实例 Servlet是与JSP样在服务器端运行的Java应用程序的一种。Servlet就是运行在服务器端的应用程序,Servlet接收来自客户端的请求,将处理结果返回给客户端。(1)功能强大(2)执行效率高(3)开发难度低(4)可移植性好(5)性能更强Servlet接受来自客户端的请求,这个请求Servlet是通过Web服务器得到的,然后运行之后得到结果,然后
2、返回结果,返回结果是通过Web服务器。Servlet的用途:(1)一个简单的Servlet可以处理使用HTML FORM在HTTPS上使用POST传递的数据。复杂的Servlet(可能还会使用RMI技术)可以用于实现定单输入和处理系统、生产及库存数据库以及一个可能的联机支付系统。(2)一个Servlet能并发处理多个请求;他们可以使用在诸如在线会议这样的同步请求支持系统。(3)Servlet可以转送请求给其他的服务器和Servlet,(4)Servlet编写者们可以定义彼此之间共同工作的激活代理,每个代理者是一个Servlet,而且代理者能够在他们之间传送数据。Servlet是一种在服务器端运
3、行的Java程序,从某种意义上说,它就是服务器端的Applet。所以Servlet可以像Applet一样作为一种插件(Plugin)嵌入到Web Server中去,提供诸如HTTP、FTP等协议服务甚至用户自已定制的协议服务。而JSP是继Servlet后Sun公司推出的新技术,它是以Servlet为基础开发的,Servlet与JSP区别:(1)编程方式不同JSP是为了解决Servlet中相对困难的编程技术而开发的技术,因此,JSP在程序的编写方面比Servlet要容易的多,Servlet严格遵循Java语言的编程标准,而JSP则遵循脚本语言的编制标准。(2)Servlet必须在编译以后才能执行
4、 JSP并不需要另外进行编译,JSP Container会自动完成这一工作,而Servlet在每次修改代码之后都需要编译完才能执行。(3)运行速度不同 由于JSP Container将JSP程序编译成Servlet的时候需要一些时间,所以JSP的运行速度比Servlet要慢一些,不过,如果JSP文件能毫无变化的重复使用,它在第一次以后的调用中运行速度就会和Servlet一样了,这是因为JSP Container接到请求以后会确认传递过来的JSP是否有改动,如果没有改动的话,将直接调用JSP编译过的Servlet类,并提供给客户端解释执行,如果JSP文件有所改变,JSP Container将重新
5、将它编译成Servlet,然后再提交给客户端。Servlet执行javax.Servlet.Servlet接口。Servlet编写者可以通过直接执行interface开发Servlet,但这样通常没有必要。因为大多数Servlet是针对用HTTP协议的web服务器,这样最通用开发Servlet办法是用javax.Servlet.http.HttpServlet类。HttpServlet类通过extend GenericServlet基类执行Servlet interface,提供了处理HTTP协议的功能。一般地,用HttpServlet指定的类编写的Servlet可以多线程地并发运行servi
6、ce方法。Servlet一般从Javax包的HttpServlet类扩展而来,在HttpServlet中加入了一些附加的方法,这些方法可以被协助处理HTTP基本请求的HttpServlet类中的方法service自动地调用。1doGet doGet用来处理HTTP的GET请求。这个GET操作仅仅允许客户从HTTP server上取得GET资源。重载此方法的用户自动允许支持方法HEAD。这个GET操作被认为是安全的,没有任何的负面影响,对用户来说是很可靠的。比如,大多数的正规查询都没有副作用。打算改变存储数据的请求必须用其他的HTTP方法。这些方法也必须是个安全的操作。方法doGet的缺省实现将
7、返回一个HTTP的BAD_REQUEST错误。doGet方法格式为:protected void doGet(HttpServletResquest request,HttpServletResponse response)throws ServletException,IOException;下面看一段HTTP Servlet处理GET和HEAD方法的代码:1package com.jsp.chap08;223import java.io.IOException;4import java.io.PrintWriter;5import javax.servlet.ServletExceptio
8、n;6import javax.servlet.http.HttpServlet;7import javax.servlet.http.HttpServletRequest;8import javax.servlet.http.HttpServletResponse;9public class SimpleServlet extends HttpServlet 10 public void doGet(HttpServletRequest req,HttpServletResponse res)11 throws ServletException,IOException 12 /首先设置头部1
9、3 res.setContentType(text/html);14 /解决显示的中文问题15 res.setCharacterEncoding(gb2312);16 /用writer方法返回响应数据17 PrintWriter out=res.getWriter();18 out.println(新闻发布系统);19 out.println(新闻发布系统);20 out.println();21 out.close();22 2324 public String getServletInfo()25 return A simple Servlet;26 272doPostdoPost用来处理
10、HTTP的POST请求。这个POST操作包含了在必须通过此Servlet执行的请求中的数据。由于它不能立即取得资源,所以对于那些涉及到安全性的用户来说,通过POST请求操作会有一些副作用。doPost的缺省执行将返回一个HTTP的BAD_REQUEST错误。当编写Servlet时,为了支持POST操作必须在子类HttpServlet中实现(implement)此方法。doPost方法格式为:protected void doPost(HttpServletResquest request,HttpServletResponse response)throws ServletException,
11、IOException;下面看一段HTTP Servlet处理POST方法的代码:11 public void doPost(HttpServletRequest req,HttpServletResponse res)12 throws ServletException,IOException 13 /首先设置响应的content type头部14 res.setContentType(text/html);15 /得到响应的PrintWriter以返回文本给客户端.16 PrintWriter toClient=res.getWriter();17 try 18 /打开一个文件写入Surv
12、ey的结果19 String surveyName=req.getParameterValues(survey)0;FileWriter resultsFile=new FileWriter(resultsDir+System.getProperty(file.separator)+surveyName+.txt,true);21 PrintWriter toFile=new PrintWriter(resultsFile);22 /从客户端得到表单数据存贮在该文件中23 toFile.println();24 Enumeration values=req.getParameterNames(
13、);25 while(values.hasMoreElements()26 String name=(String)values.nextElement();27 String value=req.getParameterValues(name)0;28 if(pareTo(submit)!=0)29 toFile.println(name+:+value);30 31 32 toFile.println();33 /关闭文件。34 resultsFile.close();35 /用一个thank you返回客户端36 toClient.println();37 toClient.printl
14、n(Thank you!);38 toClient.println(Thank you for participating);39 toClient.println();40 catch(IOException e)42 e.printStackTrace();43 44 /关闭writer;响应完成。45 toClient.close();46 47 3doPutdoPut用来处理HTTP的PUT请求。此PUT操作模拟通过FTP发送一个文件。对于那些涉及到安全性的用户来说,通过PUT请求操作也会有一些副作用。doPut方法格式为:protected void doPut(HttpServle
15、tResquest request,HttpServletResponse response)throws ServletException,IOException;4doDeletedoDelete用来处理HTTP的DELETE请求。此操作允许客户端请求一个从server移出的URL。对于那些涉及到安全性的用户来说,通过DELETE请求操作会有一些副作用。doDelete方法格式为:protected void doDelete(HttpServletResquest request,HttpServletResponse response)throws ServletException,I
16、OException;5doHeaddoHead用来处理HTTP的HEAD请求。缺省地,它会在无条件的GET方法执行时运行,但是不返回任何数据到客户端。只返回包含内容信息的长度的header。由于用到GET操作,此方法应该是很安全的(没有副作用)也是可重复使用的。此方法的缺省实现(implement)自动地处理了HTTPDE的HEAD操作并且不需要通过一个子类实现(implement)。doHead方法格式为:protected void doHead(HttpServletResquest request,HttpServletResponse response)throws ServletException,IOException;6doOptionsdoOptions用来处理HTTP的OPTIONS请求。此操作自动地决定支持什么HTTP方法。比如说,如果读者创建HttpServlet的子类并重载方法doGet,然后方法doOptions会返回下面的header:GET、HEAD、TRACE和OPTIONS。doOptions方法格式为:protected void doOptio