欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    第8章 JSP与Servlet编程.ppt

    • 资源ID:5030333       资源大小:876KB        全文页数:61页
    • 资源格式: PPT        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第8章 JSP与Servlet编程.ppt

    第8章 JSP与Servlet编程,主要内容,Servlet概述,编写一个简单的Servlet,处理客户端提交的数据,返回数据到客户端,返回JSP+Servlet编程实例,一、Servlet概述,Servlet是与JSP样在服务器端运行的Java应用程序的一种。Servlet就是运行在服务器端的应用程序,Servlet接收来自客户端的请求,将处理结果返回给客户端。,1、什么是Servlet,(1)功能强大 (2)执行效率高 (3)开发难度低 (4)可移植性好 (5)性能更强,2、什么是Servlet,Servlet接受来自客户端的请求,这个请求Servlet是通过Web服务器得到的,然后运行之后得到结果,然后返回结果,返回结果是通过Web服务器。Servlet的用途: (1)一个简单的Servlet可以处理使用HTML FORM在HTTPS上使用POST传递的数据。复杂的Servlet(可能还会使用RMI技术)可以用于实现定单输入和处理系统、生产及库存数据库以及一个可能的联机支付系统。 (2)一个Servlet能并发处理多个请求;他们可以使用在诸如在线会议这样的同步请求支持系统。 (3)Servlet可以转送请求给其他的服务器和Servlet, (4)Servlet编写者们可以定义彼此之间共同工作的激活代理,每个代理者是一个Servlet,而且代理者能够在他们之间传送数据。,3、Servlet的用途,Servlet是一种在服务器端运行的Java程序,从某种意义上说,它就是服务器端的Applet。所以Servlet可以像Applet一样作为一种插件(Plugin)嵌入到Web Server中去,提供诸如HTTP、FTP等协议服务甚至用户自已定制的协议服务。而JSP是继Servlet后Sun公司推出的新技术,它是以Servlet为基础开发的,Servlet与JSP区别: (1)编程方式不同 JSP是为了解决Servlet中相对困难的编程技术而开发的技术,因此,JSP在程序的编写方面比Servlet要容易的多,Servlet严格遵循Java语言的编程标准,而JSP则遵循脚本语言的编制标准。,4、Servlet与JSP的区别,(2)Servlet必须在编译以后才能执行 JSP并不需要另外进行编译,JSP Container会自动完成这一工作,而Servlet在每次修改代码之后都需要编译完才能执行。 (3)运行速度不同 由于JSP Container将JSP程序编译成Servlet的时候需要一些时间,所以JSP的运行速度比Servlet要慢一些,不过,如果JSP文件能毫无变化的重复使用,它在第一次以后的调用中运行速度就会和Servlet一样了,这是因为JSP Container接到请求以后会确认传递过来的JSP是否有改动,如果没有改动的话,将直接调用JSP编译过的Servlet类,并提供给客户端解释执行,如果JSP文件有所改变,JSP Container将重新将它编译成Servlet,然后再提交给客户端。,Servlet执行javax.Servlet.Servlet接口。Servlet编写者可以通过直接执行interface开发Servlet,但这样通常没有必要。因为大多数Servlet是针对用HTTP协议的web服务器,这样最通用开发Servlet办法是用javax.Servlet.http.HttpServlet类。HttpServlet类通过extend GenericServlet基类执行Servlet interface,提供了处理HTTP协议的功能。一般地,用HttpServlet指定的类编写的Servlet可以多线程地并发运行service方法。Servlet一般从Javax包的HttpServlet类扩展而来,在HttpServlet中加入了一些附加的方法,这些方法可以被协助处理HTTP基本请求的HttpServlet类中的方法service自动地调用。,5、Servlet的方法,1doGet doGet用来处理HTTP的GET请求。这个GET操作仅仅允许客户从HTTP server上取得GET资源。重载此方法的用户自动允许支持方法HEAD。这个GET操作被认为是安全的,没有任何的负面影响,对用户来说是很可靠的。比如,大多数的正规查询都没有副作用。打算改变存储数据的请求必须用其他的HTTP方法。这些方法也必须是个安全的操作。方法doGet的缺省实现将返回一个HTTP的BAD_REQUEST错误。doGet方法格式为: protected void doGet(HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException;,下面看一段HTTP Servlet处理GET和HEAD方法的代码: package com.jsp.chap08;2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 public class SimpleServlet extends HttpServlet 10 public void doGet(HttpServletRequest req, HttpServletResponse res) 11 throws ServletException, IOException 12 / 首先设置头部 13 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 23 24 public String getServletInfo() 25 return “A simple Servlet“; 26 27 ,2doPost doPost用来处理HTTP的POST请求。这个POST操作包含了在必须通过此Servlet执行的请求中的数据。由于它不能立即取得资源,所以对于那些涉及到安全性的用户来说,通过POST请求操作会有一些副作用。 doPost的缺省执行将返回一个HTTP的BAD_REQUEST错误。当编写Servlet时,为了支持POST操作必须在子类HttpServlet中实现(implement)此方法。doPost方法格式为: protected void doPost(HttpServletResquest request,HttpServletResponse response) throws ServletException,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 / 打开一个文件写入Survey的结果 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(); 25 while (values.hasMoreElements() 26 String name = (String) values.nextElement(); 27 String value = req.getParameterValues(name)0; 28 if (name.compareTo(“submit“) != 0) 29 toFile.println(name + “:“ + value); 30 31 32 toFile.println(“);,33 / 关闭文件。 34 resultsFile.close(); 35 / 用一个thank you返回客户端 36 toClient.println(“); 37 toClient.println(“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 ,3doPut doPut用来处理HTTP的PUT请求。此PUT操作模拟通过FTP发送一个文件。对于那些涉及到安全性的用户来说,通过PUT请求操作也会有一些副作用。doPut方法格式为: protected void doPut(HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException;,4doDelete doDelete用来处理HTTP的DELETE请求。此操作允许客户端请求一个从server移出的URL。对于那些涉及到安全性的用户来说,通过DELETE请求操作会有一些副作用。doDelete方法格式为: protected void doDelete(HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException;,5doHead doHead用来处理HTTP的HEAD请求。缺省地,它会在无条件的GET方法执行时运行,但是不返回任何数据到客户端。只返回包含内容信息的长度的header。由于用到GET操作,此方法应该是很安全的(没有副作用)也是可重复使用的。此方法的缺省实现(implement)自动地处理了HTTPDE的HEAD操作并且不需要通过一个子类实现(implement)。doHead方法格式为: protected void doHead(HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException;,6doOptions doOptions用来处理HTTP的OPTIONS请求。此操作自动地决定支持什么HTTP方法。比如说,如果读者创建HttpServlet的子类并重载方法doGet,然后方法doOptions会返回下面的header:GET、HEAD、TRACE和OPTIONS。doOptions方法格式为: protected void doOptions(HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException;,7doTrace doTrace用来处理HTTP的TRACE请求。此方法的缺省实现产生一个包含所有在trace请求中的header的信息的应答(response)。在开发Servlet时,多数情况下需要重载此方法。doTrace方法格式为: protected void doTrace(HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException;,Servlet的生命周期定义了一个Servlet如何被加载、初始化,以及它怎样接收请求、响应请求、提供服务。Servlet的生命周期如图所示。,6、Servlet的生命周期,1Servlet的初始化 init方法被调用于初始化JSP/Servlet,其格式为: public void init(ServletConfig config) throws ServletException super.init(); 在初始化过程中,Servlet应当准备好它要安排的一些资源,以便这个Servlet能够接收请求,做到这些可以不用考虑多线程,因为在Servlet初始化时只能是单进程的。一旦初始化方法完成,Servlet就能接收客户端的请求。当然如果初始化不能成功,这个方法会抛出UnavailableException解释的。 初始化方法使用ServletConfig对象作为参数,这个方法应该保存这个对象,以便它能有方法getServletConfig()返回。最简单的办法是,创建出一个新类,它的初始化方法数调用super.init()。如果确实这样做,就应当自己保存ServletConfig对象,并且自己重编getServletConfig()方法,以便它能从新的位置得到对象。,例: 1 public void init(ServletConfig config) throws ServletException 2 3 super.init(config); 4 /获取目录 5 resultsDir=getInitParameter(“resultsDir“); 6 /如果没有目录,不处理客户端 7 if (resultsDir=null) 8 9 throw new UnavailableException(this,“Not given a directory to write survey results!“); 10 11 ,2Servlet的执行 Service方法可以用于实现事务逻辑,是处理请求的地方。在服务器装载初始化Servlet后,Servlet就能够处理客户端的请求,可以用service方法来实现。每个客户端请求有它自己service方法。这些方法接收客户端请求,并且发回相应的响应。Servlet能同时运行多个service。这样,service方法可以按一个thread-safe样式编写。如service方法更新Servlet对象中的一个字段field,这个字段是可以同时存取的。假如某个服务器不能同时并发运行service方法,也可以用SingleThreadModel接口。这个接口保证不会有两个以上的线程(threads)并发运行。在Servlet执行期间其最多的应用是处理客户端的请求并产生一个网页。,3Servlet的结束 当服务器卸载一个Servlet,它将调用Servlet的destroy方法。这个destroy方法是与初始化方法相反,同时从内存中释放Servlet。Destroy的格式为: public void destroy() ,下面看一段应用destroy方法的代码: public void destroy() Try con.close(); catch(SQLException e) while(e != null) log(“SQLException:“+e.getSQLState()+t+e.getMessage()+t+e.getErrorCode()+t); e=e.getNextException(); catch (Exception e) e.printStackTrace(); ,代码中,在初始化时打开的一个数据库连接,destroy方法将该数据库连接关闭。下面看一段service方法、destory方法综合应用的代码: 1 package com.jsp.chap08; 2 import java.io.IOException; 3 import java.io.PrintWriter; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 public class ShutdownExample extends HttpServlet 9 private int serviceCounter = 0; 10 private Boolean shuttingDown; 11 / serviceCounter 12 protected synchronized void enteringServiceMethod() 13 serviceCounter+; 14 15 protected synchronized void leavingServiceMethod() 16 serviceCounter-; 17 18 protected synchronized int numServices() 19 return serviceCounter; 20 21 / shuttingDown 22 protected void setShuttingDown(Boolean flag) 23 shuttingDown = flag; 24 ,25 protected Boolean isShuttingDown() 26 return shuttingDown; 27 28 protected void service(HttpServletRequest req, HttpServletResponse resp) 29 throws ServletException, IOException 30 enteringServiceMethod(); 31 try 32 super.service(req, resp); 33 finally 34 leavingServiceMethod(); 35 36 37 public void destroy() 38 / 检查是否有线程在运行,如果有,告诉他们停止 39 if (numServices() 0) 40 setShuttingDown(true); 41 42 while (numService() 0) 43 try 44 thisThread.sleep(interval); 45 catch (InterruptedException e) 46 47 48 49 public void doPost() 50 for (i = 0; (i lotsOfStuffToDo) 53 catch (InterruptedException e) 54 55 56 57 ,Servlet的相关类和接口放在包javax.Servlet和包javax.Servlet.http中。其中部分接口与JSP内置对象相对应,对应关系如表8.1所示。,7、 Servlet的类和接口,1ServletInputStream类 ServletInputStream类是一个抽象类,它提供了从客户机请求读取二进制数据的一个输入流,对于一些协议,例如HTTP、POST和PUT,可以使用ServletInputStream对象读取和发送数据。 public int readLine(byte b,int off,int len)throws IOException 读输入流,一次一行。如果读到输入流的尾部,则返回1,参数b为数据读取的字节数组,off为开始读的位置,len为读的字节数。,2ServletOutputStream类 ServletOutputStream类是一个抽象类,它提供了一个输出流,用于向客户端发送数据。下面看两组代码。 不带回车和换行的代码: public void print() throws IOException public void print(String s) throws IOException public void print(boolean b) throws IOException public void print(char c) throws IOException public void print(int i) throws IOException public void print(long l) throws IOException public void print(float f) throws IOException public void print(double d) throws IOException 带回车和换行的代码: public void println() throws IOException public void println(String s) throws IOException public void println(boolean b) throws IOException public void println(char c) throws IOException public void println(int i) throws IOException public void println(long l) throws IOException public void println(float f) throws IOException public void println(double d) throws IOException 这些代码都是向客户端写数据,不过参数不同。,3ServlertConfig接口 ServletConfig接口定义了一个Servlet配置对象,Servlet引擎可以用来传递信息给Servlet以便初始化Servlet。其配置信息含有初始化参数,这些参数以名字和值的形式成对出现,描述关于服务器的Servlet信息。 public abstract ServletContext getServletContext() 得到服务器传递给Servlet的一个ServletContext对象。 public abstract String getInitParameter(String name) 得到一个含有参数name指定的初始化参数的值,如果参数不存在则为null。 public abstract Enumeration getInitParameterNames() 得到Servlet的初始化参数的名字,返回值是一个Enumeration对象。 4HttpServletRequest接口 HttpServletRequest接口扩展了javax.Servlet.ServletRequest接口。用于提供更多的功能给HTTP Servlet。Servlet引擎实现该接口,创建HTTPServletRequest对象,将来自客户浏览器的信息传递给HttpServlet的service方法。 public abstract int getIntHeader(String name) 得到有关请求 header 的值,为一个整数。如果请求中没有指定名字(参数name)则返回1,如果不能转换为整数,则抛掷NumberFormatException。Name是区别大小写的。 public abstract String getMethod() 得到HTTP方法的名字,例如:GET、POST或PUT。返回的字符串与CGI的REQUEST_MOTHOD变量的值一样。,public abstract String getPathInfo():得到与URL相联系的路径的信息,它等同于CGI的PATH_INFO。 public abstract String getPathTranslated():得到在Servlet 之后查询字符串之前的路径信息,并将其转换为一个真实的路径,它等同于CGI的PATH_TRANSLATED。 public abstract String getQueryString():得到请求的查询字符串,它等同于CGI的QUERY_STRING。 public abstract String getRemoteUser():如果远程用户使用HTTP认证登录,得到发出请求的用户名。如果登录用户没有认证则返回null,它等同于CGI的REMOTE_USER。 public abstract String getRequestedSessionId():得到用户指定的任务(session)ID,这可能与实际任务使用的ID不一样。例如,如果请求指定一个旧的任务ID,而服务器启动一个新的任务,该方法将得到新任务的新ID,如果请求没有指定任务ID,该方法返回null。 public abstract String getAuthType():得到服务器使用的认证计划(authentication scheme)名,例如:“BASIC”或“SSL”。所谓认证计划,就是使用一种“质询/响应”模式,服务器质询客户,客户提供认证信息,与 CGI 的 AUTH_TYPE 变量的值一样。 返回值为一个描述认证计划名的字符串,如果服务器没有认证计划则为null。 public abstract Cookie getCookies():得到一个Cookie对象数组,含有所有发送请求的浏览器的Cookie,如果浏览器没有发送任何Cookie,则返回null。 , public abstract long getDateHeader(String name):得到一个特定请求header的、描述Date对象的长整型值。Header(参数name)是区别大小写的。如果请求中没有该name的header,则方法返回1,如果方法不能转换日期,则抛掷一个IllegalArgumentException。 public abstract String getHeader(String name):得到有关请求header的值,为一个字符串,如果指定名字的header没有随请求一起发送,该方法返回null,name是区别大小写的。 public abstract Enumeration getHeaderNames():得到请求中的所有header名。有些Servlet引擎不允许Servlet使用该方法访问header,这时,方法返回null。 public abstract HttpSession getSession():得到与请求相联系的当前任务,如果请求没有任务,则创建一个。 public abstract boolean isRequestedSessionIdValid():检查请求是否在当前的任务上下文(HttpSessionContext)中拥有一个有效的任务。如果任务无效,该方法永远都不会返回。 public abstract boolean isRequestedSessionIdFromCookie():检查请求所呈递的任务ID是否作为一个 cookie 进入,而不是来自getSession方法。 public abstract boolean isRequestedSessionIdFromURL():检查请求所呈递的任务ID是否作为请求URL的一部分进入,而不是来自getSession方法。 public abstract String getServletPath():得到调用Servlet的请求的URL部分,这包括Servlet名或到Servlet的路径,但是不包括任何额外的路径信息或查询字符串,它等同于CGI的SCRIPT_NAME变量。 public abstract HttpSession getSession(boolean create):得到与请求相联系的当前HttpSession,如果需要(create为true),则为请求创建一个新的任务。,8、 状态代码,在Web服务器应答中,应答中可能包括状态代码处理。应答信息中的状态代码中,可以提取需要的状态信息,从而做出相应的处理。Servlet可以利用这些状态代码来实现许多功能。例如,可以把用户重定向到另一个网站;可以告诉用户必须提供密码才能访问文档等等。常见的状态代码以及它们对应的状态信息和含义如表所示。,二、编写一个简单的Servlet,通过上面的学习,大家应该对Servlet的概念、方法、生命周期等知识有了一定的认识,现在将通过一个简单的实例学习Servlet,来加深对Servlet的理解。下面是HelloServlet.java文件的代码,它实现了在浏览器中输出指定的信息。 1 package com.jsp.chap08; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class HelloServlet extends HttpServlet 12,13 public void service(HttpServletRequest req, 14 HttpServletResponse res) throws IOException 15 res.setContentType(“text/html“); 16 PrintWriter out = res.getWriter(); 17 out.println(“Hello World!“); 18 out.println(“); 19 out.println(“Hello World!“); 20 21 ,所有的servlet都应该存放在Web应用程序的/WEB-INF/classes目录中,因为web.xml文件控制着对servlet的访问。下面是对此例中web.xml文件进行修改的部分。 /这里指定servlet的名称 HelloWorldServlet /这里是存放class文件的相对路径,注意大小写 test.HelloServlet /在遇到中的路径请求时就交给名为的servlet来处理 HelloWorldServlet /url-pattern路径的映射 /HelloWorldServlet/* ,三、处理客户端提交的数据,客户端向服务器端提交数据的方法一般有GET和POST两种。相应的,覆盖doGet方法和doPost方法就能够处理其中的信息(doGet方法和doPost方法在前面已经介绍过了,这里不再阐述)。下面看一段处理客户端提交的数据的代码:,1 package com.jsp.chap08; 2 import java.io.IOException; 3 import java.io.PrintWriter; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 public class GetForm extends HttpServlet 9 public void doGet(HttpServletRequest request, HttpServletResponse response) 10 throws ServletException, IOException 11 response.setContentType(“text/html;charset=GB2312“); 12 PrintWriter pw = response.getWriter(); 13 pw.println(“); 14 pw.println(“获取信息“); 15 pw.println(“);,16 pw.pr

    注意事项

    本文(第8章 JSP与Servlet编程.ppt)为本站会员(韩长文)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开