如何在 JSF 中将 getter 和 setter 与托管 bean 分开?

How to separate getters and setters from managed bean in JSF?

我正在用 JSF 开发登录页面。我有两个属性电子邮件和密码。我想要两个 java classes。一个用于 setter 和 getter,两个用于逻辑。那么,如何将 setter 和 getter 从托管 bean 中分离出来。我的代码是

private String email;
private String password;
private String message;

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}
public void login()
{
 //logic
}

我想在一个 class 中使用 login() 方法,在另一个 class 中使用 setter 和 getter。以及如何对这两个文件使用 .xhtml。请帮助我

我不知道将 getter 和 setter 分成不同 class 的解决方案。对于我认为你只是 运行 在圈子里得到的语义结果实际上与将 getter 和 setter 与你的其他东西放在同一个 bean 上相同。

现在,对于您的业务逻辑,您始终可以使用不同的 classes 来管理该逻辑。没有什么能真正阻止您这样做,只要您通过 bean 方法引用它们,因为这个 bean 是您进入 JSF 页面的大门。

how to seperate getters and setters from managed bean in JSF?

只需介绍另一个托管 bean,其目的是保存您的数据。

@Named
@ViewScoped
public class LoginModel implements Serializable {
    private String userName;
    private String password;

    //Getters and setters ...
}

@Named
@ViewScoped
public class LoginController implements Serializable {

    @Inject
    private LoginModel loginData;

    public String logIn(){
        if(isLoginDataValid(loginData)){
            return "index.xhtml";
        }
    }
}

请确保使用 javax.faces.view.ViewScoped 作为注释。不要使用 javax.faces.bean.ViewScoped.

使用部分 jsf 可能看起来像。

<h:form>
    <table>
        <tr>
            <td>Username:</td>
            <td>
                <h:inputText value="#{loginModel.userName}"/>
            </td>
        </tr>
        <tr> 
            <td>Password:</td>
            <td>
                <h:inputText value="#{loginModel.password}"/>
            </td>
        </tr>
        <tr>
            <td></td>
            <td>
                <h:commandButton value="Login" action="#{loginController.logIn}"/>          
            </td>
        </tr>
    </table>
</h:form>

首先,阅读有关 three-tier architecture 的内容。您应该始终将业务逻辑与表示层分开。在您的情况下,表示层包括 jsf 页面和托管 bean 作为控制器。我为您的申请推荐以下模板:

  1. 创建服务classLoginService并注释@Stateless:

    @Stateless
    public class LoginService {
        public void login() {
            //your logic here
        }
    }
    
  2. 将此 EJB 注入您的托管 bean:

    @EJB private LoginService loginService;
    
    //getters and setters are omitted
    public void login() {
        loginService.login();
    }
    

上面的模板会将您的业务逻辑与托管 bean 分开,并使其与前端无关(例如,如果您决定为每个字段添加 RESTful services to your application, you can use EJB injection by the same way). And don't remove getters and setters from your managed bean. Managed bean needs to be a POJO 和 getter 和 setter。

如果只是冗长,您可以尝试 lombok framework 并注释您的字段,这样就不需要 getter 和 setter

免责声明:我自己没有使用它

将数据保存在 DTO class 中,并在 Bean class 中创建对象和 setter getter。并通过 xhtml 中的 Bean class 访问 DTO class 的属性。

豆子class

@SessionScoped
@ManagedBean(name = "loginBean")
public class LoginBean implements Serializable {

LoginDTO loginDTO = new LoginDTO();

public String logIn() {
   //here the logic
}

public LoginDTO getLoginDTO() {
    return loginDTO;
}

public void setLoginDTO(LoginDTO loginData) {
    this.loginDTO = loginData;
}

}

DTO class

public class LoginDTO {
private String email;
private String password;
private String message;
private String localeCode;

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}

}

并访问 xhtml 中的数据,如 value="#{loginBean.loginDTO.email}"