2013-08-19 5 views
0

Пример У меня есть 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); 
      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 является правильным? Должен ли мы создать, например, сервисный уровень, в котором будет выполнена проверка? Например, так:

@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) должен выполнять только работу по преобразованию формы в управляемые данные. Обработка таких данных и доступа DAO не имеет ничего общего с этим слоем. –

ответ

3

Проверка обычно относится к уровню обслуживания, так как нет необходимости связывать ее с конкретной реализацией вида. Поэтому в вашем случае попробуйте поместить его в EJB.

  • Если вы должны выполнить еще одно приложение, которое должно использовать другой реализации вид как свинг, например, это пойдет на пользу от проверки, а также.

  • Как правило, легче писать тестов против сервисного уровня; и таким образом вы можете протестировать проверку без необходимости издеваться над уровнем представления.

  • Использование JSF, если у вас есть два варианта использования с использованием разных управляемых компонентов, и оба варианта использования создают пользователя, скорее всего, вы в два раза записываете код проверки.

+0

Хорошо. Спасибо за ответ. Но если мой managedBean в порядке? Слишком высокая операция? –

+1

Вы забыли рассказать о самой важной вещи, которую OP должен знать в случае выполнения проверки в JSF: это должно быть сделано в валидаторе, а не в методе действий. – BalusC

+0

У меня есть валидатор. Валидатор проверяет правильное введенное электронное письмо. Но на уровне сервиса я проверяю, нет ли такого письма. –