第7章JavaServerFacesLyh_ht@163.com22019/8/15JSF简介JSF入门JSF标签JSF运行流程和生命周期数据转换与验证事件处理学习目标32019/8/157.1JSF简介JavaServerFaces(JSF):符合JavaEE5标准的JavaWeb应用框架。JSF的历史:2001年中旬:JSF草案(由JavaCommunityProcess(JCP)团队研拟出来的一套标准)2004.3:JSF1.0(在2004年三月发布了JavaServerFaces1.0)2009:JSF2.042019/8/157.1JSF简介MVC介绍Model1架构:JSP+JavaBean52019/8/157.1JSF简介MVC介绍Model2架构:Servlet作为前端控制器,Servlet中调用JavaBean来完成实际的逻辑处理。62019/8/157.1JSF简介JSF体系结构JSF它既是JavaWeb用户界面标准又是严格遵循模型-视图-控制器(MVC)设计模式的框架。用户界面代码(视图)与应用程序数据和逻辑(模型)的清晰分离使JSF应用程序更易于管理。所有与应用程序的用户交互均由一个前端“Facesservlet”(控制器)来处理。72019/8/157.1JSF简介JSF体系结构82019/8/157.1JSF简介JSF的优势UI组件(UI-component)事件驱动模式用户界面到业务逻辑的直接映射程序员和网页设计人员的分工请求处理生命周期的多阶段划分全面的用户自定义支持Web开发的官方标准之一大量的IDE工具支持92019/8/157.2JSF入门第一个JSF例程:根据下拉列表选择来跳转到不同的页面102019/8/157.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;}}(下接右边代码……)//定义导航页面中转的UrlpublicStringgourl(){returntype;}}112019/8/157.2JSF入门第一个JSF例程:faces-config.xml设计?xmlversion=1.0encoding=UTF-8?faces-configversion=1.2xmlns=:xi=:xsi=:schemaLocation=://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd!--配置托管Bean--managed-beanmanaged-bean-namesunyang/managed-bean-namemanaged-bean-classcom.sunyang.MyJsfAction/managed-bean-classmanaged-bean-scopesession/managed-bean-scope/managed-bean!--定义导航规则与页面--navigation-rulefrom-view-id/index.jsp/from-view-idnavigation-casefrom-outcomeJAVA/from-outcometo-view-id/jsp/newJava.jsp/to-view-id/navigation-casenavigation-casefrom-outcomeC/from-outcometo-view-id/jsp/newC.jsp/to-view-id/navigation-case/navigation-rule/faces-config122019/8/157.2JSF入门第一个JSF例程:web.xml设计?xmlversion=1.0encoding=UTF-8?web-appxmlns=:xsi==2.5xsi:schemaLocation=://java.sun.com/xml/ns/javaee/web-app_2_5.xsdlistenerlistener-classcom.sun.faces.config.ConfigureListener/listener-class/listener!--配置JSF的配置文件--context-paramparam-namejavax.faces.CONFIG_FILES/param-nameparam-value/WEB-INF/faces-config.xml/param-value/context-param!--处理请求的Servlet--servletservlet-nameFacesServlet/servlet-nameservlet-classjavax.faces.webapp.FacesServlet/servlet-classload-on-startup0/load-on-startup/servlet!--配置所有的.JSF结尾的请求都由JSF处理--servlet-mappingservlet-nameFacesServlet/servlet-nameurl-pattern*.jsf/url-pattern/servlet-mapping/web-app132019/8/157.2JSF入门第一个JSF例程:index.jsp%@pagelanguage=javaimport=java.util.*pageEncoding=UTF-8%%@tagliburi==f%%@tagliburi==h%htmlheadtitleMyJSF'index.jsp'startingpage/title/headbodyJSF测试信息!brf:viewh:form请选择查询项目:brh:selectOneMenuvalue=#{sunyang.type}valueChangeListener=#{sunyang.selectType}id=selecttypef:selectItemitemValue=JAVAitemLabel=JAVA/f:selectItemitemValue=CitemLabel=C//h:selectOneMenuh:commandButtonvalue=提交action=#{sunyang.gourl}/h:commandButton/h:form/f:view/body/html142019/8/157.2JSF入门第一个JSF例程:newJava.jsp注:另一个页面newC.jsp类似。%@pagelanguage=javaimport=java.util.*pageEncoding=UTF-8%%@tagliburi==f%%@tagliburi==h%!DOCTYPEHTMLPUBLIC-//W3C//DTDHTML4.01Transitional//ENhtmlheadtitleMyJSP'newJava.jsp'startingpage/title/headbodyJSF测试信息!brf:viewh:form欢迎学习h:outputTextvalue=#{sunyang.type}/语言,祝你成功!br/h:form/f:view/body/html152019/8/157.2JSF入门示例程序中涉及到的几个内容:JSF表达式语言(ExpressionLanguage)托管Bean(BackingBean)JSF导航162019/8/157.2JSF入门JSF表达式语言(EL):JSFExpressionLanguage搭配JSF标签来使用,是用来存取数据对象的一个简易语言。以#开始,将变量或运算式放置在{与}之间。#{userBean.name}EL的变量名也可以程序执行过程中所声明的名称,或是JSFEL预定义的隐含对象。#{param.name}或#{param['name']}如果变量是List类型或Map类型的话,则可以在[]中指定索引。#{someBean.someList[0]}#{someBean.someMap[user.name]}172019/8/157.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.否则返回false182019/8/157