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 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 中划分代码的最佳方法是什么?

4

1 回答 1

3

验证通常属于服务层,因为不需要将其绑定到特定的视图实现。因此,在您的情况下,请尝试将其放入 EJB 中。

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

  • 针对服务层编写测试通常更容易;这样您就可以测试验证,而无需模拟视图层。

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

于 2013-08-19T08:21:12.740 回答