Validator问题及解决办法——java.lang.ClassCastException: org.apache.struts.validator.ValidatorForm cannot be cast to forms.RegisterForm
2008-04-28 14:55
1326 查看
还是那个register的例子,我想加上struts的validator。
但是遇到一个错误,几天都没有解决,每次点击register.jsp中的register按钮时,就会出错,如下:
java.lang.ClassCastException: org.apache.struts.validator.ValidatorForm cannot be cast to forms.RegisterForm
action.RegisterAction.execute(RegisterAction.java:24)
org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53)
org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
说说我是怎么实现的吧
大体思路——RegisterForm继承自ValidatorForm,RegisterAction对RegisterForm的数据进行处理,但是RegisterAction的execute中需要对form的类型进行转换,转换为RegisterForm才能做进一步的处理。问题就出在转换这里。
1、RegisterAction.java
package action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.web.struts.ActionSupport;
import service.RegisterService;
import bo.Userregister;
import forms.RegisterForm;
public class RegisterAction extends ActionSupport ...{
RegisterService registerService;
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException ...{
ActionErrors errors = new ActionErrors();
RegisterForm registerForm = (RegisterForm) form; //看来问题在这一行。但是不知道怎么解决好
if (errors != null) ...{
//saveErrors(request, errors);
return (mapping.findForward("register"));
}
String username = registerForm.getUsername();
String password = registerForm.getPassword();
String email = registerForm.getEmail();
String question = registerForm.getQuestion();
String answer = registerForm.getAnswer();
Userregister userregister = new Userregister();
userregister.setUsername(username);
userregister.setPassword(password);
userregister.setEmail(email);
userregister.setQuestion(question);
userregister.setAnswer(answer);
registerService.saveRegister(userregister);
return mapping.findForward("success");
}
public RegisterService getRegisterService() ...{
return registerService;
}
public void setRegisterService(RegisterService registerService) ...{
System.out.println("setregisterService=" + registerService);
this.registerService = registerService;
}
}
2、RegisterForm.java
原来是public class RegisterForm extends ActionForm;
修改,让其继承自ValidatorForm。
package forms;
import org.apache.struts.validator.ValidatorForm;
public class RegisterForm extends ValidatorForm ...{
private String username;
private String password;
private String email;
private String question;
private String answer;
public String getUsername() ...{
return username;
}
public String getPassword() ...{
return password;
}
public String getEmail() ...{
return email;
}
public String getQuestion() ...{
return question;
}
public String getAnswer() ...{
return answer;
}
public void setUsername(String username) ...{
this.username = username;
}
public void setPassword(String password) ...{
this.password = password;
}
public void setEmail(String email) ...{
this.email = email;
}
public void setQuestion(String question) ...{
this.question = question;
}
public void setAnswer(String answer) ...{
this.answer = answer;
}
}
3、修改strut-config.xml
在相应的位置加入:
<form-beans>
<form-bean name="userInfoForm" type="forms.UserInfoForm"/>
<form-bean name="registerForm" type="org.apache.struts.validator.ValidatorForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
<form-property name="email" type="java.lang.String"/>
<form-property name="question" type="java.lang.String"/>
<form-property name="answer" type="java.lang.String"/>
</form-bean>
</form-beans>
...
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
<set-property property="stopOnFirstError" value="false"/>
</plug-in>
4、validation.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd">
<form-validation>
<global>
<constant>
<constant-name>name_common</constant-name>
<constant-value>^[0-9a-zA-Z]*$</constant-value>
</constant>
</global>
<formset>
<form name="registerForm">
<field property="username" depends="required,mask,maxlength">
<arg key="username" resource="false" />
<arg name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>mask</var-name>
<var-value>${name_common}</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>30</var-value>
</var>
</field>
<field property="password" depends="required,mask,maxlength">
<arg key="password" resource="false" />
<arg name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>mask</var-name>
<var-value>${name_common}</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>30</var-value>
</var>
</field>
<field property="email" depends="required,email,maxlength">
<arg key="email" resource="false" />
<arg name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>maxlength</var-name>
<var-value>50</var-value>
</var>
</field>
<field property="question" depends="required,maxlength">
<arg key="question" resource="false" />
<arg name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>maxlength</var-name>
<var-value>50</var-value>
</var>
</field>
<field property="answer" depends="required,maxlength">
<arg key="answer" resource="false"/>
<arg name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>maxlength</var-name>
<var-value>50</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
问题原因及解决办法。
RegisterForm registerForm = (RegisterForm) form; //看来问题在这一行。但是不知道怎么解决好 。
刚才去图书馆查了下资料,发现是下面这个地方错了:
<form-beans>
<form-bean name="userInfoForm" type="forms.UserInfoForm"/>
<form-bean name="registerForm" type="org.apache.struts.validator.ValidatorForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
<form-property name="email" type="java.lang.String"/>
<form-property name="question" type="java.lang.String"/>
<form-property name="answer" type="java.lang.String"/>
</form-bean>
</form-beans>
...
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
<set-property property="stopOnFirstError" value="false"/>
</plug-in>
form-bean里面的type应该填写实际处理registerForm的form位置,而不是org.apache.struts.validator.ValidatorForm。
但是这个我是按照孙卫琴的那本“精通struts”来写的,所以一直以为应该是org.apache.struts.validator.ValidatorForm。
但是遇到一个错误,几天都没有解决,每次点击register.jsp中的register按钮时,就会出错,如下:
java.lang.ClassCastException: org.apache.struts.validator.ValidatorForm cannot be cast to forms.RegisterForm
action.RegisterAction.execute(RegisterAction.java:24)
org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53)
org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
说说我是怎么实现的吧
大体思路——RegisterForm继承自ValidatorForm,RegisterAction对RegisterForm的数据进行处理,但是RegisterAction的execute中需要对form的类型进行转换,转换为RegisterForm才能做进一步的处理。问题就出在转换这里。
1、RegisterAction.java
package action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.web.struts.ActionSupport;
import service.RegisterService;
import bo.Userregister;
import forms.RegisterForm;
public class RegisterAction extends ActionSupport ...{
RegisterService registerService;
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException ...{
ActionErrors errors = new ActionErrors();
RegisterForm registerForm = (RegisterForm) form; //看来问题在这一行。但是不知道怎么解决好
if (errors != null) ...{
//saveErrors(request, errors);
return (mapping.findForward("register"));
}
String username = registerForm.getUsername();
String password = registerForm.getPassword();
String email = registerForm.getEmail();
String question = registerForm.getQuestion();
String answer = registerForm.getAnswer();
Userregister userregister = new Userregister();
userregister.setUsername(username);
userregister.setPassword(password);
userregister.setEmail(email);
userregister.setQuestion(question);
userregister.setAnswer(answer);
registerService.saveRegister(userregister);
return mapping.findForward("success");
}
public RegisterService getRegisterService() ...{
return registerService;
}
public void setRegisterService(RegisterService registerService) ...{
System.out.println("setregisterService=" + registerService);
this.registerService = registerService;
}
}
2、RegisterForm.java
原来是public class RegisterForm extends ActionForm;
修改,让其继承自ValidatorForm。
package forms;
import org.apache.struts.validator.ValidatorForm;
public class RegisterForm extends ValidatorForm ...{
private String username;
private String password;
private String email;
private String question;
private String answer;
public String getUsername() ...{
return username;
}
public String getPassword() ...{
return password;
}
public String getEmail() ...{
return email;
}
public String getQuestion() ...{
return question;
}
public String getAnswer() ...{
return answer;
}
public void setUsername(String username) ...{
this.username = username;
}
public void setPassword(String password) ...{
this.password = password;
}
public void setEmail(String email) ...{
this.email = email;
}
public void setQuestion(String question) ...{
this.question = question;
}
public void setAnswer(String answer) ...{
this.answer = answer;
}
}
3、修改strut-config.xml
在相应的位置加入:
<form-beans>
<form-bean name="userInfoForm" type="forms.UserInfoForm"/>
<form-bean name="registerForm" type="org.apache.struts.validator.ValidatorForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
<form-property name="email" type="java.lang.String"/>
<form-property name="question" type="java.lang.String"/>
<form-property name="answer" type="java.lang.String"/>
</form-bean>
</form-beans>
...
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
<set-property property="stopOnFirstError" value="false"/>
</plug-in>
4、validation.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd">
<form-validation>
<global>
<constant>
<constant-name>name_common</constant-name>
<constant-value>^[0-9a-zA-Z]*$</constant-value>
</constant>
</global>
<formset>
<form name="registerForm">
<field property="username" depends="required,mask,maxlength">
<arg key="username" resource="false" />
<arg name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>mask</var-name>
<var-value>${name_common}</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>30</var-value>
</var>
</field>
<field property="password" depends="required,mask,maxlength">
<arg key="password" resource="false" />
<arg name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>mask</var-name>
<var-value>${name_common}</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>30</var-value>
</var>
</field>
<field property="email" depends="required,email,maxlength">
<arg key="email" resource="false" />
<arg name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>maxlength</var-name>
<var-value>50</var-value>
</var>
</field>
<field property="question" depends="required,maxlength">
<arg key="question" resource="false" />
<arg name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>maxlength</var-name>
<var-value>50</var-value>
</var>
</field>
<field property="answer" depends="required,maxlength">
<arg key="answer" resource="false"/>
<arg name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>maxlength</var-name>
<var-value>50</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
问题原因及解决办法。
RegisterForm registerForm = (RegisterForm) form; //看来问题在这一行。但是不知道怎么解决好 。
刚才去图书馆查了下资料,发现是下面这个地方错了:
<form-beans>
<form-bean name="userInfoForm" type="forms.UserInfoForm"/>
<form-bean name="registerForm" type="org.apache.struts.validator.ValidatorForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
<form-property name="email" type="java.lang.String"/>
<form-property name="question" type="java.lang.String"/>
<form-property name="answer" type="java.lang.String"/>
</form-bean>
</form-beans>
...
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
<set-property property="stopOnFirstError" value="false"/>
</plug-in>
form-bean里面的type应该填写实际处理registerForm的form位置,而不是org.apache.struts.validator.ValidatorForm。
但是这个我是按照孙卫琴的那本“精通struts”来写的,所以一直以为应该是org.apache.struts.validator.ValidatorForm。
相关文章推荐
- 异常-----springmvc + ajaxfileupload解决ajax不能异步上传图片的问题。java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.
- Tomcat7出现HTTP Status 500 - java.lang.ClassCastException: org.apache.jasper.el.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl的解决
- Caused by: java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer错误解决办法
- java.lang.ClassCastException: org.apache.taglibs.standard.tlv.JstlCoreTLV cannot be cast to javax.servlet.jsp.tagext.TagLibraryValidator
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- Spring+hibernate中的问题解决:java.lang.ClassCastException: $Proxy6 cannot be cast to com.mqEsb.service.imp
- 关于使用动态代理创建代理对象是报错 java.lang.ClassCastException: $Proxy0 cannot be cast to 的解决办法
- java.lang.ClassCastException:org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to o
- java.lang.ClassCastException: com.sun.proxy.$Proxy* cannot be cast to***问题解决方案
- java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.spri
- unexpected token: * 和 java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to 解决办法
- java.lang.ClassCastException: org.apache.commons.dbcp.BasicDataSource cannot be cast to
- SparkR读取CSV格式文件错误java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.spark.u
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.spri
- java.lang.ClassCastException: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl cannot be cast to
- java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to
- ava.lang.ClassCastException: org.apache.struts.taglib.tiles.UseAttributeTei cannot be cast to javax.
- java.lang.ClassCastException:org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.AnnotationProcesso