首页 > 解决方案 > 无法在控制器中同时添加两个功能

问题描述

亲爱的,

我正在使用 oracle 数据库。用户可以在应用程序中注册,也可以登录。

注册和登录功能都在控制器的 post 方法中单独工作。但是,如果我把它放在一起,那么它就行不通了。

控制器.java

package controller;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

/**
 * Servlet implementation class Controller
 */
@WebServlet("/Controller")
public class Controller extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private DataSource ds;

    public void init() throws ServletException {
        try {
            InitialContext ic = new InitialContext();
            ds = (DataSource) ic.lookup("java:comp/env/jdbc/myoracle");
        } catch (Exception e) {
            throw new ServletException(e);
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getParameter("action");
        String address = null;

        request.setAttribute("email", "");
        request.setAttribute("password", "");
        request.setAttribute("loginerror", "");
        request.setAttribute("signupMessage", "");

        if (action == null) {
            address = "/login.jsp";
        }

        else if (action.equals("signup")) {
            address = "/signup.jsp";
        }
        request.getServletContext().getRequestDispatcher(address).forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Connection con = null;
        try {
            con = ds.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        String loginValidate = request.getParameter("loginValidate");
        String signupValidation = request.getParameter("signupValidation");

        //Validate Sign up
        if (signupValidation.equals("yes")) {
            userHandle user = new userHandle(con);
            String email = request.getParameter("emailsignup");
            String password = request.getParameter("passwordsignup");

            try {
                if (user.signupValidation(email, password)) {
                    request.setAttribute("signupMessage", "Succesfully Logged in...");
                    request.getServletContext().getRequestDispatcher("/success.jsp").forward(request, response);
                } else {
                    request.setAttribute("signupMessage", "Invalid User/Name and password!!");
                    request.getServletContext().getRequestDispatcher("/signup.jsp").forward(request, response);

                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        //Validate login.
        else if (loginValidate.equals("yes")) {
            userHandle user1 = new userHandle(con);
            String e = request.getParameter("email");
            String p = request.getParameter("password");

            try {
                if (user1.userValidate(e, p)) {
                    request.setAttribute("loginerror", "Scucess");
                    request.getServletContext().getRequestDispatcher("/success.jsp").forward(request, response);

                } else {
                    request.setAttribute("loginerror", "Invalid User Name and password!!");
                    request.getServletContext().getRequestDispatcher("/login.jsp").forward(request, response);

                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        try {
            con.close();
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

    }
}

注册工作正常,我创建了密码 12 的 vicky 用户。 在此处输入图像描述

但是,当我使用 vicky 用户登录时,我收到以下错误消息: 在此处输入图像描述

但是,如果我在控制器中评论验证注册部分,则登录功能将作为例外工作。

Controller.java 带有注释的验证注册部分:

package controller;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

/**
 * Servlet implementation class Controller
 */
@WebServlet("/Controller")
public class Controller extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private DataSource ds;

    public void init() throws ServletException {
        try {
            InitialContext ic = new InitialContext();
            ds = (DataSource) ic.lookup("java:comp/env/jdbc/myoracle");
        } catch (Exception e) {
            throw new ServletException(e);
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getParameter("action");
        String address = null;

        request.setAttribute("email", "");
        request.setAttribute("password", "");
        request.setAttribute("loginerror", "");
        request.setAttribute("signupMessage", "");

        if (action == null) {
            address = "/login.jsp";
        }

        else if (action.equals("signup")) {
            address = "/signup.jsp";
        }
        request.getServletContext().getRequestDispatcher(address).forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Connection con = null;
        try {
            con = ds.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        String loginValidate = request.getParameter("loginValidate");
        String signupValidation = request.getParameter("signupValidation");

        //Validate Sign up
//      if (signupValidation.equals("yes")) {
//          userHandle user = new userHandle(con);
//          String email = request.getParameter("emailsignup");
//          String password = request.getParameter("passwordsignup");
//
//          try {
//              if (user.signupValidation(email, password)) {
//                  request.setAttribute("signupMessage", "Succesfully Logged in...");
//                  request.getServletContext().getRequestDispatcher("/success.jsp").forward(request, response);
//              } else {
//                  request.setAttribute("signupMessage", "Invalid User/Name and password!!");
//                  request.getServletContext().getRequestDispatcher("/signup.jsp").forward(request, response);
//
//              }
//          } catch (SQLException e) {
//              // TODO Auto-generated catch block
//              e.printStackTrace();
//          }
//
//      }
//      
        //Validate login.
         if (loginValidate.equals("yes")) {
            userHandle user1 = new userHandle(con);
            String e = request.getParameter("email");
            String p = request.getParameter("password");

            try {
                if (user1.userValidate(e, p)) {
                    request.setAttribute("loginerror", "Scucess");
                    request.getServletContext().getRequestDispatcher("/success.jsp").forward(request, response);

                } else {
                    request.setAttribute("loginerror", "Invalid User Name and password!!");
                    request.getServletContext().getRequestDispatcher("/login.jsp").forward(request, response);

                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        try {
            con.close();
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

    }
}

是否有可能帮助我为什么会这样?我在这里做错了什么?非常感谢您的时间和反馈。

项目结构: 在此处输入图像描述

登录.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Login</title>
</head>
<body>
<form action="/db/Controller" method="post">
Email: <input type="text" name="email" value="<%=request.getAttribute("email")%>"/>
<br>
Password: <input type="text" name="password" value="<%=request.getAttribute("password")%>"/>
<br>
<input type="submit" value="Login" />
<input type="hidden" name="loginValidate" value="yes"/>
<br>
</form>
<h2><%= request.getAttribute("loginerror") %></h2>
<br>
<a href="/db/Controller?action=signup"> Click here to sign up... </a>
</body>
</html>

用户处理程序.java

package controller;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class userHandle {
   private String email;
   private String password;
   private Connection con;

   public userHandle() {

   }

   public userHandle(Connection con) {
       this.con = con;
   }

   public boolean userValidate(String email, String password) throws SQLException {
       String sql = "select count(*) as count from users where email = ? and password = ?";
       PreparedStatement stmt = con.prepareStatement(sql);

       stmt.setString(1, email);
       stmt.setString(2, password);

       ResultSet rs = stmt.executeQuery();


       int count = 0;
       if(rs.next()) {
           count=rs.getInt("count");
       }
       if( count ==0) {
           return false;
       }
       return true;
   }

   public boolean exists(String email) throws SQLException {
       String sql = "select count(*) as count from users where email = ?";
       PreparedStatement stmt = con.prepareStatement(sql);

       stmt.setString(1, email);

       ResultSet rs = stmt.executeQuery();



       int count = 0;
       if(rs.next()) {
           count=rs.getInt("count");
       }
       stmt.close();
       if( count ==0) {
           return false;
       }
       return true;
   }

   public boolean signupValidation(String email, String password) throws SQLException {
       if (exists(email)){
          return false; 
       }
       else {
           String sql = "insert into users values(?,?)";
           PreparedStatement stmt = con.prepareStatement(sql);

           stmt.setString(1, email);
           stmt.setString(2, password);

           int count = stmt.executeUpdate();

           if(count == 0 ) {
               return false;
           }
       }

       return true;
   }


}

成功.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
Logged in...
</body>
</html>

注册.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Sign up...</title>
</head>
<body>
<h1> Welcome to the Club. Sign up for free!!!!</h1>
<form action="/db/Controller" method="post">
<br>
Email: <input type="text" name="emailsignup"/>
<br>
password: <input type="text" name="passwordsignup"/>
<br>
<input type="hidden" value="yes" name="signupValidation"/>
<input type="submit" value="Submit" />
</form>
<h2><%=request.getAttribute("signupMessage") %></h2>

<a href="/db/Controller" >Click here to log in...</a>
</body>
</html>

标签: javajspservlets

解决方案


似乎您缺少请求参数"signupValidation"login.jsp应该像这样设置:

<form action="/db/Controller" method="post">
Email: <input type="text" name="email" value="<%=request.getAttribute("email")%>"/>
<br>
Password: <input type="text" name="password" value="<%=request.getAttribute("password")%>"/>
<br>
<input type="submit" value="Login" />
<input type="hidden" name="loginValidate" value="yes"/>
<input type="hidden" name="signupValidation" value="no"/>
<br>
</form>

同样,您需要"loginValidate"signup.jsp.

NullPointerException此外,在将一些已知常量与控制器中的请求参数进行比较时,您可以避免:

if ("yes".equals(signupValidation)) { // no NPE here if signupValidation is null
// ... the rest of your code
}

推荐阅读