JSF从JSP到Java类的流程

时间:2013-11-22 18:54:29

标签: jsf jsf-2

我是JSF的新手(在Struts中有公平的知识)尝试过一些来自互联网的JSF的例子,我对流程有一些疑问。

示例是下面的内容

Login.xhtml

<div>
    <h:panelGrid columns="2">
        <h:outputText value="Name"></h:outputText>
        <h:inputText value="#{loginBean.name}"></h:inputText>
        <h:outputText value="Password"></h:outputText>
        <h:inputSecret value="#{loginBean.password}"></h:inputSecret>
        <h:commandButton value="Login" action="login"></h:commandButton>
    </h:panelGrid>
</div>

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
    <managed-bean>
        <managed-bean-name>loginBean</managed-bean-name>
        <managed-bean-class>com.tutorial.LoginBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    <navigation-rule>
        <display-name>template/Login.xhtml</display-name>
        <from-view-id>/template/Login.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>login</from-outcome>
            <to-view-id>/template/Welcome.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>

</faces-config>

LoginBean:

package com.tutorial;

public class LoginBean
{
    private String name;
    private String password;


    public String getName ()
    {
        return name;
    }


    public void setName (final String name)
    {
        this.name = name;
    }


    public String getPassword ()
    {
        return password;
    }


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

流程是在登录页面我们将提供用户名和密码,它将转到欢迎页面并显示名称

在下面列出我的查询请帮助我搞清楚这些事情并更好地理解JSF

  1. 在struts中,我们将使用类似下面的代码 <action path="/LoginAction" type="com.app.action.LoginAction" name="LoginForm"> 所以对于这个“LoginAction”,它将转到LoginAction类,bean或DTO将是LoginForm。在上面的faces-config.xml中,login.jsp没有链接到任何bean类。

  2. 在struts中我们有执行方法。我们在JSF中有任何默认方法吗?

  3. 在JSF中,如果我们有一个要求,例如“当我们点击JSP中的按钮时,控件应该转到java类,并且基于java中的身份验证,我们将进入成功或失败页面”。 faces-config.xml中的混淆应该是什么?在<navigation>中,tag只标记<to-view>(这意味着我理解的是JSP)如果控件应该转到java类,我们应该怎么做。

1 个答案:

答案 0 :(得分:1)

  

在上面的faces-config.xml中,login.jsp没有链接到任何bean类。

我不确定为什么这是必要的。 JSF是基于组件的,而不是基于请求的。


  

在struts中我们有execute方法。我们在JSF中有任何默认方法吗?

不,您可以完全自由地将命令组件的action属性绑定到辅助bean的任意方法。

E.g。

<h:commandButton value="Login" action="#{loginBean.submit}" />

public String submit() {
    // Do your thing here.
    // ...

    return "login";
}

请注意,方法名称完全免费供您选择。您也可以#{loginBean.login}使用public String login()方法。我不确定为什么你会被限制在一个预定义的动作名称上。 JSF是基于组件的,而不是基于请求的。


  

“当我们点击JSP中的一个按钮时,控件应该转到java类,并且基于java中的认证我们将进入成功或失败页面”。 faces-config.xml中的混淆应该是什么?在tag中只有标签(对我来说这意味着一个JSP)如果控件应该转到java类,我们应该怎么做。

创建另一个<navigation-case>

<navigation-case>
    <from-outcome>error</from-outcome>
    <to-view-id>/template/Error.xhtml</to-view-id>
</navigation-case>

并在操作方法中进行相应处理:

public String submit() {
    // Do your thing here.
    // ...

    if (success) {
        return "login";
    } else {
        return "error";
    }
}

注意到导航案例应该是soo JSF 1.x.在JSF 2.x上,它们不再是必需的。只需删除<navigation-rule>中的整个faces-config.xml块,并使用JSF隐式导航功能。

    if (success) {
        return "/template/Welcome";
    } else {
        return "/template/Error";
    }

另见: