学习servlet前,首先我们得了解servlet是什么?它有那些特征?及实际开发中的运用?本文结合这几点浅浅的分析一下,还有不够请同行多多指教。
一、Servlet是什么
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。我们一起来看看J2EE平台下servlet接口之间的关系。
J2EE平台只是定义了servlet规范,提供了统一的接口,并没有去实现,而是其他内部实现由容器厂商自己实现,如tomcat 、jetty 、jboss等等应运而生。
二、Servlet的特征
2.1.过滤器 filter
所有的Servlet过滤器都必须实现javax.servlet.filter接口,该接口中定义了3个过滤器必须实现的方法:2.1.1 void init(FilterConfig):过滤器的初始化方法,Servlet容器在创建过滤器实例时调用这个方法,在这个方法中可以读出在web.xml文件中为该过滤器配置的初始化参数。
2.1.2 void doFilter(ServletRequest,ServletResponse,FilterChain):用于完成实际的过滤操作,当客户请求访问与过滤器相关联的URL时,Servlet容器将先调用过滤器的这个方法,FilterChain参数用于访问后续过滤器。
2.1.3 void destroy():过滤器在被取消前执行这个方法,释放过滤器申请的资源。
如在项目中使用编码过滤器,web.xml中配置如下:
代码中需要一个EncodingFilter实现Filter类,
除了上面的使用的编码过滤器,项目中还有登录过滤器、权限过滤器等等。
2.2 Servlet监听器
servlet监听器主要的作用就是对servlet三大作用域的监听。(request、session、Servletcontext)
2.2.1监听request作用域
request的作用范围:请求响应后马上销毁传递的参数或者请求转发跳转数据传递写入HttpServletRequest 应用比较多
request的生命周期: 浏览器发起请求产生request对象,响应后request被销毁。
2.2.2监听session
session作用域范围:数据使用有状态的不同的用户拥有不同的数据写入HttpSession
在web.xml中配置session监听器
代码如下:
配置session时效
2.2.3监听ServletContext
ServletContext作用域范围:当项目重新发布或者关闭服务器时销毁所有的servlet都需要共享数据需要保留时间很长写入ServletContext
三、Servlet的作用
1.获取客户端浏览器提交的表单数据
2.获取浏览器的附加信息
3.操作数据(做数据持久化,调用业务层做数据处理,调用远程的服务。。。)
4.给客户端产生一个响应
5.在响应中添加附加信息
四、Servlet生命周期
servlet生命周期分为三个阶段:初始化、服务、销毁
请求到相对应的servlet时,解析如下:
public List<ServletModel> parse(){
List<ServletModel> list = new ArrayList<ServletModel>();
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("webapps/hello/WEB-INF/web.xml"))) ;
String str ;
while((str = br.readline()) != null){
//解析web.xml
ServletModel s = new ServletModel();
s.setName("Hello");
s.setClassName("com.cams.Hello");
ServletMappingModel sm = new ServletMappingModel();
sm.setUrlPattern("/suibian.do");
s.setServletMappingMode(sm);
list.add(s);
}
return list;
}
List list = this.parse();
while(true){
//解析所有webapps目录下的web.xml
ServerScoket ss = new ServerSocket(8080);
Socket socket = ss.accept();
//正常来讲,这个位置的代码应该在一个新的线程中实现。(暂时写一起了)
//通过处理客户端的连接的socket解析http数据包
HttpServletRequest request = new HttpServletRequest();
HttpServletResponse response = new HttpServletResponse():
response.setIp(....)
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(),"ISO-8859-1"));
String str ;
while((str = br.readLine()) != null){
//开始解析请求的http数据包中的内容。
//解析的过程中会产生解析请求数据,那么容器需要将这些请求数据做存储
System.out.println(str);
request.setMethod("GET");
request.set...
reuqest.set....
}
ServletModel s = null;
for(int i=0;i<list.size();i++){
ServletModel sm = list.get(i);
if(request.getURI().eq(sm.getServletMappingModel.getUrlPattern())){
s = sm;
break;
}
}
if(s != null){
if(如果在缓存的对象没找到了这个servlet那么容器会创建这个servlet对象了。并且在新的线程里直接调用service方法){
Serlvet obj = Class.forName(s.servletClass()).newInstance();
obj.init();
AA a = new AA(obj,request,response);
Thread t = new Thread(a);
t.start();
pool.add(obj);
}else{
//如果在缓存找到了这个servlet,那么不会创建这个servlet的对象了。直接在新的线程中调用service方法
Thread t = new Thread(pool.getObject(),request,response);
t.start();
}
}else{
.......httpStute404
}
}
servlet的生命周期是由容器管理的
当有第一个客户端浏览器访问这个servlet时,容器会将这个servlet实例化并且调用一次init方法,然后在新的线程中调用service方法,然后容器并不会立即销毁这个对象,当容器在关闭的过程中。会销毁这个servlet对象,但是在销毁这个对象之前会调用一次该servlet对象的destroy方法。