读书人

(奉送100分请各位帮忙啊)JSF的views

发布时间: 2012-12-15 15:16:03 作者: rapoo

(奉送100分请各位帮忙啊)JSF的viewstate问题
本帖最后由 benben821024 于 2012-11-29 13:26:21 编辑 关于JSF的viewstate保存的问题。

目前是把viewstate设置成保存为server端,但是这样出现了一个问题就是
每次用同一个浏览器打开不同的tab,比如说用两个tab打开个2不同内容的帖子,然后对之前打开的帖子进行回复的时候,内容竟然跑到后面帖子里面去了。

这个应该是viewstate保存到server端后,只能记住最新状态的viewstate的原因。
我看了一些资料说可以在web.xml中设置让viewstate为每个用户多保存几个最新状态。
<context-param>
<param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name>
<param-value>10</param-value>
</context-param>
但是怎么好像不起作用呢?另外,这个设置过大貌似会很耗服务器端memory的。

我知道将它保存在client端就没有这个问题了,但是保存到client端(尽管可以压缩)每个请求都需要传递viewstate,占带宽,页面加载速度也受影响。

请问各位有什么方法让viewstate可以保存在server端,有可以解决我遇到的这个问题呢?
在线等哦~~
[最优解释]
加我QQ:139575990
[其他解释]
怎么没人理我涅?
[其他解释]
该回复于2012-11-29 13:44:38被管理员删除
[其他解释]
为什么一定要用这个viewstate呢?
看你的描述,是对帖子进行回复是吧?那么,回复按钮,你总要按一下吧?
每个帖子也总有一个回复按钮。在回复按钮上添加该帖子的id,传给服务器端,不就可以了?
[其他解释]
打开帖子的时候,就获取帖子本身的id,然后设置到回复按钮的value属性中,这个很简单的。
[其他解释]

引用:
为什么一定要用这个viewstate呢?
看你的描述,是对帖子进行回复是吧?那么,回复按钮,你总要按一下吧?
每个帖子也总有一个回复按钮。在回复按钮上添加该帖子的id,传给服务器端,不就可以了?
+1
[其他解释]
引用:
为什么一定要用这个viewstate呢?
看你的描述,是对帖子进行回复是吧?那么,回复按钮,你总要按一下吧?
每个帖子也总有一个回复按钮。在回复按钮上添加该帖子的id,传给服务器端,不就可以了?

其实我也不想用啊,没有办法我只是个搞维护地~~
你说的这个方法应该是可以的,也不难.只是我做的系统里不止这些,要改的地方比较多(这个系统已经在用了,上面不太让改代码),所以暂时还没有考虑这么做.
高手,我知道这个viewstate比较麻烦,但是还有没有其他的方法哦.拜托啦~~
[其他解释]
一个ie窗口的tab是共用一个进程资源的。

你可以开两个ie窗口,注意是两个ie窗口,而不是tab页。


不同的ie窗口分别对应不同的进程,而相同ie窗口其实就是和同一个进程没有区别,自己调用自己。

所有才会有你这样的结果,不信你开两个ie窗口试试就知道了。

[其他解释]
这个明显是个bug,开发时出的bug,怎么不能改?可以光明正大地改。
但如果之前没出过这问题,那就恢复原设置。
如果是新开发的功能,这也不符合项目要求,也是必须修改的内容。楼主拿出底气来和项目经理说,不用太纠结。

和项目经理沟通的时候,要说出修改的思路。其实改动相当小。
给你提供下基本思路:
①要在request里面设置帖子的id;如果request里面已经有帖子id了,那么这部分不用修改;
②生成帖子的jsp,按钮的属性,增加value="${帖子对象名.帖子id}"。
比如,原来的按钮为:
<input id="replybtn" type="submit" value=""/>
就改为:
<input id="replybtn" type="submit" value="${帖子对象名.帖子id}"/>
③接收到回复信息,服务器端肯定要检查帖子id的,所以回复的接收逻辑应该不用改。要是服务器端都不辨识下帖子id,那这个系统原始开发就做得太烂了,要向经理申请去打开发者的屁股
[其他解释]
引用:
这个明显是个bug,开发时出的bug,怎么不能改?可以光明正大地改。
但如果之前没出过这问题,那就恢复原设置。
如果是新开发的功能,这也不符合项目要求,也是必须修改的内容。楼主拿出底气来和项目经理说,不用太纠结。

和项目经理沟通的时候,要说出修改的思路。其实改动相当小。
给你提供下基本思路:
①要在request里面设置帖子的id;如果request里面已经有帖子id了,那么这部分不……


+1
[其他解释]
引用:
一个ie窗口的tab是共用一个进程资源的。

你可以开两个ie窗口,注意是两个ie窗口,而不是tab页。


不同的ie窗口分别对应不同的进程,而相同ie窗口其实就是和同一个进程没有区别,自己调用自己。



所有才会有你这样的结果,不信你开两个ie窗口试试就知道了。


首先谢谢你的回答,你说的这个我知道,问题是人家客户要这么用啊。呵呵
[其他解释]
引用:
这个明显是个bug,开发时出的bug,怎么不能改?可以光明正大地改。
但如果之前没出过这问题,那就恢复原设置。
如果是新开发的功能,这也不符合项目要求,也是必须修改的内容。楼主拿出底气来和项目经理说,不用太纠结。

和项目经理沟通的时候,要说出修改的思路。其实改动相当小。
给你提供下基本思路:
①要在request里面设置帖子的id;如果request里面已经……


感谢你的回答哈,很仔细呢,这个的确可以说是之前做的时候没有考虑到吧。
做法我明白,只是还有一个地方我还不清楚怎么修改或者说是不是我考虑的太多了?

比如说发帖子的时候要上传附件,如上面所说,在一个浏览器中同时打开两个tab(A和B),
如果对之前打开的tab页面A上传附件,再去上传后面打开tab页面B里的附件,在A中上传的附件也会出现在B页面的附件列表中。因为此时该帖子还没有ID(好像rich:fileUpload上传控件也不支持这种传参?),所以还不知道怎么解决?

高手,你说这种情况我需不需要考虑呢?实际应用中客户会这样使用么?我是菜鸟,大家多帮忙哈。
[其他解释]
各位大侠帮忙啊。
[其他解释]
引用:
引用:
一个ie窗口的tab是共用一个进程资源的。

你可以开两个ie窗口,注意是两个ie窗口,而不是tab页。


不同的ie窗口分别对应不同的进程,而相同ie窗口其实就是和同一个进程没有区别,自己调用自己。

所有才会有你这样的结果,不信你开两个ie窗口试试就知道了。
首先谢谢你的回答,你说的这个我知道,问题是人家客户要这么用啊。呵呵


哦,我大概推断出,你的问题了。

你回复的留言,没有和帖子关联起来,
正常的话,留言表有一个帖子表的外键,你检查下你留言的时候,是否该条记录中外键有没有加上。

[其他解释]
引用:
感谢你的回答哈,很仔细呢,这个的确可以说是之前做的时候没有考虑到吧。
做法我明白,只是还有一个地方我还不清楚怎么修改或者说是不是我考虑的太多了?

比如说发帖子的时候要上传附件,如上面所说,在一个浏览器中同时打开两个tab(A和B),
如果对之前打开的tab页面A上传附件,再去上传后面打开tab页面B里的附件,在A中上传的附件也会出现在B页面的附件列表中。因为此时该帖子还没有ID(好像rich:fileUpload上传控件也不支持这种传参?),所以还不知道怎么解决?

高手,你说这种情况我需不需要考虑呢?实际应用中客户会这样使用么?我是菜鸟,大家多帮忙哈。


呵呵……这个解决方案,仍然是和回复一个道理。反问一句:你见过哪个论坛,能在断网的情况下也能发帖的?从来没有。必然要服务器先发送一些基础数据。新建帖子的时候,就应该传递一个帖子的id值。
新建帖子就相当于回复一个“内容为空”的帖子,然后按钮的文字有所不同,由“回复”变成了“发帖”。

上传文件的那一栏,也应该要带有帖子的id。保存草稿时,也是保存的这个id值。
id值不用吝啬,上亿个,随便分发就是。
[其他解释]
引用:
哦,我大概推断出,你的问题了。

你回复的留言,没有和帖子关联起来,
正常的话,留言表有一个帖子表的外键,你检查下你留言的时候,是否该条记录中外键有没有加上。


你说的这些都是加了的哦。
[其他解释]
断网的情况下,点击“发帖”,都不可能进入发帖页面。
新建帖子,应该由服务器发送最新的id给客户端。
[其他解释]
引用:
干脆把我的web.xml代码贴一部分。
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>


貌似配置没贴对?
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
[其他解释]
可能我没有表达清楚?

我用的JSF框架(myfaces)+Facelets.

这个主要是和服务器端只保存最新一次viewstate(UI试图状态)有关系,
我开了两个tab页面A和B之后,服务器就只记住了最新打开的tab页面B的信息,所以
我即使想回复的是A的帖子,服务器早就把A是谁给忘记了,就只认识B了,所以回复就到了B上去了。
同理,我若点击一个链接想查看A的详细信息,其实查看到的也只会是B。
所有在这两个tab页面的操作都会出现这种情况。其实和代码关系不大的。
之前blazingsoul回答的只可以解决部分页面的问题(当然这部分本来也可以说做法就有问题的),有些画面有传递ID的,比如查看A的详细信息时,肯定是有传递ID的呀,但服务器它老人家只认识这个B页面的ID,它只返回给B页面的详细信息给你看。



干脆把我的web.xml代码贴一部分。
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>[color=#FF0000]server</param-value>
</context-param>[/color]
现在的配置是viewstate保存在server端。
我把它改成client端,这问题就解决了。
但是对页面加载速度有影响,
※其实影响多大我也不清楚,总之页面增加了n多个k,基本上页面大小增加了将近1倍,而且每次request都会来回传这个viewstate(也就是n多个k)。
所以希望可以仍将viewstate保存到server,然后加上其他配置可以同时保存每个用户多个viewstate状态的配置(Google,度娘了n遍,实在无果),JSF相关资料又不多,只好求助各位啦。
[其他解释]
谢谢各位,不过目前还没有解决,期待更多的回答哦

读书人网 >Java Web开发

热点推荐