关于STRUTS2的传值问题?

Action类中的部分代码
private String str;

public String getStr{
return str;
}
public void setStr(String str){
System.out.println("页面传来的值:"+str);
this.str = str;
}

页面代码
<s:form name="actionForm" action="">
<s:select name="str" list="#{'123':'123','456','456'}"
listKey="label" listValue="value" onchange="javascript:actionForm.onsubmit()" />
</s:form>
选择456时,提交表单到Action,控制台输出结果为
页面传来的值:456
Action执行完成后返回同一页面,此时选择123,执行onchange事件提交表单到Action,控制台输出结果为
页面传来的值:123,456

我想问的是为什么会出现这种情况,第二次提交不能覆盖第一次的值????
本以为是缓存的问题,结果缓存禁了也不行,Action配置文件的scope设为"singleton"和"prototype"都不行,请问怎么解决???????
回apollo47,已经看过,页面值正确。
回laogao3232,之所以写错是因为我不是复制过来的,是提问时手敲的,我所说的Action配置文件是指
<bean id="daglBeikaobiaoAction"
class="com.Test.web.DaglBeikaobiaoAction" scope="singleton" />
scope="singleton"或scope="prototype"配置是指单例或多例模式。
另:页面肯定是struts标签。

回xiaoqulai,我早就把scope的设置改为了prototype,但是问题依旧,可能是我眼拙,调试时看不出什么问题,不知道还有没有什么建议

恭喜你gisfresher,你推断完全正确。再选就会继续累加

回xiaoqulai,我早就把scope的设置改为了prototype,但是问题依旧,可能是我眼拙,调试时看不出什么问题,不知道还有没有什么建议
--------------------
你的问题我下面已经说了。
你的值出现累加就是因为你的三次请求的三个线程访问了同一个对象实力。这说明两个可能:
1.你的action对象是单例的——尽管你一再强调你的配置文件使用的是prototype。请检查以下你的配置文件是否有错。比如有没有可能使用了某些插件,覆盖了你的设置。
2.你的标签使用不当,建议你了解<s:select />的每一个属性,也许你还需要在多一个属性没有写。

我不知道你的问题在哪,但我可以告诉你如何解决这个问题:就是在<s:select />中加一个属性value=""就可以了,假如有value这个属性的话。
你还可以multiple="false"

如果你的action是单例的,那么里面的定义的变量就会被多个线程共享。

你前后提交的两个请求是不同的线程,它们会在变量中累计,因此,你的第二次请求会加上第一次的请求。

所以,我可以肯定的告诉你,你的问题是你的Action不是原子的,而是单例的。

所以第一,你一定要将action配置为prototype。

如果还出现这个问题,其实是可以通过调试找出问题的。

我们没有必要对一个技术太过深究,struts2确实很好,但并不代表你需要使用它的一切,所以你如果找不出问题来,就别用它的标签好了。建议使用sun官方的jstl标签加el表达式。

另,不懂就别到这乱说,搞些错误的东西来误导人哈!!
--------------------------------------------

laogao3232 说:

这个是谁教你的啊!
action里怎么能写
private String str; ...

这个说法不正确的,我们不仅要这么些,而且还鼓励这么写,我们要去掉他娘的from对象。
struts 2.0之前的版本最大败笔就是form对象和struts标签,form对象严重影响了我们优良的程序设计,通过DTO设计模式,我们原本可以直接将对象传递到jsp,因为有了一个form,我们不得不将对象一个个变成form,再传过去。
struts标签更是烂,生成的form表单,连ID属性都没有,大家知道,ID属性是DOM树中唯一的引用标识,我们很多客户端的JS和CSS都需要ID!!!
struts2.0的标签大有改进,但还是不够灵活。

总值,struts2 以前的版本不允许是因为action中的变量是多线程共享的,但struts2 action对象是是可以配置为原子的prototype,就没问题了。
楼主的问题在于还没有理解struts2的精髓,就算这个问题解决了,还会碰到其它很多的问题。建议先理清struts2的原理及流程。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-05-30
这个是谁教你的啊!
action里怎么能写
private String str;

public String getStr{
return str;
} //还少个()
public void setStr(String str){
System.out.println("页面传来的值:"+str);
this.str = str;
}

这个呢,会被鄙视的。
onchange="javascript:actionForm.onsubmit()"这个也不能这么写!

Action配置文件的scope要写session或者request,page等等吧。
标签用的页不对啊!要用struts标签啊!
命名页不规范!
这些解决了,再解决那个值的问题!
养成良好的习惯啊!
第2个回答  2008-05-30
右键-》查看源文件。

我怀疑123选项值是 123,456。即:
</select>
<option value="123,456">123</option>
...
第3个回答  2008-05-31
既然你的代码是手敲的,那大家就不能根据代码做判断,如果不方便把代码和配置都粘上来,那就这样推断
选择456 -》456
然后选择123-》123,456

再选456-》是什么呢?如果是456,123,456就不知道是啥原因了,但如果是456,就肯定是代码问题了
第4个回答  2008-05-30
要取得Book对象的bookid属性的值有两种方法:
第一,使用<bean:write>标签,写法如下
<bean:write name="book" property="bookid"/>
第二,使用EL,写法如下:${book.bookid}。
要注意的是,必须支持JSP2.0,因为只有JSP2.0才支持表达式语言(EL)。另外,这个表达式的原理是调用Book中的getBookid()方法,所以你的类中可以没有申明bookid这个属性,但是一定要有getBookid()这个方法,只不过,你需要在这个方法中返回你要的值而已。
比如,我们在一个类(A)中申明了单价(price)&数量(quantity),但是总价可能我们仅仅只是用作显示,那么我们可能就不必在该类中申明total这样一个属性,而只需申明如下方法:
public int getTotal(){
return (price * quantity);
}
假设request中有A的对象a,
在页面我们可以这样写${a.total}.
第5个回答  2019-04-10
你应该在构造方法里面new一个bean
可以这样写
public
Action3(){
if(ab1==null)
ab1
=
new
ActionBean1();
}
把在action中的ab1的get和set方法去掉

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网