servlet简单介绍
servlet是一种服务器端的java应用程序,具有独立于平台和协议的特性,可以生成动态的web页面,她担当客户请求与服务器响应的中间层,servlet是位于web服务器内部的服务器端的java应用程序,与传统的从命令行启动的java应用程序不同,servlet由web服务器进行加载,该web服务器必须包含支持servlet的java,servlet(server applet),全称java servlet,未有中文译文。是用java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态web内容。狭义的servlet是指java语言实现的一个接口,广义的servlet是指任何实现了这个servlet接口的类,一般情况下,人们将servlet理解为后者。servlet运行于支持java的应用服务器中。从原理上讲,servlet可以响应任何类型的请求,但绝大多数情况下servlet只用来扩展基于http协议的web服务器,在日常的学习和生活中,总是碰见servlet,今天这篇博文,小编就来简单的介绍一下servlet的相关知识,希望对有需要的小伙伴有帮助,不足之处,还请各位大神多多指教。
什么是servlet
一个servlet就是java语言中的一个类,她被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序,虽然servlet可以对任何类型的请求产生响应,但通常只用来扩着web服务器的应用程序,java servlet技术为这些应用程序定义了一个特定于http的servlet类。
javax.servlet和javax.servlet.http包为编写servlet提供了接口和类,所有的servlet都必须实现servlet接口,这个接口定义了生命周期方法,当实现一个通用的服务时,可以使用或扩展由javaservlapi提供的genericservlet类,httpservlet类提供了一些方法,诸如doget和dopost,以用于处理特定于http的服务。简单来说servlet就是满足我们servlet规范的“服务器端的小java程序”。如下代码所示:
/** * 需要我们实现j2ee中的servlet接口 * @author 丁国华 */ public class servletexample implements servlet { //在构造方法执行结束之后,对象创建完毕,init方法马上执行 //只执行一次。这个方法我们称作初始化方法。 //该方法调用的时候servlet对象刚刚创建完毕,相当于人一生开始的受教育 @override public void init(servletconfig arg0) throws servletexception { } //这是一个servlet对象的核心业务方法。我们主要把业务编写到这个方法中,用户请求一次,执行一次。 @override public void service(servletrequest arg0, servletresponse arg1) throws servletexception, ioexception { } //当服务器容器关闭的时候,或者长时间没有用户再去访问这个servlet //servlet对象所占用的内存即将被释放,释放之前会由tomcat容器自动调用该方法。 //该方法在servlet对象的内存被回收之前执行。 //该方法执行的时候servlet对象还没有被销毁。 //该方法也是只执行一次。相当于人一辈子的结束。 @override public void destroy() { } //下边两个是关于servlet信息的方法 @override public servletconfig getservletconfig() { return null; } @override public string getservletinfo() { return null; } }
servlet的生命周期
首次创建servlet时,她的init对象得到调用,因此init是放置一次性设置代码的地方,在这之后,针对每个用户请求都会创建一个线程,该线程调用前面创建的实例的service方法,多个并发请求一般会导致多个线程同时调用service,之后由service方法依据接收到的http请求类型,调用doget、dopost或者其他方法,最后如果服务器决定卸载某个servlet,调用servlet的destroy方法。是不是觉得特别烦琐,小编用了几句话,简单的总结了一下,servlet生命周期分为三个阶段:
a、初始化阶段,调用init()方法;
b、响应客户请求阶段,调用service()方法,doget()、dopost(),这些方法都是servlet的主体;
c、终止阶段,调用destroy()方法;
简单介绍一下这几种方法,首先init()方法,可以在servlet开始时,完成初始化,代码如下:
//在一个servlet中写一个 public void init()thorws servlet exception{ //init code }
service方法
服务器每次收到对servlet的请求,都会产生一个新的线程,调用service方法检查http请求类型,从而调用相应的方法。
destory()方法
服务器移除servlet之前可以调用destory方法来完成一些工作,例如,使得servlet有机会关闭连接,停滞后台进程,将cookie列表和点击数写入磁盘等收尾工作。
小伙伴们有没有发现一个有趣的现象,创建的过程和servlet的生命周期是一一对应的,
a、创建:通过用户的请求路径,解析web.xml文件,获取servlet的完整类名,通过反射进行实例化对应的servlet对象:
class c = class.forname(“servlet类全名”);
servlet servlet = (servlet)c.newinstance();
b、创建后进行初始化,调用init方法
servlet.init(config); //初始化方法,对象第一次被创建之后调用。只执行一次。(初始化时刻)
c、用户调用时,执行service方法:
servlet.service(request,response); //核心业务方法,用户访问一次必然执行一次。(执行多次)
d、销毁:
servlet.destroy();
servlet的基本结构
下面一个简单的小demo,是一个基本的servlet,servlet一般扩展自httpservlet,依据数据发送方式的不同,覆盖doget或者是dopost方法,如果希望servlet对get和post采取同样的行动,只需要让doget调用dopost即可,反之亦然,代码如下所示:
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class servlettemplate extends httpservlet{ public void doget(httpservlet requestrequest,httpservlet responseresponse) throws servlet exception,ioexception{ //use "request" to read in coming httpheaders //(e.g.cookies) and query date from htmlforms. //user "response" to specify the httpresponsetatus //code and headers(e.g.the content type,cookies) printwriter out = response.getwriter(); //user "out" tosend contentto browser } }
doget和dopost都接受两个参数httpservletrequest和httpservletrespon,通过httpservletrequest可以获得所有的输入数据,表单数据、http请求报头、客户主机名等,httpservletresponse可以指定输出信息,如http状态码和响应报头,最重要的是,通过它可以获得printwriter,用她将文档内容发给用户。
创建httpservlet
根据客户发出的http请求,生成响应的http响应结果,httpservlet首先必须读出http请求的内容,servlet容器负责创建httprequest对象,并把http请求信息封装到httprequest对象中,这大大简化了httpservlet解析请求数据的工作量,如果没有httpservletrequest,httpservlet只能直接处理web客户发出的原始的字符串数据,有了httprequest后,只要调用httpservletrequest的相关方法,就可以方便的读取http请求中任何部分信息。
创建一个httpservlet,分为以下四个步骤:
a、扩展httpservlet抽象类
b、重载适当的方法,如覆盖doget()或者dopost()
c、如果http请求信息,则获取该信息,用httpservletrequest对象来检索html表格所提交的数据或url上的查询字符串,请求对象还有特定的方法以检索客户机提供的信息,有以下三种方法:
getparameternames()
getparameter()
getparametervalues()
d、生成http响应,httpservletresponse对象生成响应,并将她返回到发出请求的客户机上,她的方法允许设置“请求”标题“和”响应“主体,”响应“对象还含有getwriter()方法以返回一个printwriter对象,使用printwriter的print(),和printin()方法以编写servlet响应来返回给客户机,或者直接使用out对象输出有关html文档内容,下面来写一个简单的demo,代码如下所示:
import java.io.*; import java.util.* import javax.servlet.*; import javax.servlet.http.*; public class servletsample extends httpservlet{ //第一步:扩展httpservlet抽象类 public void doget(httpservletrequestrequest,httpservletresponseresponse) thrower servlet exception,ioexception{ //第二步:重写doget()方法 string myname=""; //第三步:获取http请求信息 java.util,enumeration keys = request.getparameternames(); while(keys.hasmoreelements());{ key=(string) keys.nextelement(); if(key.equals ignorecase("myname")) myname=request.getparameter(key); } if(myname="") myname="hello"; //第四步:生成http响应 response.setcontenttype("text/html"); response.setheader("pragma","no-cache"); response.setdateheader("expires",0); response.setheader("cache-control","no-cache"); out.println("<> "); out.println(""); out.println("
"+myname+",this is a very basic servlet that writes an html page."); out.println("
for instruction son running those samples on your web sphere 应用服务器,"+"open the pase:"); out.println(<"pre> https://your.server.name/ibmwebas/samples/index.1
分析一下上面的代码部分,上述servletsample类扩展httpservlet抽象类,重写doget()方法,在重写的doget()方法中,获取http请求中的一个任选的参数,比如myname,该参数可作为调用的url上的查询参数传递到servlet。
小编寄语:该博文,小编主要介绍了servlet的相关知识,分别从什么是servlet、servlet的生命周期、servlet的基本结构以及创建一个简单的httpservlet几个方面对servlet进行一系列简单的介绍,servlet在开发中经常使用,明白她的工作原理对我们以后的开发学习非常有用,java之路,未完待续......
推荐阅读
-
PHP中trim()函数简单使用指南,trim使用指南_PHP教程
-
t-分布邻域嵌入算法(t-SNE algorithm)简单理解
-
PostCSS一种更优雅、更简单的书写CSS方式_html/css_WEB-ITnose
-
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能_jquery
-
Unix/Linux系统下的nobody用户与nologin详细介绍
-
简单谈谈JSP/EL表达式
-
非常不错的功能强大代码简单的管理菜单美化版_javascript技巧
-
最简单的nginx+ftp搭建图片服务器(Windows Server服务器环境下和本机都可以用)
-
详细介绍Opencv实现张正友法相机标定
-
简单掌握CSS3中resize属性的用法