JSF 体系结构

JSF的主要优势之一就是它既是JavaWeb应用程序的用户界面标准又是严格遵循模型-视图-控制器(MVC)设计模式的框架。用户界面代码(视图)与应用程序数据和逻辑(模型)的清晰分离使JSF应用程序更易于管理。为了准备提供页面对应用程序数据访问的JSF上下文和防止对页面未授权或不正确的访问,所有与应用程序的用户交互均由一个前端FacesServlet(控制器)来处理。

JSF生命周期:

<1>恢复视图

为选定的视图找到或创建组件树。

一旦用户单击JSP页面上的链接或按钮,就会启动此阶段。JSF应用里的JSP页面被表示成一个组件树。JSF实现会进一步将这些组件链接到事件处理程序和验证程序,并将视图保存在FacesContext对象中,以备后面的处理过程所用。FacesContext对象包含了JSF用来管理当前会话中当前请求的GUI组件状态所需要的所有状态信息。

<2>应用请求值

使用请求中发送来的值来更新组件树的组件值。因为请求中发送来的值都是String类型的,所以在更新组件树的组件值之前,必须将这些值转换为相应类型。这个过程也是解码。若转换有错误,这些错误将添加到FacesContext对象。

一个jsf的实例

<3>处理验证

当每个组件的本地值被更新后,Lifecycle对象都会根据这些注册组件的验证规则来验证这些值的合法性。

如果输入的值不符合验证规则,就会将验证错误添加至FacesContext对象,并将组件标记为无效。JSF将转至呈现响应阶段,并显示带有验证错误消息的视图。

如果没有遇到验证错误,JSF将进入下一阶段。

<4>更新模型值

更新与组件相关的后台bean(也叫管理bean)或者模型对象的值。只有那些与组件值绑定在一起的Bean属性才会被更新。

<5>调用应用程序

JSF控制器调用应用程序来处理应用程序级的事件,如提交一个表单。(此阶段可执行业务逻辑)

<6>呈现响应

使用当前的显示技术(如JSP)显示选定的视图。

一个jsf的实例

配置文件

/JSFLoginDemo/WebRoot/WEB-INF/faces-config.xml

代码:

<?xmlversion='1.0'encoding='UTF-8'?>

<faces-configxmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"

version="1.2">

<managed-bean>

<managed-bean-name>loginBean</managed-bean-name>

<managed-bean-class>

com.qdu.sun.jsf.LoginBean

</managed-bean-class>

<managed-bean-scope>request</managed-bean-scope>

<managed-property>

<property-name>username</property-name>

<property-class>java.lang.String</property-class>

<value></value>

</managed-property>

<managed-property>

<property-name>password</property-name>

<property-class>java.lang.String</property-class>

<value></value>

</managed-property>

</managed-bean>

<navigation-rule>

<from-view-id>/login.jsp</from-view-id>

<navigation-case>

<from-outcome>success</from-outcome>

<to-view-id>/success.jsp</to-view-id>

</navigation-case>

<navigation-case>

<from-outcome>fail</from-outcome>

<to-view-id>/fail.jsp</to-view-id>

</navigation-case></navigation-rule>

<navigation-rule>

<from-view-id>/success.jsp</from-view-id>

</navigation-rule>

<navigation-rule>

<from-view-id>/fail.jsp</from-view-id>

</navigation-rule></faces-config>

前端页面

/JSFLoginDemo/WebRoot/login.jsp

<%@pagelanguage="java"pageEncoding="ISO-8859-1"%>

<%@tagliburi="http://java.sun.com/jsf/html"prefix="h"%>

<%@tagliburi="http://java.sun.com/jsf/core"prefix="f"%>

<%

Stringpath=request.getContextPath();

StringbasePath=request.getScheme()+"://"

+request.getServerName()+":"+request.getServerPort()

+path+"/";

%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<basehref="<%=basePath%>">

<title>MyJSF'login.jsp'startingpage</title>

<metahttp-equiv="pragma"content="no-cache">

<metahttp-equiv="cache-control"content="no-cache">

<metahttp-equiv="expires"content="0">

<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

<metahttp-equiv="description"content="Thisismypage">

<!--

<linkrel="stylesheet"type="text/css"href="styles.css">

-->

</head>

<body>

<f:view>

<br>

<h:form>

<h:panelGridcolumns="3">

<h:outputLabelfor="username"value="UserName:"/>

<h:inputTextid="username"value="#{loginBean.username}"required="true"/>

<h:messagefor="username"/>

<h:outputLabelfor="password"value="Password:"/>

<h:inputSecretid="password"value="#{loginBean.password}"required="true"/>

<h:messagefor="password"/>

</h:panelGrid>

<h:panelGrid>

<h:panelGroup>

<h:commandButtonvalue="Login"action="#{loginBean.login}"/>

</h:panelGroup>

</h:panelGrid>

</h:form>

</f:view>

</body>

</html>

后台代码

/JSFLoginDemo/src/com/qdu/sun/jsf/LoginBean.java

/**

*

*/

packagecom.qdu.sun.jsf;

/**

*@authorsun1

*

*/

publicfinalclassLoginBeanextendsObject{

/**

*

*/

privateStringpassword;

/**

*

*/

privateStringusername;

/**

*@returnthepassword

*/

publicStringgetPassword(){

returnpassword;

}

/**

*@parampasswordthepasswordtoset

*/

publicvoidsetPassword(Stringpassword){

this.password=password;

}

/**

*@returntheusername

*/

publicStringgetUsername(){

returnusername;

}

/**

*@paramusernametheusernametoset

*/

publicvoidsetUsername(Stringusername){

this.username=username;

}

publicStringlogin(){

if((username==null)||(username.length()<1))

return"fail";

if((password==null)||(password.length()<1))

return"fail";

if((username.equals("孙更新"))&&(password.equals("123")))

return"success";

else

return"fail";

}

}

相关推荐