This is part 1 of the Build Todo App using JSP, Servlet, JDBC and MySQL tutorial.
In part 1, we will develop user registration and login module implementation.
In part 1, we will develop user registration and login module implementation.
Table of Contents
User Registration Module:
1. Create a JavaBean - User.java
2. Configure JDBC Connection- JDBCUtils.java
3. DAO Layer - UserDao.java
4. Controller Layer - UserController.java
5. View Layer - register.jsp
Login Module:
1. Create a JavaBean - LoginBean.java
2. DAO Layer - LoginDao.java
3. Controller Layer - LoginController.java
4. View Layer - login.jsp
User Registration Module
Let's build a User Registration module using JSP, Servlet, JDBC and MySQL database.
1. Create a JavaBean - User.java
Let's create a User JavaBean class which we will use in JSP action tags.
Create a User.java class and add the following content to it:
package net.javaguides.todoapp.model;
import java.io.Serializable;
/**
* JavaBean class used in jsp action tags.
* @author Ramesh Fadatare
*/
public class User implements Serializable {
private static final long serialVersionUID = 1 L;
private String firstName;
private String lastName;
private String username;
private String password;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2. Configure JDBC Connection- JDBCUtils.java
Let's create JDBCUtils.java class which contains all JDBC common code.
package net.javaguides.todoapp.utils;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.time.LocalDate;
public class JDBCUtils {
private static String jdbcURL = "jdbc:mysql://localhost:3306/demo";
private static String jdbcUsername = "root";
private static String jdbcPassword = "root";
public static Connection getConnection() {
Connection connection = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
}
public static void printSQLException(SQLException ex) {
for (Throwable e: ex) {
if (e instanceof SQLException) {
e.printStackTrace(System.err);
System.err.println("SQLState: " + ((SQLException) e).getSQLState());
System.err.println("Error Code: " + ((SQLException) e).getErrorCode());
System.err.println("Message: " + e.getMessage());
Throwable t = ex.getCause();
while (t != null) {
System.out.println("Cause: " + t);
t = t.getCause();
}
}
}
}
public static Date getSQLDate(LocalDate date) {
return java.sql.Date.valueOf(date);
}
public static LocalDate getUtilDate(Date sqlDate) {
return sqlDate.toLocalDate();
}
}
Note that we need to provide your MySQL database credentials in the above file.
3. DAO Layer - UserDao.java
Let's create a UserDao class which contains JDBC code to store User registered data into the users table. Add the following code to an UserDao class:
package net.javaguides.todoapp.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import net.javaguides.todoapp.model.User;
import net.javaguides.todoapp.utils.JDBCUtils;
public class UserDao {
public int registerEmployee(User employee) throws ClassNotFoundException {
String INSERT_USERS_SQL = "INSERT INTO users" +
" (first_name, last_name, username, password) VALUES " +
" (?, ?, ?, ?);";
int result = 0;
try (Connection connection = JDBCUtils.getConnection();
// Step 2:Create a statement using connection object
PreparedStatement preparedStatement = connection.prepareStatement(INSERT_USERS_SQL)) {
preparedStatement.setString(1, employee.getFirstName());
preparedStatement.setString(2, employee.getLastName());
preparedStatement.setString(3, employee.getUsername());
preparedStatement.setString(4, employee.getPassword());
System.out.println(preparedStatement);
// Step 3: Execute the query or update query
result = preparedStatement.executeUpdate();
} catch (SQLException e) {
// process sql exception
JDBCUtils.printSQLException(e);
}
return result;
}
}
4. Controller Layer - UserController.java
Let's create an UserController class to process HTTP request parameters and redirect to the appropriate JSP page after request data stored in the database:
package net.javaguides.todoapp.web;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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 net.javaguides.todoapp.dao.UserDao;
import net.javaguides.todoapp.model.User;
/**
* @email Ramesh Fadatare
*/
@WebServlet("/register")
public class UserController extends HttpServlet {
private static final long serialVersionUID = 1 L;
private UserDao userDao;
public void init() {
userDao = new UserDao();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
register(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendRedirect("register/register.jsp");
}
private void register(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String firstName = request.getParameter("firstName");
String lastName = request.getParameter("lastName");
String username = request.getParameter("username");
String password = request.getParameter("password");
User employee = new User();
employee.setFirstName(firstName);
employee.setLastName(lastName);
employee.setUsername(username);
employee.setPassword(password);
try {
int result = userDao.registerEmployee(employee);
if (result == 1) {
request.setAttribute("NOTIFICATION", "User Registered Successfully!");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
RequestDispatcher dispatcher = request.getRequestDispatcher("register/register.jsp");
dispatcher.forward(request, response);
}
}
5. View Layer - register.jsp
header.jsp
Let's create header.jsp file and keep all the common header code in it. Include this file in respect to JSP pages.
<header>
<nav class="navbar navbar-expand-md navbar-dark"
style="background-color: tomato">
<div>
<a href="https://www.javaguides.net" class="navbar-brand"> Todo App</a>
</div>
<ul class="navbar-nav navbar-collapse justify-content-end">
<li><a href="<%= request.getContextPath() %>/login" class="nav-link">Login</a></li>
<li><a href="<%= request.getContextPath() %>/register" class="nav-link">Signup</a></li>
</ul>
</nav>
</header>
footer.jsp
Let's create a common footer.jsp file for all JSP pages. Include this file in respect JSP pages.
<style>
.footer {
position: fixed;
bottom: 0;
width:100%;
height: 40px;
background-color: tomato;
}
</style>
<footer class="footer font-small black">
<!-- Copyright -->
<div class="footer-copyright text-center py-3" style="color: white">© 2019 Copyright:
<a href="https://www.javaguides.net/" > <strong> Java Guides </strong></a>
</div>
</footer>
<!-- Footer -->
register.jsp
Let's design user registration HTML form with the following fields:
- firstName
- lastName
- username
- password
<%@ 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>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
</head>
<body>
<jsp:include page="../common/header.jsp"></jsp:include>
<div class="container">
<h2>User Register Form</h2>
<div class="col-md-6 col-md-offset-3">
<div class="alert alert-success center" role="alert">
<p>${NOTIFICATION}</p>
</div>
<form action="<%=request.getContextPath()%>/register" method="post">
<div class="form-group">
<label for="uname">First Name:</label> <input type="text" class="form-control" id="uname" placeholder="First Name" name="firstName" required>
</div>
<div class="form-group">
<label for="uname">Last Name:</label> <input type="text" class="form-control" id="uname" placeholder="last Name" name="lastName" required>
</div>
<div class="form-group">
<label for="uname">User Name:</label> <input type="text" class="form-control" id="username" placeholder="User Name" name="username" required>
</div>
<div class="form-group">
<label for="uname">Password:</label> <input type="password" class="form-control" id="password" placeholder="Password" name="password" required>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
<jsp:include page="../common/footer.jsp"></jsp:include>
</body>
</html>
Login Module
1. Create a JavaBean - LoginBean.java
Let's create a LoginBean class which we will use in JSP action tags.
package net.javaguides.todoapp.model;
import java.io.Serializable;
public class LoginBean implements Serializable {
private static final long serialVersionUID = 1 L;
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2. DAO Layer - LoginDao.java
Let's create a LoginDao class which contains JDBC code validate login username and password with users table. Add the following code to a LoginDao class:
package net.javaguides.todoapp.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import net.javaguides.todoapp.model.LoginBean;
import net.javaguides.todoapp.utils.JDBCUtils;
public class LoginDao {
public boolean validate(LoginBean loginBean) throws ClassNotFoundException {
boolean status = false;
Class.forName("com.mysql.jdbc.Driver");
try (Connection connection = JDBCUtils.getConnection();
// Step 2:Create a statement using connection object
PreparedStatement preparedStatement = connection
.prepareStatement("select * from users where username = ? and password = ? ")) {
preparedStatement.setString(1, loginBean.getUsername());
preparedStatement.setString(2, loginBean.getPassword());
System.out.println(preparedStatement);
ResultSet rs = preparedStatement.executeQuery();
status = rs.next();
} catch (SQLException e) {
// process sql exception
JDBCUtils.printSQLException(e);
}
return status;
}
}
3. Controller Layer - LoginController.java
Let's create LoginController to process HTTP request parameters and redirect to the appropriate JSP page based on the login status. If login successfully validated with the database then redirect to "todo/todo-list.jsp" page otherwise redirect to login.jsp page.
package net.javaguides.todoapp.web;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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.servlet.http.HttpSession;
import net.javaguides.todoapp.dao.LoginDao;
import net.javaguides.todoapp.model.LoginBean;
/**
* @email Ramesh Fadatare
*/
@WebServlet("/login")
public class LoginController extends HttpServlet {
private static final long serialVersionUID = 1 L;
private LoginDao loginDao;
public void init() {
loginDao = new LoginDao();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendRedirect("login/login.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
authenticate(request, response);
}
private void authenticate(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String username = request.getParameter("username");
String password = request.getParameter("password");
LoginBean loginBean = new LoginBean();
loginBean.setUsername(username);
loginBean.setPassword(password);
try {
if (loginDao.validate(loginBean)) {
RequestDispatcher dispatcher = request.getRequestDispatcher("todo/todo-list.jsp");
dispatcher.forward(request, response);
} else {
HttpSession session = request.getSession();
// session.setAttribute("user", username);
// response.sendRedirect("login.jsp");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
4. View Layer - login.jsp
Let's design login HTML form with following fields:
- username
- password
<%@ 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>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body>
<jsp:include page="../common/header.jsp"></jsp:include>
<div class="container col-md-8 col-md-offset-3" style="overflow: auto">
<h1>Login Form</h1>
<form action="<%=request.getContextPath()%>/login" method="post">
<div class="form-group">
<label for="uname">User Name:</label> <input type="text" class="form-control" id="username" placeholder="User Name" name="username" required>
</div>
<div class="form-group">
<label for="uname">Password:</label> <input type="password" class="form-control" id="password" placeholder="Password" name="password" required>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
<jsp:include page="../common/footer.jsp"></jsp:include>
</body>
</html>
Move to Part 2 - Todo CRUD Operations
Next part, we create Todo management features such as add todo, update todo, list todo and delete todo at Build Todo App using JSP, Servlet, JDBC and MySQL - Part 2.
👍
ReplyDelete