-1-WEB开发基础之Servlet和JSP牛志嘉第1篇.概述篇1.1.JavaWeb技术概述网络将世界联系在一起,使世界变得更加丰富多彩。同时网络互连是一个内容丰富而复杂的主题,所以这方面的程序设计涉及面很广且不易掌握。本文主要讲述Web开发技术中Java平台的Servlet和JSP技术。Servlet和JSP技术是浏览器能够使程序在服务器上运行的一种技术。它由服务器执行必要的运算处理,如访问数据库,最终把HTML输出回送给客户端上的浏览器。这也是所有的基于Web的系统采用的一种体系结构。他们的最终用户界面均采用Web浏览器,而后台业务逻辑则在服务器上运行。普通的HTML页面是静态的,服务器每次送回HTML页面时,显示的都是完全相同的内容。而改变这一种状况的惟一方法是当有人利用编辑程序更新了HTML文件。在现实情况中,许多信息都是动态变化的,如股票价格、天气情况、航班座位、库存数量、帐户余额以及联机购物车内容等。Servlet和JSP恰好是能够把动态信息更新到网页上的最佳方法。用户看到的网页是能够访问和更新数据库的通用程序根据用户的请求,经过加工处理后提供给用户的内容。图1Servlet/JSP程序架构1.2.Servlet和JSP的优点Servlet是位于Web服务器内部的、服务器端的、独立于平台和协议的Java应用程序,可以生成动态的Web。它的优点在于以下几个方面:1.可移植性(Portability)利用Java语言来开发,因此在不同平台都能够将我们所写好的Servlet/JSP程序放在这些操作系统上执行。借助Java的优势,就可以真正达到WriteOnce,ServeAnywhere的境界,这正是从事Java程序员最感到欣慰也是最骄傲的地方。2.强大的功能基于Java语言的Servlet/JSP能够完全发挥JavaAPI的威力,包括网络和URL存取、多线程(Multi-Thread)、-2--3-影像处理、RMI(RemoteMethodInvocation)、分布式服务器组件(EnterpriseJavaBean)、对象序列化(ObjectSerialization)等。若想写个网络目录查询程序,则可利用JNDIAPI;想连接数据库,则可利用JDBC。3.性能Servlet/JSP在加载执行之后,其对象实体(instance)通常会一直停留在Server的内存中,若有请求(request)发生时,服务器再调用Servlet来服务,假若收到相同服务的请求时,Servlet会利用不同的线程来处理,不像CGI程序必须产生许多进程(process)来处理数据。在性能的表现上,大大超越以往的CGI程序。最后补充一点,那就是Servlet在执行时,不是一直停留在内存中,服务器会自动将停留时间过长一直没有执行的Servlet从内存中移除,不过有时候也可以自行写程序来控制。至于停留时间的长短通常和选用的服务器有关。4.安全性Servlet有类型检查(TypeChecking)的特性,并且利用Java的垃圾收集(GarbageCollection)与没有指针的设计,使得Servlet避免内存管理的问题。由于在Java的异常处理(Exception-Handling)机制下,Servlet能够安全地处理各种错误,不会因为发生程序上逻辑错误而导致整体服务器系统的毁灭。例如:某个Servlet发生除以零或其他不合法的运算时,它会抛出一个异常(Exception)让服务器处理,如:记录在记录文件中(logfile)。1.3.HTTP协议以及请求/响应模式HTTP协议(HyperTextTransferProtocol)是Internet众多协议中的一种,表示超文本传输协议,它构成了的基础。它具有简单快速、灵活、无状态、无连接等特点。它是采用基于请求(Request)和响应(Response)模式。其工作过程如下:1.首先客户端与服务器建立连接。2.然后客户端发送一个请求给服务器。3.服务器接到请求后,给予相应的响应信息;最后关闭连接,完成一次操作。1.4.客户端请求的方法客户端发送给服务器的请求有很多类型,被称为方法,其中最常用的是GET、POST。下面对各个方法做个简单介绍。1.GET方法用来从服务器读取信息,比如从服务器读取文件、表格、数据库查询结果等。2.POST方法。用来向服务器传送信息,比如把信用卡号、表格、存储于数据库的数据等传送到服务器。3.HEAD方法。用来读取服务器响应头(ResponseHead);得到诸如文件大小,文件最后修改时间,服务器类型等信息。4.PUT方法。将文件直接传到服务器。5.DELETE方法。将文件直接从服务器删除。6.TRACE方法。用来协助程序调试。7.OPTIONS方法。用来查询服务器所支持的方法。-4-第2篇.Servlet篇2.1.感性认识Servlet:第一个Servlet例子提出问题:写一个Servlet,生成HTML页面,向用户显示一些欢迎信息。解决方法:继承HttpServlet类,覆盖doGet()或doPost()方法。具体解决方案:Servlet是java语言类,用来拓展通过请求响应模式的服务端的能力。所有的servlets都必须实现javax.servlet.Servlet接口,它定义了生命周期方法。Servlet编写者可以通过直接实现javax.servlet.Servlet开发Servlet。实际上,大多数Servlet是针对用HTTP协议的Web服务器,这样最通用开发Servlet办法是继承javax.servlet.http.HttpServlet,实现具体的Servlet。HttpServlet类提供了一些方法,如doGet()及doPost(),用来处理特定的HTTP服务。下面完成这个Servlet的例子。HelloServlet.javapackagecom.abchina.sample;importjavax.servlet.*;importjavax.servlet.http.*;importjava.io.*;publicclassHelloServletextendsHttpServlet{//初始化全局变量publicvoidinit(ServletConfigconfig)throwsServletException{super.init(config);}//处理Get请求publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType(text/html;charset=GB2312);PrintWriterout=response.getWriter();out.println(html);out.println(headtitleCH2-HelloServlet/title/head);out.println(body);out.println(HelloServletbr);-5-out.println(大家好);out.println(/body);out.println(/html);out.close();}//GetServletinformationpublicStringgetServletInfo(){returncom.abchina.sample.HelloSerlvetInformation;}//结束时做销毁工作publicvoiddestroy(){//…………//………….//Servlet结束时,会自动调用执行的程序//………….}}一开始我们必须导入(import)javax.servlet.*、javax.servlet.http.*。javax.servlet.*:存放与HTTP协议无关的一般性Servlet类;javax.servlet.http.*:除了继承javax.servlet.*之外,并且还增加与HTTP协议有关的功能。所有Servlet都必须实现javax.servlet.Servlet接口(Interface),但是通常我们都会从javax.servlet.GenericServlet或javax.servlet.http.HttpServlet择一来实现。若写的Servlet程序和HTTP协议无关,那么必须继承GenericServlet类;若有关,就必须继承HttpServlet类。javax.servlet.*里的ServletRequest和ServletResponse接口提供存取一般的请求和响应;而javax.servlet.http.*里的HttpServletRequest和HttpServletResponse接口,则提供HTTP请求及响应的存取服务。//初始化全局变量publicvoidinit(ServletConfigconfig)throwsServletException{super.init(config);}这个例子中,一开始和Applet一样,也有init()的方法。当Servlet被Container(容器,后面会提到)加载后,接下来就会先执行init()的内容,因此,我们通常利用init()来执行一些初始化的工作。//处理Get请求publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{-6-response.setContentType(text/html;charset=GB2312);PrintWriterout=response.getWriter();out.println(html);out.println(headtitleCH2-HelloServlet/title/head);out.println(body);out.println(HelloServletbr);out.println(大家好);out.println(/body);out.println(/html);out.close();}Servlet可以利用HttpServletResponse类的setContentType()方法来设定内容类型,我们要显示为HTML网页类型,因此,内容类型设为text/html,这是HTML网页的标准MIME类型值。之后,Servlet用getWriter()方法取得PrintWriter类型的out对象,它与PrintSteam类似,但是它能对Java的Unicode字符进行编码转换。最后,再利用out对象把“HelloServlet”的字符串显示在网页上。//结束时做销毁工作publicvoiddestroy(){//......}若当Container结束Servlet时,会自动调用destroy(),因此,我们通常利用destroy()来关闭资源或是写入文件,等等。编译好HelloServlet.java之后,再来设定web.xml,如下:servletservlet-nameHelloServlet/servlet-nameservlet-classcom.abchina.sample.HelloServlet/servlet-class/servletservlet-mappingservlet-nameHelloServlet/servlet-nameurl-pattern/HelloServlet/url-pattern/servlet-mapping最后,HelloServlet.java的执行效果如图所示。图2执行效果图顺利完成第一个