下面是我在servlet中写的增删查改功能的代码,但是总是有异常出现,希望能得到各位指点了,谢谢!!
部分源码如下:
public class MessageServlet extends HttpServlet { public void init() throws ServletException{

}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
login(req, resp);
add(req, resp);
delete(req, resp);
update(req, resp);
list(req, resp);
getone(req,resp);
}

protected void getone(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
Udao  u=new Udao();
int id=Integer.parseInt(req.getParameter("ID"));
ArrayList<person> a=u.getone(id);

req.setAttribute("all", a);
req.getRequestDispatcher("/3.jsp").forward(req, resp);
}

protected void login(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
req.setCharacterEncoding("gbk");
String username = req.getParameter("username");
String password = req.getParameter("password");
User vo = new User();
vo.setUsername(username);
vo.setPassword(password);PersonDao dao = new PersonDaoImpl();
boolean flag = dao.User(vo);
if(flag==true){
this.getServletContext().getRequestDispatcher("/success.jsp").forward(req, resp);
}else{
this.getServletContext().getRequestDispatcher("/fail.jsp").forward(req, resp);
}
System.out.println("qqqqqqqqqqqqqqqqq");
}
protected void add(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("gbk");
Udao dao=new Udao();
String name=req.getParameter("uname");
byte[] b=name.getBytes("ISO-8859-1");
name=new String(b,"GBK");
String sex=req.getParameter("sex");
byte[] b1=sex.getBytes("ISO-8859-1");
sex=new String(b1,"GBK");
int age=Integer.parseInt(req.getParameter("age"));
person p=new person(name,sex,age);
int x=dao.add(p);
ArrayList<person> a = dao.getall();
req.setAttribute("all", a);
if(x==1)
{
req.getRequestDispatcher("/2.jsp").forward(req, resp);
}

}
报错信息:
2009-3-10 14:49:21 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servletgetone的Servlet.service()发生意外(exception)
java.lang.NullPointerException
at servlet.MessageServlet.add(MessageServlet.java:72)
at servlet.MessageServlet.doPost(MessageServlet.java:28)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.Poo

解决方案 »

  1.   


    问题出在这几个方法里面:
    login(req, resp);
    add(req, resp);
    delete(req, resp);
    update(req, resp);
    list(req, resp);
    getone(req,resp); 对于从参数提取的结果需要进行是否为空的判断!
      

  2.   

    Debug一下就知道问题在哪里了。
      

  3.   

    嗯,这种错误, Debug 跟就是了。
      

  4.   

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    login(req, resp); 
    add(req, resp); 
    delete(req, resp); 
    update(req, resp); 
    list(req, resp); 
    getone(req,resp); 

    你这个方法里面写这么多。当地一个执行跳转了,后面方法能得到原用的parameter参数吗?
    再利用得到的null参数调用其方法,肯定null异常了
      

  5.   

    7楼的大哥
    我想请问下,象这样在一个servlet中执行多个方法是可行的不?按照你所说的,我该怎样改呢??能不能多给点提示什么的  初学者  请多关照了 谢谢
      

  6.   


    同意七楼的说法,你这几个函数功能相当于是几个不同的case,增加一个参数如actionName吧,通过参数的名称来判断
    if(req.actionName=="login") {
         login(req, resp);
    }else if (req.actionName=="add"){
         add(req, resp);
    }else if(req.actionName=="delete") {
         delete(req,resp);
    }else if(req.actionName=="list"){
         list(req,resp);
    }else if(req.actionName=="update"){
         update(req,resp);
    }else if(req.actionName=="getone"){
         getone(req,resp);
    }
    其次,对于传入参数是否为空,也是要进行判断的,可以在页面用js拦截,或者在servlet中进行拦截
      

  7.   

    哦,9楼回答中
    在request里带一个参数actionName,
    if(req.actionName== "login ")   { 
              login(req,   resp); 
    }要改为
    if(req.getParameter(actionName)equals("login "))
              login(req,   resp); 
    }