我是否使用了正确的JSF编码方式?

我是否使用了正确的JSF编码方式?,jsf,backing-beans,entity-bean,Jsf,Backing Beans,Entity Bean,我是JSF新手。我可以使用这种编码方式而不是在JSF视图中使用EL吗?并纠正我,如果有什么错误,在我的编码或我应该使用更好的方式 @Named @RequestScoped public class RegistrationBacking extends Root { @EJB private UserManagerLocal userManager; public String register(){ Map<String, Object>

我是JSF新手。我可以使用这种编码方式而不是在JSF视图中使用EL吗?并纠正我,如果有什么错误,在我的编码或我应该使用更好的方式

@Named
@RequestScoped
public class RegistrationBacking extends Root {
    @EJB
    private UserManagerLocal userManager;
    public String register(){
        Map<String, Object> parameterMap = getRequestMap();
        User user = new User();
        user.setUserName((String) parameterMap.get("userName"));
        user.setPassword((String) parameterMap.get("password"));
        user.setEmail((String) parameterMap.get("email"));
        try{
            userManager.registerUser(user);
        } catch(UserExistsException ex) {
            Logger.getLogger(RegistrationBacking.class.getName()).log(Level.SEVERE, null, ex);
            getContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, getBundle().getString("loginExist"), ex.getMessage()));
            return null;
        } catch(Exception ex) {
            Logger.getLogger(RegistrationBacking.class.getName()).log(Level.SEVERE, null, ex);
            getContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, getBundle().getString("loginError"), ex.getMessage()));
            return null;
        }
        return "index";
    }
}
@Named
@请求范围
公共类注册支持扩展根{
@EJB
私有用户管理器本地用户管理器;
公共字符串寄存器(){
映射参数Map=getRequestMap();
用户=新用户();
user.setUserName((字符串)parameterMap.get(“用户名”);
user.setPassword((字符串)parameterMap.get(“密码”);
user.setEmail((字符串)parameterMap.get(“email”);
试一试{
userManager.registerUser(用户);
}catch(UserExistsException-ex){
Logger.getLogger(RegistrationBacking.class.getName()).log(Level.SEVERE,null,ex);
getContext().addMessage(空,新的FacesMessage(FacesMessage.SEVERITY_错误,getBundle().getString(“loginExist”),例如getMessage());
返回null;
}捕获(例外情况除外){
Logger.getLogger(RegistrationBacking.class.getName()).log(Level.SEVERE,null,ex);
getContext().addMessage(空,新的FacesMessage(FacesMessage.SEVERITY_错误,getBundle().getString(“loginError”),例如getMessage());
返回null;
}
返回“索引”;
}
}

否。您基本上是从请求参数映射中手动获取提交的值,而不是将输入值绑定到模型。您正在控制器的操作方法中手动填充模型。您将无法对这些输入执行JSF管理的转换和Bean验证

正确的方法如下:

<h:form>
    <h:inputText value="#{registrationBacking.user.userName}" />
    <h:inputSecret value="#{registrationBacking.user.password}" />
    <h:inputText value="#{registrationBacking.user.email}" />
    <h:commandButton value="Register" action="#{registrationBacking.register}" />
</h:form>
另见:

如果用户是你的支持bean的属性,并且你的EL有User.userName、User.password和User.email这样的值,那么这就不容易了。我想如果我想更改实体bean的成员变量名称,我会遇到麻烦。谢谢。为什么要在PostConstruct函数中实例化用户?否则它将保持为
null
,并且不能在
null
上调用setter方法。这是“方法”,而不是“功能”。这是Java,不是JavaScript或PHP或其他东西。
private User user;

@PostConstruct
public void init() {
    user = new User();
}

public String register {
    try {
        // ...
    }
}