关于struts2将参数以属性的方式注入到action的疑惑,弄了两天两夜,终于发现问题所在,但是不懂其中原理。

最近在弄struts2,用的是struts-2.3.1.2版本,在将参数以属性的方式注入到action的疑惑,碰到个问题。写了一个简单的小程序,在index.jsp页面中... 最近在弄struts2,用的是struts-2.3.1.2版本,在将参数以属性的方式注入到action的疑惑,碰到个问题。写了一个简单的小程序,在index.jsp 页面中
<body>
<a href="success/success!add?username=a&age=1">添加参数</a>
<br />
</body>
在struts.xml配置文件中:
<package name="success" namespace="/success" extends="struts-default">
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<action name="success" class="org.struts2.action.IndexAction">
<result>
/success.jsp
</result>
</action>
</package>
在IndexAction中:
private String username;
private int age;

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

public String add(){
System.out.println("username:" + username);
System.out.println("age:" + age);
if(age!=25){
return ERROR;
}
return SUCCESS;
}

问题如下,在index.jsp中,如果传入的参数为:
username=aa&age=11
则程序运行正常,如果参数为
username=a&age=1"
则程序报错:
java.lang.NoSuchMethodException: org.qwj.struts2.action.IndexAction.setAge([Ljava.lang.String;)
在后台输出中输出:
username:
age:0
也就是说struts根本就没有调用我的set方法,把值注入进去。求解释!
展开
 我来答
程序员在思考
推荐于2016-02-20 · 知道合伙人互联网行家
程序员在思考
知道合伙人互联网行家
采纳数:347 获赞数:784
毕业于吉林大学计算机科学与技术学院,硕士学位。从事IT互联网工作12年,现任银行产品架构师、高级项目经理

向TA提问 私信TA
展开全部
网页上所有的元素在被解析的时候都默认为是一个字符串,也就是说不论什么框架,最好的习惯是把网页传递过来的值都当作字符串来处理,因为url本身就是一个字符串,从中截取age=1当然也认为1是一个字符串。
建议你在使用struts2的时候,所有action用于接受网页参数的属性都设置为private String,这样就不会有任何问题。就算你实际需要接受的是一个年龄或者数量这样的数值类型,也应该在接受到参数以后再做转换(Integer.parseInt).

根本原理在于,你看一下jsp的相关文档,request.getParameter("xxxx");这个方法只提供了一种返回类型就是String,也就是说,你如果在action里定义了一个属性age,如果是int类型,那么实际上是struts2帮你做了数据类型转换,但是这其中不排除有bug,所以还是都定义为Stirng类型为好。

struts2实际上用起来还是会发现有些bug的,呵呵,我不是说struts2不好,只是开源项目都会有缺陷,使用时尽量避免。
更多追问追答
追问
我也知道struts所谓的注入是怎么回事,只是:
第一,struts既然说可以自动帮我们把数据转换成我们需要的类型,这个应该是没有问题的,因为在index.jsp中,如果传入的参数为:username=aa&age=11则程序运行正常。
第二,我传入的username本身我在action中定义为字符串类型,但为什么
如果参数为username=a&age=1,则程序报错,在后台输出中输出:
username:
age:0
很明显,就算我把它当字符串处理,它也没有被注入任何值。
追答
那最好还是看看报错的内容了
359882466
2012-05-16 · 超过14用户采纳过TA的回答
知道答主
回答量:50
采纳率:0%
帮助的人:19.9万
展开全部
你传参方式是用URL来传递的,而用URL来传递参数的时候仅仅传递字符串,所以你传进去的参数age是String类型,而你在action中定义age的类型是int,所以会造成类型转换的错误,你可以试试在result里面添加一个“input”的结果页面,你可以发现我显示一个filederror(提示你类型转换错误了!),所以你只需要在action的excute方法中写逻辑处理就行了,用Integer.intValue()的方法将字符串转换为整数值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
智州山S
2012-05-15
知道答主
回答量:8
采纳率:0%
帮助的人:1.2万
展开全部
strut2接受页面传过来的参数都是String类型的,虽然会帮我们自动转换,但是我还是建议下面那个哥们说的那样都声明成String类型的属性来接收,用的时候在转换一下类型
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ynnuyili
2012-05-11
知道答主
回答量:12
采纳率:0%
帮助的人:4.4万
展开全部
因为它认为你的age变量是个String类型的,所以就找不到对应的set方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
铂金羊羊羊
2012-05-22 · TA获得超过1043个赞
知道小有建树答主
回答量:230
采纳率:100%
帮助的人:212万
展开全部
肯定出错啊
你的id是int类型,你改成String类型你实验一下...你自己捉摸,我相信你能想通其中的道理
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式