JSF正确使用依赖

时间:2013-02-10 13:23:42

标签: jsf-2 managed-bean

JSF 2.1 Tomcat 7.0

这是依赖注入的错误用法吗?

它可以在页面上移动。但“它的工作原理”与“它是正确的”并不相同。

我也会将此模式用于搜索目的。我有一个请求,我喜欢用它来填充同一页面中的表。这可能吗?

的index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <link rel="SHORTCUT ICON" href= "resources/img/onlyT.ico"></link>
        <title>title</title>
        <h:outputStylesheet library="css" name="compass.css"/>
    </h:head>
    <h:body>
        Login system
        <br />

        <h:form>
            User : <h:inputText value="#{user.username}" />
            Password : <h:inputSecret value="#{user.password}" />
            <h:commandButton action="#{loginBean.performLogin()}" value="Submit" />
            <h:commandButton value="reset" type="reset" />
            <h:commandButton value="ChangePsW" action="changePassword"></h:commandButton>
        </h:form>

        <h:message for="" style="color:red;margin:8px;"/>

    </h:body>
</html>

LoginBan.java

@ManagedBean
@RequestScoped
public class LoginBean {


    @ManagedProperty(value="#{user}")
    private UserBean userBean;

    //must povide the setter method
    public void setUserBean(UserBean userBean) {
        this.userBean = userBean;
    }

    public LoginBean() {}


    public String performLogin(){


        //Mi connetto al db
        if(userBean.getUsername().equalsIgnoreCase( "mario")){

        //effettuo i controlli per stabilire se esiste l'utente

        userBean.setRoles("-EE-E-E-E-E-E");
        return "/mainPortal/mainPortal";
        }
        return "/mainPortal/index";

    }
}

UserBean.java

@ManagedBean (name="user")
@SessionScoped 
public class UserBean implements Serializable  {

private String Username;
private String Password;
private String Roles;

/** Creates a new instance of UserBean */
public UserBean() {
}


/**
 * @return the Username
 */
public String getUsername() {
    return Username;
}


/**
 * @param Username the Username to set
 */
public void setUsername( String Username ) {
    this.Username = Username;
}


/**
 * @return the Password
 */
public String getPassword() {
    return Password;
}


/**
 * @return the Roles
 */
public String getRoles() {
    return Roles;
}


/**
 * @param Roles the Roles to set
 */
public void setRoles( String Roles ) {
    this.Roles = Roles;
}


/**
 * @param Password the Password to set
 */
public void setPassword( String Password ) {
    this.Password = Password;
}

更改密码也使用userBean并拥有他的changePasswordBean。

1 个答案:

答案 0 :(得分:1)

JSF 2允许您在其他托管bean中injecting managed beans。这只受你实际注入的bean的范围的限制,它必须大于你实际所在的bean的范围。我的意思是,你可以在{{1}中注入@SessionScoped bean一个,但不是另一个方式。当你遵循这个惯例时,我认为你做得很好。

通常,您的应用程序应由@ViewScoped@ViewScoped bean组成,以处理当前用户输入/输出以及用于会话或应用程序方式的更广泛的bean。因此,当用户登录时,最好将其数据保存在会话上下文中,但是我建议您不要将用户的密码保存到会话中,至少如果您在登录成功后不打算使用它。

最后您提出的关于搜索请求的问题,我认为您可以在页面中实现搜索输入,并根据搜索情况对结果表进行二次加载。只需使用ajax即可获取它而无需重新加载整个页面。您可以在@RequestScoped bean中实现所有内容,但是如果要维护bean的工作,请记住不要在侦听器方法中返回导航结果。