RegistrationAction是DispatchAction的派生类么?parameter属性应指定目标方法的名称,该方法必须和标准的Actoin的execute()方法有相
同的参数类型和返回类型validate="false",当然不会执行validate()方法

解决方案 »

  1.   

    刚才看了一下,确实是validate="false"这里不对,不过,将validate设置为true后,出现了新的问题。java.lang.NullPointerException
    at com.sxf.personal.form.RegistrationForm.validate(RegistrationForm.java:74)
    at org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:942)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:255)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
    at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
    at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027)
    at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125)
    at java.lang.Thread.run(Thread.java:536)下面是RegistrationForm的validate方法:    public ActionErrors validate(ActionMapping actionMapping,
                                     HttpServletRequest httpServletRequest) {
            System.out.println("----------Begin Validate--------------");
            ActionErrors errors =new ActionErrors();
            if (name.length()<1){
                errors.add("error",new ActionError("registion.name.missing"));
            }
            if (password.length()<1){
                errors.add("error",new ActionError("registion.password.missing"));
            }
            if (email.length()<1){
                errors.add("error",new ActionError("registion.email.missing"));
            }
            System.out.println("----------End Validate--------------");
            return errors;
        }
      

  2.   

    不知道你的具体代码
    你是不是在action或着其他地方new RegistrationForm
    如果是这样你可能没有初始化name等或者初始化为null
      

  3.   

    action代码    public ActionForward Create(ActionMapping actionMapping,
                                     ActionForm actionForm,
                                     HttpServletRequest httpServletRequest,
                                     HttpServletResponse httpServletResponse) {
            /**@todo: complete the business logic here, this is just a skeleton.*/        return actionMapping.findForward("Create");    }
    这样不行
        public ActionForward Create(ActionMapping actionMapping,
                                     ActionForm actionForm,
                                     HttpServletRequest httpServletRequest,
                                     HttpServletResponse httpServletResponse) {
            /**@todo: complete the business logic here, this is just a skeleton.*/
            if (actionForm ==null){
                System.out.println("--------Enter form-------------");
                RegistrationForm form=new RegistrationForm();
                httpServletRequest.setAttribute("registrationForm",form);
            }        return actionMapping.findForward("Create");    }这样还是不行。都报告java.lang.NullPointerException
      

  4.   

    if (name.length()<1){
    也许你的name并没有得到值.也就是没有初始化.
      

  5.   

    谢谢  beyondii(十万个为什么),我将RegistrationForm中validate方法中的name打印出来,结果是null。这就是说form的初始化有问题。我的loginForm也是这么写的,没有出现这样的问题阿。
    public class LoginForm
        extends ActionForm {
        private String name;
        private String password;
        public void setName(String name) {
            this.name = name;
        }    public String getName() {
            return name;
        }    public void setPassword(String password) {
            this.password = password;
        }    public String getPassword() {
            return password;
        }    public ActionErrors validate(ActionMapping actionMapping,
                                     HttpServletRequest httpServletRequest) {
            ActionErrors errors=new ActionErrors();
            System.out.println("login username=" + name);        if (name.length()<1){
                errors.add("error",new ActionError("login.name.missing"));
            }
            if (password.length()<1){
                errors.add("error",new ActionError("login.password.missing"));
            }
            return  errors;
        }
    }
    我测试了一下,当我第一次进入loginForm的时候,如果什么都不填写,进入validate后判断name的长度小于1,而不是null。我还做了一个测试。我再两个loginForm和RegistrationForm的validate方法中打印“----------Begin Validate--------------”,测试发现第一次进入loginForm的时候,loginForm的没有执行System.out.println("---Begin Validate---"),但是进入Registration.jsp时,就会执行System.out.println("---Begin Validate---"),这时候form中name书行为null。这是怎么一回事呢?