基于NetJava教材的servlet初探

1servlet路径配置详解

   servelt的一项非常重要的特性就是支持模糊配置,<.url-pattern>中配置的路径的定义例子有:"*.netjava"表示所有以".netjava"结尾的都会对应到这个配置上"/servlet/*"表示所有在app绝对路径后加"/servlet/<RegisteredServletName>"的都满足。

关于Web中路径的配置,有很多可以说的,网上的牛人已经为我们做好了铺垫:

http://www.iteye.com/wiki/topic/800415 

对于解决措施,网上也有不少解决方法,这里就不列举。

 

 

2数据的存储

servlet中数据一般是以"key-value pair"存储的。关于requestsessoincontext的作用范围以及session的会话超时与无效这里就不赘述了,很好理解。

 

 

3servlet的过滤和监听

过滤:实现的细节我不想再这里讲,重点是明白:过滤器就是加在请求具体的servletjsphtmlweb资源之间的一层东西,以实现认证过滤、加密过滤等作用。使用的比较多的是,处理中文问题和登陆认证。

为了避免过滤器的一些诸如死循环的问题,可以在过滤器中配置有选择性的过滤,放过那些不需要安全保护的地址。

监听servlet监听器主要是用来监听sessionrequestapplication中数据的变化,例如有多少人访问我们的网站。

 

 

4servlet模型深入解析

 

AServlet生命周期和定义的方法对应如下

 

加载和实例化——DistributeServlet()

初始化——init()

请求处理——service()/doGet()/doPost()

从服务器中删除——destroy()

 

B、多线程模型

 

默认servlet使用多线程模型,就是两个客户端请求可以同时访问同一个servlet实例,懂同步的同学应该明白,这会造成一些意想不到的结果,如果要同步它只要让servlet实现SingleTreadModel接口即可(不需要实现任何方法),不过这中一个一个处理请求的方式可能会导致严重的性能瓶颈。单线程不适合于高容量的Web站点。为了减少创建实例的时间,在例如Weblogic Server的服务器上,在servlet单线程是是利用对象池来实现的。

我们一般选用默认的多线程模型,不过在使用的时候要注意servlet中变量作用域的问题


基于NetJava教材的servlet初探

 【多线程的JMM模型】

局部变量从来都是现成安全的,作用域别限制在被声明的方法中。

实例变量(可以理解为属性)在多线程模型中不是线程安全的,这里我用上面的JMM模型分析:实例变量时存在主存中的,不过任何一个线程对象的缓存中数据的改变都可能实时地导致贮存中实例变量的改变,所以,不安全。可以用实现SingleTreadModel来完全消除这种不安全性。故一般不建议使用可修改的实例变量。

静态变量:类一级的就算实现SingleTreadModel接口也不能保证线程安全,故一般只用于存储常量。

ServletContext对象由所有的servelt对象共享,不管是不是单实例都不是线程安全的。

HttpSession对象:同一会话请求的多个线程,管是不是单实例都不是线程安全的。

HttpRequest对象:是线程安全的,只属于一个请求。

你可能感兴趣的:(多线程,Web,jsp,weblogic,servlet)