390 likes | 689 Views
第九章 Servlet 编程技术. Servlet 是用 java 编写的,运行在 WEB 服务器上的独立模块。在实际应用中,我们可以灵活地加载和卸下 Servlet 模块,以此提高 WEB 服务器功能。 学习目标 了解 Servlet 的概念 了解 Servlet 与 JSP 的关系 熟悉 Servlet 运行环境 了解 Servlet 类的基本结构 了解 Servlet 模块的生命周期 学会在 JSP 页面中调用 Servlet. Servlet 引擎. ①HTTP 请求. IE 浏览器. ② 请求. ③ 响应. ④ HTTP 响应. 客户端.
E N D
第九章 Servlet编程技术 • Servlet是用java编写的,运行在WEB服务器上的独立模块。在实际应用中,我们可以灵活地加载和卸下Servlet模块,以此提高WEB服务器功能。 学习目标 • 了解Servlet的概念 • 了解Servlet与JSP的关系 • 熟悉Servlet运行环境 • 了解Servlet类的基本结构 • 了解Servlet模块的生命周期 • 学会在JSP页面中调用Servlet
Servlet引擎 ①HTTP请求 IE浏览器 ②请求 ③响应 ④HTTP响应 客户端 Servlet模块 WEB服务器 9.1 Servlet是什么? • Servlet是使用Servlet API编写的java程序。其结构基于请求/响应模式。Servlet模块运行模式如图9-1所示。 图9-1 Servlet运行模式
从图中可以看出,整个处理流程如下: • HTTP请求:客户将客户请求发送给Servler引擎。 • 请求:Servlet引擎将请求转发送给处理请求的Servlet模块。 • 响应:Servlet模块接受请求后,调用相应的服务(service())对请求进行处理,然后将处理结果返回给Servlet引擎。 • HTTP响应:Servlet引擎将结果发送给客户端。
9.2 Servlet与JSP • Servlet是JSP的早期版本,JSP是Servlet的简易表达形式。JSP经过转译后的结果就是Servlet。JSP适合于展示用户界面,Servlet适合于企业逻辑处理。因此,我们常使用JSP技术编写用户界面,使用Servlet实现业务逻辑。
9.3 Servlet运行环境 • 运行一个Servlet,首先要将Servlet原文件编译为字节码文件,然后,将字节码文件保存到相应的WEB目录中,最后设置Servlet的调用路径,即配置web.xml文件。
9.3.1编译Servlet程序 • 创建用户目录 编写servlet类之前,首先创建一个用户目录,用以保存servlet原文件。这里创建一个目录为: e:\test\9 • 编写自已的servlet类 用记事本工具编写一个简单的servlet类,该类包含一个init()方法和service()方法,其功能是向客户端输出一个字符串。将该文件保存在e:\test\9目录下。Ex9_1.java
获取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
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 -->标记之间增加以下代码:
<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文件前,将后面的注释文字删除。
9.3.3 运行 Servlet 保存web.xml文件后,重新启动Tomcat5.0服务器,然后在浏览器地址栏中输入” http://localhost:8090/doget1” 就可以访问该servlet了。访问结果如图9-2所示。 图9-2 访问servlet模块
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。
1 GenericServlet类 GenericServlet类在javax.servlet包中,它提供了 servlet接口的基本实现,该类包含三个重要的方法,它们是init()、destroy()和service()方法。service()是抽象方法,所有子类都应当实现这个方法。 2 HttpServlet类 HttpServlet类在javax.servlet.http包中,它扩展了GenericServlet类。HttpServlet类定义了两个service()方法和六个doXXX()方法。
(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()方法之一,进行逻辑处理并响应客户。 }
(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()方法。 }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 具体要处理的逻辑代码写在此处,或者在此处调用被覆盖的doGet()方法。 } 程序员自定义的Servlet类都必须扩展HttpServlet类.在扩展类中,覆盖service()、doPost()或doGet()方法实现逻辑处理。
3.编写Servlet类的步骤 下面是程序员编写Servler类时的一般步骤: (1).扩展HttpServlet类 (2).覆盖HttpServlet类中的三个方法service()、doPost()或doGet(),将要处理的逻辑代码写在以上三个方法的任一个中。Servlet模块执行service()方法时,会自动调用doPost()或doGet()这两个方法,实现servlet逻辑处理功能。
ex9_2.jsp 页面 提交 Ex9_2.java Servlet模块 重新选择 9.4.1 获取客户端信息 [例子9.2]获取客户端信息,并把信息输出到客户端。 程序结构: ex9_2.jsp页面提供一个信息输入窗口,并把信息提交给Servlet(Ex9_2.java)处理。页面交互关系如图9-3所示。 图9-3 访问servlet模块
程序算法: ex9_2.jsp: 创建一个表单,该表单包含一个文本框,一个下拉框。 Ex9_2.java: 1.定义类Ex9_2,该类扩展类HttpServlet 2.覆盖doPost()方法 3.设置输出流的文件类型 4.获得输出流对象:out 5.设置输出流的字符集为:GB2312 6.获取表单数据:name/love 7.向客户端输出姓名(name)和爱好(love)
9.4.2向客户提交信息 [例子9.3] 写一Servlet程序,读出文件内容。其中,文件目录和文件名从客户端输入。 问题分析: 我们可以使用上一章[例子8.3]的读文件类ReadFile.java,通过该类对象读取文件内容。这样只需编写一个Servlet类接受客户端提供的文件目录和文件名,然后将文件目录和文件名传递给类ReadFile.java,创建一个读文件的对象,最后输出文件的内容。
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模块
程序算法: 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
程序代码: • 说明:在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
9.5 Servlet生命周期 • 当服务器调用Servlet类时,Servlet对象被创建。从服务器创建Servlet对象到该对象被消灭这段时间称为Servlet生命周期。 1.Servlet三个基本方法的作用 (1) init()方法 当servlet第一次被加载时,服务器调用该方法创建一个servlet对象,完成必要的初始化工作。在servlet对象生命周期内,本方法只调用一次。
(2) service()方法 每当客户请求到来时,servlet引擎将请求对象传递给本方法,同时创建一个响应对象,service()方法获得请求/响应对象后,进行请求处理(调用被覆盖的doXXX()方法进行逻辑处理),将处理的结果,以响应对象的方式返回给客户端。在servlet对象周期内,该方法可能被多次请求,而被多次调用。 (3) destroy()方法 servlet引擎终止服务时(如关闭服务器),调用该方法销毁 servlet对象。在servlet对象周期内,该方法只调用一次。
服务器调用init(),创建servlet对象 Servlet对象等待客户请求 N Y 创建request/response对象传递给公有方法service(). service()进行请求处理或调用被覆盖的doXXX()方法进行请求处理,把处理结果返回给客户端 N Y 调用destroy(),删除servlet对象 2.Servlet执行流程 右图是servlet对象的执行流程。 • 有请求吗? • 销毁servlet对象吗? 图9-5 servlet对象执行流程
9.5.1 init()方法初始化Servlet [例子9.4]这里按姓名查询学生(表:students)成绩为例,说明Servlet对象的三个基本方法的作用。 问题分析: 本题由一个JSP页面和一个Servlet模块组成。在JSP页面中,由表单提供姓名录入窗口,将姓名提交给一Servlet模块,该Servlet模块查询出学生成绩,并把成绩输出到客户端。
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模块
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) { } }
init()方法作用: 由于存在多个客户与同一数据库连接的事实。因此Servlet对象初始化要做的工作是:加载驱动程序,创建连接对象con。
9.5.2 service()方法响应客户 在[例子9.4]中, Ex9_4.java对客户请求(以姓名为关键字查询学生成绩)的逻辑处理由service()方法完成。 Servlet模块(Ex9_4.java)包含三个方法,下面是实现逻辑处理的service()方法。
service()方法: • service()方法的作用: • 由于存在多个客户,多次查询学生成绩的事实(请求),因此将查询学生成绩的实现代码放置在service()方法中。该方法以姓名为关键字,查询学生成绩,并将成绩输出到客户端。
9.5.3 destroy()方法释放Servlet对象 在例子9.4中,Servlet模块(Ex9_4.java)希望不再查询,要求释放资源时,调用destroy()方法销毁Servlet对象。 Servlet模块(Ex9_4.java)包含三个方法,下面是销毁Servlet对象的destroy()方法。
destroy()方法: public void destroy() { super.destroy(); try { con.close(); } catch(Exception e) { e.printStackTrace(); } } destroy()方法的作用: 当客户希望不再查询时,调用destroy()方法释放资源,销毁Servelt对象。
程序代码: 说明:在web.xml文件中,将Servlet模块(Ex9_4.java)的调用路径设置为 " /doget4 "。ex9_4.jsp通过" /doget4 "来调用Servlet模块(Ex9_4.java)。 ex9_4.jsp:
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"中。
程序算法: 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)输出到客户端。
本章小节 • 本章介绍了Servlet基本概念、JSP与Servlet的关系、Servlet运行环境、Servlet类的基本结构和Servlet模块的生命周期。
心得体会 (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的功能。
心得体会 (5)doPut事件与delete事件 doPut用于接受应用程序的上传文件,delete用于删除服务器的文件,但两者都不能通过表单激活,需要用java代码来激活。 (6)PrintWriter类与JSP的内对象out作用一样,用于输出HTML代码。 (7)HttpServletRequest与HttpServletResponse相当于JSP的request与response内对象。