Моя идея такова: у меня есть bean-компонент ( UserBean ), у которого есть некоторые атрибуты, которые помогут мне проверить, прежде чем я установлю в сущность User . Я делаю это для повторного использования проверки в атрибуте UserBean во всем проекте и для разделения слоев, как я мог прочитать во многих постах здесь, в переполнении стека .
Зная, что я хотел бы сохранить структуру MVC, давайте посмотрим, что я делаю до сих пор:
(извините за большую картину, я подумал, что будет проще понять мой вопрос)
Это мой пользователь (в пакете сущностей):
@Entity
@Table(name="user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private int id;
private String email;
private String password;
private int reputation;
//bi-directional one-to-one association to Company
@OneToOne(mappedBy="user", cascade={CascadeType.ALL})
private Company company;
//bi-directional many-to-one association to Location
@OneToMany(mappedBy="user")
private List<Location> locations;
//bi-directional one-to-one association to Person
@OneToOne(mappedBy="user")
private Person person;
//bi-directional many-to-one association to Product
@OneToMany(mappedBy="user")
private List<Product> products;
//bi-directional many-to-one association to UserType
@ManyToOne
@JoinColumn(name="type")
private UserType userType;
//bi-directional many-to-one association to UserPhone
@OneToMany(mappedBy="user")
private List<UserPhone> userPhones;
//bi-directional many-to-one association to UserPicture
@OneToMany(mappedBy="user")
private List<UserPicture> userPictures;
//bi-directional many-to-one association to UserSocialNetwork
@OneToMany(mappedBy="user")
private List<UserSocialNetwork> userSocialNetworks;
// getters and setters
}
А это его бин, UserBean (в пакете bean.entity):
@ManagedBean
@SessionScoped
public class UserBean implements Serializable {
private static final long serialVersionUID = -1626847931067187536L;
private int id;
@NotNull(message="informe seu e-mail")
@Email(message="e-mail inválido")
private String email;
@NotNull(message = "6 dígitos no mínimo")
@Size(min = 6, max = 128, message = "6 dígitos no mínimo")
private String password;
@NotNull(message = "6 dígitos no mínimo")
@Size(min = 6, max = 128, message = "6 dígitos no mínimo")
private String password_2;
private int reputation;
private UserType userType;
private List<UserPhoneBean> userPhones;
private List<UserPicture> userPictures;
private List<UserSocialNetwork> userSocialNetworks;
@AssertTrue(message = "senhas diferentes")
public boolean isPasswordsEquals() {
return password.equals(password_2);
}
// getters and setters
}
Затем при каждом действии, связанном с пользователем, я бы хотел сохранить элемент управления в одном месте, поэтому я создаю UserControl bean:
@ManagedBean(name="userc")
@ViewScoped
public class UserControl implements Serializable {
private static final long serialVersionUID = -1626847931067187536L;
@EJB EaoUser eaoUser;
@EJB EaoPerson eaoPerson;
@ManagedProperty("#{userBean}")
private UserBean user;
@ManagedProperty("#{personBean}")
private PersonBean person;
private UserBean ub;
private PersonBean pb;
private View view;
public UserControl() {
ub = new UserBean();
pb = new PersonBean();
view = new View();
}
public String login(){
List<User> list = eaoUser.findByEmail(ub.getEmail());
User u = list.get(0);
if (Crypto.check(ub.getPassword(), u.getPassword())){
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
session.setAttribute("authenticated", true);
user = new UserBean();
user.setId(u.getId());
user.setEmail(u.getEmail());
user.setPassword(u.getPassword());
user.setReputation(u.getReputation());
user.setUserType(u.getUserType());
if (u.getUserType().getId() == 10){
Person p = eaoPerson.find(u.getId());
if (p != null){
person = new PersonBean();
person.setName(p.getName());
person.setSurname(p.getSurname());
person.setBirthdate(p.getBirthdate());
person.setGender(p.getGender());
}
}
for (UserPhone up : u.getUserPhones()){
user.getUserPhones().add(new UserPhoneBean(up.getId(), up.getPhone()));
}
user.setUserPictures(u.getUserPictures());
user.setUserSocialNetworks(u.getUserSocialNetworks());
}else{
view.imageError();
view.setStatus("e-mail ou senha incorretos");
view.setPopup(true);
return "#";
}
return "secured/user/home?faces-redirect=true";
}
// others method, getters and setters
}
Обратите внимание, что я вставляю userBean здесь в userControl , поэтому, когда пользователь входит в систему, я спасаю значение из базы данных и устанавливаю в userBean.
Я создаю атрибут user и ub , потому что когда я пытаюсь проверить с помощью user , проверка не работает, я думаю, это потому, что он уже введен (только предположение).
Итак, после всего этого объяснения, когда я пытаюсь войти в систему, пользователь (который вводится) больше не сохраняет никакого значения.
Если я попытаюсь сделать это:
Welcome, <h:outputText value="#{userc.user.email}" />
Не появляется ничего ..
Так что мне интересно, правильна ли моя структура.
Что вы, ребята, думаете об этом?