区别:
1.客服端浏览器的地址栏
重定向会将URL指向jsp页面;转发不会
2.转发可以携带数据,重定向不行
3.重定向发生在客服端,转发发生在服务端,客服端不知道服务器如何操作
4.重定向时,客服端发送了两个请求,而转发只发送了一个请求(本质区别)
最后这一点有点难理解,举个例子:
a、你向你爸要钱,你说“爸给我点钱” (请求)
你爸摸摸口袋发现没有,起身去房间里拿钱(至于是在房间里面找钱,还是向你妈妈要钱我们不知道)
再回来把钱给你
这就是转发
(客户端不知道服务器的操作)
b、你说“爸给我点钱” (请求)
你爸摸摸口袋发现没有,对你说“去!找你妈要去!”(告诉你一个新的地址)
然后!你就可以去找妈妈要钱了...
这就是重定向
(发生在客户端,客户端知道该如何做)
servlet 的单例问题
当 Servlet 被第一次访问后就被加载到内存,以后该实例对各个请求服务,即在使用中是单例
那我就想到了{{12306:0}}
我们就假设这是是一个购票网站的 Servlet,每个游览器都是一个用户做个测试吧!
这边重新写了一个Servlet(就不写页面了)
不加同步锁
浏览器的情况
明明只有两张票!三个浏览器都显示买到票了明显是有问题的!
加上同步锁的情况!
就设置了两张票!用三个游览器作为三个用户端
看看那个浏览器能抢到票!
我就不报浏览器的名称了!因为不是同时启动的,结果没有参考价值!
那么通过这个实验给大家一个小建议
1.如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制 synchronized (对象){ //代码 }
2.如果一个变量不需要共享,则直接在 doGet() 或者 doPost() 中定义.这样不会存在线程安全问题