JSF入门
来源:互联网 发布:推荐淘宝蓝莓苗卖家 编辑:程序博客网 时间:2024/06/09 20:49
浏览了很多的网站,总结一下JSF这个框架。
JavaServer Faces (JSF) 是一种用于构建Java Web 应用程序的标准框架(是Java Community Process 规定的JSR-127标准)。它提供了一种以组件为中心的用户界面(UI)构建方法,从而简化了Java服务器端应用程序的开发。由于由Java Community Process (JCP) 推动,属于Java EE 5中的技术规范,而受到了厂商的广泛支持。
这里说明一下JSF是一个框架,是一种开发标准,JSF属于javaEE中的技术,JSF是一种规范,例如java中的JDBC的接口和类,会由不同的厂商实现(例如Mysql和Oracle),对应的实现JSF的例如Myfaces,MyFaces是Apache软件基金会开发的一个JSF Web框架 (JSR 127)的具体实现框架。
一.jsf(java server faces)的运行原理(工作方式)
1.jsf应用是事件驱动的,当一个事件发生时(比如用户单击一个按钮),事件通知通过HTTP发往服务器,服务器端使用叫做FacesServlet的特殊servlet处理该通知,web容器里每一个jsf应用都有它自己的FacesServlet;
在后台,每一个jsf请求都触发了3件事情:
1)FacesServlet创建FacesContext(该对象中包含Web容器传给FacesServlet的service方法的ServletContext,ServletRequest,ServletRespons对象,在处理过程中主要就是修改这个FacesContext)
2)FacesServlet把控制权交给Lifecycle
3)Lifecycle分6个阶段处理FacesContext(也即jsf生命周期过程)
二.jsf生命周期过程
1. 重建视图: 建立组件树,如果是首次渲染,则组件树被重置合适的状态;如果不是首次渲染,则组件树被创建跳到响应阶段(JSF的组件树结构和DOM是一样的,只不过后者是client前者是server)。
2. 应用请求值: 树中的每个组件都能从请求参数中提取到新的值,并把值存储本地,之后处理所有与组件相关的事件进入队列,如果某个组件的immediate属性设置为true,那么验证,转换,以及与组件关联的事件在这个阶段被处理.
3. 处理验证: 组件值转换成与之相对应的数据类型。如果转换失败,这一阶段将继续完成所有剩余的转换器,验证和运行所需的检查,但在完成后,跳转到生命周期的Render Response阶段。如果验证成功,则检查组件上的required 的属性。如果该属性是必须的并且组件中输入了值,那么与之相关的验证程序运行。如果required的属性是必须但又没有输入值,这一阶段完成(所有剩余验证程序还会继续执行),然后生命周期跳跃到Render Response阶段。如果required 属性标识为false,不管组件中有没有输入值,验证过程都不会运行。
4. 更新模型: 验证组件的本地值移动到模型中,同时本地副本被丢弃。
5. 调用应用程序: 执行应用级逻辑(如事件处理程序)。
6. 呈现响应: 呈现树中的组件。后续请求和Restore View阶段保存状态信息。
JSF框架简介与1实例
为选定的视图找到或创建组件树。
应用请求值
使用请求中发送来的值来更新组件树的组件值。因为请求中发送来的值都是String类型的,所以在更新组件树的组件值之前,必须将这些值转换为相应类型。这个过程也是解码。若转换有错误,这些错误将添加到FacesContext对象。
处理验证
当每个组件的本地值被更新后,Lifecycle对象都会根据这些注册组件的验证规则来验证这些值的合法性。
更新模型值
调用应用程序
一个JSF示例:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>guessNumber</display-name> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping></web-app>
package chapter5; import java.util.Random; public class UserNumberBean { /** 用户输入的数字 */ private int userNumber = 0; /** 正确答案数字 */ private int keyNumber = 0; /** 最小值 */ private int minNum = 0; /** 最大值 */ private int maxNum = 10; /** 回应客户的信息字符串 */ private String responseStr; public UserNumberBean() { Random random = new Random(); keyNumber = random.nextInt(10); System.out.println("正确数字是:" + keyNumber); } public int getUserNumber() { return userNumber; } public int getKeyNumber() { return keyNumber; } public int getMaxNum() { return maxNum; } public int getMinNum() { return minNum; } public String getResponseStr() { if(userNumber == keyNumber){ return "您真聪明,您猜对了!"; }else{ return "对不起,您猜错了!不是"+ userNumber +"!"; } } public void setUserNumber(int userNumber) { this.userNumber = userNumber; } public void setKeyNumber(int keyNumber) { this.keyNumber = keyNumber; } public void setMaxNum(int maxNum) { this.maxNum = maxNum; } public void setMinNum(int minNum) { this.minNum = minNum; } public void setResponseStr(String responseStr) { this.responseStr = responseStr; }}
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE faces-config PUBLIC"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN""http://java.sun.com/dtd/web-facesconfig_1_1.dtd"><faces-config xmlns="http://java.sun.com/JSF/Configuration"> <managed-bean> <managed-bean-name[q1] >UserNumberBean</managed-bean-name> <managed-bean-class[q2] >chapter5.UserNumberBean</managed-bean-class> <managed-bean-scope[q3] >session</managed-bean-scope> </managed-bean></faces-config>
<%@ page contentType="text/html; charset=GBK" %><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><html><head><title>猜数字</title></head><body bgcolor="#ffffff"><f:view> <h:form id="helloForm"> <h2>请猜一个<h:outputText value="#{UserNumberBean.minNum}" /> 至<h:outputText value="#{UserNumberBean.maxNum}" />的数字</h2> <h:inputText id="userNo" value="#{UserNumberBean.userNumber}"> <f:validateLongRange minimum="#{UserNumberBean.minNum}" maximum="#{UserNumberBean.maxNum}" /> </h:inputText> <h:commandButton id="submit" action="success" value="提交" /><br/> <h:message style="color:red;" id="errors1" for="userNo"/> </h:form></f:view></body></html>
第二个页面:结果页面response.jsp:
<%@ page contentType="text/html; charset=GBK" %><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><html><head><title>结果</title></head><body bgcolor="#ffffff"><f:view> <h:form id="responseForm"> <h2> <h:outputText id="result" value="#{UserNumberBean.responseStr}" /> </h2> <h:commandButton id="back" value="返回" action="success" /> </h:form></f:view></body></html>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"><faces-config xmlns="http://java.sun.com/JSF/Configuration"> <managed-bean> <managed-bean-name>UserNumberBean</managed-bean-name> <managed-bean-class>chapter5.UserNumberBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <navigation-rule> <from-view-id[q4] >/guess.jsp</from-view-id> <navigation-case[q5] > <from-outcome[q6] >success</from-outcome> <to-view-id[q7] >/response.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/response.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/guess.jsp</to-view-id> </navigation-case> </navigation-rule></faces-config>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<h:inputText id="userNo" value="#{UserNumberBean.userNumber}"> <f:validateLongRange minimum="#{UserNumberBean.minNum}"maximum="#{UserNumberBean.maxNum}" /></h:inputText>
这段代码要求userNo文本字段中所输入的值要在指定的最小值和最大值之间。
- jsf:jsf入门案例
- JSF入门
- JSF入门
- JSF入门
- JSF 入门
- JSF入门
- JSF入门
- JSF入门
- JSF入门
- jsf入门
- JSF入门
- JSF入门
- JSF入门
- JSF入门
- JSF入门
- JSF入门
- JSF入门
- JSF入门
- oracle case表达式
- ubuntu系统中安装caffe可视化工具digits
- 【Android】开发干货-技术分享之高仿QQ微信网页加载进度条实现
- 从零开始搭建一个完善的MVP开发框架(四) —对View(Activity,Fragment等)层组件进行封装简化View层的开发
- 学习OpenCV——行人检测&人脸检测(总算运行出来了)
- JSF入门
- 13.2. Copy Control and Resource Management
- jVM内存模型(二、重排序与同步)
- 美团CODEM 最长树链 枚举质因数,DFS或者直接BFS
- unity人物残影的实现
- HashMap简介
- 黑客-ubuntu下scapy的ARP攻击(1)
- python脚本作业
- 从零开始搭建一个完善的MVP开发框架(五),通过组件化开发优化项目的结构