Java教材课件14Servlet编程.ppt
第14章 Servlet编程,教学目的要求1.理解Servlet的概念以及Servlet的处理流程。2.初步掌握用java书写动态网页的技能。3.对java在构建Web网站方面的应用有初步的了解。,14.1 Servlet简介,Servlet是标准的服务器端程序,用以增强Web服务器的功能。Servlet运行在服务器上,当Web服务器收到一个用户的Servlet请求时,执行Servlet,动态地创建HTML响应给用户。,14.1.1 Servlet概述,Servlet是标准的服务器端程序,用以增强Web服务器的功能。用Servlet可以创建协议、平台无关的Web应用程序可以生成动态的Web页面,它是公共网关接口(Common Gateway Interface,CGI)程序设计的Java技术解决方案。Servlet提供了比使用CGI开发服务器端功能更好的方法,因为Java Servlet 在Web服务器和Servlet之间定义了一个标准的接口,这使Servlet运行是平台独立的,具有很高的可移植性,可以和异构的服务器交互。大多数主流服务器通过插件支持Servlet。,14.1.2 Servlet开发环境搭建,学习Servlet开发,必须搭建一个符合规范的开发环境,有许多的Web服务器或应用服务器可以运行提供我们需要的软件:如Apache Tomcat、Allaire Jrun、New Atlanta ServletExec、Gefion Software LiteWebServer等。,1、Apache Tomcat建Servlet开发环境,Tomcat是一个免费的开放源代码的Servlet容器可以到 http:/jakarta.apache.org下载Tomcat 5.x。安装后还应设置CLASSPATH以使得编译程序javac能利用Servlet API,为此,应将install_dircommonlibServlet-api.jar放入置在CLASSPATH中。启动后在浏览器地址栏里输入http:/localhost:8080/出现服务器测试成功页面。,2、创建开发目录,创建一个自己的开发目录 比如:install_dirwebappsROOTmyapp,于其中放置所有的Servlet和JSP页面,14.1.3 Servlet的工作原理与生命周期,每个Servlet都有一个生命周期,从它被装入到Web应用服务器的内存开始,到终止或重新装入时结束。每个生命周期定义了Servlet如何被加载和被初始化,它怎样接收请求、响应请求,怎样提供服务。javax.Servlet.Servlet接口中定义了生命周期方法,如init()、service()、destroy()等,在Servlet的生命周期中,这些方法会在待定时间按照一定的顺序被调用。,1、init()方法,客户端通过HTTP协议发送,当Web服务器接收请求并将其发送给Servlet,如果需要处理请求的Servlet未加载,服务器把它加载到JVM并执行它。服务器首先调用init()方法进行初始化工作。该方法只被调用一次。,2、service()方法,在init()方法之后,服务器调用service()方法准备处理用户的访问。通常是Servlet接收HTTP请求并执行相应的处理,并向Web服务器返回应答,Web服务器再把从Servlet收到的应答发送给客户端。来自HTTP的访问有GET、PUT、POST、DELETE等类型,这些都可以在service()方法中处理,也可以重置doPost、doGet等方法来处理特定的请求方式。,3、destroy()方法,服务器在结束Servlet运行时调用destroy()方法,通常在这个方法中执行诸如清除资源的操作。例如停止后台的文件处理、线程和释放数据库连接等操作。,例14.2 测试Servlet的生命周期方法,package mjwa;import java.util.*;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class Lifecircle extends HttpServletpublic void init(ServletConfig config)throws ServletException System.out.println(init():+new Date();public void destroy()System.out.println(destroy():+new Date();public void service(HttpServletRequest req,HttpServletResponse resp)throws IOException,ServletException PrintWriter out=resp.getWriter();resp.setContentType(text/html);out.print(to see:install_dir/logs/stdout.log);System.out.println(service():+new Date();,使用命令javac-d.Lifecircle.java进行编译。将编译之后在当前目录下产生的子目录mjwa整体拷贝到myapp/WEB-INF/classes目录下,并在配置文件web.xml中添加如下的servlet和servlet-mapping。Lifecircle mjwa.Lifecircle Lifecircle/servlet/Lifecircle,重新启动Tomcat,在浏览器地址栏中输入http:/localhost:8080/servlet/Lifecircle 即可运行。该程序运行时由System.out.print产生的输出在install_dir/logs/stdout.log文件中。可以看出,浏览器每刷新一次,service方法就执行一遍,而init()方法只开始的时候执行一次,destroy()始终得不到执行。,14.2 Servlet编程示例,例14.3获取参数:根据用户的request,得到有关的信息。/获取参数package mjwa;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;public class InfoServlet extends HttpServlet public void service(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException,response.setContentType(text/html);PrintWriter out=response.getWriter();out.println();out.println(Request InformationExample);out.println(Method:+request.getMethod()out.println(Request URI:+request.getRequestURI();out.println(Protocol:+request.getProtocol();out.println(PathInfo:+request.getPathInfo();,out.println(Remote Address:+request.getRemoteAddr()+);Enumeration e=request.getHeaderNames();while(e.hasMoreElements()String name=(String)e.nextElement();String value=request.getHeader(name);out.println(+name+=+value);out.println();,编译InfoServlet.java源程序文件,生成字节代码文件InfoServlet.class,将该文件拷贝到myapp/WEB-INF/classes/mjwa目录下,并在配置文件web.xml中添加如下的servlet和servlet-mapping。InfoServlet mjwa.InfoServlet InfoServlet/servlet/InfoServlet,重新启动Tomcat,在浏览器地址栏中输入http:/localhost:8080/servlet/InfoServlet 运行。本程序运行结果如图所示。,例14.4表单处理应用举例:利用Servlet读取表单输入内容,对客户的GET和POST请求分别用doGet方法和doPost方法进行处理。源程序如下:/表单处理应用 package mjwa;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;,public class FormServlet extends HttpServlet public void doGet(HttpServletRequest req,HttpServletResponse resp)throws IOException,ServletException resp.setContentType(text/html);PrintWriter out=resp.getWriter();out.println(GET Request.No Form Data Posted);,public void doPost(HttpServletRequest req,HttpServletResponse resp)throws IOException,ServletException Enumeration e=req.getParameterNames();PrintWriter out=resp.getWriter();while(e.hasMoreElements()String name=(String)e.nextElement();String value=req.getParameter(name);out.println(name+:+value);,对应的FormServlet.html文件如下:Name:Address:,Name:Address:,对源文件FormServlet.java进行编译,生成字节代码文件FormServlet.class,将该文件拷贝到myapp/WEB-INF/classes/mjwa目录下,并在配置文件web.xml中添加如下的servlet和servlet-mapping。,FormServlet mjwa.FormServlet FormServlet/servlet/FormServlet,文件FormServlet.html保存在文件夹install_dirwebappsROOTmyapp中。重新启动Tomcat。在浏览器地址栏中输入http:/localhost:8080/FormServlet.html 运行。本程序运行结果如图14.4(a)(c)所示。,(a),(b),(c)图14.4例14.4的执行结果,例14.5会话管理应用举例。源程序如下:package mjwa;/例14.5,会话管理 import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;public class SessionServlet extends HttpServlet public void service(HttpServletRequest request,HttpServletResponse response),throws IOException,ServletException response.setContentType(text/html);PrintWriter out=response.getWriter();HttpSession session=request.getSession(true);Date created=new Date(session.getCreationTime();Date accessed=new Date(session.getLastAccessedTime();out.println(ID+session.getId();out.println(Created:+created);out.println(Last Accessed:+accessed+);,String id=request.getParameter(id);String email=request.getParameter(email);session.setAttribute(id,id);session.setAttribute(email,email);Enumeration e=session.getAttributeNames();while(e.hasMoreElements()String name=(String)e.nextElement();String value=session.getAttribute(name).toString();out.println(+name+=+value);,把编译源文件SessionServlet.java生成的字节代码文件SessionServlet.class拷贝到myapp/WEB-INF/classes/mjwa目录下,并在配置文件web.xml中添加如下的servlet和servlet-mapping。,SessionServlet mjwa.SessionServlet SessionServlet/servlet/SessionServlet 重新启动Tomcat,在浏览器地址栏中输入http:/localhost:8080/servlet/SessionServlet 即可运行。,本章小结,本章介绍了Servlet的基本概念、工作原理、生命周期、Servlet程序的基本构架以及开发Servlet程序的基本步骤。Servlet是运行在请求/面向请求服务器上的模块,它是在服务器端的Servlet容器中执行的Java程序。一个Servlet可以从一个HTML表单中获取数据,然后用商业逻辑进行处理,最后把处理结果发往客户的浏览器。,