1. JSF的控制流程
a. 由各种GUI组件构建的web表单显示给用户
b. 这个表单被提交给自己
c. 创建一个描绘表单数据的bean
d. 在form中描述的action方法被调用
e. action方法返回一个条件
f. 相应于这个条件的页面返回给用户
2. 使用JSF开发的步骤
a. 创建一个描绘表单数据的Bean
b. 使用f:view和h:form来创建输入表单
c. 用h:commandButton的 action属性来详细说明一个Action controller
d. 创建一个Action controller来读取数据,调用业务逻辑,存储结果,返回一个和某结果页面相关的条件。
e. 使用faces-config.xml来声明form bean和页面导航。
f. 创建和每一条件相关联的jsp页面。
3. 事例1:静态导航
a. 输入表单
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<f:view>
<!DOCTYPE …>
<HTML>
<HEAD>…</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">New Account Registration</TH></TR>
</TABLE>
<P>
<h:form>
Email address: <h:inputText/><BR>
Password: <h:inputSecret/><BR>
<h:commandButton value="Sign Me Up!" action="login"/>
</h:form>
</CENTER></BODY></HTML>
</f:view>
b. 页面导航
<faces-config>
<navigation-rule>
<from-view-id>/login.jsp</from-view-id>
<navigation-case>
<from-outcome>login</from-outcome>
<to-view-id>/WEB-INF/…/result.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
c. 说明
由于是静态导航,所以h:commandButton中的action属性没有指明控制器中的方法,而是直间赋予了导航条件(from-outcome),因此当点击按钮后会直接转向result.jsp页面.(当然一般情况下应在action属性中指明控制器处理方法)
4. 事例2:动态导航
a. 输入表单
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<f:view>
…
<h:form>
First name: <h:inputText/><BR>
Last name: <h:inputText/><BR>
...
<h:commandButton
value="Sign Me Up!"
action="#{loginAction.validate}"/>
</h:form>…
</f:view>
b. 控制器
public class LoginAction {
public String validate() {
if (...) {
return "error";
}
else {
return "success";
}
}
}
c. 导航
<faces-config>
<navigation-rule>
<managed-bean>
<managed-bean-name>
loginAction
</managed-bean-name>
<managed-bean-class>
net.boyce.LoginAction
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<from-view-id>/signup.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/WEB-INF/results/success.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>error</from-outcome>
<to-view-id>/WEB-INF/results/error.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
d. 说明
在action属性中指明了控制器,由控制器返回条件,再根据导航转到不同的结果页面。注意在action属性中指明的控制器方法是无输入参数,且返回String类的函数。