java - 无法在控制器中同时添加两个功能
问题描述
亲爱的,
我正在使用 oracle 数据库。用户可以在应用程序中注册,也可以登录。
- login.jsp -> 登录表单
- Signup.jsp -> 用户可以注册
- UserHandle.java -> 使用数据库验证用户详细信息。
- Controller.java -> 应用程序的控制器。
注册和登录功能都在控制器的 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();
}
}
}
但是,当我使用 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>
解决方案
似乎您缺少请求参数"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
}
推荐阅读
- android - 在android中询问权限是否有任何限制?
- api - Web API 从 IIS 返回 404
- python - pyinstaller 应用程序包无法在 MacOS 上加载 QT Designer .ui 文件
- python - 如何抓取每个链接的描述
- reactjs - CORS 策略:Access-Control-Allow-Headers 不允许请求标头字段令牌
- r - 如何从一系列列表中删除同一列
- express - 在javascript express中发送数据后如何呈现新页面?
- amazon-web-services - python3(lambda函数)未能将响应发送回云形成模板
- c# - 未找到样式 XAML
- amazon-web-services - 了解所有并发运行的 AWS Lambda 已结束的最佳方法是什么?