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同时对外部文件访问修改,一定要加上锁,做到互斥访问
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同时对外部文件访问修改,一定要加上锁,做到互斥访问