[SEAM] 热帖:seam里面另人无奈的bug
无双Rama
2009-05-07
不知道大家有没有碰到这样的bug, 就是<h:commandButton /> 和 <a4j:commandButton> 的问题,此前Mrpublic 也提到过这类问题。
当你在做修改的动作时,就算你不给这些按钮加上action,只要有值改变,它就会去执行更新动作。。。。我遇到的最头痛的问题是:当用户对某行数据进行修改的时候,在后台有个验证用户输入的方法,若输入的数据非法,则不会执行更新,并弹出提示框。 可是运行后却让出现这样的现象:输入非法的数据时,它会弹出提示消息,但是却执行了更新的动作!! 我把action去掉后,奇怪的是一但有值改变,它也会执行更新的动作。。。 只有<s:button />不会出现此问题,可是我这里必须要用到<a4j:commandButton>,因为我用到的几个属性只有它才有,希望大家有遇到相同问题的一起来讨论帮我解决哈~~~ |
|
5day
2009-05-07
entityManager.refresh可解决。
if(验证通过){ entityManager.flush(); }else{ enttiyManager.refresh(对象); } |
|
无双Rama
2009-05-07
5day 写道 entityManager.refresh可解决。
if(验证通过){ entityManager.flush(); }else{ enttiyManager.refresh(对象); } 我现在只有把正则表达式的验证写在前台的js代码里面了,只要前台验证不通过,它是不会去执行后台的任何动作的。。。 |
|
打倒小日本
2009-05-08
这哪是BUG啊 还是楼主没理解JSF的生命周期
具体周期过程就不说了 解决这个问题需要定义一个JSF验证器 如果验证器不通过 那么就不会更新后台的值了 |
|
无双Rama
2009-05-08
打倒小日本 写道 这哪是BUG啊 还是楼主没理解JSF的生命周期
具体周期过程就不说了 解决这个问题需要定义一个JSF验证器 如果验证器不通过 那么就不会更新后台的值了 你不給它action,当有值改变的时候它照样执行update动作,这不是bug?还是我对此不太懂没有作原理性研究,呵呵。。。看来不能以servlet的观点来看待呀。、 以后都不敢在action中来进行验证了,直接写在bean中~~~~~ |
|
打倒小日本
2009-05-08
无双Rama 写道 当有值改变的时候它照样执行update动作
这句话具体是指?没太明白 辛苦贴一下代码 |
|
wan_2004
2009-05-08
immplate这个属性 = true 就不会提交了(属性名大概就是这个)
|
|
darwinwen
2009-05-09
这是JPA的自动脏检测,解决办法,如果你是开启一个长会话,记得在@Begin里面将flushMode=设置为MANUAL模式,可解决这个问题,给你一个例子。
@Begin(join = true, flushMode = FlushModeType.MANUAL) |
|
无双Rama
2009-05-11
打倒小日本 写道 无双Rama 写道 当有值改变的时候它照样执行update动作
这句话具体是指?没太明白 辛苦贴一下代码 页面中用于修改的modalPanel: <rich:modalPanel id="update_er" minHeight="200" minWidth="450" height="300" width="300" zindex="2000"> <f:facet name="header"> <h:outputText value="編輯幣別" /> </f:facet> <f:facet name="controls"> <h:graphicImage value="/img/close.png" style="cursor:pointer" onclick="Richfaces.hideModalPanel('update_er')" /> </f:facet> <h:form> <rich:spacer> </rich:spacer> <center><h:panelGrid columns="2" cellpadding="6"> <h:outputText value="主要幣別" /> <h:selectOneMenu value="#{currencyExchangeRateHome.mtccid}" > <f:selectItems value="#{currencyExchangeRateQuery.currentCurrencyList}"/> </h:selectOneMenu> <h:outputText value="兌換幣別" /> <h:selectOneMenu value="#{currencyExchangeRateHome.mtecid}"> <f:selectItems value="#{currencyExchangeRateQuery.exchangeCurrencyList}"/> </h:selectOneMenu> <h:outputText value="兌換年月" /> <h:inputText value="#{currencyExchangeRateHome.instance.exchangeDate}" validator="#{currencyExchangeRate.validate}"> </h:inputText> <h:outputText value="匯率" /><h:inputText value="#{currencyExchangeRateHome.instance.exchangeRate}" /> <a4j:commandButton oncomplete="Richfaces.hideModalPanel('update_er')" value="保存" reRender="huilv,form1" /> <a4j:commandButton oncomplete="Richfaces.hideModalPanel('update_er')" vlaue="取消" /> </h:panelGrid> <h:panelGroup> <rich:messages style="color:red"/> </h:panelGroup> </center> </h:form> </rich:modalPanel> 后台就不用贴了吧,就是一个DataModel用于查询,然后就是增删改。。。 注意,这个页面中 保存的按鈕 我在这里故意不给它action,当你修改值后再点击它的时候,控制台显示已经执行了update~~~ |
|
无双Rama
2009-05-11
to darwinwen:
我的发贴页面出了点问题,看不到右边的“引用/收藏”,所以只有在这里写了。。 很感谢你的方法,虽然我用其它途径避免了此问题,但是我还是很想知道产生这个问题的根本原因 你的方法我刚才试过,有效。但是可能是我的环境不同,所以还有个小问题,开发中他们都是在xml中开启长会话,所以我只能这样改:<begin-conversation join="true" flush-mode="manual"/> ,而改成这样之后 就不会出现以上的问题了,可是页面中的值却跟着改变了,我刷新也没用,直到我关闭页面 重新运行页面,它的值才会显示成最初未改动的值。。。而在整个过程当中,DB的数据是一直没变的(这是我想要的),可是我怎么样才能让页面的值不会出现那种“假象”?? |