1、标题,Click to edit Title Slide,一级文本,Click to edit Master text styles,二级文本,Second level,三级文本,Third level,Fourth level,Fifth level,#,2019/12/22,JSF,简介,JSF,入门,JSF,标签,JSF,运行流程和生命周期,数据转换与验证,事件,处理,学习目标,7.1,JSF,简介,JavaServer Faces(JSF),:符合,JavaEE5,标准的,Java Web,应用框架。,JSF,的历史:,2001,年中旬:,JSF,草案(由,Java Community
2、 Process,(,JCP,)团队研拟出来的一套标准),2004.3,:,JSF1.0,(在,2004,年三月发布了,JavaServer Faces 1.0,),2009,:,JSF2.0,7.1,JSF,简介,MVC,介绍,Model1,架构:,JSP+JavaBean,7.1,JSF,简介,MVC,介绍,Model2,架构:,Servlet,作为前端控制器,,Servlet,中调用,JavaBean,来完成实际的逻辑处理。,7.1,JSF,简介,JSF,体系结构,JSF,它既是,Java Web,用户界面标准又是严格遵循,模型,-,视图控制器,(MVC),设计模式的框架。,用户界面代码
3、视图),与应用程序数据和逻辑,(模型),的清晰分离使,JSF,应用程序更易于管理。,所有与应用程序的用户交互均由一个前端“,Faces servlet”,(控制器),来处理。,7.1,JSF,简介,JSF,体系结构,7.1,JSF,简介,JSF,的优势,UI,组件(,UI-component,),事件驱动模式,用户界面到业务逻辑的直接映射,程序员和网页设计人员的分工,请求处理生命周期的多阶段划分,全面的用户自定义支持,Web,开发的官方标准之一,大量的,IDE,工具支持,7.2,JSF,入门,第一个,JSF,例程:根据下拉列表选择来跳转到不同的页面,7.2,JSF,入门,第一个,JSF,例
4、程:,MyJsfAction.java,设计,package com.sunyang;,import,javax.faces.context.FacesContext;,import javax.faces.event.ValueChangeEvent,;,public class,MyJsfAction,private String type,;,public String getType(),return type;,public void setType(String type),this.type=type;,/,定义监听值改变的方法,public void selectType(Va
5、lueChangeEvent event),/FacesContext context=FacesContext.getCurrentInstance();,String nameTemp=(String)event.getNewValue();,if(JAVA.equals(nameTemp),type=JAVA;,else,type=C;,(下接右边代码,),/,定义导航页面中转的,Url,public String gourl(),return type;,7.2,JSF,入门,第一个,JSF,例程:,faces-config.xml,设计,sunyang,com.sunyang.MyJ
6、sfAction,session,/index.jsp,JAVA,/jsp/newJava.jsp,C,/jsp/newC.jsp,7.2,JSF,入门,第一个,JSF,例程:,web.xml,设计,com.sun.faces.config.ConfigureListener,javax.faces.CONFIG_FILES,/WEB-INF/faces-config.xml,Faces Servlet,javax.faces.webapp.FacesServlet,0,Faces Servlet,*.jsf,7.2,JSF,入门,第一个,JSF,例程:,index.jsp,My JSF in
7、dex.jsp starting page,JSF,测试信息,!,请选择查询项目:,7.2,JSF,入门,第一个,JSF,例程:,newJava.jsp,注:另一个页面,newC.jsp,类似。,My JSP newJava.jsp starting page,JSF,测试信息!,欢迎学习,语言,祝你成功!,7.2,JSF,入门,示例程序中涉及到的几个内容:,JSF,表达式语言(,Expression Language,),托管,Bean,(,Backing Bean,),JSF,导航,7.2,JSF,入门,JSF,表达式语言(,EL,):,JSF Expression Language,搭配
8、JSF,标签来使用,是用来存取数据对象的一个简易语言。,以,#,开始,将变量或运算式放置在,与,之间。,#userBean.name,EL,的变量名也可以程序执行过程中所声明的名称,或是,JSF EL,预定义的隐含对象。,#param.name,或,#paramname,如果变量是,List,类型或,Map,类型的话,则可以在,中指定索引。,#someBean.someList0#someBean.someMapuser.name,7.2,JSF,入门,JSF,表达式语言(,EL,)示例:,示,例,说,明,#myBean.value,返回保存在关键字,myBean,下的对象的,value,属
9、性,或者如果,myBean,是一个,Map,,则返回存储在关键字,value,下的元素,#myBeanvalue,同,#myBean.value,“,#myArrayList5,返回保存在关键字,myArrayList,下的,List,的第,5,个元素,#myMapfoo,从保存在关键字,myMap,下的,Map,中返回保存在关键字,foo,下的,对象,#myMapfoo.bar,从保存在,myMap,关键字下的,Map,中返回保存在等于表达式,foo.bar,的值的关键字下的对象,#myMapfoo.value,从保存在关键字,myMap,下的,Map,中返回保存在关键字,foo,下的对象的
10、value,属性,#myMapfoo.value5,从保存在关键字,myMap,下的,Map,返回关键字,foo,下的,List,或者数组的第,5,个元素,#myString,返回存储在,myString,关键字下的,String,对象,#myInteger,返回存储在,myInteger,关键字下的,Integer,对象,#user.role=normal,如果关键字,user,下的对象的,role,属性等于,normal,则返回,true.,否则返回,false,7.2,JSF,入门,JSF,表达式语言(,EL,)示例(续):,示,例,说,明,#,(,user.balance-200,)
11、0,如果关键字,user,下的对象的,balance,属性减去,200,等于,0,,则返回,true,。否则返回,false,Hello#user.name!,返回字符串,Hello,,后跟关键字,user,下的对象的,name,属性。所以,如果用户的名称是,Sean,,则会返回,Hello Sean!,You are#,(,user.balance 100,),?loaded:not loaded,如果关键字,user,下的对象的,balance,属性小于,100,,返回,You are loaded,,否则返回,You are not loaded,#myBean.methodName
12、返回关键字,myBean,下名为,methodName,的对象的方法,#20+3,返回,23,7.2,JSF,入门,JSF,表达式语言(,EL,)操作符:,语,法,替,代,操,作,访问数组、,List,元素或者,Map,条目,(),创建子表达式并控制求解顺序,?:,条件表达式,:ifCondition?trueValue:falseValue,+,加,-,减 或者负号,*,乘,/,div,除,%,mod,模(求余),=,eq,等于(对对象,使用,equals(),方法),!=,ne,不等于,gt,大于,=,ge,大于或等于,&,and,逻辑,AND,|,or,逻辑,OR,!,not,逻辑,N
13、OT,empty,测试空值(,null,、空字符串、数组、,Map,或者没有值的,Collection,),7.2,JSF,入门,JSF,表达式语言(,EL,)隐含变量:,隐含变量,说,明,实,例,applicationScope,应用作用域变量的,Map,,以名称作为关键字,#,applicationScope.myVariable,cookie,一个当前请求的,cookie,值的,Map,,以,cookie,名称作为关键字,#cookie.myCookie,facesContext,当前请求的,FacesContext,实例,#facesContext,header,当前请求的,HTTP,
14、首部值的,Map,,以,header,名称作为关键字。如果给定的,header,名称有多个值,仅返回第,1,个值,#headerUser-Agent,headerValues,当前请求的,HTTP,首部值的,Map,,以,header,名称作为关键字。对每个关键字,返回一个,String,数组(以便所有的值都能访问),#headerValues,Accept-Encoding3,initParam,应用初始化参数的,Map,,以参数名称为关键字。(也称为,servlet,上下文初始化参数,在部署描述符中设置),#initParam.adminEmail,param,请求参数的,Map,,,以,
15、param,名称作为关键字。如果对给定的参数名称有多个值,仅返回第,1,个值,#param.address,7.2,JSF,入门,JSF,表达式语言(,EL,)隐含变量(续):,隐含变量,说,明,实,例,paramValues,请求参数的,Map,,,以,param,名称作为关键字。对每个关键字,返回一个,String,数组(以便可以访问所有的值),#param.address2,requestScope,请求范围内的变量的,Map,,以名称作为关键字,#requestScope.user-Preferences,sessionScope,会话范围内的变量的,Map,,以名称作为关键字,#se
16、ssionScopeuser,view,当前视图,#view.locale,7.2,JSF,入门,JSF,表达式示例:,如何在,JSP,页面中访问,web.xml,中的初始化参数,?,(使用预定义的,JSF EL,变量,initParam,来访问),w,eb.xml,中有,:,productId,2004Q4,JSP,页面中可以,使用她,#initParamproductId,来访问,.,例如,:,Product Id:,7.2,JSF,入门,JSF,表达式示例:,如何将,URL,中的参数传递到,JSF,程序中,?,如果,你有下面的,URL:your_server/your_app/produ
17、ct.jsf?id=777,JSF,页面上,你也可以使用预定义的变量,访问参数,例如,:,注意,:,你必须直接调用该,JSF,页面,并且使用,servlet,映射,(mapping).,7.2,JSF,入门,JSF,表达式示例:,如何添加上下文路径到,outputLink,的,URL,中,?,注:对于,URL localhost:8080/JSFCh03/faces/test.jsp,来说,,getRequestContextPath,方法的返回值为,/JSFCh03,。,在,当前的,JSF,实现中,当在,outputLink,中定义的路径以,/,开始时,没有添加上下文路径到,URL,中,请,
18、在,URL,中使用,#facesContext.externalContext.requestContextPath,前缀,.,例如,:,7.2,JSF,入门,托管,Bean,(,Managed Beans,),JSF,使用,Bean,来达到逻辑层与表现层分离的目的,,Bean,的管理集中在配置文件中,只要修改配置文件,就可以修改,Bean,之间的相依关系。,Backing Beans,:在真正的业务逻辑,Bean,及,UI,组件之间搭起桥梁,在,Backing Bean,中会呼叫业务逻辑,Bean,处理使用者的请求,或者是将业务处理结果放置其中,等待,UI,组件取出当中的值并显示结果给使用者
19、7.2,JSF,入门,托管,Bean,(,Managed Beans,),作用域:,application,:一直存活,session,:会话过程,request,:请求阶段,none,:需要时,临时,sunyang,com.sunyang.MyJsfAction,session,7.2,JSF,入门,托管,Bean,(,Managed Beans,),Bean,的基本定义:,名称,类,存活范围,可选设置,属性的初始值,user#user,7.2,JSF,入门,托管,Bean,(,Managed Beans,),在,Java,代码中获取,Bean,:,第一种方式:,FacesContext
20、context=FacesContext.getCurrentInstance();,ValueBinding,binding=,context.getApplication,().createValueBinding,(#userBean);,UserBean,bean=,(UserBean,)binding.getValue(context);,第二种方式:,FacesContext,ctx=FacesContext.getCurrentInstance();,VariableResolver,variableResolver=ctx.getApplication().getVariab
21、leResolver();,UserBean,bean=,(UserBean,)variableResolver.resolveVariable(ctx,“userBean);,第三种方式:,Application,application=context.getApplication();,UserBean bean=,(UserBean,)application.evaluateValueExpressionGet,(,context,#userBean,UserBean,.class);,7.2,JSF,入门,FacesContext,与,ExternalContext,对每个,JSF,请
22、求,,FacesServlet,对象都会为其获取一个,javax.faces.context.FacesContext,类的实例。,FacesContext,的实例里包含了所有处理,JSF,请求所需的每个请求的状态信息。,7.2,JSF,入门,在,Java,代码中使用,FacesContext,的示例:,获取,Session,对象及其特性,通过,ExternalContext,对象访问,与当前请求相关联的,Session,对象,:,Object,sessionAttribute=null;,FacesContext facesContext=FacesContext.getCurrentIns
23、tance();,ExternalContext externalContext=facesContext.getExternalContext();,Map sessionMap=externalContext.getSessionMap();,if(sessionMap!=null),sessionAttribute,=sessionMap.get(key);,7.2,JSF,入门,在,Java,代码中使用,FacesContext,的示例:,如何结束,session?,(使用,session,的,invalidate,方法),从,action,方法中结束,session:,public
24、String logout(),FacesContext fc=FacesContext.getCurrentInstance();,HttpSession session=(HttpSession)fc.getExternalContext().getSession(false);,session.invalidate();,return login_page;,7.2,JSF,入门,在,Java,代码中使用,FacesContext,的示例:,如何从,java,代码中访问,web.xml,中的初始化参数,?,(,使用,externalContext,的,getInitParameter,方
25、法,),Web.xml,:,connectionString,jdbc:oracle:thin:scott/tigercartman:1521:O901DB,Java,代码,:,FacesContext fc=FacesContext.getCurrentInstance,();,String,connection=fc.getExternalContext().getInitParameter(connectionString);,7.2,JSF,入门,在,Java,代码中使用,FacesContext,的示例:,如何在,JSF,程序中获取,URL,的传递参数,?,(,使用,external
26、Context,的,getRequestParameterMap,方法,),如果,URL:your_server/your_app/product.jsf?id=777,你可以使用下面的代码来访问所传递的参数,:,FacesContext fc=FacesContext.getCurrentInstance,();,String,id=(String)fc.getExternalContext().getRequestParameterMap().get(id);,7.2,JSF,入门,web.xml,中为,JSF,配置一些额外的参数:,javax.faces.STATE_SAVING_MET
27、HOD,client,javax.faces.DEFAULT_SUFFIX,.jsp,javax.faces.LIFECYCLE_ID,7.2,JSF,入门,web.xml,中为,JSF,配置一些额外的参数:,javax.faces.CONFIG_FILES,/,WEB-INF/faces-config-beans.xml,/,WEB-INF/faces-config-nav.xml,javax.faces.verifyObjects,true,javax.faces.validateXml,true,7.2,JSF,入门,web.xml,中为,JSF,配置一些额外的参数:,javax.fac
28、es.NUMBER_OF_VIEWS_IN_SESSION,-1,7.2,JSF,入门,JSF,导航,-Navigation,:请求指定的页面。,中的,:请求返回结果。,:请求导向至的页面。,/index.jsp,JAVA,/jsp/newJava.jsp,C,/jsp/newC.jsp,7.2,JSF,入门,JSF,导航,-Navigation,:请求指定的页面。,中的,:请求返回结果。,:请求导向至的页面。,i,ndex.jsp,页面中:,托管,Bean,对应的,Java,代码中:,public class MyJsfAction,private String type,;,/type,的
29、getter,和,setter,方法,/,定义监听值改变的方法,public void selectType(ValueChangeEvent event),/FacesContext context=FacesContext.getCurrentInstance();,String nameTemp=(String)event.getNewValue();,if(JAVA.equals(nameTemp),type=JAVA;,else,type=C;,/,定义导航页面中转的,Url,public String gourl(),return type;,7.2,JSF,入门,JSF,导航,
30、JSF,带参数 页面重定向,问题,:如果想在登录失败时,传递页面的错误信息,怎么实现?,/login.jsp,succeed,/loginsuccess.jsp,fail,/,login.jsp,7.2,JSF,入门,JSF,导航,-JSF,带参数 页面重定向,LoginBean,(,去掉原来,fail,的导航,只保留,succeed,的导航即可,),:,public String login(),String,result=;,int,ret=authenticate(username,pwd,verifyingcode);,if(ret,=0),result,=succeed;,else
31、switch,(ret),case 1:,result=login.jsf?result=wrongpwd;break;,case 2:,result=login.jsf?result=wrongcode;break;,try,FacesContext.getCurrentInstance().getExternalContext().redirect(result,);,catch(IOException e),e.printStackTrace();,return,result;,7.3 JSF,标签,JSF,提供了大量的,UI,标签来简化创建视图。,使用这些标签,可以通过其,value
32、binding,,,action,,,actionListener,等属性直接绑定到托管,Bean,的属性,实例或者方法上。,JSF,包括两组标签库:,jsf_core.tld,核心标签库和,html_basic,。,7.3 JSF,标签,Taglib,指令,41,JSF,核心标签库,JSF HTML,标签库,使用,JSF,标签,.,7.3 JSF,标签(,JSF,核心标签库,),标签,说明,f:validateLength,验证组件值的长度,f:,validateDoubleRange,验证组件值的双精度范围,f:,validateLongRange,验证组件值的长整型范围,f:,va
33、lidator,向组件添加验证器,f:,loadBundle,加载资源包,f:,verbatim,向页面中添加标签,f:,selectItem,指定,UISelectOne,或,UISelectMany,组件的一个项目,f:,selectItems,指定,UISelectOne,或,UISelectMany,组件的多个项目,42,7.3 JSF,标签(,JSF,核心标签库,),43,标签,说明,f:,v,iew,创建顶层视图,f:,s,ubview,创建视图的子视图,f:,f,acet,向组件添加,facet,f:,p,aram,向组件添加参数,f:,a,ttribute,向组件添加属性,f:
34、actionListener,在父组件上注册操作监听器,f:valueChangeListener,向父组件注册值变更监听器,f:,converter,注册任意转换器,f:,convertDateTime,注册日期时间转换器,f:,convertNumber,注册数量转换器,标准的转换器和验证器示例,编写一个填写付款信息的页面,付款信息包括付款金额、信用卡号、信用卡有效期,要求对输入的数据进行特定的转换和验证,44,8899,1234567898765,12/2005,示例代码,45,import java.util.Date;,public class PaymentBean,private
35、 double amount;,private String card=;,private Date date=new Date();,public void setAmount(double newValue)amount=newValue;,public double getAmount()return amount;,public void setCard(String newValue)card=newValue;,public String getCard()return card;,public void setDate(Date newValue)date=newValue;,p
36、ublic Date getDate()return date;,受管理的,Bean,index.jsp,result.jsp,7.3 JSF,标签(,JSF HTML,标签,),46,组件,标签,说明,UISelectOne,h:SelectOneListbox,单选列表框,h:selectOneMenu,单选菜单,h:selectOneRadio,单选按钮集,UISelectBoolean,h:selectBooleanCheckbox,单个复选框,UISelectMany,h:selectManyListbox,复选框集,h:selectManyCheckbox,多行选择列表框,h:se
37、lectManyMenu,多选菜单,UIPanel,h:panelGrid,表示一个,HTML,表格,h:panelGroup,组合一系列组件,UIMessage,h:message,显示一个组件的最近使用的消息,UIMessages,h:messages,显示所有消息,UIGraphic,h:graphicImage,显示一个图像,UIData,h:dataTable,功能丰富的表格控件,UIColumn,h:column,表示表格中的列,7.3 JSF,标签(,JSF HTML,标签,),组件,标签,说明,UIForm,h:form,表示,HTML,表单,元素,UIInput,h:Inpu
38、tText,单行文本输入控件,h:inputTextarea,多行文本输入控件,h:InputSecret,密码输入控件,h:inputHidden,隐藏字段,UIOutput,h:outputLabel,显示文本,h:outputLink,链接到另一页面或某页面上的特定位置,h:outputFormat,显示格式化的信息,h:outputText,当行文本输入,UICommand,h:commandButton,表示一个按钮,h:commandLink,表示一个链接,47,7.3 JSF,标签(,表单,),表单,:,h:form,标签产生,HTML form,元素,如果在名为,/index.
39、jsp,的,JSF,页面中使用了无属性的,h:form,标签,则,Form,呈现器将产生如下的,HTML,代码,:,可以,为,h:form,指定,style,或,styleClass,属性,建议为表单元素明确指定,id,属性,48,7.3 JSF,标签(,文本输入,),h:inputText,h:inputSecret,h:inputTextarea,49,7.3 JSF,标签(,命令,),h:commandButton,h:commandLink,h:outputLink,50,7.3 JSF,标签(,选择,),h:selectBooleanCheckbox,h:selectManyChec
40、kbox,h:selectOneRadio,h:selectOneListbox,h:selectManyListbox,h:selectOneMenu,h:selectManyMenu,51,选择标签使用示例,52,联系我,private boolean contactMe;,public void setContactMe(boolean newValue),contactMe=newValue;,public boolean getContactMe(),return contactMe;,private SelectItem grades=,new SelectItem(new Int
41、eger(1),高中,),new SelectItem(new Integer(2),专科,),new SelectItem(new Integer(3),本科,),new SelectItem(new Integer(4),硕士,),new SelectItem(new Integer(5),博士,),;,public SelectItem getGrades(),return grades;,7.3 JSF,标签(,数据表格标签,),UIData,组件表示,h:dataTable,标签,它支持将数据绑定到数据对象集合,遍历数据源中的每个记录,表内的数据列由,UIColumn,组件表示,即,
42、h:column,标签,53,属性,说明,bgcolor,设置表格背景色,border,设置表格边框宽度,cellpadding,设置表格单元格周围的边距,cellspacing,设置表格单元格之间的间距,first,表格中所显示的第一行的索引,frame,指定表格四周的边框样式;有效值:,none,、,above,、,below,、,hsides,、,vsides,、,lhs,、,rhs,、,box,、,border,styleClass,指定整个表格的,CSS,类,rowClasses,行的,CSS,类列表,用逗号分隔列表,columnClasses,列的,CSS,类列表,用逗号分隔列表,
43、headerClass,表格标题的,CSS,类,footerClass,用于表格页脚的,CSS,类,rules,单元格之间的行样式;有效值:,groups,、,rows,、,columns,、,all,var,数据表格所创建的变量名称,表示该值中的当前项目,数据表格使用示例,1,在网页中输出一个简单的表格,显示一个职员的姓名和职位,54,示例代码,55,public class EmployeeList,private String name;,private String position;,public EmployeeList(String name,String position),t
44、his.name=name;,this.position=position;,public void setName(String name)this.name=name;,public void setPosition(String position)this.position=position;,public String getName()return name;,public String getPosition()return position;,EmployList.java,public class Data,private static final EmployeeList e
45、mployeelist=new EmployeeList,new EmployeeList(,高侠,软件工程师,),new EmployeeList(,张小丽,培训师,),new EmployeeList(,刘亚平,项目经理,),new EmployeeList(,牛远,软件工程师,),;,public EmployeeList getEmployeelist(),return employeelist;,受管理,Bean Data,index.jsp,数据表格使用示例,2,练习如何从数据库中提取数据,然后将查询结果显示在数据表格中。要求为数据表格设置样式,56,样式表,57,.custome
46、rs,border:thin solid black;,.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,负责同数据库建立连接,并查询数据,58,public cla
47、ss CustomerBean,String sDBDriver=com.microsoft.jdbc.sqlserver.SQLServerDriver;,String sConnStr=jdbc:microsoft:sqlserver:/localhost:1433;,DatabaseName=northwind;,Connection connect=null;,public CustomerBean(),try,Class.forName(sDBDriver);,catch(java.lang.ClassNotFoundException e),System.err.println(e
48、getMessage();,try,connect=DriverManager.getConnection(sConnStr,sa,);,catch(SQLException ex),System.err.println(ex.getMessage();,CustomerBean.java,public synchronized ResultSet,executeQuery(String sql),ResultSet rs=null;,if(connect!=null),try,Statement stmt=connect.createStatement();,rs=stmt.execute
49、Query(sql);,catch(SQLException ex),System.err.println(ex.getMessage();,return rs;,public synchronized int,executeUpdate(String sql),int rs=-1;,if(connect!=null),try,Statement stmt=connect.createStatement();,rs=stmt.executeUpdate(sql);,catch(SQLException ex),System.err.println(ex.getMessage();,return
50、 rs;,public Result,getAll(),throws SQLException,try,CustomerBean jc=new CustomerBean();,String sql=select*from Customers;,ResultSet rs=jc.executeQuery(sql);,return ResultSupport.toResult(rs);,finally,closeConnection();,public void,closeConnection(),if(connect!=null),try,connect.close();,catch(SQLExc






