Java 创建用于处理公共servlet请求和事务操作的静态方法

Java 创建用于处理公共servlet请求和事务操作的静态方法,java,hibernate,jakarta-ee,servlets,Java,Hibernate,Jakarta Ee,Servlets,在任何servlet之外考虑这些静态方法。它们都从servlet过滤器中检索hibernate会话 public static User findUser(HttpServletRequest request) { Session session = (Session)request.getAttribute("session"); // org.hibernate.Session User user = (User)session.createQuery("from User

在任何servlet之外考虑这些静态方法。它们都从servlet过滤器中检索hibernate会话

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;
}
公共静态用户findUser(HttpServletRequest){
Session Session=(Session)request.getAttribute(“Session”);//org.hibernate.Session
User User=(User)session.createQuery(“来自用户u,其中u.email类似:email,u.password类似:password”).setParameter(“email”,request.getParameter(“email”).setParameter(“password”),hash(request.getParameter(“password”)).uniqueResult();
返回用户;
}
公共静态用户userExist(HttpServletRequest请求){
Session Session=(Session)request.getAttribute(“Session”);//org.hibernate.Session
User User=(User)session.createQuery(“来自用户u,其中u.email类似于:email”).setParameter(“email”,request.getParameter(“email”)).uniqueResult();
返回用户;
}
公共静态用户loadUser(HttpServletRequest){
Session Session=(Session)request.getAttribute(“Session”);//org.hibernate.Session
User User=session.load(User.class,(long)request.getSession().getAttribute(“userid”);
返回用户;
}
公共静态布尔existerervations(HttpServletRequest请求,布尔checkCurrent){
日期checkInDate=getDate(request.getParameter(“checkInDate”);
日期checkOutDate=getDate(request.getParameter(“checkOutDate”);
List res=loadUser(请求).getReservations();
预订(r:res){
如果(checkInDate.compareTo(r.getCheckOutDate())=0){
if(checkCurrent&r.getReservationID()!=Long.parseLong(request.getParameter(“id”)){
继续;
}
返回true;
}
}
返回false;
}
我将不得不多次调用这些方法,以便它们位于Utils类中。现在,我绝对相信,如果:

  • 我在一个servlet中
  • 休眠会话已打开
  • HTTPSession和“userid”属性可用
  • 对于保留方法,参数“id”可用

现在我发现这样做可以缩短servlet代码。我个人认为这样做没有问题,我没有修改HTTPServletRequest中的任何属性或参数。我见过很多人问这是否可能。但这是坏习惯还是我做得很好?有没有这样的情况会导致不好的事情发生?

如果在这些方法中使用静态变量,我会发现这是有问题的,因为这样会失去并发保护。由于所有内容似乎都是通过参数提供的,所以应该可以。在实用程序类中分离常用函数是一个好主意。但是,很快就会有多个线程将数据弄乱。两种方法1)在实用工具方法中使用synchronized关键字使方法局部变量线程安全2)在方法中访问会话和请求对象而不在
final
类型引用变量中接收它们不是一种好做法。从这些对象中取出重要字段,并将其传递给线程安全的静态方法。参考这些,我通常在我的项目中创建一个根servlet,我的所有servlet都从中继承并将这些类放在其中。然后,您可以将每个servlet中的方法调用到父方法。如果您在这些方法中使用静态变量,我会发现这是有问题的,因为您将失去并发保护。由于所有内容似乎都是通过参数提供的,所以应该可以。在实用程序类中分离常用函数是一个好主意。但是,很快就会有多个线程将数据弄乱。两种方法1)在实用工具方法中使用synchronized关键字使方法局部变量线程安全2)在方法中访问会话和请求对象而不在
final
类型引用变量中接收它们不是一种好做法。从这些对象中取出重要字段,并将其传递给线程安全的静态方法。参考这些,我通常在我的项目中创建一个根servlet,我的所有servlet都从中继承并将这些类放在其中。然后,您可以将每个servlet中的方法调用到父方法。