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

时间:2015-03-08 04:27:41

标签: java jsf javabeans getter-setter

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

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
}

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

5 个答案:

答案 0 :(得分:1)

  

如何在JSF中从托管bean中分离getter和setter?

只需引入另一个托管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>

答案 1 :(得分:0)

我不知道将getter和setter分成不同类的解决方案。因为我认为你只是在圈子中运行得到与在其他东西上使用同一个bean的getter和setter相同的语义结果。

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

答案 2 :(得分:0)

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

  1. 创建服务类LoginService并对其进行注释@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();
    }
    
  3. 上面的模板会将您的业务逻辑与托管bean分开并保持与前端无关(例如,如果您决定将RESTful services添加到您的应用程序,您可以使用EJB注入同样的方式)。并且不要从托管bean中删除getter和setter。托管bean必须是POJO,每个字段都有getter和setter。

答案 3 :(得分:0)

如果它只是冗长,你可以试试lombok framework并注释你的字段,这样就不需要吸气剂和固定剂了

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

答案 4 :(得分:-1)

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

Bean类

@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课程

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}”