Servlet总结

    学习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方法。



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值