Validator问题及解决办法——java.lang.ClassCastException: org.apache.struts.validator.ValidatorForm cannot be cast to forms.RegisterForm

 

还是那个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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值