关于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方法,把值注入进去。求解释! 展开
<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 · 知道合伙人互联网行家
关注
展开全部
网页上所有的元素在被解析的时候都默认为是一个字符串,也就是说不论什么框架,最好的习惯是把网页传递过来的值都当作字符串来处理,因为url本身就是一个字符串,从中截取age=1当然也认为1是一个字符串。
建议你在使用struts2的时候,所有action用于接受网页参数的属性都设置为private String,这样就不会有任何问题。就算你实际需要接受的是一个年龄或者数量这样的数值类型,也应该在接受到参数以后再做转换(Integer.parseInt).
根本原理在于,你看一下jsp的相关文档,request.getParameter("xxxx");这个方法只提供了一种返回类型就是String,也就是说,你如果在action里定义了一个属性age,如果是int类型,那么实际上是struts2帮你做了数据类型转换,但是这其中不排除有bug,所以还是都定义为Stirng类型为好。
struts2实际上用起来还是会发现有些bug的,呵呵,我不是说struts2不好,只是开源项目都会有缺陷,使用时尽量避免。
建议你在使用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
很明显,就算我把它当字符串处理,它也没有被注入任何值。
追答
那最好还是看看报错的内容了
展开全部
你传参方式是用URL来传递的,而用URL来传递参数的时候仅仅传递字符串,所以你传进去的参数age是String类型,而你在action中定义age的类型是int,所以会造成类型转换的错误,你可以试试在result里面添加一个“input”的结果页面,你可以发现我显示一个filederror(提示你类型转换错误了!),所以你只需要在action的excute方法中写逻辑处理就行了,用Integer.intValue()的方法将字符串转换为整数值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
strut2接受页面传过来的参数都是String类型的,虽然会帮我们自动转换,但是我还是建议下面那个哥们说的那样都声明成String类型的属性来接收,用的时候在转换一下类型
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为它认为你的age变量是个String类型的,所以就找不到对应的set方法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
肯定出错啊
你的id是int类型,你改成String类型你实验一下...你自己捉摸,我相信你能想通其中的道理
你的id是int类型,你改成String类型你实验一下...你自己捉摸,我相信你能想通其中的道理
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询