web_mvc_hibernate_template
Import the project as an existing Maven project in your IDE (e.g., Eclipse).
web_mvc_hibernate_template
→ Finish.Update the database settings in hibernate.cfg.xml
:
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_db</property>
<property name="hibernate.connection.username">your_username</property>
<property name="hibernate.connection.password">your_password</property>
Right-click the project → Maven → Update Project → Check "Force Update" → OK.
If needed, run Maven goals:
mvn clean compile
Ensure dependencies (Hibernate, MySQL connector, JSTL) are in pom.xml
.
Purpose: Initializes and destroys the Hibernate SessionFactory
.
Implementation (HibernateServletContextListener.java
):
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;
@WebListener
public class HibernateServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
HibernateUtils.getSessionFactory(); // Builds SessionFactory
sce.getServletContext().log("Hibernate SessionFactory initialized");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
HibernateUtils.shutdown(); // Closes SessionFactory, cleans up DBCP
sce.getServletContext().log("Hibernate SessionFactory closed");
}
}
Explanation:
contextInitialized
: Called when the application starts, builds the SessionFactory
.contextDestroyed
: Called when the application shuts down, closes the SessionFactory
and cleans up the database connection pool (DBCP).Purpose: Centralized request handling and routing for all user-related operations.
Implementation (FrontController.java
):
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
@WebServlet(value = "/*", loadOnStartup = 1)
public class FrontController extends HttpServlet {
private UserDAO userDAO;
@Override
public void init() throws ServletException {
userDAO = new UserDAOImpl(); // Initialize DAO
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String path = req.getPathInfo() == null ? "/" : req.getPathInfo();
switch (path) {
case "/":
listUsers(req, resp);
break;
case "/update_form":
showUpdateForm(req, resp);
break;
case "/delete":
deleteUser(req, resp);
break;
case "/add_user_form":
showAddUserForm(req, resp);
break;
default:
resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid path");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String path = req.getPathInfo();
if ("/insert".equals(path)) {
insertUser(req, resp);
} else if ("/update".equals(path)) {
updateUser(req, resp);
} else {
doGet(req, resp); // Delegate to doGet for other cases
}
}
private void listUsers(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<User> users = userDAO.getAllUsers();
req.setAttribute("user_list", users);
req.getRequestDispatcher("/WEB-INF/views/list.jsp").forward(req, resp);
}
private void showUpdateForm(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Long id = Long.parseLong(req.getParameter("id"));
User user = userDAO.getUserById(id);
if (user != null) {
req.setAttribute("user_details", user);
req.getRequestDispatcher("/WEB-INF/views/update_form.jsp").forward(req, resp);
} else {
resp.sendError(HttpServletResponse.SC_NOT_FOUND, "User not found");
}
}
private void deleteUser(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Long id = Long.parseLong(req.getParameter("id"));
String result = userDAO.deleteUser(id);
resp.sendRedirect(req.getContextPath() + "/"); // Redirect to list
}
private void showAddUserForm(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/views/add_user.jsp").forward(req, resp);
}
private void insertUser(HttpServletRequest req, HttpServletResponse resp) throws IOException {
User user = new User();
user.setName(req.getParameter("name"));
user.setPassword(req.getParameter("pass"));
user.setRole(req.getParameter("role"));
user.setDob(LocalDate.parse(req.getParameter("dob")));
String result = userDAO.addUser(user);
resp.sendRedirect(req.getContextPath() + "/"); // Redirect to list
}
private void updateUser(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Long id = Long.parseLong(req.getParameter("id"));
User user = userDAO.getUserById(id);
if (user != null) {
user.setName(req.getParameter("name"));
user.setPassword(req.getParameter("pass"));
user.setRole(req.getParameter("role"));
user.setDob(LocalDate.parse(req.getParameter("dob")));
String result = userDAO.changePassword(id, user.getPassword()); // Assuming merge-like behavior
resp.sendRedirect(req.getContextPath() + "/"); // Redirect to list
} else {
resp.sendError(HttpServletResponse.SC_NOT_FOUND, "User not found");
}
}
}
Explanation:
@WebServlet(value = "/*", loadOnStartup = 1)
intercepts all requests and initializes the servlet eagerly.doGet
handles GET requests, doPost
handles POST requests (e.g., form submissions)./
: Lists all users./update_form
: Shows update form for a user./delete
: Deletes a user./add_user_form
: Shows add user form./insert
: Handles new user creation (POST)./update
: Handles user updates (POST).resp.sendRedirect
) for POST operations to refresh the view; Forward (req.getRequestDispatcher
) for rendering JSPs./WEB-INF/views/
to prevent direct access.Copy JSTL JARs (jstl-1.2.jar
) to <tomcat>/lib
.
Add JSTL dependency in pom.xml
:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
list.jsp