最新闲来无事,打算做个Struts2+spring+Mybatis的项目玩玩,没想到在Struts2 的Ajax检测用户名是否重复上纠结了半天.
2013-01-10 15:30:12 [ http-80-1:51281 ] - [ ERROR ] Could not find action or result
/PMS/product.action?searchHelp.productClass=1
No result defined for action com.liaochente.pms.productinfo.action.ProductInfoAction and result SUCCESS
at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:375)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:277)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
最开始以为是少包,因为在STRUTS.XML中一直提示找不到JSON-DEFAULT,然后就苦逼的换了好几次包,但是还是不行。
最后没办法 手写了个空的ACTION的构造函数,然后打个断点,一步一步的跟了下去,最后发现在validate()方法中校验不通过,所以控制台不报错,他自动去找返回名为input的那一项,但是我配的是JSON通信,并没有配置INPUT所以直接报 could not find action or result .....input
Action代码:
public class RegisterAction extends ActionSupport implements SessionAware
{
private static final long serialVersionUID = 1L;
private RegisterUserInfo userInfo;
private RegisterService service;
private Map<String, Object> session;
private String securityCode;
private boolean isCheckUserName;
public RegisterAction()
{
System.out.println("**********Start************");
}
public String registerUserInfo()
throws Exception
{
service.registerUserInfo(userInfo.toParameterMap());
session.put(CommonConst.USER_INFO_KEY, userInfo);
return SUCCESS;
}
/**
* 检测验证码填写是否正确
*/
public void validate()
{
String _code = session.get(CommonConst.SECURYTY_CODE)==null?"":session.get(CommonConst.SECURYTY_CODE).toString();
if(!_code.equals(securityCode)) {
this.addFieldError("security_error", "验证码错误");
}
}
/**
* 校验注册用户名是否重复
* @return
*/
public String checkUserName() throws Exception
{
isCheckUserName = service.checkUserName(userInfo);
return SUCCESS;
}
@Override
public void setSession(Map<String, Object> session)
{
this.session = session;
}
public RegisterUserInfo getUserInfo()
{
return userInfo;
}
public RegisterService getService()
{
return service;
}
public Map<String, Object> getSession()
{
return session;
}
public void setUserInfo(RegisterUserInfo userInfo)
{
this.userInfo = userInfo;
}
public void setService(RegisterService service)
{
this.service = service;
}
public static long getSerialversionuid()
{
return serialVersionUID;
}
public String getSecurityCode()
{
return securityCode;
}
public void setSecurityCode(String securityCode)
{
this.securityCode = securityCode;
}
public boolean isCheckUserName()
{
return isCheckUserName;
}
public void setCheckUserName(boolean isCheckUserName)
{
this.isCheckUserName = isCheckUserName;
}
}
PS:因为个人偷懒把注册和检测用户名重复写在一个ACTION,但是注册的相关操作和验证码校验都是用的默认全局,结果导致异步校验户用名的时候 也走了一遍全局输入校验,所以才会有之后的问题产生。
解决方法:把execute方法和validate方法全部重命名 改成专门的注册方法。
修改后Action代码:
public class RegisterAction extends ActionSupport implements SessionAware
{
private static final long serialVersionUID = 1L;
private RegisterUserInfo userInfo;
private RegisterService service;
private Map<String, Object> session;
private String securityCode;
private String isCheckUserName = CommonConst.AJAX_HANDLE_STATUS_NO;
public String registerUserInfo()
throws Exception
{
service.registerUserInfo(userInfo.toParameterMap());
session.put(CommonConst.USER_INFO_KEY, userInfo);
return SUCCESS;
}
/**
* 检测验证码填写是否正确
*/
public void validateRegisterUserInfo()
{
String _code = session.get(CommonConst.SECURYTY_CODE)==null?"":session.get(CommonConst.SECURYTY_CODE).toString();
if(!_code.equals(securityCode)) {
this.addFieldError("security_error", "验证码错误");
}
}
/**
* 校验注册用户名是否重复
* @return
*/
public String checkUserName() throws Exception
{
if(service.checkUserName(userInfo))
{
isCheckUserName = CommonConst.AJAX_HANDLE_STATUS_YES;
}
return SUCCESS;
}
@Override
public void setSession(Map<String, Object> session)
{
this.session = session;
}
public RegisterUserInfo getUserInfo()
{
return userInfo;
}
public RegisterService getService()
{
return service;
}
public Map<String, Object> getSession()
{
return session;
}
public void setUserInfo(RegisterUserInfo userInfo)
{
this.userInfo = userInfo;
}
public void setService(RegisterService service)
{
this.service = service;
}
public static long getSerialversionuid()
{
return serialVersionUID;
}
public String getSecurityCode()
{
return securityCode;
}
public void setSecurityCode(String securityCode)
{
this.securityCode = securityCode;
}
public String getIsCheckUserName()
{
return isCheckUserName;
}
public void setIsCheckUserName(String isCheckUserName)
{
this.isCheckUserName = isCheckUserName;
}
}