有关servlet
发布日期:2021-10-05 07:45:40 浏览次数:5 分类:技术文章

本文共 1687 字,大约阅读时间需要 5 分钟。

一、今天servlet在跳转的时候遇到一个问题:无论是转发(foward)还是重定向(redirect)

都会报错:

后来发现原因是:

在servlet的doget方法中调用了 super.doGet(req,resp);

解决办法:把他去掉就好了

=================================================================

二、在servlet中获得请求的路径:

String requestURI = req.getRequestURI();//   /myStruts1/test/test1.action

三、servle的init()方法:

只有在第一次请求时调用]

* 读取配置文件内容,并缓存起来

四、有关servlet的线程安全问题:

servlet默认是线程不安全的,如果需要线程安全需要指明:

servlet/jsp 由于其多线程运行具有很高的执行效率,同时也引起了线程安全问题。然而很多人编写servlet/jsp时没有注意多线程安全性问题。

这样造成编写的程序在少量用户访问时没有任何问题,而当并发用户上升到一定值时,就会出现莫名其妙的问题:

sevlet多线程是建立在java多线程机制上的。,他的生命周期由web容器负责。当客户端第一次请求该servlet时,servlet容器将会根据web.xml配置文件实例化这个servlet类

当有新的客户端请求这个servlet时,一般不会再次实例化该servlet类,也就是多个线程在使用这个实例。

servlet容器会自动使用线程池技术支持系统运行。

这样,当两个或者多个线程同时访问同一个servlet时,可能会多个线程同时访问同一资源的情况,数据可能会变得不一致。

下面看实例:

解决方案:

方案一、实现 SingleThreadModel 接口:该接口指定了系统如何处理对同一个Servlet的调用

实现这个接口后,这个servlet中的service方法将不会有两个线程被同时执行。也就没有线程安全的问题了。

public class  Concurrent   extends   HttpServletimplements  SingleThreadMOdel{

}

缺点:为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销

方案二:同步对共享数据的操作:用synchronized(this){}

缺点:被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态

另外为保证主存内容和线程的工作中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能

方案三、避免使用实例变量(最好的方法)

本实例中的线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。

修正上面的Servlet代码,将实例变量改为局部变量实现同样的功能,代码如下

小结

  Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要特别注意。线程安全问题主要是由实例变量造成的,因此在Servlet中应避免使用实例变量。如果程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,但为保证系统的最佳性能,应该同步可用性最小的代码路径

==================================================

四、servlet的request,,response区别:

request 是请求的载体,它附带着,请求的参数,ip,cookie,表单,字符编码,或者上传文件。你可以通过request去获得你所需要的信息。response是响应的载体,你可以设置,表头,报文,响应文件类型,字符编码,
response,自带一个输出流(printWriter),当你需要将一个页面或者一个文件传到客户端时,你可以通过这个流来进行操作。

转载地址:https://blog.csdn.net/lixld/article/details/37385117 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:如此简单的dwr
下一篇:java基础的,随便记录

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月10日 00时20分27秒