在SessionScoped bean (CDI、JSF)中更新来自用户POST的数据的最优雅的方式



我有一个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>

相关内容

  • 没有找到相关文章

最新更新