Java-Servlet的转发与重定向、Servlet的单例问题

区别:

1.客服端浏览器的地址栏

重定向会将URL指向jsp页面;转发不会

2.转发可以携带数据,重定向不行

3.重定向发生在客服端,转发发生在服务端,客服端不知道服务器如何操作

4.重定向时,客服端发送了两个请求,而转发只发送了一个请求(本质区别)

最后这一点有点难理解,举个例子:

a、你向你爸要钱,你说“爸给我点钱” (请求)

你爸摸摸口袋发现没有,起身去房间里拿钱(至于是在房间里面找钱,还是向你妈妈要钱我们不知道)

再回来把钱给你

这就是转发

(客户端不知道服务器的操作)

b、你说“爸给我点钱” (请求)

你爸摸摸口袋发现没有,对你说“去!找你妈要去!”(告诉你一个新的地址)

然后!你就可以去找妈妈要钱了...

这就是重定向

(发生在客户端,客户端知道该如何做)

servlet 的单例问题

当 Servlet 被第一次访问后就被加载到内存,以后该实例对各个请求服务,即在使用中是单例

那我就想到了{{12306:0}}

我们就假设这是是一个购票网站的 Servlet,每个游览器都是一个用户做个测试吧!

这边重新写了一个Servlet(就不写页面了)

不加同步锁

浏览器的情况

明明只有两张票!三个浏览器都显示买到票了明显是有问题的!

加上同步锁的情况!

就设置了两张票!用三个游览器作为三个用户端

看看那个浏览器能抢到票!

我就不报浏览器的名称了!因为不是同时启动的,结果没有参考价值!

那么通过这个实验给大家一个小建议

1.如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制 synchronized (对象){ //代码 }

2.如果一个变量不需要共享,则直接在 doGet() 或者 doPost() 中定义.这样不会存在线程安全问题

猜你喜欢

转载自blog.csdn.net/weixin_39214481/article/details/88352456