用servlet和jsp写拉个购物车程序,本来单机运行可以的,后来我用2台电脑访问,发现拉个严重的问题,购物车的数据怎么共享拉!!请进来看

jy00057800 2005-11-05 10:35:23
是servlet写的 web里面配置好拉可以用的
数据库:数据库里面有2个表。
1:用户表存放用户信息的。登陆验证什么的。
2:商品表,用户登陆就会读这表里面的内容。

思路:我写拉
DateBaseConnection 连接数据库
ShoppingCar 购物车(里面有Map,Collection放物品)
User,存放用户信息
Product,商品信息
Items:封装Product类,里面还有变量保存商品的数量,用户结帐用的
LogServlet 用户登陆时连接数据库,然后在这里面读取商品的信息,用out发送到客户端
另外还有2个PutinShoppingCar,ReadShoppingCar是放入和查看购物车用的
问题就是:session我是用servlet的方法得到的是一样的,
为什么2个用户的时候,放入购物车的内容变成一起用的呢?A用户放入,B可以看到自己的购物车多拉东西,A用户清空,B用户购物车里面的也都没拉,是什么原因啊
...全文
353 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Error404 2005-11-11
  • 打赏
  • 举报
回复
这个问题有人问过了,但忘记是怎么解决的了。我是这样处理的,后面登录的把前面的踢出去。如果前一客户端再次访问,就提示“由于有同名用户在别处登录,你已被注销”,然后要求重新登录。
jy00057800 2005-11-11
  • 打赏
  • 举报
回复
今天回家拉 恩 到学校一看果然是 全局里面 初始化的,改到server(x,x)里面初始化就好拉谢谢
我还作好拉
1:只允许同一个帐号,不可以重复登陆,
2:用户如故直接关浏览器,在一个线程里面,检验没操作的session,把session失效(失效时间是30分钟),
请问第2个 我的方法对吗?
我发现,因为登陆我是改变user_info表里面的一个isLog变量,
来判断帐号是否登陆(0没登陆,1登陆),但是如果用户直接关浏览器的话,在30分钟后,user_info里面的那个isLog才会在线程里面恢复到‘0’。这样的话,用户如果直接关浏览器后,在登陆那个帐号,就必须等30分钟才可以,否则会显示,帐号已经登陆。
请问我的这算法对吗?上面的问题怎么解决
province_ 2005-11-07
  • 打赏
  • 举报
回复
还是应该放到数据表里好,我以前做过一个网络购物应用就是把用户ID及选择的商品放到表里,查询、合计、删除、结帐等都很方便,用户中途退出的话可以在SESSION的生命期结束时删除。
zeq258 2005-11-07
  • 打赏
  • 举报
回复
把你的相关代码铁出来,初步估计是线程同步的问题。

在你的方法(可能引起线程不安全)上,加上同步。

synchronized,这样,就可以了!
cdwei80 2005-11-07
  • 打赏
  • 举报
回复
就是说为了克服线程同步的问题, 尽可能不要使用实例变量, 应该使用局部变量!
ASPGuy 2005-11-07
  • 打赏
  • 举报
回复
我认为
你没有弄清楚servlet和jsp生命周期的区别
jsp的确是对每一个用户都会新打开一个页面,也就是说用户A和用户B的数据绝对不会共享
但是servlet只要第一次被load就会长驻内存,直到被垃圾收集
因此,很多成员,不能共享(不管静态不静态)。
也就是说
如果
public class Sservlet extends HttpServlet{
Vector vec=new Vector();
public void doPost(...)...
{}
}
就会出现你说的问题,数据共享。
如果
public class Sservlet extends HttpServlet{
public void doPost(...)...
{Vector vec=new Vector();
}
}
应该就不会。
等待你的回答,如果不是这个原因,请再把具体表现描述的更清楚。
sansong089 2005-11-06
  • 打赏
  • 举报
回复
因为没有看到你代码,所以只能猜测了.
如果购物车对象是在servlet的实例变量的话,所有用户是共享.
因为servlet通常是多线程的, 某个用户访问时,只会有新线程被创建(他们共享servlet的实例数据),不会有另一个servlet实例被创建.
hhj112 2005-11-06
  • 打赏
  • 举报
回复
你再创建一个全局的集合products 把每个用户操作的product放进去 每个用户操作时用shoppingcart和products进行比较再返回session中的shoppingcart
jy00057800 2005-11-06
  • 打赏
  • 举报
回复
数据库 里面 我不知道怎么建立,表间的联系,我总是想不通
现在我只是用拉session
用户我没分离,但是我登陆的是不同的用户名,而且我没有写入数据库,都是放入session里面的
,这样的话,只要客户端不同,应该没什么问题啊?
to:tiger(哈哈鱼)可以帮我 解释一下你的那结构 在数据库的表里面怎么联系呢?
to:welshem(天堂客)我在用户登陆的servlet里面先声明的是 ShoppingCar x = null;
然后在service(xx,xx)里面才初始话的,然后放入session,
DelphiStudy 2005-11-06
  • 打赏
  • 举报
回复
存入数据库即可.
ftiger 2005-11-06
  • 打赏
  • 举报
回复
是否是同一个用户名登录?
Items是appplication级的话,是否有分离用户的参数?

应当是user--shoppingcar--items这样的结构逻辑更好吧。
welshem 2005-11-06
  • 打赏
  • 举报
回复
你每次要保证向Session传的是新建立的ShoppingCar而不是声明时已实例好的那个
jy00057800 2005-11-06
  • 打赏
  • 举报
回复
1:2台电脑 怎么可能 一个浏览器打开呢?
2。我的ShoppingCar里面 封装拉Items类,Items里面封装有Product类,我定义的是全局变量
但是我没有用static啊!而且定义的全局ShoppingCar的只是一个引用而已,是在doPost(xx,xx)里面初始化的
歪嘴鱼 2005-11-05
  • 打赏
  • 举报
回复
是不是购物车用了静态成员变量来存放
like this
private static ShoppingCar xxx=new ShoppingCar ();
leekooqi 2005-11-05
  • 打赏
  • 举报
回复
你是用一个浏览器打开的吧?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧