1 / 39

第九章 Servlet 编程技术

第九章 Servlet 编程技术. Servlet 是用 java 编写的,运行在 WEB 服务器上的独立模块。在实际应用中,我们可以灵活地加载和卸下 Servlet 模块,以此提高 WEB 服务器功能。 学习目标 了解 Servlet 的概念 了解 Servlet 与 JSP 的关系 熟悉 Servlet 运行环境 了解 Servlet 类的基本结构 了解 Servlet 模块的生命周期 学会在 JSP 页面中调用 Servlet. Servlet 引擎. ①HTTP 请求. IE 浏览器. ② 请求. ③ 响应. ④ HTTP 响应. 客户端.

italia
Download Presentation

第九章 Servlet 编程技术

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第九章 Servlet编程技术 • Servlet是用java编写的,运行在WEB服务器上的独立模块。在实际应用中,我们可以灵活地加载和卸下Servlet模块,以此提高WEB服务器功能。 学习目标 • 了解Servlet的概念 • 了解Servlet与JSP的关系 • 熟悉Servlet运行环境 • 了解Servlet类的基本结构 • 了解Servlet模块的生命周期 • 学会在JSP页面中调用Servlet

  2. Servlet引擎 ①HTTP请求 IE浏览器 ②请求 ③响应 ④HTTP响应 客户端 Servlet模块 WEB服务器 9.1 Servlet是什么? • Servlet是使用Servlet API编写的java程序。其结构基于请求/响应模式。Servlet模块运行模式如图9-1所示。 图9-1 Servlet运行模式

  3. 从图中可以看出,整个处理流程如下: • HTTP请求:客户将客户请求发送给Servler引擎。 • 请求:Servlet引擎将请求转发送给处理请求的Servlet模块。 • 响应:Servlet模块接受请求后,调用相应的服务(service())对请求进行处理,然后将处理结果返回给Servlet引擎。 • HTTP响应:Servlet引擎将结果发送给客户端。

  4. 9.2 Servlet与JSP • Servlet是JSP的早期版本,JSP是Servlet的简易表达形式。JSP经过转译后的结果就是Servlet。JSP适合于展示用户界面,Servlet适合于企业逻辑处理。因此,我们常使用JSP技术编写用户界面,使用Servlet实现业务逻辑。

  5. 9.3 Servlet运行环境 • 运行一个Servlet,首先要将Servlet原文件编译为字节码文件,然后,将字节码文件保存到相应的WEB目录中,最后设置Servlet的调用路径,即配置web.xml文件。

  6. 9.3.1编译Servlet程序 • 创建用户目录 编写servlet类之前,首先创建一个用户目录,用以保存servlet原文件。这里创建一个目录为: e:\test\9 • 编写自已的servlet类 用记事本工具编写一个简单的servlet类,该类包含一个init()方法和service()方法,其功能是向客户端输出一个字符串。将该文件保存在e:\test\9目录下。Ex9_1.java

  7. 获取servlet API包 编译程序Ex9_1.java时,需要用到servlet API基本包,这些包在文件servlet-api.jar中,我们在E:\Tomcat 5.0\common\lib目录下找到该文件,将该文件复制到e:\test\9目录下。 • 编译servlet原文件 在dos命令窗口下,进入e:\test\9目录,编译程序Ex9_1.java。在dos窗口中,输入命令:javac –classpath servlet-api.jar Ex9_1.java 编译后的字节码文件是: Ex9_1.class

  8. 9.3.2存放Servlet字节码文件到相应目录 1.部署servlet字节码文件 Tomcat 5.0服务器存放servlet字节码文件的目录是:ROOT\WEB-INF\classes。将Ex9_1.class文件复制到该目录下。 2.配置web.xml文件 web.xml文件在ROOT\WEB-INF目录下,编辑该文件。 在<!-- JSPC servlet mappings start --> 和<!-- JSPC servlet mappings end -->标记之间增加以下代码:

  9. <servlet> <servlet-name>name_1</servlet-name> //给servlet类起个名字 <servlet-class>Ex9_1</servlet-class> //servlet的字节码文件名 </servlet> <servlet-mapping> <servlet-name>name_1</servlet-name> //servlet类的名字 <url-pattern>/doget1</url-pattern> //给运行servlet类设置一个路径名(自已起名) </servlet-mapping> 说明:保存web.xml文件前,将后面的注释文字删除。

  10. 9.3.3 运行 Servlet 保存web.xml文件后,重新启动Tomcat5.0服务器,然后在浏览器地址栏中输入” http://localhost:8090/doget1” 就可以访问该servlet了。访问结果如图9-2所示。 图9-2 访问servlet模块

  11. 9.4 Servlet基本结构 • Servlet模块是用Servlet API编写的.Servlet API包含两个包:javax.servlet和javax.servlet.http。javax.servlet包中的类与http协议无关;javax.servlet.http包中的类与http协议相关,该包中的部分类继承了javax.servlet包中的部分类和接口.下面介绍编写Servlet类时要继承的超类和父类。即GenericServlet和HttpServlet。

  12. 1 GenericServlet类 GenericServlet类在javax.servlet包中,它提供了 servlet接口的基本实现,该类包含三个重要的方法,它们是init()、destroy()和service()方法。service()是抽象方法,所有子类都应当实现这个方法。 2 HttpServlet类 HttpServlet类在javax.servlet.http包中,它扩展了GenericServlet类。HttpServlet类定义了两个service()方法和六个doXXX()方法。

  13. (1) 两个service()方法 • public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { 本方法是公有方法。该方法接收客户端请求包后,创建request对象和response对象,并分别转换为 HttpServletRequest/ HttpServletResponse类型的对象,然后调用下面的保护service()方法。 } • protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 该方法接收HttpServletRequest/ HttpServletResponse类型的对象后,根据http请求方法的类型,本方法调用下面6个doXXX()方法之一,进行逻辑处理并响应客户。 }

  14. (2) doXXX()方法 doXXX()方法有6个: doGet(), doPost(),doDelete(),doPut(),doTrace(),doOption()。 它门分别对应Form表单中的method属性。get方法提交的数据量不能超过2kB, 否则提交失败,post提交没有容量限制。下面是doGet()方法和doPost()方法。 • protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 具体要处理的逻辑代码写在此处 ,或者在此处调用被覆盖的doPost()方法。 }

  15. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 具体要处理的逻辑代码写在此处,或者在此处调用被覆盖的doGet()方法。 } 程序员自定义的Servlet类都必须扩展HttpServlet类.在扩展类中,覆盖service()、doPost()或doGet()方法实现逻辑处理。

  16. 3.编写Servlet类的步骤 下面是程序员编写Servler类时的一般步骤: (1).扩展HttpServlet类 (2).覆盖HttpServlet类中的三个方法service()、doPost()或doGet(),将要处理的逻辑代码写在以上三个方法的任一个中。Servlet模块执行service()方法时,会自动调用doPost()或doGet()这两个方法,实现servlet逻辑处理功能。

  17. ex9_2.jsp 页面 提交 Ex9_2.java Servlet模块 重新选择 9.4.1 获取客户端信息 [例子9.2]获取客户端信息,并把信息输出到客户端。 程序结构: ex9_2.jsp页面提供一个信息输入窗口,并把信息提交给Servlet(Ex9_2.java)处理。页面交互关系如图9-3所示。 图9-3 访问servlet模块

  18. 程序算法: ex9_2.jsp: 创建一个表单,该表单包含一个文本框,一个下拉框。 Ex9_2.java: 1.定义类Ex9_2,该类扩展类HttpServlet 2.覆盖doPost()方法 3.设置输出流的文件类型 4.获得输出流对象:out 5.设置输出流的字符集为:GB2312 6.获取表单数据:name/love 7.向客户端输出姓名(name)和爱好(love)

  19. 9.4.2向客户提交信息 [例子9.3] 写一Servlet程序,读出文件内容。其中,文件目录和文件名从客户端输入。 问题分析:   我们可以使用上一章[例子8.3]的读文件类ReadFile.java,通过该类对象读取文件内容。这样只需编写一个Servlet类接受客户端提供的文件目录和文件名,然后将文件目录和文件名传递给类ReadFile.java,创建一个读文件的对象,最后输出文件的内容。

  20. ex9_3.jsp 页面 提交 ReadFileServlet.java Servlet模块 Param(目录,文件名) Return(文件内容) ReadFile.java (组件) 程序结构:   本程序由ex9_3.jsp页面,一个Servlet模块(ReadFileServlet.java),一个java类(ReadFile.java)组成。Ex9_3.jsp页面将客户输入的文件目录和文件名提交给Servlet模块,Servlet模块调用ReadFile.java读取文件内容,然后将内容输出到客户端。页面的交互关系如图9-4所示。 图9-4 访问servlet模块

  21. 程序算法: ex9_3.jsp:  创建一个表单,该表单包含两个文本框,分别用来输入文件目录和文件名。 ReadFileServlet.java: 1.定义一个类ReadFileServlet,该类扩展类HttpServlet 2.覆盖doPost()方法,在该方法体中实现逻辑处理(下面是处理逻辑) 3.设置输出的文件类型,采用的字符集。 4.获取输出流:out 5.从客户表单中获取文件目录(filePath)和文件名(fileName)。 6.以文件目录(filePath)和文件名(fileName)为参数,创建一个读文 件内容的对象:readFileBean 7.调用getReadContent()方法,获取文件内容:readContent 8.输出文件内容:readContent

  22. 程序代码: • 说明:在web.xml文件中,将Servlet模块(ReadFileServlet.java)的调用路径设置为 “ /doget3 ”。ex9_3.jsp通过 “ /doget3 ”来调用Servlet模块。 • 说明:ReadFileServlet.java引用了ReadFile.java类,我们必须 用import语句导入该类字节码文件,同时将该类字节码文件与ReadFileServlet字节码文件一起存放在ROOT\WEB-INF\classes\ch9目录中。还要配置web.xml文件,在该文件中设置Servlet模块的调用路径是 /doget3

  23. 9.5 Servlet生命周期 • 当服务器调用Servlet类时,Servlet对象被创建。从服务器创建Servlet对象到该对象被消灭这段时间称为Servlet生命周期。 1.Servlet三个基本方法的作用 (1) init()方法 当servlet第一次被加载时,服务器调用该方法创建一个servlet对象,完成必要的初始化工作。在servlet对象生命周期内,本方法只调用一次。

  24. (2) service()方法 每当客户请求到来时,servlet引擎将请求对象传递给本方法,同时创建一个响应对象,service()方法获得请求/响应对象后,进行请求处理(调用被覆盖的doXXX()方法进行逻辑处理),将处理的结果,以响应对象的方式返回给客户端。在servlet对象周期内,该方法可能被多次请求,而被多次调用。 (3) destroy()方法 servlet引擎终止服务时(如关闭服务器),调用该方法销毁 servlet对象。在servlet对象周期内,该方法只调用一次。

  25. 服务器调用init(),创建servlet对象 Servlet对象等待客户请求 N Y 创建request/response对象传递给公有方法service(). service()进行请求处理或调用被覆盖的doXXX()方法进行请求处理,把处理结果返回给客户端 N Y 调用destroy(),删除servlet对象 2.Servlet执行流程 右图是servlet对象的执行流程。 • 有请求吗? • 销毁servlet对象吗? 图9-5 servlet对象执行流程

  26. 9.5.1 init()方法初始化Servlet [例子9.4]这里按姓名查询学生(表:students)成绩为例,说明Servlet对象的三个基本方法的作用。 问题分析:   本题由一个JSP页面和一个Servlet模块组成。在JSP页面中,由表单提供姓名录入窗口,将姓名提交给一Servlet模块,该Servlet模块查询出学生成绩,并把成绩输出到客户端。

  27. ex9_4.jsp 页面 提交 Ex9_4.java Servlet模块 程序结构: ex9_4.jsp页面将客户输入的姓名提交给Ex9_4.java(Servlet模块);Ex9_4.java以姓名为关键字查询出学生的成绩,并将成绩输出到客户端。下面是ex9_4.jsp页面与Ex9_4.java的交互关系如图9-6所示。 图9-6 访问servlet模块

  28. Servlet模块(Ex9_4.java)包含三个方法,下面是它的初始化方法init()方法。Servlet模块(Ex9_4.java)包含三个方法,下面是它的初始化方法init()方法。 init()方法: public void init(ServletConfig config) throws ServletException { super.init(config); try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动程序 } catch(ClassNotFoundException e) { } try{ con=DriverManager.getConnection("jdbc:odbc:grade","",""); } catch(SQLException e) { } }

  29. init()方法作用:  由于存在多个客户与同一数据库连接的事实。因此Servlet对象初始化要做的工作是:加载驱动程序,创建连接对象con。

  30. 9.5.2 service()方法响应客户 在[例子9.4]中, Ex9_4.java对客户请求(以姓名为关键字查询学生成绩)的逻辑处理由service()方法完成。 Servlet模块(Ex9_4.java)包含三个方法,下面是实现逻辑处理的service()方法。

  31. service()方法: • service()方法的作用: • 由于存在多个客户,多次查询学生成绩的事实(请求),因此将查询学生成绩的实现代码放置在service()方法中。该方法以姓名为关键字,查询学生成绩,并将成绩输出到客户端。

  32. 9.5.3 destroy()方法释放Servlet对象 在例子9.4中,Servlet模块(Ex9_4.java)希望不再查询,要求释放资源时,调用destroy()方法销毁Servlet对象。 Servlet模块(Ex9_4.java)包含三个方法,下面是销毁Servlet对象的destroy()方法。

  33. destroy()方法: public void destroy() { super.destroy(); try { con.close(); } catch(Exception e) { e.printStackTrace(); } } destroy()方法的作用:  当客户希望不再查询时,调用destroy()方法释放资源,销毁Servelt对象。

  34. 程序代码: 说明:在web.xml文件中,将Servlet模块(Ex9_4.java)的调用路径设置为 " /doget4 "。ex9_4.jsp通过" /doget4 "来调用Servlet模块(Ex9_4.java)。 ex9_4.jsp:

  35. 9.6 jsp调用Servlet [例子9.5]将客户录入的姓名/性别/电话保存在文件"e:\phone.txt"中。 问题分析: JSP页面程序构造一个表单,提供姓名/性别/电话录入窗口,当提交表单后,把姓名/性别/电话数据提交给一Servlet模块。Servlet模块接受数据后,把它保存到文件"e:\phone.txt"中。 程序结构:   本程序由一个ex9_5.jsp页面文件接受客户输入的数据,然后客户将数据提交给Servlet模块(Ex9_5.java),Servlet模块(Ex9_5.java)把数据写入到文件"e:\phone.txt"中。

  36. 程序算法: ex9_5.jsp:  创建一个表单,包含三个文本框,分别用来输入姓名(name),性别(sex),电话(telphone)。 Ex9_5.java: 1.扩展类HttpServlet,构造类Ex9_5 2.定义两个成员变量:ou(字符文件输出流), outbuff(字符缓冲输 出流)。 3.在init()方法中,创建字符文件输出流和字符缓冲输出流,分别 初始化成员变量ou和outbuff。 4.在doPost()方法中,设置向客户端输出类型为 "text/html;charset=GB2312"。 5.获取向客户端的输出流:out 6.设置字符编码为:"GB2312" 7.获取表单中的数据:name/sex/telphone 8.将姓名(name),性别(sex),电话(telphone)写入缓冲输出流 outbuff中。 9.将姓名(name),性别(sex),电话(telphone)输出到客户端。

  37. 本章小节 • 本章介绍了Servlet基本概念、JSP与Servlet的关系、Servlet运行环境、Servlet类的基本结构和Servlet模块的生命周期。

  38. 心得体会 (1)Servlet和JSP一样,都系服务端的应用程序。相比起JSP更容易编写Java语言,但处理HTML就相对麻烦。简单来说,Servlet可以看成是一个运行在服务器的类。 (2)编写好Servlet文件后,需要编译成扩展名为.class的文件,配置Web.xml文件设置Servlet调用路径,重启Tomcat服务器。环境设置与Bean的设置有些类似。 (3)需要注意的是在编译Servlet文件时,需要包含Servlet API基本包,命令如下:javac –classpath servlet-api.jar 文件名。 (4)doGet事件、doPost事件与service事件 doGet与doPost两者分别接受Form表单的get方法和post方法访问,但doGet事件还可以接受浏览器直接访问。service事件则包含doGet和doPost的功能。

  39. 心得体会 (5)doPut事件与delete事件 doPut用于接受应用程序的上传文件,delete用于删除服务器的文件,但两者都不能通过表单激活,需要用java代码来激活。 (6)PrintWriter类与JSP的内对象out作用一样,用于输出HTML代码。 (7)HttpServletRequest与HttpServletResponse相当于JSP的request与response内对象。

More Related