您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 第5章 Servlet技术基础知识
第5章Servlet技术基础知识Servlet是一种服务器端的编程语言,是J2EE中比较关键的组成部分,Servlet技术的推出,扩展了Java语言在服务器端开发的功能,巩固了Java语言在服务器端开发中的地位,而且现在使用非常广泛的JSP技术也是基于Servlet的原理,JSP+JavaBeans+Servlet成为实现MVC模式的一种有效的选择。在本章中将介绍Servlet的基础知识,并通过具体的示例介绍Servlet的强大功能。5.1Servlet简介Servlet在本质上就是Java类,编写Servlet需要遵循Java的基本语法,但是与一般Java类所不同的是,Servlet是只能运行在服务器端的Java类,而且必需遵循特殊的规范,在运行的过程中有自己的生命周期,这些特性都是Servlet所独有的。另外Servlet是和HTTP协议是紧密联系的,所以使用Servlet几乎可以处理HTTP协议各个方面的内容,这也正是Servlet收到开发人员青睐的昀大原因。5.1.1Servlet的工作原理Servlet需要在特定的容器中才能运行,在这里所说的容器即Servlet运行的时候所需的运行环境,一般情况下,市面上常见的JavaWebServer都可以支持Servlet,例如Tomcat、Resin、Weblogic、WebSphere等,在本书中采用Tomcat作为Servlet的容器,由Tomcat为Servlet提供基本的运行环境。Servlet容器环境在HTTP通信和web服务器平台之间实现了一个抽象层。Servlet容器负责把请求传递给Servlet,并把结果返回结客户。容器环境也提供了配置Servlet应用的简单方法,并且也提供用XML文件配置Servlet的方法。当Servlet容器收到对用户对Servlet请求的时候,Servlet引擎就会判断这个Servlet是否是第一次被访问,如果是第一次访问,Servlet引擎就会初始化这个Servlet,即调用Servlet中的init()方法完成必要的初始化工作,当后续的客户请求Servlet服务的时候,就不再调用init()方法,而是直接调用service()方法,也就是说每个Servlet只被初始化一次,后续的请求只是新建一个线程,调用Servlet中的service()方法。在使用Servlet的过程中,并发访问的问题由Servlet容器处理,当多个用户请求同一个Servlet的时候,Servlet容器负责为每个用户启动一个线程,这些线程的运行和销毁由Servlet容器负责,而在传统的CGI程序中,是为每一个用户启动一个进程,因此Servlet的运行效率就要比CGI的高出很多。5.1.2Servlet的生命周期Servlet是运行在服务器端的程序,所以Servlet的运行状态完全由Servlet容器维护,一个Servlet的生命周期一般有三个过程。1.初始化当一个Servlet被第一请求的时候,Servlet引擎就初始化这个Servlet,在这里是调用init()方法完成必需的初始化工作。而且这个对象一致在内存中活动,Servlet为后续的客户请求新建线程,直接调用Servlet中的service()方法提供服务,不再初始化Servlet。2.提供服务当Servlet对象被创建以后,就可以调用具体的service()方法为用户提供服务。3.销毁Servlet被初始化以后一直再内存中保存,后续的访问可以不再进行初始化工作,当服务器遇到问题需要重新启动的时候,这些对象就需要被销毁,这时候Servlet引擎就会调用Servlet的destroy()方法把内存中的Servlet对象销毁。5.1.3简单Servlet开发配置示例JavaServletAPI包括两个基本的包,javax.servlet和javax.servlet.http,其中javax.servlet提供了用来控制Servlet生命周期所需的类和接口,是编写Servlet必需要实现的。javax.servlet.http提供了处理与HTTP相关操作的类和接口,每个Servlet必需实现Servlet接口,但是在实际的开发中,一般情况都是通过继承javax.servlet.http.HttpServlet或者javax.servlet.GenericServlet来间接实现Servlet接口。下面这个简单的示例程序就是继承了javax.servlet.http.HttpServle,从而实现Servlet接口,具体的代码如下。//--------文件名:HelloWorld.java--------------------packageservlets;importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;publicclassHelloWorldextendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{response.setContentType(text/html);PrintWriterout=response.getWriter();out.println(html);out.println(head);out.println(titleHelloWorld!/title);out.println(/head);out.println(body);out.println(h1HelloWorld!/h1);out.println(/body);out.println(/html);}}在上面这个简单的示例程序中,继承了HttpServlet,而HttpServlet是一个实现了Servlet接口的类,所以这个Servlet就间接地实现了Servlet的接口,从而可以使用接口提供的服务。在这个程序中,并没有具体的init()方法和destroy()方法,这里使用Servlet容器默认的方式对这个Servlet进行初始化和销毁动作,而在这里的doGet()方法就是具体的功能处理方法,这个方法可以对以get方法发起的请求进行处理,在这里这个方法的功能就是打印出一个HTML页面。上面这个程序编译以后会生成对应的Servlet类文件,把编译生成的类文件拷贝到当前应用项目的WEB-INF/classes文件夹中,Servlet引擎会到这个目录下面寻找Servlet的类文件。这里需要注意,如果Servlet有包名,这时候把需要把整个包拷贝,而不是仅仅拷贝类文件。负责Servlet引擎就会找不到Servlet类文件Servlet引擎需要通过配置文件来找到具体的Servlet,在一般情况下都需要在当前应用项目的web.xml配置文件中对各个Servlet进行配置,其中web.xml文件的位置在当前项目应用的WEB-INF文件夹下。对于上面这个简单的Servlet示例,可以在web.xml中进行如下的配置。servletservlet-nameHelloWorld/servlet-nameservlet-classservlets.HelloWorld/servlet-class/servletservlet-mappingservlet-nameHelloWorld/servlet-nameurl-pattern/HelloWorld/url-pattern/servlet-mapping对于每一个Servlet都需要像上面这样的配置信息,这时Servlet引擎初始化Servlet所必需的信息,这个配置信息可以分为两个部分,第一部分是配置Servlet的名称和类,第二部分是配置Servlet的访问路径,其中servlet-name是这个Servlet的名称,这个名字可以任意命名,但是要和servlet-mapping节点中的servlet-name保持一致,servlet-class是Servlet对应类的路径,在这里要注意,如果有Servlet带有包名,一定要把包路径写全,否则Servlet引擎就找不到对应的Servlet类。servlet-mapping节点是对Servlet的访问路径进行配置,url-pattern定义了Servlet的访问路径。经过上面的步骤,就可以使用类似这样的网址访问这个Servlet,其中是本机Tomcat服务器的访问地址,chapt5是当前应用项目的名称,HelloWorld是Servlet的访问路径,当Servlet引擎接收到这样的请求的时候,就会初始化HelloWorld这个Servlet,然后调用其中的方法为用户提供服务。上面这个简单的示例程序的运行效果如图5.1所示。图5.1HelloWorld示例程序运行效果总之,编写一个Servlet要经过以下几个步骤。(1)编写Servlet的功能代码,即实现功能的代码类。(2)把编译成功的Servlet功能代码类文件拷贝到当前应用项目的WEB-INF/classes目录下。(3)在当前应用项目的web.xml文件中对Servlet进行配置,即在web.xml中添加配置信息。经过这样三个步骤就可以通过浏览器访问这个Servlet。注意:Servlet的配置信息需要添加在web-app/web-app标签之间。5.1.4使用Servlet实现MVC开发模式Java语言之所以受到开发人员支持,是因为Java语言实现科学方便的开发模式,在这些开发模式中,昀出色而且应用昀广的就是MVC模式,对于MVC模式的研究由来已久,但是一直没有得到很好的推广和应用,随着J2EE技术的成熟,MVC逐渐成为了一种常用而且重要的设计模式。MVC(Model-View-Controller)把应用程序的开发分为三个层面:视图层、控制层、模型层。其中视图层负责从用户获取数据和向用户展示数据,在这层中不负责对业务逻辑的处理和数据流程的控制。而模型层负责处理业务逻辑和数据库的底层操作,其中视图层和模型层之间没有直接的联系。控制层主要负责处理视图层和模型层的交互,控制层从视图层接收请求,然后从模型层取出对请求的处理结果,并把结果返回给视图层。在控制层中只负责数据的流向,并不涉及具体的业务逻辑处理。MVC三层结构的内部关系如图5.2所示。图5.2MVC三层结构的内部关系从图5.2中可以看出,Servlet在MVC开发模式中承担着重要的角色,在MVC结构中,控制层就是依靠Servlet实现,Servlet可以从浏览器端接收请求,然后从模型层取出处理结果,并且把处理结果返回给浏览器端的用户。在整个结构中,Servlet负责数据流向控制的功能。虽然现在用很多开源框架都很好的实现了MVC的开发模式,例如Struts、WebWork等,这些开源框架对MVC的实现都是非常出色的,在这些框架中,处理数据控制流向的时候,采用的还是Servlet,例如在Struts中,对应每一个用户请求都有一个Action,这个Action就是继承了Servlet的类,所以在MVC架构中,Servlet是不可替代的。5.2JSP页面调用Servlet的方法在上面HelloWorld的示例程序中,我们直接在浏览器中输入具体的地址进行访问,在实际的应用中,不可能让用户在浏览器中直接输入Servlet的地址进行访问,一般情况下,可以通过调用Servlet进行访问,在这里介绍通过提交表单和超链接两种方式调用Servlet。5.2.1通过表单提交调用Servlet在通过提交表单调用Servlet的时候
本文标题:第5章 Servlet技术基础知识
链接地址:https://www.777doc.com/doc-5585916 .html