代码分区的好习惯

时间:2013-08-19 07:00:03

标签: java jsf ejb

示例我有一个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 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);
            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中分区代码的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

验证通常属于服务层,因为不需要将其绑定到特定的视图实现。所以在你的情况下,试着把它放在EJB中。

  • 如果你必须实现另一个使用另一个视图实现的应用程序,例如Swing,它也将从验证中受益。

  • 对服务层编写测试通常更容易;这样你就可以测试验证而不必模拟视图层。

  • 使用JSF,如果您有两个使用不同托管bean的用例,并且两个用例都创建了一个用户,那么您最终可能会编写两次验证代码。