1 / 52

ww.propt

第七讲. ww.propt.com.cn. 课  题  JAVA 服务器小程序( ServLet )之定义、方法及编程 目的要求 掌握 ServLet 的定义、方法及编程   教学重点   ServLet 的含义、步曙、方法与编程 教学难点 ServLet 编程 教学课时 4 (含 2 课时上机) 教学方法 讲解、示例与启发式教学相结合  . 教学内容和步骤 7.1 ServLet 概述

dolf
Télécharger la présentation

ww.propt

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. 第七讲 ww.propt.com.cn

  2. 课  题 JAVA服务器小程序(ServLet)之定义、方法及编程 目的要求 掌握ServLet的定义、方法及编程   教学重点  ServLet的含义、步曙、方法与编程 教学难点 ServLet编程 教学课时 4(含2课时上机) 教学方法 讲解、示例与启发式教学相结合  

  3. 教学内容和步骤 7.1 ServLet概述 Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面。Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。

  4. 7.1.1 Java Servlet 与 Applet 的比较: 相似之处: (1)它们不是独立的应用程序,没有main()方法。 (2)它们不是由用户或程序员调用,而是由另外一个应用程序(容器)调用。 (3)它们都有一个生存周期,包含init()和destroy()方法。 不同之处: (4)Applet具有很好的图形界面(AWT),与浏览器一起,在客户端运行。 (5) Servlet 则没有图形界面,运行在服务器端。 (6)Java Servlet 与 CGI(Common Gateway Interface) 的比较:

  5. (7)与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资。在未来的技术发展过程中,Servlet有可能彻底取代CGI。 ①高效  在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而在Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。

  6. ②在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。在性能优化方面,Servlet也比CGI有着更多的选择。②在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。在性能优化方面,Servlet也比CGI有着更多的选择。 ③方便 Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。 (8)功能强大 在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如,Servlet能够直接和Web服务器交互,而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。

  7. (9)可移植性好 Servlet用Java编写,Servlet API具有完善的标准。因此,为IPlanet Enterprise Server写的Servlet无需任何实质上的改动即可移植到Apache、Microsoft IIS或者WebStar。几乎所有的主流服务器都直接或通过插件支持Servlet。 (10)节省投资  不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用,而且对于现有的服务器,如果它不支持Servlet的话,要加上这部分功能也往往是免费的(或只需要极少的投资)。

  8. 7.1.2Java Servlet 与 JSP(JavaServer Pages) 的比较: JavaServer Pages(JSP)是一种实现普通静态HTML和动态HTML混合编码的技术,JSP并没有增加任何本质上不能用Servlet实现的功能。但是,在JSP中编写静态HTML更加方便,不必再用println语句来输出每一行HTML代码。更重要的是,借助内容和外观的分离,页面制作中不同性质的任务可以方便地分开:比如,由页面设计者进行HTML设计,同时留出供Servlet程序员插入动态内容的空间。

  9. 从网络三层结构的角度看,一个网络项目最少分三层:数据层、应用层和表示层。  Servlet用来写应用层是很强大的,但是对于写表示层就很不方便。 JSP则主要是为了方便写表示层而设计的,当然也可以写应用层。写惯了ASP、PHP、CGI的朋友,经常会不自觉地把表示层和应用层混在一起。比如把数据库处理信息放到JSP中,其实,它应该放在应用层中。 JSP中应该仅仅存放与表示层有关的部分,也就是说,只放输出HTML网页的部分。而所有的数据计算、数据分析、数据库连接处理,统统是属于应用层,应该放在Java Beans中。通过JSP调用Java Beans,实现两层的整合。   综上所述,Servlet是一个不完善的产品,写应用层很好,写表示层就逊色许多了,并且两层混杂。

  10. 7.2 Java Servlet API 2.2 简介 Java Servlet API 2.2 的类和接口组成两个Java 包,即:javax.servlet 和 javax.servlet.http(还包括javax.servlet.jsp包,不在本篇文章讨论范围之内)。  javax.servlet 包提供了控制 Servlet 生命周期所必需的 Servlet 接口,是编写 Servlet 时必须要实现的。  javax.servlet.http 包提供了从Servlet 接口派生出的专门用于处理 HTTP 请求的抽象类和一般的工具类。所有的Servlet 对象都要实现Servlet 接口,大多数情况下是作为已经实现了Servlet 接口的javax.servlet.GenericServlet 和 javax.servlet.http.HttpServlet 这两个抽象类的子类来间接实现Servlet 接口。

  11. 7.2.1 javax.servlet 包定义的类和接口: ⑴ interface RequestDispatcher //定义一种对象,用于从客户接受请求,并将请求发送到服务器上任何指定的资源,如一个Servlet 、JSP 或 HTML 文件。   ⑵ interface Servlet //定义了所有 Servlet 必须实现的方法。   ⑶ interface ServletConfig //定义Servlet config 对象,由Servlet 引擎用在 Servlet 初始化时,向 Servlet 传递信息。

  12.  ⑷ interface ServletContext //定义了一系列方法,以便Servlet与其运行的环境通信。   ⑸ interface ServletRequest //定义了用于向Servlet传递客户请求信息的对象。   ⑹ interface ServletResponse //定义了一个对象,由Servlet用于向客户发送响应。   ⑺ interface SingleThreadModel //用于保证Servlet在任一时刻,只处理一个请求。   ⑻ class GenericServlet //继承Servlet接口,定义了一个通用的,与协议无关的Servlet。

  13. ⑼ class ServletInputStream //定义了一个输入流,用于由Servlet从中读取客户请求的二进制数据。   ⑽ class ServletOutputStream //定义了一个输出流,用于由Servlet向客户发送二进制数据。   ⑾ class ServletException //定义了一个当Servlet遇到问题时可以抛出的异常。   ⑿class UnavailableException //定义了一种异常,用于由Servlet指明它永远或暂时不可用

  14. 7.2.2 javax.servlet.http 包定义的类和接口:   ⑴ interface HttpServletRequest //继承了ServletRequest 接口,为HTTPServlet 提供请求信息。   ⑵ interface HttpServletResponse //继承了ServletResponse 接口,为HTTPServlet 输出响应信息提供支持。   ⑶ interface HttpSession //为维护 HTTP 用户的会话状态提供支持。   ⑷ interface HttpSessionBindingListener //使得某对象在加入一个会话或从会话中删除时能够得到通知。

  15.  ⑸ interface HttpSessionContext //由Servlet 2.1 定义,该对象在新版本已不被支持。   ⑹ class Cookie //用在Servlet 中使用Cookie 技术   ⑺ class HttpServlet //定义了一个抽象类,继承 GenericServlet 抽象类,应被 HTTPServlet 继承。   ⑻ class HttpSessionBindingEvent //定义了一种对象,当某一个实现了HttpSessionBindingListener接口的对象被加入会话或从会//话中删除时,会收到该类对象的一个句柄   ⑼ class HttpUtils //提供了一系列便于编写HTTPServlet 的方法。

  16. 7.3 Servlet 的主要方法 HTTP Servlet 使用一个 HTML 表格来发送和接收数据。要创建一个 HTTP Servlet,请扩展 HttpServlet 类, 该类是用专门的方法来处理 HTML 表格的 GenericServlet 的一个子类。 HTML 表单是由 <FORM> 和 </FORM> 标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定服务器应执行哪一个Servlet(或其它的程序)。 HttpServlet 类包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是继承的。

  17. (1)init() 方法 • 在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet • 时执行的。 可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。 无论有多少客户机访问 Servlet,都不会重复执行 init() 。 • 缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法来覆盖它,典型的是管理服务器端资源。 例如,可能编写一个定制 init() 来只用于一次装入 GIF 图像,改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的 init() 方法设置了 Servlet 的初始化参数,并用它的 ServletConfig 对象参数来启动配置, 因此所有覆盖 init() 方法的 Servlet 应调用 super.init() 以确保仍然执行这些任务。在调用 service() 方法之前,应确保已完成了 init() 方法。

  18. (2)service() 方法 • 语法格式: • public void service(HttpServletRequest request,HttpServletResponse • response)throws servletException,IOException • 例1 serviceDemo.java • import javax.servlet.*; • import javax.servlet.http.*; • import java.io.*; • import java.util.*; • public class serviceDemo extends HttpServlet { • static final private String CONTENT_TYPE="text/html;charset=GBK"; • public void init() throws ServletException { • }

  19. public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType(CONTENT_TYPE); request.setCharacterEncoding("GBK"); PrintWriter out = response.getWriter(); String name=request.getParameter("name"); String gender=request.getParameter("gender"); String age=request.getParameter("age"); String method=request.getMethod(); out.println("<h3>" + "service方法演示" + "</h3>");

  20. out.println("<h3>" + "上传方法的参数是"+method + "</h3>"); out.println(("<p>名字="+name+"<p>")); out.println(("<p>性别="+gender+"<p>")); out.println(("<p>年龄="+age+"<p>")); } public void destroy() { System.out.println("servlet 的生命结束"); } }

  21. service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。

  22. 当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用doPost()方法。 一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。

  23. Servlet的响应可以是下列几种类型:    ① 一个输出流,浏览器根据它的内容类型(如text/HTML)进行解释。    ② 一个HTTP错误响应, 重定向到另一个URL、servlet、JSP。 ⑶destroy() 方法 destroy() 方法仅执行一次,即在服务器停止且卸装Servlet 时执行该方法。典型的,将 Servlet 作为服务器进程的一部分来关闭。缺省的 destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果 Servlet 在运行时会累计统计数据,则可以编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。

  24. 当服务器卸装 Servlet 时,将在所有 service() 方法调用完成后,或在指定的时间间隔过后调用 destroy() 方法。一个Servlet 在运行service() 方法时可能会产生其它的线程,因此请确认在调用 destroy() 方法时,这些线程已终止或完成。 ⑷ GetServletConfig()方法 ⑸ GetServletConfig()方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和ServletContext。ServletContext 接口提供有关servlet 的环境信息。

  25. ⑹ GetServletInfo()方法 ⑺ GetServletInfo()方法是一个可选的方法,它提供有关servlet 的信息,如作者、 版本、版权。 ⑻ doPost方法 doPost()只可以接受浏览器和Form表单的post方法访问,格式: public void doPost(HttpServletRequest request,HttpServletResponse response)throws servletException,IOException 通过HTML表单提交了HTTP POST请求时,将调用该方法。与POST请求相关联的参数独立传递给Web服务器。当在server端需对发来的数据作修改时采用doPost方法。

  26. ⑼ doGet方法 doGet()方法可以接受浏览器直接访问和Form表单的get方法访问,格式: public void doGet(HttpServletRequest request,HttpServletResponse response) throws servletException,IOException 当在游览器中指定了一个URL时,HTTP GET是客户端采用的缺省方法。doGet是Web server对用户端请求的响应方法。与doPost不同的是,当在server端不需要对发来的数据修改时或是发来的参数非敏感数据时采用doGet方法。参数数据被附加在URL之后通过一个HTTP请求发送给Web server。

  27. ⑽ doDelete()方法 public void doDelete(HttpServletRequest request,HttpServletResponse response)throws servletException,IOException 该方法删除服务器端的文件。 servlet的输出响应可以是以下几种情况之一,HTML页面、HTTP错误代码、重定向到别外的URL、servlet或JSP。当服务器调用sevlet 的Service()、doGet()和doPost()这三个方法时,均需要 "请求"和"响应"对象作为参数。"请求"对象提供有关请求的信息,而"响应"对象提供了一个将响应信息返回给浏览器的一个通信途径。

  28. javax.servlet 软件包中的相关类为ServletResponse和ServletRequest,而javax.servlet.http 软件包中的相关类为HttpServletRequest 和 HttpServletResponse。Servlet 通过这些对象与服务器通信并最终与客户机通信。Servlet 能通过调用"请求"对象的方法获知客户机环境,服务器环境的信息和所有由客户机提供的信息。Servlet 可以调用"响应"对象的方法发送响应,该响应是准备发回客户机的。

  29. 7.4 Servlets编程 Servlets是生成动态页面的Java解决方案。它有如下特点: ⑴ 移植性好:Servlets以Java写成,在服务器端执行,拥有良好的跨平台特性,适应于各种Web服务器。Servlet API在Servlet和Web服务器之间定义了标准接口。 ⑵ 良好的一致性和性能:Servlet代码被Web服务器一次装入,为每一个客户端的请求而激活。不同的请求间可以共享系统资源(如数据库连接)因此不存在为每一个请求初使化新的Servlet程序的额外开销。Servlet可以动态装入可以在Web服务器启动时装入。 ⑶ 基于Java语言:Servlet采用Java书写,它继承了Java语言的所有优点。通过垃圾内存清理机制而且不使用指针,使得Servlet避免了内存管理的大多数问题。

  30. servlet是运行于Web服务器或应用服务器的服务器端Java程序(注意,这里的应用服务器的是指应用的部署和运行平台软件:Application Server)。servlet和Web服务器的关系就象applet与浏览器的关系一样。Applet在游览器中装入和执行,而servlet是在Web服务器中装入和执行。servlet API定义了servlet与Web服务器间的标准接口,这使得servlet的开发独立于Web服务器。

  31. 7.4.1 servlet的访问方式 通过浏览器可以有几种途径访问servlet: ⑴  HTML表单:通常servlet由HTML表单中的Sumbit按钮驱动,用户的输入数据通过POST或GET方法传递给servlet。 ⑵  超链接:servlet也可以超链接的形式指定,通过超链接激活服务或servlet的doGet方法。

  32. ⑶  SERVLET标记:一些Web服务器支持HTML文档的SERVLET标记或者<!—include-->标记。执行时servlet的doGet方法被激活,输出结果代替SERVLET标记出现在HTML文档中。在JSP0.92和1.0规范中,支持的include语法是:<%@ include file=”相对URL路径”> ⑷ 通过servlet访问:通过getServletContext().getServlet(servletname)可访问其它的servlet。值得注意的是,Java servlet API2.1建议不采用这种方法,它提供了RequestDispatcher接口,它可以转发请求调用另外的servlet。

  33. 7.4.2 Servlet生命周期管理 基于servlet的网络应用的用户端程序并非直接与servlet交互,而是发请求给Web server,由Web server通过servlet API激活servlet。Web server的主要任务包括为servlet初使化、活servlet的doGet或doPost方法、销毁servlet进程等。在Web server中,每个servlet只有一个进程,为每个客户端请求创建一个线程(每个线程处理一个客户端请求, 如图1,servlet的这一特性使其运行效率非常高效。

  34. 图1 Servlet生命周期

  35. 装载Servlet。这项操作一般是动态执行的。然而,Server通常会提供一个管理的选项,用于在Server启动时强制装载和初始化特定的Servlet。 Server创建一个Servlet的实例 Server调用Servlet的init()方法   一个客户端的请求到达Server Server创建一个请求对象 Server创建一个响应对象 Server激活Servlet的service()方法,传递请求和响应对象作为参数 service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息

  36. service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如doGet()或doPost()或程序员自己开发的新的方法   对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用init()方法。一般Servlet只初始化一次 ,当Server不再需要Servlet时(一般当Server关闭时),Server调用Servlet的Destroy()方法。

  37. 例2 Servlet生命周期 import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class servletLifeDemo extends HttpServlet { static final private String CONTENT_TYPE="text/html;charset=GBK"; public void init() throws ServletException { System.out.println("servlet 的生命开始"); } public void doGet(HttpServletRequest request,

  38. HttpServletResponse response) throws IOException, ServletException { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<head>"); String title = rb.getString("requestinfo.title"); out.println("<title>" + title + "</title>"); out.println("</head>"); out.println("<body bgcolor=\"white\">");

  39. // img stuff not req'd for source code html showing // all links relative! out.println("<a href=\"../servlets/reqinfo.html\">"); out.println("<img src=\"../images/code.gif\" height=24 " + "width=24 align=right border=0 alt=\"view code\"></a>"); out.println("<a href=\"../servlets/index.html\">"); out.println("<img src=\"../images/return.gif\" height=24 " + "width=24 align=right border=0 alt=\"return\"></a>"); out.println("<h3>" + title + "</h3>"); out.println("<table border=0><tr><td>");

  40. out.println(rb.getString("requestinfo.label.method")); out.println("</td><td>"); out.println(request.getMethod()); out.println("</td></tr><tr><td>"); out.println(rb.getString("requestinfo.label.requesturi")); out.println("</td><td>"); out.println(request.getRequestURI()); out.println("</td></tr><tr><td>"); out.println(rb.getString("requestinfo.label.protocol")); out.println("</td><td>");

  41. out.println(request.getProtocol()); out.println("</td></tr><tr><td>"); out.println(rb.getString("requestinfo.label.pathinfo")); out.println("</td><td>"); out.println(request.getPathInfo()); out.println("</td></tr><tr><td>"); out.println(rb.getString("requestinfo.label.remoteaddr")); out.println("</td><td>"); out.println(request.getRemoteAddr()); out.println("</table>");

  42. response.sendRedirect("http://127.0.0.1:8080/examples/servlet/HelloWorldExample");response.sendRedirect("http://127.0.0.1:8080/examples/servlet/HelloWorldExample"); } public void destroy() { System.out.println("servlet 的生命结束"); } }

  43. 7.5 servlet的步曙:(Tomcat5.0配置servlet) ⑴ 先添加servlet的环境变量,我用的是win2000,所以只要在我的电脑->属性->高级->环境变量,然后新建一个classpath, 因为我的Tomcat5.0目录是在C:\Tomcat 5.0 所以变量值为 C:\Tomcat 5.0\common\lib\servlet-api.jar 与tomcat4不同的是tomvat4的jar文件是servlet.jar 编辑好环境变量后重启计算机 ⑵ 写一个servlet文件 import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest;

  44. I mport javax.servlet.http.HttpServletResponse; public class Test extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out=response.getWriter(); out.println("<html><body><h1>This is a servlet test.</h1></body></html>"); out.flush(); } } 可放在任一classes目录,此处,我选择虚拟目录D:/jsp/webapp server.xml设置:

  45. <Context path="/webapp" docBase="d:/jsp/webapp"... path是虚拟目录,docBase是虚拟目录路径 虚拟目录的设置网上有很多,这里不再介绍 在D:/jsp/webapp/WEB-INF/classes/下编译生成Test.class文件 请将生成的类文件与LocalStrings.properties、LocalStrings_en.properties、LocalStrings_es.properties、LocalStrings_fr.properties全放在classes目录下。 ⑶ web.xml编辑 在<web-app>与</web-app>中间编辑如下代码: <servlet> <servlet-name>Test</servlet-name> <servlet-class>Test</servlet-class>

  46. </servlet> <servlet-mapping> <servlet-name>Test</servlet-name> <url-pattern>/Test</url-pattern> </servlet-mapping> 其中,<servlet-class>Test</servlet-class>说明class文件为Test <url-pattern>/Test</url-pattern>说明将声明的servlet“映射”到地址/Test上,

  47. ⑷ 运行: 启动Tomcat,启动浏览器,输入http://localhost:8080/webapp/Test如果看到输出This is a servlet test.就说明编写的servlet成功了。 如果要放到其他的目录上运行,那么,原理也是一样!!  作  业 ①:比较Servlet与Applet的区别与联系  ②:写出Servlet的安装与发布过程 ③:编写ServLet实现将客户端传送给服务器的所有COOKIE显示在浏览器窗体中。                                     教学总结:

  48. 上机实验七:ServLet的安装、配置及其编程使用(2课时)上机实验七:ServLet的安装、配置及其编程使用(2课时) 一、实验目的及要求 1.掌握ServLet的安装、配置 2.掌握doGet、doPost、Service等方法的使用 3.掌握利用ServLet API编程完成较为复杂的功能 二、实验环境 Myeclipse、Tomcat、JDK

  49. 三、实验内容 1. 上机完成教案上所有示例 2.运行Tomcat自带的Servlet示例,分析其代码 3.上机运行下述用doPost方法写成的ServLet import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class DoPostDemo extends HttpServlet { static final private String CONTENT_TYPE="text/html;charset=GBK"; public void init() throws ServletException { }

  50. public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType(CONTENT_TYPE); request.setCharacterEncoding("GBK"); PrintWriter out = response.getWriter(); String name=request.getParameter("name"); String gender=request.getParameter("gender"); String age=request.getParameter("age"); out.println("<h3>" + "DOPost方法演示" + "</h3>");

More Related