关于STRUTS2的传值问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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的原理及流程。
参考技术A 这个是谁教你的啊!
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标签啊!
命名页不规范!
这些解决了,再解决那个值的问题!
养成良好的习惯啊!
参考技术B 右键-》查看源文件。

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

再选456-》是什么呢?如果是456,123,456就不知道是啥原因了,但如果是456,就肯定是代码问题了
参考技术D 要取得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方法去掉

jsp页面和action的传值与action和action之间的转换传值等四个问题

 

 

情况一:jsp提交到某个action中,如果该action方法执行完毕之后还要转到该action中的另一个方法,

 

那么可以直接返回的时候返回该另一个方法,然后struts.xml中也要配置该方法

 

情况二:

jsp页面提交某个action中,如果giantaction方法执行完毕之后还要转到另一个action中的某方法

 

此时需要用到重定向

只需要return "name值"

技术分享

然后在struts.xml中配置重定向name 值,type类型使用redirect.

技术分享

 

如果需要传递参数,可以如下使用param标签,然后再download的action中定义参数,和get和set即可

技术分享

 

情况三:

 

在某个action页面中展示的页面中,如果要通过按钮转到另一个action中的方法.

如:

技术分享

通过点击按钮转到另一个jsp页面,提交的时候可以直接转到另一个action如:

 

技术分享

在struts.xml中;直接写出该action既可

技术分享

,如果需要传递参数,那么可以通过将url中参数通过param对象获取到key值放到input隐藏域中的value中.然后在上面的action中写该参数的属性的get和set方法,就能传递到action中了.

 

 

情况四:

如果是必须通过struts.xml来进行传递参数,也就是如下:

技术分享技术分享

传递之前需要取到paperId的值,可以通过在jsp页面上添加隐藏域,取到paperId,

如下:那样在上面的action中就有paperId的值了.

技术分享技术分享

然后进行xml来传递参数.如下:

技术分享技术分享

只需要在传递的action中定义相应的paperId属性,通过get和set来取到值既可.

以上是关于关于STRUTS2的传值问题?的主要内容,如果未能解决你的问题,请参考以下文章

struts2中jsp页面与action之间的传值

jsp js action之间的传值

struts2 的action 怎么向页面传值?

struts2 action怎么从页面取值传值

struts2传值的四种方式

js 往struts2传值,java接收不到