示例我有一个 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 中划分代码的最佳方法是什么?
最佳答案
验证通常属于服务层,因为不需要将其绑定(bind)到特定的 View 实现。因此,在您的情况下,请尝试将其放入 EJB 中。
如果您必须实现另一个应用程序,该应用程序要使用另一个 View 实现(例如 Swing),它也将从验证中受益。
针对服务层编写测试通常更容易;这样您就可以测试验证而无需模拟 View 层。
使用 JSF,如果您有两个使用不同托管 Bean 的用例,并且这两个用例都创建一个用户,那么您最终可能需要编写两次验证代码。
关于java - 代码分区的好习惯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18308073/