Jsp之三 servlet基础
servlet带给开发人员最大的好处是它可以处理客户端传来的http请求,并返回一个响应。servlet是一个java类,java语言能够实现的功能,servlet基本上都可以实现。
可移植性
因为servlet是由java开发并符合规定定义和广泛接受的api他可以再不同操作和不同的应用服务器平台下移植。
集成
servlet和服务器紧密集成,他们可以密切合作完成特东的任务。
模块化
每一个servlet可以完成一个特定任务,并且可以将他们并在一起工作,servlet之间是可以交流的。
高效耐久
servlet一旦载入,他就驻留在内存中,这样加快了响应的速度。在服务器上仅有一个java在运行,他的优势在于,当servlet被客户端发送的第一个请示激活,以后他就可以运行于后台,等待以后的请求,所以我们在第一次反问servlet页面时通常有点慢,之后就很快了(当然首次的servlet载入也可以是在服务器启动时,由web程序的配置文件web.xml而定)。每个请求将生成一个线程而不是进程
|
在学习servlet的生命周期之前,我们先做一个servlet的小例子,熟悉一下servlet的运行过程
?建立web项目目录
打开tomcat安装目录进入webapps文件夹,新建一个文件夹作为我们项目的根目录,名字为servlettest,那么这个项目的名字就叫做servlettest。然后在servlettest目录下建立一个名为web-inf的文件夹(注意这个文件夹必须是要大写的),在web-inf下建立classes文件夹,同时在web-inf下建立一个名为web.xml的文件。准备工作已经做完,下面开始开发第一个servlet程序。
?创建servlet类文件
如程序3-1所示
【3-1】import java.io.*
import javax.servlet.*
import javax.servlet.http.*
public class servletdemo extends httpservlet {
public void doget(httpservletrequest req,
httpservletresponse res )throws servletexception,ioexception{
printwriter out=res.getwriter();
out.println("hello,world");
}
}
将这个类文件,在命令行下编译得到一个servletdemo.class的字节码文件,之后将此字节码文件copy到刚才建立的classes目录下即可。下面我们需要做的就是让服务器知道有这么一个servlet存在,并在客户端用户按照规定反问这个servlet的时候,此servlet能够正确的响应结果
?改写web.xml文件
如清单【3-2】所示
【3-2】
对于web.xml中的内容,最为重要的就是
?运行servlet
进入tomcat安装目录的bin目录执行startup.bat文件,之后打开请求http://localhost:8080页面如果出现如图【3-3】所示则说明tomcat已正常启动
图【3-3】
之后再地址栏中输入https://localhost:8080/servlettest/firstservlet请求刚刚开发的servlet,如若页面中出现图【3-4】情形则说明此servlet运行正常。
图【3-4】
好让我们总结一下servlet的开发流程,首先建立web项目的目录,其次开发servlet程序,然后修改配置文件,最后启动服务器tomcat运行servlet测试调试运行。
?servlet的生命周期
我们曾说过,服务器只创建每个servlet的单一实例,每个用户请求都会引发新的线程—将用户请求交付给相应的doget或是dopost运行出来。现在,我们更为详细的介绍servlet的创建和销毁方式,以及调用各种方法的方式和时间。我们首先汇总一下。
在创建servlet时,他的init方法会得到调用,因此,init是放置一次性设置代码的地方。在这之后,针对每个用户的请求,都会创建一个线程,该线程会调用前面创建实例的service方法,而不会重新的调用init方法(除非前面创建的servlet实例已经销毁)。最后,如果服务器决定卸载某个servlet,他会首先调用destroy方法
1、service方法
httpservlet类中有一个service(httpservletrequest req,httpservletresponse res)方法,而一般的servlet都继承自httpservlet这个类,所以一般的servlet都具有service()这个方法,service方法是在用户使用浏览器请求servlet时调用,service方法能够判断用户请求servlet的方法如: get、post、delete等,然后根据判定的结果调用执行doget()或者dopost()或者dodelete()方法。正常的url请求,或是没有指定method的html表单都是get请求。把html表单中的method设置成post的请求为post请求。
如果你需要在servlet中等同的处理post和get请求,只需要将dopost调用doget方法或是用doget调用dopost方法。如清单【3-5】所示:
清单【3-5】
public void doget(httpservletrequest req,httpservletresponse res)
throws servletexception,ioexception{
//
//程序块
//
}
publicvoid dopost(httpservletrequestreq,httpservletresponse res)
throws servletexception,ioexception{
doget(req,res);
}
在servlet中我们99%的时间只关心get和post请求,所以我们在servlet中覆盖doget()和dopost()方法
2、init方法
大多数时候,你的servlet只需要处理单个请求的数据,doget()或dopost()是生命周期中唯一需要的方法,然而有时候我们希望在servlet首次载入的时候,执行一些复杂的初始化任务,但并不想每个请求都重复这些任务。init方法就专为这种情况设计。所以,他主要用于一次性的初始化工作,servlet一般在用户首次调用对应servlet的url的创建,但也可以指定servlet在服务器启动后载入,这可以再web.xml中设定。
例如:在servlet中创建一个有十个整数组成的数组。由于这些数据都来源于复杂的计算,我们不希望每次都重复这些计算。因此doget查找init中计算得出的值,而不是每次都生成他们。如清单【3-6】所示
【3-6】import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class initservlet extends httpservlet {
private long modtime;
private int [] numbers=new int[10];
public void init(){
modtime=system.currenttimemillis()/1000*1000;
for(int i=0;i
numbers[i]=randomnum();
}
}
private int randomnum(){//得到一到一百随机数
return (int)(math.random()*100);
}
protected void doget(httpservletrequest req, httpservletresponse res)
throws servletexception,ioexception {
dopost(req, res);
}
protected void dopost(httpservletrequest req, httpservletresponse res)
throws servletexception,ioexception {
printwriter out=res.getwriter();
for(int i=0;i
out.println(numbers[i]);
}
}
@override
protected long getlastmodified(httpservletrequest req) {
// todo auto-generatedmethod stub
return modtime;
}
}
安装上面步骤我们将此servlet所编译生成的字节码文件copy到classes目录中同样修改web.xml,将清单【3-7】代码加入到web.xml中的
【3-7】
【3-8】
我们每次涮新页面,得到的结果都是这个结果,而在servlet中我们知道这十个数都是随机生成的,每一次调用都应该产生不同的结果,所以可以肯定这个init方法制备调用了一次,只要服务器没有重启,那么浏览器就会一直返回这样的结果。
1.destroy()方法
服务器可能会决定移除之前载入的servlet实例,或许因为服务器的管理员要求这样做。但是在服务器移除servlet的实例之前,他会调用servlet的destroy方法,从而使得servlet有机会关闭连接、停止后台运行的线程、将cookie列表和点击计数写入到磁盘、并执行其他清理活动。但是,要意识到web服务器有可能崩溃。因此不要将destroy机制作为向磁盘上保存状态的唯一机制。如服务器执行诸如点击计数,或对cookie值的列表经行累加等活动,应该主动地定期将数据写到磁盘上。
|
在前面的例子中,我们知道每创建完一个servlet后,在servlet运行之前都需要把servlet的一些信息写入到web.xml中,这就是对servlet的配置,最基本的配置是这样的,必须在
|
||
|
servlet编写完之后,必须将servlet编译之后生成的字节码文件copy到wen-inf目录下的classes文件夹,至于servlet的.java文件,我们可以放在任何位置,但为了项目的整齐美观,最好在项目的根目录下创建一个名为scr的文件件,将servlet的源文件放入其中,方便开发者查看修改,另外需要注意的就是,不要玩了在web.xml中加入此servlet的配置信息,如果这些事情都已完成,就将此web项目copy到服务器tomcat安装根目录下的wabapp下,启动服务器tomcat即可运行servlet。
|
本章主要介绍一些servlet的基本知识,是j2ee开发者必须掌握的知识,也是初学者一个很好的基础。
在本章我们主要学习了:
1、开发一个简单servlet所用到的类。
2、用printwriter类的对象可以再浏览器上输入信息。
3、怎样将servlet的输出的信息用中文显示。
4、servlet的生命周期,即init、service、destroy方法在何时调用。
5、servlet信息如何在web.xml中进行配置。
如何部署servlet,使其可以在服务器上能正常运行。
上一篇: ASP.Net MVC开发基础学习笔记(7):数据查询页面
下一篇: jsp路径问题