[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的数据是一直没变的(这是我想要的),可是我怎么样才能让页面的值不会出现那种“假象”??
Global site tag (gtag.js) - Google Analytics