您的位置:首页 > 运维架构 > Apache

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐