Consider these static methods outside of any servlet. All of them retrieve a hibernate session from a servlet filter.
public static User findUser(HttpServletRequest request) {
Session session = (Session)request.getAttribute("session"); // org.hibernate.Session
User user = (User)session.createQuery("from User u where u.email like :email and u.password like :password").setParameter("email", request.getParameter("email")).setParameter("password", hash(request.getParameter("password"))).uniqueResult();
return user;
}
public static User userExist(HttpServletRequest request) {
Session session = (Session)request.getAttribute("session"); // org.hibernate.Session
User user = (User)session.createQuery("from User u where u.email like :email").setParameter("email", request.getParameter("email")).uniqueResult();
return user;
}
public static User loadUser(HttpServletRequest request) {
Session session = (Session)request.getAttribute("session"); // org.hibernate.Session
User user = session.load(User.class, (long)request.getSession().getAttribute("userid"));
return user;
}
public static boolean existReservations(HttpServletRequest request, boolean checkCurrent) {
Date checkInDate = getDate(request.getParameter("checkInDate"));
Date checkOutDate = getDate(request.getParameter("checkOutDate"));
List<Reservation> res = loadUser(request).getReservations();
for (Reservation r : res) {
if (checkInDate.compareTo(r.getCheckOutDate()) <= 0 && checkOutDate.compareTo(r.getCheckInDate()) >= 0) {
if (checkCurrent && r.getReservationID() != Long.parseLong(request.getParameter("id"))) {
continue;
}
return true;
}
}
return false;
}
I will have to call these methods lots of times so they are in a Utils class. Now, I am absolutely sure that I will always call them if:
- I'm in a servlet.
- A hibernate session is open
- A HTTPSession and a "userid" attribute is available.
- In case of reservation methods, a parameter "id" is available
Now I found that doing this made my servlet code shorter. I personally think there are no problems doing this, I'm not modifying any attributes or parameters in HTTPServletRequest. I've seen many question asking if this is possible. But is this bad practice or I'm doing just fine? Are there cases where doing this approach make bad things happen?