一.错误处理
在Web应用程序中可能生成错误并引发异常
可以发送错误信息和状态代码,为用户提供关于错误和异常的信息。
1.状态代码
(1)状态代码是应用程序服务器发送到客户端的关于客户端请求是成功或失败的信息
(2)Http状态代码用三位数字表示
(3)状态代码逻辑上可分为以下五个类别:
提示信息(1XX):表示接受的请求与应用程序服务器正处理的请求的信息,表示请求已被接受,需要继续处理。
成功(2XX):表示成功消息,它表示接受了或处理请求成功。
重定向(3XX):表示重定向消息,他表示请求重定向到另一个页面处理和服务。
客户端错误(4XX):表示客户端错误,他表示请求中有一些错误导致无法提供服务。
服务器错误(5XX):表示服务器错误,他表示服务器无法完成客户端请求。
2.常用状态代码
200(SC_OK):请求成功
301(SC_MOVED_PERMANENTLY):重定向,客户请求的文档在其他地方,客户端应该自动访问新的URL。
302:重定向,客户请求的文档在其他地方,新的URL应该被视为临时性代替
304:客户端请求的网页没有修改,可直接从缓存读取。
404:表示客户机请求的资源因某种原因不可用
410:表示资源已不再用,一般可能是永久被删除了。
500:服务器中有错误,无法完成处理请求
3.错误处理和异常
(1)声明式错误和异常处理
在web.xml文件中配置的方式处理错误
A.针对某种错误代码(404)配置错误页面
B.针对某种异常配置错误页面
(2)编程时错误和异常处理
使用try-catch-finally结构编写代码处理异常
4.自定义发送状态码
(1)调用setStatus()设置状态码,主要是设置非错误状态码。
(2)调用sendError()方法发送错误状态码,主要是4和5开头的状态码
二.请求转发和响应重定向
1.响应重定向:将用户重定向到另一个页面,显示响应内容给用户
重定向会发起一个新的请求
调用响应对象的sendRedirect()方法重定向到制定页面
重定向后,地址栏显示重定向后的servlet或jsp的url
我们在网站建设中,时常会遇到需要网页重定向的情况:
1.网站调整(如改变网页目录结构);
2.网页被移到一个新地址;
3.网页扩展名改变(如应用需要把.php改成.Html或.shtml)。
这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。
2.请求转发:将同一个请求对象转发给制定的servlet或页面
请求转发地址栏显示发送请求时 请求的资源的url
转发是将当前请求转发出去,所以转发者和转发目标受到的请求是用一个
1.调用RequestDispatcher对象的forward()
A forward B最后显示B的Content
2.调用RequestDispatcher对象的include()
A include B = A + B content
三.线程模型
1.Servlet规范中定义了一下两种线程模型
(1)多线程模型
(2)单线程模型
2.多线程模型
(1)Web容器默认使用多线程模型处理Servlet
(2)一个Servlet不是程序启动就是实例化(除非在web.xml设置了load-on-startup),而是在第一次收到请求的时候被实例化。后续如果再次向该Servlet请求,则直接使用直接创建的Serlet实力,而不是再创建一个实例。
(3)虽然是单实例,但是为了能够同时服务多个请求,web容器对并发的多个请求分配单独的一个县城处理请求,也就是单实例,多线程模式
(4)单实例,多线程容易引发县城安全问题,也就是很有可能多个县城访问同一个资源或数据。
备注
(1)多线程模型不是说有多少并发的请求,就启动多少个县城处理请求。
(2)Web容器通过管理县城池来提高效率和性能和更好的管理线程。
(3)Web容器会在一开始就创建一些线程,留在出处理请求
(4)当并发请求增多,web容器会多创建一些线程放入线程池,为增多的请求服务,但不会请求增多少,线程也增加那么多。
(5)如果线程池中控线的线程很多,则线程池根据设置关闭一些线程。
为何使用线程池:
减少创建和销毁线程的开销
县城可被反复利用,可多次执行任务
可根据系统承受能力和实际需求调整线程数量
四.单线程模型
1.可通过让Servlet类实现SingleThreadModel接口采用单线程模型
2.但是,SingleThreadModel接口一杯废除,因为他增加了开销,降低效率,而且并不能真正解决线程安全问题
3.在单线程模型下,每个请求会被分配一个Servlet实例,也就是说并发的多个请求每个都有一个单独的Servlet实例处理。
4.Web容器通过Servlet处理多个请求,如果请求数量超过可用的Servlet实力数量,则请求被加入队列,等候处理
五.解决线程安全问题
1.一朵线程模型开发servlet时,需处理线程问题以保护共享资源,也就是解决线程安全问题
2.若要开发线程安全的servlet,首先要确定属性类型本质上就是线程安全的类型。
3.线程安全中,上下文对象中的属性不安全,会话对象中的属性不安全
六.可遵循的开发servlet线程安全的两种方法
1.访问共享资源是同步方法,在方法前添加synchronized关键字
同步化方法后,该方法在同一时刻只能有一个线程访问该方法,其他线程需要等待该线程调用完方法在访问。
2.