2013-08-19 51 views
0

比如我有一個JSF託管bean,並在我的方法來創建用戶:很好的做法,代碼分區

public String createNewAccount() { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     Map requestParameterMap = (Map) context.getExternalContext().getRequestParameterMap(); 
     try { 
      String userRole = requestParameterMap.get("userRole").toString(); 
      String active = requestParameterMap.get("active").toString(); 
      Boolean act = Boolean.parseBoolean(active); 
      user.setRole(userRole); 
      user.setActive(act); 
      if ((user.getEmail() != null) && (userDao.findEmailExist(user.getEmail()))) { 
       sendErrorMessageToUser("A user with the given email address exists in the databasee"); 
       return null; 
      } else { 
       userDao.create(user); 
      } 
     } catch (EJBException e) { 
      sendErrorMessageToUser("Register error"); 
      return null; 
     } 
     return "newAccountCreated"; 
    } 

,我讀了JSF managedBean應僅用於導航和我在這裏的問題是,是否這樣做在JSF beanie中的驗證是正確的?例如,我們是否應該創建一個服務層來完成驗證?例如,像這樣:

@Stateless 
public class UserDao implements UserDaoLocal { 

    @PersistenceContext 
    private EntityManager em; 
    private User user; 

    @Override 
    public void create(User user) { 
     em.persist(user); 
    } 

@Stateless 
public class UserDaoService implements UserDaoServiceLocal { 

    @EJB 
    private UserDaoLocal userDao 
    private User user; 


    @Override 
    public String create(User user) { 
     if(findEmailExist(user.email) { 
      return "emailExist"; 
     } else { 
      userDao.create(user); 
       return "create"; 
     } 
    } 

    @Override 
    public boolean findEmailExist(String email) { 
     try { 
      Query q = em.createNamedQuery("User.findByEmail"); 
      q.setParameter("email", email); 
      user = (User) q.getSingleResult(); 
      return true; 
     } catch (Exception e) { 
      System.out.println("Błąd email: " + e.getMessage()); 
      return false; 
     } 
    } 

,然後在JSF豆唯一有此:

public String createNewAccount() { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     Map requestParameterMap = (Map) context.getExternalContext().getRequestParameterMap(); 
     try { 
      String userRole = requestParameterMap.get("userRole").toString(); 
      String active = requestParameterMap.get("active").toString(); 
      Boolean act = Boolean.parseBoolean(active); 
      user.setRole(userRole); 
      user.setActive(act); 
      String result userDaoService.create(user); 
      if (result = "emailExist") { 
       sendErrorMessageToUser("A user with the given email address exists in the database"); 
       return null; 
      } else 
       return result; 
      } 
     } catch (EJBException e) { 
      sendErrorMessageToUser("Error registration"); 
      return null; 
     } 
    } 

這是一個很好的? 在Java EE中分區代碼的最佳方式是什麼?

+0

這是基本的MVC架構。查看圖層(在您的情況下,JSF託管bean)只需完成將表單轉換爲可管理數據的工作。處理這些數據和DAO訪問與該層無關。 –

回答

3

驗證通常屬於服務層,因爲不需要將其綁定到特定的視圖實現。所以在你的情況下,嘗試把它放在EJB中。

  • 如果你必須實現另一個應用程序,它是使用另一種觀點認爲實施如Swing例如,這將有利於從確認爲好。

  • 針對服務層寫測試通常更容易;這樣你就可以測試驗證而不必模擬視圖層。

  • 使用JSF,如果您有兩個使用不同的託管bean的用例,並且這兩個用例都創建了一個用戶,那麼您可能會最終編寫兩次驗證代碼。

+0

好的。謝謝你的回答。但是,如果我的managedBean可以嗎?操作太高了? –

+1

您忘記告訴OP在JSF中執行驗證時需要知道的最重要的事情:它應該在驗證器中完成,而不是在操作方法中完成。 – BalusC

+0

我有驗證器。驗證器檢查輸入的正確電子郵件。但是在服務層,我檢查是否還沒有這樣的電子郵件。 –

相關問題