今天在学习Struts2框架的时候发现了一个问题,困扰了好久。今天也发帖子问大牛了,可能大牛们一般比较忙,我测试了一下午才发现问题。
就是用Struts2的硬编码方式校验从前端获取数据时,我发现validate校验通过后,一直无法执行我的业务方法save,然后又加上了validateSave方法,只执行了validate和validateSave两个方法,还是没有执行业务方法。最后索性把validate的两个方法都注释了,返回的结果集input也注释了,把项目跑起来,发现报错No result defined for action cn.xlp.action.UserAction and result input,排查了半天,发现我的实体类里面有一个属性是int(考虑到从前端获取到的数据是String),然后把int全部换成String在把项目跑起来,发现就能运行了,而且我把以前的两个validate方法加上去,每个方法都会运行。但是有时候实体类里面肯定会有除String属性为的其他属性,我就拿以前项目对比,最后发现那个业务处理类继承了ActionSupport类,我把此类注释后,把数据换成int类型,然后运行,就可以运行成功了。
从这个项目里面我发现:如果业务处理类继承了ActionSupport类,
1.如果实体类里面只有String的数据类型,不用配置结果集input;
2.如果实体类里面有除String类型外的其他数据类型,Struts框架会对struts.xml检测,看对应action中的结果集是否配置了input
但是我又发现了另外一个问题,就是第二种方式都配置好了后,运行只会执行validate和validateSave这两个方法,业务方法又不执行了。希望有大牛看到了帮小弟解决一下,然后有错误的地方希望指正一下。感谢!
业务处理类:
public class UserAction extends ActionSupport {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
/**
* 先执行calidate方法,在执行业务方法
* 在validate方法中,添加了FieldError或者ActionError方法
* 将执行不能通过,并且返回Input
*/
@Override
public void validate() {
System.out.println("----validate---");
}
public void validateSave() {
System.out.println("----validateSave-----");
if(user.getName().length()<4||user.getName().length()>10) {
this.addFieldError("user.name","用户名输入错误");
}
}
public String save(){
System.out.println("----execute----");
return "success";
}
}
struts.xml的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="save" class="cn.xlp.action.UserAction" method="save">
<result name="success">/success.jsp</result>
<result name="input">/save.jsp</result>
</action>
</package>
</struts>