第8章 JSP与Servlet编程.ppt

上传人:夺命阿水 文档编号:751201 上传时间:2023-11-07 格式:PPT 页数:61 大小:703.50KB
返回 下载 相关 举报
第8章 JSP与Servlet编程.ppt_第1页
第1页 / 共61页
第8章 JSP与Servlet编程.ppt_第2页
第2页 / 共61页
第8章 JSP与Servlet编程.ppt_第3页
第3页 / 共61页
第8章 JSP与Servlet编程.ppt_第4页
第4页 / 共61页
第8章 JSP与Servlet编程.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《第8章 JSP与Servlet编程.ppt》由会员分享,可在线阅读,更多相关《第8章 JSP与Servlet编程.ppt(61页珍藏版)》请在课桌文档上搜索。

1、第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服务器得到的,然后运行之后得到结

2、果,然后返回结果,返回结果是通过Web服务器。Servlet的用途:(1)一个简单的Servlet可以处理使用HTML FORM在HTTPS上使用POST传递的数据。复杂的Servlet(可能还会使用RMI技术)可以用于实现定单输入和处理系统、生产及库存数据库以及一个可能的联机支付系统。(2)一个Servlet能并发处理多个请求;他们可以使用在诸如在线会议这样的同步请求支持系统。(3)Servlet可以转送请求给其他的服务器和Servlet,(4)Servlet编写者们可以定义彼此之间共同工作的激活代理,每个代理者是一个Servlet,而且代理者能够在他们之间传送数据。,3、Servlet的用

3、途,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、

4、Servlet与JSP的区别,(2)Servlet必须在编译以后才能执行 JSP并不需要另外进行编译,JSP Container会自动完成这一工作,而Servlet在每次修改代码之后都需要编译完才能执行。(3)运行速度不同 由于JSP Container将JSP程序编译成Servlet的时候需要一些时间,所以JSP的运行速度比Servlet要慢一些,不过,如果JSP文件能毫无变化的重复使用,它在第一次以后的调用中运行速度就会和Servlet一样了,这是因为JSP Container接到请求以后会确认传递过来的JSP是否有改动,如果没有改动的话,将直接调用JSP编译过的Servlet类,并提供给

5、客户端解释执行,如果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协议的功能。一般地,用Htt

6、pServlet指定的类编写的Servlet可以多线程地并发运行service方法。Servlet一般从Javax包的HttpServlet类扩展而来,在HttpServlet中加入了一些附加的方法,这些方法可以被协助处理HTTP基本请求的HttpServlet类中的方法service自动地调用。,5、Servlet的方法,1doGet doGet用来处理HTTP的GET请求。这个GET操作仅仅允许客户从HTTP server上取得GET资源。重载此方法的用户自动允许支持方法HEAD。这个GET操作被认为是安全的,没有任何的负面影响,对用户来说是很可靠的。比如,大多数的正规查询都没有副作用。打

7、算改变存储数据的请求必须用其他的HTTP方法。这些方法也必须是个安全的操作。方法doGet的缺省实现将返回一个HTTP的BAD_REQUEST错误。doGet方法格式为:protected void doGet(HttpServletResquest request,HttpServletResponse response)throws ServletException,IOException;,下面看一段HTTP Servlet处理GET和HEAD方法的代码:package com.jsp.chap08;23import java.io.IOException;4import java.io

8、.PrintWriter;5import javax.servlet.ServletException;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)

9、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 2324 public String getServletInfo()2

10、5 return A simple Servlet;26 27,2doPostdoPost用来处理HTTP的POST请求。这个POST操作包含了在必须通过此Servlet执行的请求中的数据。由于它不能立即取得资源,所以对于那些涉及到安全性的用户来说,通过POST请求操作会有一些副作用。doPost的缺省执行将返回一个HTTP的BAD_REQUEST错误。当编写Servlet时,为了支持POST操作必须在子类HttpServlet中实现(implement)此方法。doPost方法格式为:protected void doPost(HttpServletResquest request,Http

11、ServletResponse 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

12、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

13、();24 Enumeration values=req.getParameterNames();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 yo

14、u返回客户端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,3doPutdoPut用来处理HTTP的PUT请求。此PUT操作模拟通过FTP发送一个文件。对于那些涉及到安全性的用户来说,通过PUT请求操作也会有一些副

15、作用。doPut方法格式为:protected void doPut(HttpServletResquest request,HttpServletResponse response)throws ServletException,IOException;,4doDeletedoDelete用来处理HTTP的DELETE请求。此操作允许客户端请求一个从server移出的URL。对于那些涉及到安全性的用户来说,通过DELETE请求操作会有一些副作用。doDelete方法格式为:protected void doDelete(HttpServletResquest request,HttpServ

16、letResponse response)throws ServletException,IOException;,5doHeaddoHead用来处理HTTP的HEAD请求。缺省地,它会在无条件的GET方法执行时运行,但是不返回任何数据到客户端。只返回包含内容信息的长度的header。由于用到GET操作,此方法应该是很安全的(没有副作用)也是可重复使用的。此方法的缺省实现(implement)自动地处理了HTTPDE的HEAD操作并且不需要通过一个子类实现(implement)。doHead方法格式为:protected void doHead(HttpServletResquest requ

17、est,HttpServletResponse response)throws ServletException,IOException;,6doOptionsdoOptions用来处理HTTP的OPTIONS请求。此操作自动地决定支持什么HTTP方法。比如说,如果读者创建HttpServlet的子类并重载方法doGet,然后方法doOptions会返回下面的header:GET、HEAD、TRACE和OPTIONS。doOptions方法格式为:protected void doOptions(HttpServletResquest request,HttpServletResponse r

18、esponse)throws ServletException,IOException;,7doTracedoTrace用来处理HTTP的TRACE请求。此方法的缺省实现产生一个包含所有在trace请求中的header的信息的应答(response)。在开发Servlet时,多数情况下需要重载此方法。doTrace方法格式为:protected void doTrace(HttpServletResquest request,HttpServletResponse response)throws ServletException,IOException;,Servlet的生命周期定义了一个Se

19、rvlet如何被加载、初始化,以及它怎样接收请求、响应请求、提供服务。Servlet的生命周期如图所示。,6、Servlet的生命周期,1Servlet的初始化init方法被调用于初始化JSP/Servlet,其格式为:public void init(ServletConfig config)throws ServletExceptionsuper.init();在初始化过程中,Servlet应当准备好它要安排的一些资源,以便这个Servlet能够接收请求,做到这些可以不用考虑多线程,因为在Servlet初始化时只能是单进程的。一旦初始化方法完成,Servlet就能接收客户端的请求。当然如果

20、初始化不能成功,这个方法会抛出UnavailableException解释的。初始化方法使用ServletConfig对象作为参数,这个方法应该保存这个对象,以便它能有方法getServletConfig()返回。最简单的办法是,创建出一个新类,它的初始化方法数调用super.init()。如果确实这样做,就应当自己保存ServletConfig对象,并且自己重编getServletConfig()方法,以便它能从新的位置得到对象。,例:1public void init(ServletConfig config)throws ServletException23 super.init(con

21、fig);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方法。这些

22、方法接收客户端请求,并且发回相应的响应。Servlet能同时运行多个service。这样,service方法可以按一个thread-safe样式编写。如service方法更新Servlet对象中的一个字段field,这个字段是可以同时存取的。假如某个服务器不能同时并发运行service方法,也可以用SingleThreadModel接口。这个接口保证不会有两个以上的线程(threads)并发运行。在Servlet执行期间其最多的应用是处理客户端的请求并产生一个网页。,3Servlet的结束当服务器卸载一个Servlet,它将调用Servlet的destroy方法。这个destroy方法是与初始

23、化方法相反,同时从内存中释放Servlet。Destroy的格式为:public void destroy(),下面看一段应用destroy方法的代码:public void destroy()Trycon.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();,代码中,在初始化时打开的一个数据库连

24、接,destroy方法将该数据库连接关闭。下面看一段service方法、destory方法综合应用的代码:1package com.jsp.chap08;2import java.io.IOException;3import java.io.PrintWriter;4import javax.servlet.ServletException;5import javax.servlet.http.HttpServlet;6import javax.servlet.http.HttpServletRequest;7import javax.servlet.http.HttpServletRespo

25、nse;8public class ShutdownExample extends HttpServlet 9 private int serviceCounter=0;10 private Boolean shuttingDown;11/serviceCounter12 protected synchronized void enteringServiceMethod()13 serviceCounter+;14 15 protected synchronized void leavingServiceMethod()16 serviceCounter-;17 18 protected sy

26、nchronized int numServices()19 return serviceCounter;20 21/shuttingDown22 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 ServletExce

27、ption,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(InterruptedE

28、xception 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、P

29、OST和PUT,可以使用ServletInputStream对象读取和发送数据。public int readLine(byte b,int off,int len)throws IOException读输入流,一次一行。如果读到输入流的尾部,则返回1,参数b为数据读取的字节数组,off为开始读的位置,len为读的字节数。,2ServletOutputStream类ServletOutputStream类是一个抽象类,它提供了一个输出流,用于向客户端发送数据。下面看两组代码。不带回车和换行的代码:public void print()throws IOExceptionpublic void

30、print(String s)throws IOExceptionpublic void print(boolean b)throws IOExceptionpublic void print(char c)throws IOExceptionpublic void print(int i)throws IOExceptionpublic void print(long l)throws IOExceptionpublic void print(float f)throws IOExceptionpublic void print(double d)throws IOException带回车和

31、换行的代码:public void println()throws IOExceptionpublic void println(String s)throws IOExceptionpublic void println(boolean b)throws IOExceptionpublic void println(char c)throws IOExceptionpublic void println(int i)throws IOExceptionpublic void println(long l)throws IOExceptionpublic void println(float

32、f)throws IOExceptionpublic void println(double d)throws IOException这些代码都是向客户端写数据,不过参数不同。,3ServlertConfig接口ServletConfig接口定义了一个Servlet配置对象,Servlet引擎可以用来传递信息给Servlet以便初始化Servlet。其配置信息含有初始化参数,这些参数以名字和值的形式成对出现,描述关于服务器的Servlet信息。public abstract ServletContext getServletContext()得到服务器传递给Servlet的一个ServletC

33、ontext对象。public abstract String getInitParameter(String name)得到一个含有参数name指定的初始化参数的值,如果参数不存在则为null。public abstract Enumeration getInitParameterNames()得到Servlet的初始化参数的名字,返回值是一个Enumeration对象。4HttpServletRequest接口HttpServletRequest接口扩展了javax.Servlet.ServletRequest接口。用于提供更多的功能给HTTP Servlet。Servlet引擎实现该接口

34、,创建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

35、 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认证登录,

36、得到发出请求的用户名。如果登录用户没有认证则返回null,它等同于CGI的REMOTE_USER。public abstract String getRequestedSessionId():得到用户指定的任务(session)ID,这可能与实际任务使用的ID不一样。例如,如果请求指定一个旧的任务ID,而服务器启动一个新的任务,该方法将得到新任务的新ID,如果请求没有指定任务ID,该方法返回null。public abstract String getAuthType():得到服务器使用的认证计划(authentication scheme)名,例如:“BASIC”或“SSL”。所谓认证计划,

37、就是使用一种“质询/响应”模式,服务器质询客户,客户提供认证信息,与 CGI 的 AUTH_TYPE 变量的值一样。返回值为一个描述认证计划名的字符串,如果服务器没有认证计划则为null。public abstract Cookie getCookies():得到一个Cookie对象数组,含有所有发送请求的浏览器的Cookie,如果浏览器没有发送任何Cookie,则返回null。,public abstract long getDateHeader(String name):得到一个特定请求header的、描述Date对象的长整型值。Header(参数name)是区别大小写的。如果请求中没有该

38、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 Htt

39、pSession getSession():得到与请求相联系的当前任务,如果请求没有任务,则创建一个。public abstract boolean isRequestedSessionIdValid():检查请求是否在当前的任务上下文(HttpSessionContext)中拥有一个有效的任务。如果任务无效,该方法永远都不会返回。public abstract boolean isRequestedSessionIdFromCookie():检查请求所呈递的任务ID是否作为一个 cookie 进入,而不是来自getSession方法。public abstract boolean isReq

40、uestedSessionIdFromURL():检查请求所呈递的任务ID是否作为请求URL的一部分进入,而不是来自getSession方法。public abstract String getServletPath():得到调用Servlet的请求的URL部分,这包括Servlet名或到Servlet的路径,但是不包括任何额外的路径信息或查询字符串,它等同于CGI的SCRIPT_NAME变量。public abstract HttpSession getSession(boolean create):得到与请求相联系的当前HttpSession,如果需要(create为true),则为请求创

41、建一个新的任务。,8、状态代码,在Web服务器应答中,应答中可能包括状态代码处理。应答信息中的状态代码中,可以提取需要的状态信息,从而做出相应的处理。Servlet可以利用这些状态代码来实现许多功能。例如,可以把用户重定向到另一个网站;可以告诉用户必须提供密码才能访问文档等等。常见的状态代码以及它们对应的状态信息和含义如表所示。,二、编写一个简单的Servlet,通过上面的学习,大家应该对Servlet的概念、方法、生命周期等知识有了一定的认识,现在将通过一个简单的实例学习Servlet,来加深对Servlet的理解。下面是HelloServlet.java文件的代码,它实现了在浏览器中输出指

42、定的信息。1package com.jsp.chap08;23import java.io.IOException;4import java.io.PrintWriter;56import javax.servlet.ServletException;7import javax.servlet.http.HttpServlet;8import javax.servlet.http.HttpServletRequest;9import javax.servlet.http.HttpServletResponse;1011public class HelloServlet extends Http

43、Servlet 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目录中,因为we

44、b.xml文件控制着对servlet的访问。下面是对此例中web.xml文件进行修改的部分。/这里指定servlet的名称 HelloWorldServlet/这里是存放class文件的相对路径,注意大小写 test.HelloServlet/在遇到中的路径请求时就交给名为的servlet来处理 HelloWorldServlet/url-pattern路径的映射/HelloWorldServlet/*,三、处理客户端提交的数据,客户端向服务器端提交数据的方法一般有GET和POST两种。相应的,覆盖doGet方法和doPost方法就能够处理其中的信息(doGet方法和doPost方法在前面已经

45、介绍过了,这里不再阐述)。下面看一段处理客户端提交的数据的代码:,1package com.jsp.chap08;2import java.io.IOException;3import java.io.PrintWriter;4import javax.servlet.ServletException;5import javax.servlet.http.HttpServlet;6import javax.servlet.http.HttpServletRequest;7import javax.servlet.http.HttpServletResponse;8public class Ge

46、tForm 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.println(

47、Servlet获取信息);17 pw.println();18 printFooter(request,response);19 20 public void doPost(HttpServletRequest request,HttpServletResponse response)21 throws ServletException,IOException 22 doGet(request,response);23 PrintWriter pw=response.getWriter();24 String name=request.getParameter(name);25 String

48、password=request.getParameter(password);26 String email=request.getParameter(email);27 pw.println(帐户:+name+);28 pw.println(密码:+password+);29 pw.println(Email地址:+email+);30 printFooter(request,response);31 32 public void printFooter(HttpServletRequest request,33 HttpServletResponse response)throws Se

49、rvletException,IOException 34 PrintWriter pw=response.getWriter();35 pw.println();36 pw.println();37 38,四、返回数据到客户端,下面以cookie为例介绍怎样返回数据到客户端。Cookie可以通过HTTP头在浏览器和服务器间传送信息。服务器首先在一个响应中用Set-Cookie头创建一个cookie,随后浏览器请求在cookie头中将此cookie返回到客户端。在将cookie返回到客户端前,可以先设置cookie的属性:Comment、MaxAge、Path、Domain等等。setComm

50、ent:设置Cookie的注释。setDomain:设置Cookie适用的域。setMaxAge:设置Cookie过期之前的时间(以秒计)。setName:设置Cookie的名字。setPath:设置Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下的所有页面。这里的方法可以用来设定一些更一般的条件。setSecure:设置一个boolean值,该值表示是否Cookie只能通过加密的连接(即SSL)发送。setValue:设置Cookie的值。,下面看一段返回数据到客户端的代码:1package com.jsp.chap08;2import java.io

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号