public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
        List errors = new ArrayList() ;
String id = request.getParameter("id") ;
String password = request.getParameter("password") ;
String path = "login.jsp" ; PersonVo pv = new PersonVo() ;
pv.setId(id) ;
pv.setPassword(password) ;
         //位置①
pv.setErrors(errors) ;        
if(pv.validate()) {
if(DaoFactory.getDaoImpl().isLogin(pv))
    {
path = "login_success.jsp" ;
request.setAttribute("id",id) ;
    }
    else
    {
errors.add("错误的用户名及密码!") ;
    }
}
                  
                  //位置②
request.setAttribute("errors",pv.getErrors()) ;
request.setAttribute("person",pv) ;
request.getRequestDispatcher(path).forward(request,response) ;
}
上面pv.setErrors(errors) ;从位置①换到位置②后就会出现空指向错误了,我觉得没理由啊,我觉得应该要放在位置②,现在我知道应该要放在位置①,但不明白为啥,我再把那个pv.validate()方法贴出来,这是在PersonVo里声明的,算了,我还是把整个PersonVo给出来

解决方案 »

  1.   

    package haha.feuda.vo ;import java.util.* ;public class PersonVo
    {
    private String id ;
    private String password ;
    private List errors ; public void setId(String id)
    {
    this.id = id ;
    }
    public String getId()
    {
    return this.id ;
    } public void setPassword(String password)
    {
    this.password = password ;
    }
    public String getPassword()
    {
    return this.password ;
    } public void setErrors(List errors)
    {
    this.errors = errors ;
    }
    public List getErrors()
    {
    return this.errors ;
    } public boolean validate()
    {
    boolean flag = true ;
    if(this.id==null||"".equals(this.id))
    {
    flag = false ;
    errors.add("ID 不能为空!       ") ;
    }
    else
    {
    if(this.id.length()<3||this.id.length()>15)
    {
    flag = false ;
    errors.add("id的长度应为3~15位!") ;
    }
    }

    if(this.password==null||"".equals(this.password))
    {
    flag = false ;
    errors.add("密码不能为空!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;") ;
    }
    else
    {
    if(this.password.length()<3||this.password.length()>15)
    {
    flag = false ;
    errors.add("密码长度应为3~15位!") ;
    }
            }
    return flag ;
    }}
      

  2.   

     //位置①
    pv.setErrors(errors) ;  
     //位置②
    request.setAttribute("errors",pv.getErrors()) ;
    先pv.setErrors(errors) ;  然后pv.getErrors()
      

  3.   

    我开始认为是在pv.invalidate()之前就errors.setErrors(errors),我以为这样errors会是空的,但实际跟我想的刚好相反,放在之后却是空的,求解答啊
      

  4.   

    首先谢谢2楼回答,我把pv.setErrors(errors)从位置①换到位置②,那也还是在request.setAttribute("errors",pv.getErrors()) ;
    之前啊
      

  5.   

    好吧,可能代码多了,没人愿意看
    我简单再说下
    List errors = new ArrayList() ;
    String id = request.getParameter("id") ;
    String password = request.getParameter("password") ;
    String path = "login.jsp" ;PersonVo pv = new PersonVo() ;
    pv.setId(id) ;
    pv.setPassword(password) ;
    pv.setErrors(errors) ;   
    if(pv.validate()) {
    if(DaoFactory.getDaoImpl().isLogin(pv))
    {
    ....注意加红的两行,这样的话,pv.validate()还没开始验证,errors不会还是空的吗?求解啊?童靴们
      

  6.   

    if(DaoFactory.getDaoImpl().isLogin(pv))
    这句话先写true试试在把你那段代码放到2位置上。
    isLogin调用pv,而pv又没有error值。可能会报错。