-JSF入门环境配置XML配置和标签使用详细介绍以及发布部_第1页
-JSF入门环境配置XML配置和标签使用详细介绍以及发布部_第2页
-JSF入门环境配置XML配置和标签使用详细介绍以及发布部_第3页
-JSF入门环境配置XML配置和标签使用详细介绍以及发布部_第4页
-JSF入门环境配置XML配置和标签使用详细介绍以及发布部_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章JavaServerFacesLyh_ht@163.comJSF简介JSF入门JSF标签JSF运行流程和生命周期数据转换与验证事件处理学习目标7.1JSF简介

JavaServerFaces(JSF):符合JavaEE5标准的JavaWeb应用框架。JSF的历史:2001年中旬:JSF草案(由JavaCommunityProcess(JCP)团队研拟出来的一套标准)2004.3:JSF1.0(在2004年三月发布了JavaServerFaces1.0)2009:JSF2.07.1JSF简介

MVC介绍Model1架构:JSP+JavaBean7.1JSF简介

MVC介绍Model2架构:Servlet作为前端控制器,Servlet中调用JavaBean来完成实际的逻辑处理。7.1JSF简介

JSF体系结构JSF它既是JavaWeb用户界面标准又是严格遵循模型-视图-控制器(MVC)设计模式的框架。用户界面代码(视图)与应用程序数据和逻辑(模型)的清晰分离使JSF应用程序更易于管理。所有与应用程序的用户交互均由一个前端“Facesservlet”(控制器)来处理。7.1JSF简介

JSF体系结构7.1JSF简介

JSF的优势UI组件(UI-component)事件驱动模式用户界面到业务逻辑的直接映射程序员和网页设计人员的分工请求处理生命周期的多阶段划分全面的用户自定义支持Web开发的官方标准之一大量的IDE工具支持7.2JSF入门

第一个JSF例程:根据下拉列表选择来跳转到不同的页面7.2JSF入门

第一个JSF例程:MyJsfAction.java设计packagecom.sunyang;importjavax.faces.context.FacesContext;importjavax.faces.event.ValueChangeEvent;publicclassMyJsfAction{ privateStringtype; publicStringgetType(){ returntype; } publicvoidsetType(Stringtype){ this.type=type; }

//定义监听值改变的方法

publicvoidselectType(ValueChangeEventevent){ //FacesContextcontext=FacesContext.getCurrentInstance(); StringnameTemp=(String)event.getNewValue(); if("JAVA".equals(nameTemp)){ type="JAVA"; }else{ type="C"; } }(下接右边代码……)

//定义导航页面中转的Url publicStringgourl(){ returntype; }}7.2JSF入门

第一个JSF例程:faces-config.xml设计 </navigation-rule></faces-config>7.2JSF入门

第一个JSF例程:web.xml设计 </servlet-mapping></web-app>7.2JSF入门

第一个JSF例程:index.jsp<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%><%@tagliburi="/jsf/core"prefix="f"%><%@tagliburi="/jsf/html"prefix="h"%><html><head><title>MyJSF'index.jsp'startingpage</title></head><body>JSF测试信息!<br><f:view> <h:form>

请选择查询项目:<br> <h:selectOneMenuvalue="#{sunyang.type}" valueChangeListener="#{sunyang.selectType}"id="selecttype"> <f:selectItemitemValue="JAVA"itemLabel="JAVA"/> <f:selectItemitemValue="C"itemLabel="C"/> </h:selectOneMenu> <h:commandButtonvalue="提交"action="#{sunyang.gourl}"> </h:commandButton> </h:form></f:view></body></html>7.2JSF入门

第一个JSF例程:newJava.jsp注:另一个页面newC.jsp类似。<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%><%@tagliburi="/jsf/core"prefix="f"%><%@tagliburi="/jsf/html"prefix="h"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>MyJSP'newJava.jsp'startingpage</title></head>

<body>JSF测试信息!

<br><f:view> <h:form>

欢迎学习<h:outputTextvalue="#{sunyang.type}"/>语言,祝你成功!<br> </h:form></f:view></body></html>7.2JSF入门

示例程序中涉及到的几个内容:JSF表达式语言(ExpressionLanguage)托管Bean(BackingBean)JSF导航7.2JSF入门

JSF表达式语言(EL):JSFExpressionLanguage搭配JSF标签来使用,是用来存取数据对象的一个简易语言。以#开始,将变量或运算式放置在{与}之间。#{userB}EL的变量名也可以程序执行过程中所声明的名称,或是JSFEL预定义的隐含对象。#{}或#{param['name']}如果变量是List类型或Map类型的话,则可以在[]中指定索引。#{someBean.someList[0]}#{someBean.someMap[]}7.2JSF入门

JSF表达式语言(EL)示例:示

例说

明#{myBean.value}返回保存在关键字myBean下的对象的value属性,或者如果myBean是一个Map,则返回存储在关键字value下的元素#{myBean['value']}同"#{myBean.value}“#{myArrayList[5]}返回保存在关键字myArrayList下的List的第5个元素#{myMap['foo']}从保存在关键字myMap下的Map中返回保存在关键字foo下的对象#{myMap[foo.bar]}从保存在myMap关键字下的Map中返回保存在等于表达式foo.bar的值的关键字下的对象#{myMap['foo'].value}从保存在关键字myMap下的Map中返回保存在关键字foo下的对象的value属性#{myMap['foo'].value[5]}从保存在关键字myMap下的Map返回关键字foo下的List或者数组的第5个元素#{myString}返回存储在myString关键字下的String对象#{myInteger}返回存储在myInteger关键字下的Integer对象#{user.role=='normal'}如果关键字user下的对象的role属性等于normal则返回true.否则返回false7.2JSF入门

JSF表达式语言(EL)示例(续):示

例说

明#{(user.balance-200)==0}如果关键字user下的对象的balance属性减去200等于0,则返回true。否则返回falseHello#{}!返回字符串"Hello",后跟关键字user下的对象的name属性。所以,如果用户的名称是Sean,则会返回"HelloSean!"Youare#{(user.balance>100)?'loaded':'notloaded'}如果关键字user下的对象的balance属性小于100,返回"Youareloaded",否则返回"Youarenotloaded"#{myBean.methodName}返回关键字myBean下名为methodName的对象的方法#{20+3}返回237.2JSF入门

JSF表达式语言(EL)操作符:语

法替

代操

作[]

访问数组、List元素或者Map条目()

创建子表达式并控制求解顺序?:

条件表达式:ifCondition?trueValue:falseValue+

加-

减或者负号*

乘/div除%mod模(求余)==eq等于(对对象,使用equals()方法)!=ne不等于<

lt小于>

gt大于<=le小于或等于>=ge大于或等于&&and逻辑AND||or逻辑OR!not逻辑NOTempty

测试空值(null、空字符串、数组、Map或者没有值的Collection)7.2JSF入门

JSF表达式语言(EL)隐含变量:隐含变量说

明实

例applicationScope应用作用域变量的Map,以名称作为关键字#{applicationScope.myVariable}cookie一个当前请求的cookie值的Map,以cookie名称作为关键字#{cookie.myCookie}facesContext当前请求的FacesContext实例#{facesContext}header当前请求的HTTP首部值的

Map,以header名称作为关键字。如果给定的header名称有多个值,仅返回第1个值#{header['User-Agent']}headerValues当前请求的HTTP首部值的

Map,以header名称作为关键字。对每个关键字,返回一个String数组(以便所有的值都能访问)#{headerValues['Accept-Encoding'][3]}initParam应用初始化参数的Map,以参数名称为关键字。(也称为servlet上下文初始化参数,在部署描述符中设置)#{initParam.adminEmail}param请求参数的Map,以param名称作为关键字。如果对给定的参数名称有多个值,仅返回第1个值#{param.address}7.2JSF入门

JSF表达式语言(EL)隐含变量(续):隐含变量说

明实

例paramValues请求参数的Map,以param名称作为关键字。对每个关键字,返回一个String数组(以便可以访问所有的值)#{param.address[2]}requestScope请求范围内的变量的Map,以名称作为关键字#{requestScope.user-Preferences}sessionScope会话范围内的变量的Map,以名称作为关键字#{sessionScope['user']}view当前视图#{view.locale}7.2JSF入门

JSF表达式示例:如何在JSP页面中访问web.xml中的初始化参数?(使用预定义的JSFEL变量initParam来访问)web.xml中有:<context-param> <param-name>productId</param-name> <param-value>2004Q4</param-value></context-param>JSP页面中可以使用她#{initParam['productId']}来访问.例如:ProductId:<h:outputTextvalue="#{initParam['productId']}"/>7.2JSF入门

JSF表达式示例:如何将URL中的参数传递到JSF程序中?如果你有下面的URL:http://your_server/your_app/product.jsf?id=777,JSF页面上,你也可以使用预定义的变量访问参数,例如:<h:outputTextvalue="#{param['id']}"/>注意:你必须直接调用该JSF页面,并且使用servlet映射(mapping).7.2JSF入门

JSF表达式示例:如何添加上下文路径到outputLink的URL中?注:对于URLhttp://localhost:8080/JSFCh03/faces/test.jsp来说,getRequestContextPath方法的返回值为/JSFCh03。在当前的JSF实现中,当在outputLink中定义的路径以'/'开始时,没有添加上下文路径到URL中,请在URL中使用#{facesContext.externalContext.requestContextPath}前缀.例如:<h:outputLinkvalue="#{facesContext.externalContext.requestContextPath}/myPage.faces">7.2JSF入门

托管Bean(ManagedBeans)JSF使用Bean来达到逻辑层与表现层分离的目的,Bean的管理集中在配置文件中,只要修改配置文件,就可以修改Bean之间的相依关系。BackingBeans:在真正的业务逻辑Bean及UI组件之间搭起桥梁,在BackingBean中会呼叫业务逻辑Bean处理使用者的请求,或者是将业务处理结果放置其中,等待UI组件取出当中的值并显示结果给使用者。7.2JSF入门

托管Bean(ManagedBeans)作用域:application:一直存活session:会话过程request:请求阶段none:需要时,临时<!--配置托管Bean--> <managed-bean> <managed-bean-name>sunyang</managed-bean-name> <managed-bean-class>com.sunyang.MyJsfAction</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>7.2JSF入门

托管Bean(ManagedBeans)Bean的基本定义:名称 <managed-bean-name>类 <managed-bean-class> 存活范围 <managed-bean-scope>可选设置属性的初始值 <managed-property><managed-property> <property-name>user</property-name> <value>#{user}</value></managed-property>7.2JSF入门

托管Bean(ManagedBeans)在Java代码中获取Bean:第一种方式: FacesContextcontext=FacesContext.getCurrentInstance(); ValueBindingbinding= context.getApplication().createValueBinding("#{userBean}"); UserBeanbean=(UserBean)binding.getValue(context);

第二种方式: FacesContextctx=FacesContext.getCurrentInstance(); VariableResolvervariableResolver=ctx.getApplication().getVariableResolver(); UserBeanbean=(UserBean)variableResolver.resolveVariable(ctx,“userBean");第三种方式: Applicationapplication=context.getApplication(); UserBeanbean= (UserBean)application.evaluateValueExpressionGet( context,"#{userBean}",UserBean.class);7.2JSF入门

FacesContext与ExternalContext对每个JSF请求,FacesServlet对象都会为其获取一个javax.faces.context.FacesContext类的实例。FacesContext的实例里包含了所有处理JSF请求所需的每个请求的状态信息。7.2JSF入门

在Java代码中使用FacesContext的示例:获取Session对象及其特性通过ExternalContext对象访问与当前请求相关联的Session对象:ObjectsessionAttribute=null;FacesContextfacesContext=FacesContext.getCurrentInstance();ExternalContextexternalContext=facesContext.getExternalContext();MapsessionMap=externalContext.getSessionMap();if(sessionMap!=null) sessionAttribute=sessionMap.get(key);7.2JSF入门

在Java代码中使用FacesContext的示例:如何结束session?(使用session的invalidate方法)从action方法中结束session:publicStringlogout(){FacesContextfc=FacesContext.getCurrentInstance();HttpSessionsession=(HttpSession)fc.getExternalContext().getSession(false);session.invalidate();return"login_page";}7.2JSF入门

在Java代码中使用FacesContext的示例:如何从java代码中访问web.xml中的初始化参数?(使用externalContext的getInitParameter方法)Web.xml:<context-param><param-name>connectionString</param-name><param-value>jdbc:oracle:thin:scott/tiger@cartman:1521:O901DB</param-value></context-param>Java代码:FacesContextfc=FacesContext.getCurrentInstance();Stringconnection=fc.getExternalContext().getInitParameter("connectionString");7.2JSF入门

在Java代码中使用FacesContext的示例:如何在JSF程序中获取URL的传递参数?(使用externalContext的getRequestParameterMap方法)如果URL:http://your_server/your_app/product.jsf?id=777,你可以使用下面的代码来访问所传递的参数:FacesContextfc=FacesContext.getCurrentInstance();Stringid=(String)fc.getExternalContext().getRequestParameterMap().get("id");7.2JSF入门

web.xml中为JSF配置一些额外的参数:<!--配置JSF程序状态的保存位置,如果设置成server则保存在session中,如果保存在client中可以保证服务器重启应用状态也不会丢失--><context-param><param-name>javax.faces.STATE_SAVING_METHOD</param-name><!--程序状态保存在客户端--><param-value>client</param-value></context-param><!--指定JSF映射资源时的默认后缀,默认为.jsp--><context-param><param-name>javax.faces.DEFAULT_SUFFIX</param-name><param-value>.jsp</param-value></context-param><!--指定JSF所管理的生命周期实例的标识符--><context-param><param-name>javax.faces.LIFECYCLE_ID</param-name><param-value></param-value></context-param>7.2JSF入门

web.xml中为JSF配置一些额外的参数:<!--指定JSF配置文件的保存位置--><context-param><param-name>javax.faces.CONFIG_FILES</param-name><param-value> /WEB-INF/faces-config-beans.xml,/WEB-INF/faces-config-nav.xml </param-value></context-param><!--指定是否需要验证自定义组件--><context-param><param-name>javax.faces.verifyObjects</param-name><param-value>true</param-value></context-param><!--指定是否需要验证XML文件--><context-param><param-name>javax.faces.validateXml</param-name><param-value>true</param-value></context-param>7.2JSF入门

web.xml中为JSF配置一些额外的参数:<!--当设置在服务器端保存状态时,控制session保存的视图数量,-1表示没有限制--><context-param><param-name>javax.faces.NUMBER_OF_VIEWS_IN_SESSION</param-name><param-value>-1</param-value></context-param>7.2JSF入门

JSF导航-Navigation<from-view-id>:请求指定的页面。<navigation-case>中的<from-outcome>:请求返回结果。<to-view-id>:请求导向至的页面。<!--定义导航规则与页面--> <navigation-rule> <from-view-id>/index.jsp</from-view-id> <navigation-case> <from-outcome>JAVA</from-outcome> <to-view-id>/jsp/newJava.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>C</from-outcome> <to-view-id>/jsp/newC.jsp</to-view-id> </navigation-case> </navigation-rule>7.2JSF入门

JSF导航-Navigation<from-view-id>:请求指定的页面。<navigation-case>中的<from-outcome>:请求返回结果。<to-view-id>:请求导向至的页面。index.jsp页面中: <h:commandButtonvalue="提交"action="#{sunyang.gourl}">托管Bean对应的Java代码中:publicclassMyJsfAction{ privateStringtype; //…type的getter和setter方法

//定义监听值改变的方法

publicvoidselectType(ValueChangeEventevent){ //FacesContextcontext=FacesContext.getCurrentInstance(); StringnameTemp=(String)event.getNewValue(); if("JAVA".equals(nameTemp)){ type="JAVA"; }else{ type="C"; } }

//定义导航页面中转的Url publicStringgourl(){ returntype; }}7.2JSF入门

JSF导航-JSF带参数页面重定向问题:如果想在登录失败时,传递页面的错误信息,怎么实现?<navigation-rule><from-view-id>/login.jsp</from-view-id><navigation-case><from-outcome>succeed</from-outcome><to-view-id>/loginsuccess.jsp</to-view-id></navigation-case><navigation-case><from-outcome>fail</from-outcome><to-view-id>/login.jsp</to-view-id></navigation-case></navigation-rule>7.2JSF入门

JSF导航-JSF带参数页面重定向LoginBean(去掉原来fail的导航,只保留succeed的导航即可):publicStringlogin(){ Stringresult=""; intret=authenticate(username,pwd,verifyingcode); if(ret==0) result="succeed"; else{ switch(ret){ case1: result="login.jsf?result=wrongpwd";break; case2: result="login.jsf?result=wrongcode";break; }try{ FacesContext.getCurrentInstance().getExternalContext().redirect(result);

}catch(IOExceptione){ e.printStackTrace(); } } returnresult;}7.3JSF标签

JSF提供了大量的UI标签来简化创建视图。使用这些标签,可以通过其value,binding,action,actionListener等属性直接绑定到托管Bean的属性,实例或者方法上。JSF包括两组标签库:jsf_core.tld核心标签库和html_basic。7.3JSF标签Taglib指令42JSF核心标签库JSFHTML标签库<%@tagliburi="/jsf/core"prefix="f"%><%@tagliburi="/jsf/html"prefix="h"%>使用JSF标签<%@tagliburi="/jsf/core"prefix="f"%><%@tagliburi="/jsf/html"prefix="h"%><f:view><h:form>...</h:form></f:view>7.3JSF标签(JSF核心标签库)标签说明f:validateLength验证组件值的长度f:validateDoubleRange验证组件值的双精度范围f:validateLongRange验证组件值的长整型范围f:validator向组件添加验证器f:loadBundle加载资源包f:verbatim向页面中添加标签f:selectItem指定UISelectOne或UISelectMany组件的一个项目f:selectItems指定UISelectOne或UISelectMany组件的多个项目437.3JSF标签(JSF核心标签库)44标签说明f:view创建顶层视图f:subview创建视图的子视图f:facet向组件添加facetf:param向组件添加参数f:attribute向组件添加属性f:actionListener在父组件上注册操作监听器f:valueChangeListener向父组件注册值变更监听器f:converter注册任意转换器f:convertDateTime注册日期时间转换器f:convertNumber注册数量转换器标准的转换器和验证器示例编写一个填写付款信息的页面,付款信息包括付款金额、信用卡号、信用卡有效期,要求对输入的数据进行特定的转换和验证458899123456789876512/2005示例代码46importjava.util.Date;publicclassPaymentBean{privatedoubleamount;privateStringcard="";privateDatedate=newDate();publicvoidsetAmount(doublenewValue){amount=newValue;}publicdoublegetAmount(){returnamount;}publicvoidsetCard(StringnewValue){card=newValue;}publicStringgetCard(){returncard;}publicvoidsetDate(DatenewValue){date=newValue;}publicDategetDate(){returndate;}}受管理的Bean<f:view><h:form><h1><h:outputTextvalue="请输入付款信息:"/></h1><h:panelGridcolumns="3"><h:outputTextvalue="金额:"/><h:inputTextid="amount"value="#{payment.amount}"><f:convertNumberminFractionDigits="2"/><f:validateDoubleRangeminimum="10"maximum="10000"/></h:inputText><h:messagefor="amount"style="color:red"/><h:outputTextvalue="信用卡号:"/><h:inputTextid="card"value="#{payment.card}"><f:validateLengthminimum="13"/></h:inputText><h:messagefor="card"style="color:red"/><h:outputTextvalue="信用卡有效期(月/年):"/><h:inputTextid="date"value="#{payment.date}"><f:convertDateTimepattern="MM/yyyy"/></h:inputText><h:messagefor="date"style="color:red"/></h:panelGrid><h:commandButtonvalue="处理"action="process"/></h:form></f:view>index.jsp<f:view><h:form><h1><h:outputTextvalue="付款信息"/></h1><h:panelGridcolumns="2"><h:outputTextvalue="金额:"/><h:outputTextvalue="#{payment.amount}"><f:convertNumbertype="currency"/></h:outputText><h:outputTextvalue="信用卡号:"/><h:outputTextvalue="#{payment.card}"/><h:outputTextvalue="信用卡有效日期:"/><h:outputTextvalue="#{payment.date}"><f:convertDateTimepattern="MM/yyyy"/></h:outputText></h:panelGrid><h:commandButtonvalue="返回"action="back"/></h:form></f:view>result.jsp7.3JSF标签(JSFHTML标签)47组件标签说明UISelectOneh:SelectOneListbox单选列表框h:selectOneMenu单选菜单h:selectOneRadio单选按钮集UISelectBooleanh:selectBooleanCheckbox单个复选框UISelectManyh:selectManyListbox复选框集h:selectManyCheckbox多行选择列表框h:selectManyMenu多选菜单UIPanelh:panelGrid表示一个HTML表格h:panelGroup组合一系列组件UIMessageh:message显示一个组件的最近使用的消息UIMessagesh:messages显示所有消息UIGraphich:graphicImage显示一个图像UIDatah:dataTable功能丰富的表格控件UIColumnh:column表示表格中的列7.3JSF标签(JSFHTML标签)组件标签说明UIFormh:form表示HTML表单元素UIInputh:InputText单行文本输入控件h:inputTextarea多行文本输入控件h:InputSecret密码输入控件h:inputHidden隐藏字段UIOutputh:outputLabel显示文本h:outputLink链接到另一页面或某页面上的特定位置h:outputFormat显示格式化的信息h:outputText当行文本输入UICommandh:commandButton表示一个按钮h:commandLink表示一个链接487.3JSF标签(表单)表单:h:form标签产生HTMLform元素如果在名为/index.jsp的JSF页面中使用了无属性的h:form标签,则Form呈现器将产生如下的HTML代码:可以为h:form指定style或styleClass属性建议为表单元素明确指定id属性497.3JSF标签(文本输入)h:inputTexth:inputSecreth:inputTextarea50<h:inputTextvalue="测试字符串"readonly="true"/><h:inputSecretvalue="#{form.passwd}"redisplay="true"/><h:inputTextareavalue="123456789012345"rows="3"cols="10"/><h:inputTextvalue="inputText"style="color:Yellow;background:Teal;"/>7.3JSF标签(命令)h:commandButtonh:commandLinkh:outputLink51<h:commandButtonvalue="按钮"onclick="alert('buttonclicked')"type="button"/><h:outputLinkvalue=""><h:graphicImagevalue="java-dot-net.jpg"/><h:outputTextvalue=""/></h:outputLink><h:commandLinkvalue="欢迎"actionListener="#{form.useLinkValue}"action="#{form.followLink}"/>7.3JSF标签(选择)h:selectBooleanCheckboxh:selectManyCheckboxh:selectOneRadioh:selectOneListboxh:selectManyListboxh:selectOneMenuh:selectManyMenu52选择标签使用示例53联系我<h:selectBooleanCheckboxvalue="#{form.contactMe}"/>privatebooleancontactMe;publicvoidsetContactMe(booleannewValue){contactMe=newValue;}publicbooleangetContactMe(){returncontactMe;}<h:selectManyCheckboxvalue="#{form.colors}"><f:selectItemitemValue="Red"itemLabel="红色"/><f:selectItemitemValue="Blue"itemLabel="蓝色"/><f:selectItemitemValue="Yellow"itemLabel="黄色"/><f:selectItemitemValue="Green"itemLabel="绿色"/><f:selectItemitemValue="Orange"itemLabel="橘黄"/></h:selectManyCheckbox><h:selectOneRadiovalue="#{form.grade}"layout="pageDirection"><f:selectItemsvalue="#{form.grades}"/></h:selectOneRadio>privateSelectItem[]grades={newSelectItem(newInteger(1),"高中"),newSelectItem(newInteger(2),"专科"),newSelectItem(newInteger(3),"本科"),newSelectItem(newInteger(4),"硕士"),newSelectItem(newInteger(5),"博士")};publicSelectItem[]getGrades(){returngrades;}<h:selectOneListboxid="onelistbox"value="#{form.expert}"><f:selectItemitemValue="java"itemLabel="Java"/><f:selectItemitemValue="oracle"itemLabel="Oracle"/><f:selectItemitemValue="asp"itemLabel="ASP"/><f:selectItemitemValue="jsp"itemLabel="JSP"/></h:selectOneListbox><h:selectOneMenuid="onemenu"value="#{form.expert}"><f:selectItemitemValue="java"itemLabel="Java"/><f:selectItemitemValue="oracle"itemLabel="Oracle"/><f:selectItemitemValue="asp"itemLabel="ASP"/><f:selectItemitemValue="jsp"itemLabel="JSP"/></h:selectOneMenu>7.3JSF标签(数据表格标签)UIData组件表示h:dataTable标签,它支持将数据绑定到数据对象集合,遍历数据源中的每个记录表内的数据列由UIColumn组件表示,即h:column标签54属性说明bgcolor设置表格背景色border设置表格边框宽度cellpadding设置表格单元格周围的边距cellspacing设置表格单元格之间的间距first表格中所显示的第一行的索引frame指定表格四周的边框样式;有效值:none、above、below、hsides、vsides、lhs、rhs、box、borderstyleClass指定整个表格的CSS类rowClasses行的CSS类列表,用逗号分隔列表columnClasses列的CSS类列表,用逗号分隔列表headerClass表格标题的CSS类footerClass用于表格页脚的CSS类rules单元格之间的行样式;有效值:groups、rows、columns、allvar数据表格所创建的变量名称,表示该值中的当前项目数据表格使用示例1在网页中输出一个简单的表格,显示一个职员的姓名和职位55示例代码56publicclassEmployeeList{privateStringname;privateStringposition;publicEmployeeList(Stringname,Stringposition){=name;this.position=position;}publicvoidsetName(Stringname){=name;}publicvoidsetPosition(Stringposition){this.position=position;}publicStringgetName(){returnname;}publicStringgetPosition(){returnposition;}}EmployList.javapublicclassData{privatestaticfinalEmployeeList[]employeelist=newEmployeeList[]{newEmployeeList("高侠","软件工程师"),newEmployeeList("张小丽","培训师"),newEmployeeList("刘亚平","项目经理"),newEmployeeList("牛远","软件工程师")};publicEmployeeList[]getEmployeelist(){returnemployeelist;}}受管理BeanData……<f:view><h:form><h:dataTablebgcolor="lightblue"value="#{Employeedata.employeelist}"var="employees"border="5"cellpadding="5"cellspacing="2"><h:column><f:facetname="header"><h:outputTextid="headerText1"value="姓名"/></f:facet><h:outputTextvalue="#{}"/></h:column><h:column><f:facetname="header"><h:outputTextid="headerText2"value="职位"/></f:facet><h:outputTextvalue="#{employees.position}"/></h:column></h:dataTable></h:form></f:view>index.jsp数据表格使用示例2练习如何从数据库中提取数据,然后将查询结果显示在数据表格中。要求为数据表格设置样式57样式表58.customers{border:thinsolidblack;}.customersHeader{text-align:center;font-style:italic;color:Snow;background:Teal;}.evenColumn{height:25px;text-align:center;background:MediumTurquoise;}.oddColumn{text-align:center;background:PowderBlue;}styleClass.css受管理Bean该后台Bean负责同数据库建立连接,并查询数据59publicclassCustomerBean{StringsDBDriver="com.microsoft.jdbc.sqlserver.SQLServerDriver";StringsConnStr="jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=northwind";Connectionconnect=null;publicCustomerBean(){try{Class.forName(sDBDriver);}catch(java.lang.ClassNotFoundExceptione){System.err.println(e.getMessage());}try{connect=DriverManager.getConnection(sConnStr,"sa","");}catch(SQLExceptionex){System.err.println(ex.getMessage());}}CustomerBean.javapublicsynchronizedResultSetexecuteQuery(Stringsql){ResultSetrs=null;if(connect!=null){try{Statementstmt=connect.createStatement();rs=stmt.executeQuery(sql);}catch(SQLExceptionex){System.err.println(ex.getMessage());}}returnrs;}publicsynchronizedintexecuteUpdate(Stringsql){intrs=-1;if(connect!=null){try{Statementstmt=connect.createStatement();rs=stmt.executeUpdate(sql);}catch(SQLExceptionex){System.err.println(ex.getMessage());}}returnrs;}publicResultgetAll()throwsSQLException{try{CustomerBeanjc=newCustomerBean();Stringsql="select*fromCustomers";ResultSetrs=jc.executeQuery(sql);returnResultSupport.toResult(rs);}finally{closeConnection();}}publicvoidcloseConnection(){if(connect!=null){try{connect.close();}catch(SQLExceptionex){System.err.println(ex.getMessage());}}}视图页60<html><head><linkhref="CSS/styles.css"rel="stylesheet"type="text/css"/><title>DisplayingDatabaseTables</title></head><body><f:view><h:form><h:dataTablevalue="#{customer.all}"var="customer"styleClass="customers"headerClass="customersHeader"columnClasses="evenColumn,oddColumn"><h:column><f:facetname="header"><h:outputTextvalue="CustomerID"/></f:facet><h:outputTextvalue="#{customer.CustomerID}"/></h:column><h:column><f:facetname="header"><h:outputTextvalue="Name"/></f:facet><h:outputTextvalue="#{customer.ContactName}"/></h:column>……</h:dataTable></h:form></f:view></body></html>index.jsp7.4JSF运行流程和生命周期

JSF是一个Web应用,也会遵循请求/响应的架构,与JSP的生命周期完全相似:客户端发送一个HTTP请求,服务器端对请求进行处理之后,向客户端送回HTTP响应,整个JSP生命周期完成。JSF将请求/响应的生命周期细化为更多阶段,从而支持更加复杂的UI组件模型7.4JSF运行流程和生命周期

JSF将用户请求分成两种:初始请求:当用户直接向某个页面发送请求时,请求没有附加任何的参数信息。提交表单:单击表单的提交按钮、提交超链接时,就会发生提交表单请求。7.4JSF运行流程和生命周期

JSF的6个生命周期:7.4JSF运行流程和生命周期

恢复视图阶段:当客户端向某个JSF页面发送请求时,例如单击了某个超链接或者按钮时,JSF就开始恢复视图阶段。在这个阶段,JSF将会为该页面创建对应的视图,并将事件监听器、输入校验器等连接到页面所包含的UI组件上,使用FacesContext实例来保存视图对象。如果是初始请求:JSF将在该阶段创建一个新的视图对象,并将生命周期阶段直接推进到生成响应阶段。7.4JSF运行流程和生命周期

应用请求值阶段:当视图恢复完成后,每个组件都会调用它的decode方法从请求参数中提取新的参数值,并保存在本地组件上。如果页面的某个组件设置了immediate=“true”,这个阶段还会处理这些组件相关的验证、转换和事件等。这个阶段结束后,所有组件都被设置成了他们的新值,所有消息和事件都被放入队列。7.4JSF运行流程和生命周期

处理输入校验阶段:处理UI组件注册的输入校验器,JSF会用各UI组件上的本地值和对应输入校验规则进行比较,如果本地值无效,JSF就会把对应的错误消息添加到FacesContext实例中,而JSF的生命周期也将直接推进到生成响应阶段,显示页面可以通过<h:message>或者<h:messages>来显示输入校验的错误信息。7.4JSF运行流程和生命周期

更新模型的值阶段:通过了输入校验之后,使用UI组件的本地值更新与之绑定的托管Bean(将用户输入的数据传送给服务器端的托管Bean),JSF只会更新绑定到输入组件的托管Bean。如果无法更新,则会生成错误信息,生命周期直接推进到生成响应阶段,可以采用<h:message>或<h:messages>来显示错误信息。7.4JSF运行流程和生命周期

调用应用阶段:在这个阶段中,JSF将会处理应用级别的事件,例如提交表单或链接到其他页面。7.4JSF运行流程和生命周期

生成响应阶段:在这个阶段中,应用准备向客户端输出响应。当在应用请求值阶段、处理阶段或更新模型阶段遇到了错误,应用将会选择生成最初的页面。生成响应后,应用的响应状态也被保存下来。7.4JSF运行流程和生命周期

JSF提供了PhaseId类来代表生命周期阶段,是一个枚举类,常常使用的常量有:ANY_PHASE:任意一个生命周期阶段RESTORE_VIEW:恢复视图阶段APPLY_REQUEST_VALUES:应用请求值阶段PROCESS_VALIDATIONS:处理输入校验阶段UPDATE_MODEL_VALUES:更新模型的值阶段INVOKE_APPLICATION:调用应用阶段RENDER_RESPONSE:生成响应阶段7.5数据转换与验证

转换器(Converter)协助模型与视图之间的数据转换。标准转换器自定义转换器验证器(Validator)协助进行语意检验(SemanticValidation)。标准验证器自定义验证器7.5数据转换与验证

标准转换器由浏览器传送的数据基本上都是字符串,而Java应用程序本身基本上则是对象,所以对象数据必须转换后传送给浏览器,而浏览器送来的数据也必须转换为对象才能使用。JSF定义了一系列标准的转换器(Converter),对于基本数据类型(primitivetype)或是其Wrapper类可进行自动转换。(JSF会使用javax.faces.Boolean、javax.faces.Byte、javax.faces.Character

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论