我是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
在struts中,我们将使用类似下面的代码
<action path="/LoginAction" type="com.app.action.LoginAction" name="LoginForm">
所以对于这个“LoginAction”,它将转到LoginAction类,bean或DTO将是LoginForm。在上面的faces-config.xml中,login.jsp没有链接到任何bean类。
在struts中我们有执行方法。我们在JSF中有任何默认方法吗?
在JSF中,如果我们有一个要求,例如“当我们点击JSP中的按钮时,控件应该转到java类,并且基于java中的身份验证,我们将进入成功或失败页面”。 faces-config.xml
中的混淆应该是什么?在<navigation>
中,tag只标记<to-view>
(这意味着我理解的是JSP)如果控件应该转到java类,我们应该怎么做。
答案 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";
}