我有一个SessionScoped的cdi bean保存用户数据。
@SessionScoped
public class UserData {
private String name;
private String city;
.. several other attributes
}
用户想要更新表单(JSF)中的数据。因此,我使用"FrontendModel"来封装所有属性。
<标题> FrontendModel h1> jsf页面:<h:inputText id="username" value="#{userDataFrontendModel.name}"/>
<h:inputText id="city" value="#{userDataFrontendModel.city}"/>
<标题>控制器h1> 是过度设计吗?我不想让所有用户的属性都直接在控制器中。UserDataFrontendBean应该是cdi bean吗?有没有更简单的方法来做我想做的事?我不能直接使用我的UserData对象,可以吗? 标题>标题>最好将UserDataController
声明为@Named @SessionScoped
,并在那里仅保留UserData
字段。由于UserDataController
将存储在会话作用域中,因此它的所有字段也将在会话作用域中。使用这种方法,您根本不需要UserDataFrontendModel
类。
@Named
@SessionScoped
public class UserDataController {
@Inject
private UserData userData;
@PostConstruct
private void initUserDataFrontendModel() {
userData = new UserData();
}
public void updateUserData() {
//logic to update the data in database or something
}
}
然后直接将UserData
中的数据绑定到视图中的元素:
<h:form>
<h:inputText value="#{userDataController.userData.name}" />
<h:inputText value="#{userDataController.userData.city}" />
<h:commandButton value="Update User Data"
action="#{userDataController.updateUserData}" />
</h:form>