javaweb--servlet--servlet的异常处理和线程安全简述

servlet异常处理


1.声明式异常处理和程序式异常处理
声明式异常处理格式
<error-page>
    <error-code>404</error-code>或者<error-type>java.io.FileNotFoundException</error-type>
    <location>/web/error.html</location>//这是处理异常的页面链接
</error-page>
通过这种方式可以很方便的处理一个异常,但是它需要为每一个异常都建立一个声明,非常繁琐。仅仅适合处理一些通用的异常。

程序式处理异常
在java程序中可能出现异常的地方用try/catch包围。我们可以在catch块中获取异常信息,然后将页面跳转到专门处理异常的
servlet中去处理。
例如下面代码段:
try{
    ......
}catch( Exceprion e ){
    ......
    //封装错误类型和来源到请求中
    req.setAttribute(exceptionName,e);
    req.setAttribute(exceptionSrc,req.getRequestURL);
    //重定向到处理servlet
    RequestDispatcher rd = req.getRequestDispatcher("/web/servlet/...");
    rd.forwrad(req,resp);
}

2.线程安全的servlet
    第一个: ServletContext
        ServletContext可以同时被web应用中的所有servlet访问,多个线程可以同时在ServletContext中设置或者读取属性
        这将导致数据不一致
    第二个: HttpSession
        HttpSession对象在用户会话期间存活,它只能在处理属于同一个Session的请求的线程中被访问。
        当用户打开多个窗口,这些窗口中的请求都是同一个Session,为了处理这些请求,servlet容器会创建多个线程,在这些线程
        中,都可以同时访问Session的属性。那么就会发生线程安全问题。
        为了避免这个问题,需要对操作session属性的语句同步
        注:在多线程中要使用集合的话,通常要考虑使用同步的集合类。用Vector 代替 ArrayList
        用HashTable代替HashMap
    虽然servlet容器提供了SingleThreadModel接口来解决线程安全问题,但实际上并不能真正解决.(servlet2.4中已废弃)
    对于开发线程安全的参考:
        1.尽可能使用本地变量
        2.使用只读的实例变量和静态变量
        3.不要在servlet中创建自己的线程
        4.修改共享对象时,使用同步,尽可能的缩小同步范围,切勿doxxx在方法上使用同步,那会极大地影响性能
        5.如果多个servlet同时对外部文件访问修改,一定要加上锁,做到互斥访问
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值