JSF EL 介绍
JSF框架简介与实例

JSF框架简介与实例JSF 体系结构:JSF 的主要优势之⼀就是它既是 Java Web 应⽤程序的⽤户界⾯标准⼜是严格遵循模型-视图-控制器 (MVC) 设计模式的框架。
⽤户界⾯代码(视图)与应⽤程序数据和逻辑(模型)的清晰分离使 JSF 应⽤程序更易于管理。
为了准备提供页⾯对应⽤程序数据访问的 JSF 上下⽂和防⽌对页⾯未授权或不正确的访问,所有与应⽤程序的⽤户交互均由⼀个前端FacesServlet(控制器)来处理。
JSF ⽣命周期:FacesServlet 充当⽤户和 JSF 应⽤程序之间的纽带。
它在明确限定的 JSF ⽣命周期(规定了⽤户请求之间的整个事件流)的范围内⼯作。
1.当JSF页⾯上的⼀个事件发⽣时(⽐如:⽤户单击了⼀个按钮),事件通知通过HTTP发往服务器。
服务器端使⽤FacesServet这个特殊的Servlet处理该通知。
2. FacesServlet⼀接收到⽤户的请求就创建⼀个FacesContext对象(JSF上下⽂,它存放了应⽤程序的所有数据)。
在处理过程中,主要修改的就是这个FaceContext对象。
3.接着就是处理过程,处理器是⼀个叫作Lifecycle的对象。
FacesServet把控制权转交给Lifecycle对象。
该对象分6个阶段来处理FacesContext对象以⽣成响应,最后将响应发回客户端。
Lifecycle对象处理JSP请求所需要的⼀系列动作称为请求处理⽣命周期。
过程状态图如下:由于请求处理⽣命周期⾥的应⽤请求值、处理验证、更新模型值和调⽤应⽤程序等阶段都可以在当前的请求对应的FacesContext实例中添加事件,因此,JSF实现必须在这些阶段后处理这些事件。
阶段说明恢复视图为选定的视图找到或创建组件树。
⼀旦⽤户单击JSP页⾯上的链接或按钮,就会启动此阶段。
JSF应⽤⾥的JSP页⾯被表⽰成⼀个组件树。
JSF实现会进⼀步将这些组件链接到事件处理程序和验证程序,并将视图保存在FacesContext对象中,以备后⾯的处理过程所⽤。
activit使用el表达式

activit使用el表达式Activiti使用EL表达式EL(Expression Language)是一种用于在JavaServer Pages(JSP)和JavaServer Faces(JSF)中访问和操作数据的简单表达式语言。
在Activiti中,EL表达式也被广泛应用于流程定义和任务处理中。
EL表达式的语法类似于JavaScript和JSP中的表达式语言,使用${}来包裹表达式。
在Activiti中,EL表达式可以用于以下几个方面:1. 流程定义中的条件判断:在流程定义的连线上,可以使用EL表达式来判断流程走向。
例如,可以使用${user.age > 18}来判断用户的年龄是否大于18岁,从而决定流程的走向。
2. 任务处理中的变量设置:在任务处理过程中,可以使用EL表达式来设置任务的变量。
例如,可以使用${}来设置任务的执行人为用户的姓名。
3. 表单字段的值获取:在流程的表单中,可以使用EL表达式来获取表单字段的值。
例如,可以使用${}来获取表单中名为name的字段的值。
4. 表单字段的可见性控制:在流程的表单中,可以使用EL表达式来控制表单字段的可见性。
例如,可以使用${user.role == 'admin'}来判断用户的角色是否为管理员,从而决定某个字段是否可见。
使用EL表达式可以使流程定义和任务处理更加灵活和动态。
通过使用EL表达式,可以根据不同的条件来决定流程的走向,设置任务的执行人和变量,以及控制表单字段的可见性。
这样,就可以根据具体的业务需求来定制流程和任务的处理逻辑。
在Activiti中,EL表达式的使用非常简单。
只需要在相应的地方使用${}包裹表达式即可。
同时,Activiti还提供了一些内置的EL函数和变量,可以在表达式中直接使用。
例如,可以使用${activiti:currentUser()}来获取当前用户的信息。
总之,EL表达式是Activiti中非常重要的一部分,它可以帮助我们实现流程和任务的灵活处理。
JSF标签详解

大多数Java Web 框架一样,JSF 应用配置是通过XML 文件处理的,该文件通常称为faces-config.xml 。
在这个文件中,你可以配置应用所支持的场所、受管bean 、导航规则以及替换可插入的JSF 类。
你还可以在此文件中配置 UI 扩展(组件、呈现器、验证器以及转换器)和其他高级特征。
所有这些东西都可以在代码中设置,虽然这样做通常只在动态场合下才有用。
如果你不喜欢编辑XML 文件,可以用工具来进行。
有一个免费的配置文件编辑器叫做Faces Console ,它可以插入到许多流行的IDE 之中,也可以作为单独的程序运行。
Exadel 也提供了一个可以作为Eclipse plugin 的JSF Studio 产品,可以简化配置、导航和其他内容的编辑。
此外,大多数IDE 也对配置的某些部分甚至全部方面提供了可视化编辑器。
JSF Central 社区站点维护着一个JSF 工具的产品目录。
JSF 可以支持多个配置文件。
默认情况下,它会查找文件名为WEB-INF/faces-config.xml 的文件,并且这里实际上也是放置大部分应用配置的地方。
还可以通过javax.faces.CONFIG_ FILESS 上下文参数指定额外的配置文件,这个参数在想要将你的配置进行分割以便易于维护时是很有用的。
例如,两个不同的团队可能工作于具有不同配置文件的不同模块。
JSF 也要在JAR 文件(或者其他任何资源路径)中搜索名为META-INF/faces-config.xml 的配置文件;这将允许你或者第三方能够创建组件、呈现器、验证器、转换器的库,并且它们可以被你的应用自动注册。
所有应用配置文件都必须引用JSF 配置的文档类型定义(DTD ):(如果你使用的是JSF 1.0,URI 将是“/dtd/Web-facesconfig_1_0.dtd ”)。
图D-1解释了配置文件的基本结构。
下面的小节详细解释了DTD 的每个元素。
JSF标签

JSF标签一、简介JSF标准标签JSF提供了標準的HTML Renderer Kit,可以讓您搭配JSF元件輸出HTML文件,標準的HTML Renderer Kit主要包括了幾個類別:∙輸出(Outputs)其名稱以output作為開頭,作用為輸出指定的訊息或綁定值。
∙輸入(Inputs)其名稱以input作為開頭,其作用為提供使用者輸入欄位。
∙命令(Commands)其名稱以command作為開頭,其作用為提供命令或連結按鈕。
∙選擇(Selections)其名稱以select作為開頭,其作用為提供使用者選項的選取。
∙其它包括了form、message、messages、graphicImage等等未分類的標籤。
JSF標準HTML標籤包括了幾個共通的屬性,整理如下:除了共通的屬性之外,您還可以在某些元件上設定標籤HTML 4.01的屬性,像是size、alt、width等屬性,或者是設定DHTML事件屬性,例如onchange、onclick等等。
除了JSF的標準HTML標籤之外,您還需要一些標準核心標籤,這些標籤是獨立於Renderer Kit的,JSF並不限制在HTML輸出表示層,核心標籤可以搭配其它的Renderer Kit來使用。
詳細的HTML標籤或核心標籤的使用與屬性說明可以查詢Tag Library Documentation文件。
二、输出类标签輸出類的標籤包括了outputLabel、outputLink、outputFormat與outputText,分別舉例說明如下:outputLabel產生<label> HTML標籤,使用for屬性指定元件的client ID,例如:<h:inputText id="user" value="#{}"/><h:outputLabel for="user" value="#{}"/>這會產生像是以下的標籤:<input id="user" type="text" name="user" value="guest" /><label for="user">outputLink產生<a> HTML標籤,例如:<h:outputLink value="../index.jsp"/>value所指定的內容也可以是JSF EL綁定。
《J2EE前沿技术》第06章[JSF概述]理论课
![《J2EE前沿技术》第06章[JSF概述]理论课](https://img.taocdn.com/s3/m/3b2680c208a1284ac85043f3.png)
显示模型
验证模型
转换模型
中国十大品牌IT教育机构
ቤተ መጻሕፍቲ ባይዱ
UI 组件类
StateHodler ValueHolder EditableValueHolder UIComponent UIComponentBase ActionSource
UIOutput UIInput UISelectOne
工具开发人员
JSF 实现者 提供执行 JSF Web 应用程序的运行时环境
中国十大品牌IT教育机构
JSF 开发过程
开发模型对象 开发基于JSF的 的 开发基于 用户界面 编写事件监听 器或者导航规 则
中国十大品牌IT教育机构
中国十大品牌IT教育机构
呈现响应
视图
FacesContext 对象 获取组件值
encode()
响应
……. ……… ……
组件
中国十大品牌IT教育机构
用户界面组件模型
JSF 用户界面模型
UI 组件类
事件和监听器模型
JSF 体系结构
Web 容器
Faces Servlet
Action Action Action Servlet Servlet JSF页面 Servlet
应用程序 数据
控制器
视图
模型
中国十大品牌IT教育机构
JSF 开发角色
页面设计人员 工具开发人员 组件开发人员 应用程序开发人员 JSF 实现者
FacesContext
中国十大品牌IT教育机构
请求处理生命周期
中国十大品牌IT教育机构
开发JSF 程序的步骤
1、建立JSP页面,用JSF组件包装HTML元素。 2、写一个JavaBean用来保持用户输入与组件数 据的状态。 3、写一个事件侦听器来决定当某事件发生时应 该有什么反应,JSF支持两个事件:ActionEvent 与valueChangeEvent。ActionEvent是针对用户 提交表单与单击按钮的,而valueChangeEvent是 当一个JSF组件改变了时触发。
el表达式判断是否包含某字符串的方法

EL(Expression Language)是一种用于在JSP、JSF等技术中简化表达式求值的语言。
在EL中,我们常常需要判断一个字符串是否包含另一个字符串。
在本文中,我将探讨el表达式中判断是否包含某字符串的方法,并从简单到复杂逐步展开这个主题,以便更好地理解。
1. EL表达式简介EL表达式是在JSP、JSF等技术中经常使用的一种表达式语言,用于在页面中访问和操作JavaBean的属性。
它的语法简洁明了,使用起来非常方便。
我们可以通过`${}`来获取JavaBean中的name属性值。
2. 判断字符串是否包含某字符串的方法在EL中,判断一个字符串是否包含另一个字符串,可以使用`${fn:contains(string1, string2)}`方法来实现。
其中,string1为要被检查的字符串,string2为要检查是否包含的字符串。
该方法会返回一个boolean类型的值,表示string1是否包含string2。
3. 实际应用举例举个例子,假设我们有一个字符串`${fruit}`,我们想判断它是否包含"apple"这个子串,可以这样写`${fn:contains(fruit, 'apple')}`。
如果fruit包含"apple",则该表达式的值为true,否则为false。
4. 注意事项在使用`${fn:contains}`方法时,需要确保传入的两个参数都是字符串类型。
如果其中有一个参数不是字符串类型,将会抛出错误。
另外,判断时是否区分大小写取决于具体的环境配置,需要注意这一点。
5. 个人观点和理解EL表达式中判断是否包含某字符串的方法非常简单且实用。
它可以在页面上轻松地实现字符串的包含关系判断,而不需要在后台Java代码中编写繁琐的判断逻辑。
当然,在实际应用中,我们也需要注意参数类型和大小写敏感性等细节,以确保程序的稳定性和可靠性。
JSF生命周期

jsf生命周期JSF是基于事件驱动的,首先介绍JSF的事件侦听。
介绍中我仅仅给大家提供简单的场景。
不过我需要首先申明,思考这些事件的时候,你最好先用C/S架构下的模式考虑她的运作模式,再用web下js调度动作的方式去认识执行过程。
1)动作事件:Action Event:普通动作响应actionEvent是最普通的事件,任何command组件(button,link等,请参见UICommand)通过注册actionListener均可出发此事件侦听响应,简单说,用户有意义的操作,即可触发。
2)即时事件:Immediate Event:立即处理,不验证/转换/更新模型值(即bean不会保存属性)即时事件,立即触发,在JSF生命周期中,让恢复试图之后,获取请求值,立即触发。
验证、转化、更新模型值被略过,当然更多的情况下,你需要一个为被注册的UI组件binding到后台bean中,别忘了,你使用即时事件的初衷是什么??就是我只想让程序关注此组件,并排斥其他组件或者级联组件的操作。
场景:单一表单中,使用“检测用户名是否存在”。
立即时间,常用来做bean层面即时服务,以执行action为主要目的。
3)值改变事件:Value Change Event:选择UI值改变后,级联调度.如果国际化中选择语言.值改变事件,如果一个输入(UIInput)、选择(UISelects)组件的值发生改变,将会执行的侦听。
所谓的值改变,就是表单中local值和submit 值发生偏移,local值就是页面渲染时上一个生命周期中传递的值,简单说就是表单中原来展示的值(server端生成的组件值,在周期中编码进去)。
submit值,就是面向用户或者操作者主动输入的客户端值。
比如:表单展示时,server端为一个下拉菜单赋值为1(local值),如果用户选择了2(submit值).请你用相同的思维去考虑输入框。
如果值改变,那么就会被执行,最好的场景就是:国际化中选择语言,然后把最新的语言元素,广播到整个站点。
JSF前端知识

Jsf前端知识1.JSF 体系结构JSF 的主要优势之一就是它既是Java Web 用户界面标准又是严格遵循模型-视图-控制器(MVC) 设计模式的框架。
用户界面代码(视图)与应用程序数据和逻辑(模型)的清晰分离使JSF 应用程序更易于管理。
为了准备提供页面对应用程序数据访问的JSF 上下文和防止对页面未授权或不正确的访问,所有与应用程序的用户交互均由一个前端“Faces”servlet(控制器)来处理。
2.JSP引入标签库基本标签<%@ taglib uri="/jsf/html" prefix="h" %><%@ taglib uri="/jsf/core" prefix="f" %>JSF的core与html标签库,core是有关于UI组件的处理,而html则是有关于HTML的进阶标签其他标签库支持<%@ taglib uri="/tomahawk" prefix="t"%>tomahawk为myfaces额外提供的标签库之一3.导航Navigation在JSF中是根据faces-config.xml中<navigation-rule>设定,以决定在符合的条件成立时,该连结至哪一个页面,一个基本的设定如下<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>failure</from-outcome><to-view-id>/failure.jsp</to-view-id></navigation-case></navigation-rule>在<navigation-rule>中的<from-view-id>是个选择性的定义,它规定了来源页面的条件,<navigation-case>中定义各种导览条件,<from-outcome>定义当窗体结果符合的条件时,各自改导向哪一个目的页面,目的页面是在<to-view-id>中定义。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1章JSF ELJavaServer Faces 提供了一种在 Web 应用程序页面中使用的表达式语言 (JSF EL),用来访问位于页面 Bean 以及其他与 Web 应用程序关联的 Bean(如会话Bean 和应用程序 Bean)中的 JavaBeans 组件。
在大多数情况下,IDE 都会为您指定正确的表达式,例如,当您将组件的 text 属性绑定到数据提供器或JavaBean 属性时。
JavaServer Faces 表达式语言语法使用分隔符 #{},如以下内容所述。
JavaServer Faces 表达式既可以是值绑定表达式(用于将 UI 组件或其值绑定到外部数据源中),也可以是方法绑定表达式(用于引用支持 Bean 方法)。
该表达式还可以接受混合的类型和计算语法,以及 2.0 表达式语言的运算符。
第2章 JavaServer Faces EL 表达式语法JSF EL 可用于将 JavaBeans 绑定到组件属性,以简化组件从各种源访问数据的方式。
JSF EL 表达式使用语法 #{expr};值绑定表达式的语法与 JavaServer Pages 规范(版本 2.0)2.3 节至 2.9 节中定义的表达式语言表达式的语法类似,但是具有以下不同之处:∙值绑定表达式的表达式分隔符是 #{ 和 },而不是${ 和 }。
∙值绑定表达式不支持 JSP 表达式语言函数。
除了在分隔符方面存在区别外,这两种表达式类型在以下语义方面也有所不同:∙在呈现期间,值绑定表达式由 JavaServer Faces 实现(通过调用getValue 方法)进行计算,而不是由页面的编译代码进行计算。
∙即使没有出现页面,也可以采用编程方式计算值绑定表达式。
∙值绑定表达式计算通过当前 Web 应用程序的 Application 对象,利用已配置的 VariableResolver 和 PropertyResolver 对象的可用功能,应用程序可为其提供能够带来额外功能的插件替换类。
∙如果值绑定表达式用于 EditableValueHolder 组件(任何输入字段组件)的值属性,则该表达式可用于修改引用的值,而不是在请求处理生命周期的“更新模型值”阶段对其进行检索。
有效的值绑定表达式示例包含:#{}#{Foo.bar}#{Foo[bar]}#{Foo[“bar”]}#{Foo[3]}#{Foo[3].bar}#{Foo.bar[3]}#{Customer.status == ‘VIP’}#{(Page1.City.farenheitTemp - 32) * 5 / 9}Reporting Period: #{Report.fromDate} to #{Report.toDate}对于要调用 setValue 方法的值绑定表达式(例如,在更新模型值期间输入字段的 text 属性绑定),其语法被限于使用以下任一格式,其中 expr-a 是用于计算某个对象的常规表达式,value-b 是一个标识符:#{expr-a.value-b}#{expr-a[value-b]]#{value-b}第3章获取值语义当调用 ValueBinding 实例的 getValue 方法(例如,在页面呈现期间计算 JSP 标记属性上的表达式),并计算该表示式时,将返回计算的结果,计算方法如下:∙该表达式语言统一了对 . 和 [] 运算符的处理方式。
expr-a.expr-b 等同于 a["expr-b"];即表达式 expr-b 用于构造其值为标识符的类型,然后 [] 运算符将与该值一起使用。
∙由 VariableResolver 实例计算表达式中最左侧的标识符,该实例是从此Web 应用程序的 Application 实例中获得的。
如果位于 . 或 [] 运算符左侧的值是 RowSet,则右侧的对象将被视为列名称。
有关这些运算符的完整计算说明,请参见下一节。
∙由 PropertyResolver 实例计算表达式中 . 或 [...] 运算符的每个实例,PropertyResolver 是从此 Web 应用程序的 Application 实例中获得的。
∙使用 . 运算符来访问变量的属性,然后可以随意进行嵌套。
第4章设置值语义在调用 ValueBinding 的 setValue 方法时(例如,在更新模型值期间输入字段的 text 属性绑定),值绑定语法的限制如上一部分中所述。
实现必须执行以下处理才能计算 #{expra.value-b} 或 #{expr-a[value-b]} 格式的表达式:∙将 expr-a 计算为 value-a。
∙如果 value-a 为空,则抛出 PropertyNotFoundException。
∙如果 value-b 为空,则抛出 PropertyNotFoundException。
∙如果 value-a 为映射,则调用 value-a.put(value-b, new-value)。
∙如果 value-a 是 List 或数组:o将 value-b 强制为 int,从而在出现错误时抛出ReferenceSyntaxException。
o在适当的时候尝试执行 value-a.set(value-b, new-value) 或Array.set(value-b, new-value)。
o如果 IndexOutOfBoundsException 或ArrayIndexOutOfBoundsException 已被抛出,则还会抛出PropertyNotFoundException。
o如果已出现其他异常,则会抛出 EvaluationException。
∙否则执行以下操作(value-a 是 JavaBeans 对象):o将 value-b 强制为 String。
o如果 value-b 是 value-a 的可编写属性(按照每个 JavaBeans 规范),则调用 setter 方法(传递 new-value)。
如果出现异常,则抛出 ReferenceSyntaxException。
o否则,将抛出 PropertyNotFoundException。
如果整个表达式包括一个标识符,则会应用以下规则:∙如果标识符与以下描述的任一隐式对象的名称相匹配,则抛出 ReferenceSyntaxException。
∙否则,如果标识符与请求范围、会话范围或应用程序范围中属性的关键字相匹配,则相应的属性值将被new-value替换。
∙否则,将创建新的请求范围属性,其关键字是标识符,而其值是 new-value。
第5章隐式对象表达式语言定义一组隐式对象:∙facesContext - 当前请求的 FacesContext 实例。
∙param - 将请求参数名称映射到单个值中。
∙paramValues - 将请求参数名称映射到值的数组中。
∙header - 将请求标题名称映射到单个值中。
∙headerValues - 将请求标题名称映射到值的数组中。
∙cookie - 将 cookie 名称映射到单个 cookie 中。
∙initParam - 将上下文初始化参数名称映射到单个值中。
允许访问各种范围的变量的对象:∙requestScope - 将请求范围的变量名称映射到它们的值中。
∙sessionScope - 将会话范围的变量名称映射到它们的值中。
∙applicationScope - 将应用程序范围的变量名称映射到它们的值中。
当表达式按名称引用其中一个对象时,将返回相应的对象。
隐式对象比同名属性的优先级要高。
例如,即使现有 facesContext 属性包含一些其他值,#{facesContext} 也将返回 FacesContext 对象。
第6章类型表达式语言定义了以下类型:∙布尔型:true 和 false∙整型:与 Java 中一样∙浮点型:与 Java 中一样∙字符串型:使用单引号和双引号;" 转义为 \", ' 转义为 \',而 \ 转义为 \\。
∙空:null第7章运算符除了在上述获取值语义和之后的章节中讨论的 . 和 [] 运算符外,表达式语言还提供以下运算符:∙算术运算符:+、-(二元)、*、/、div、%、mod、-(一元)∙逻辑运算符:and、&&、or、||、not、!∙关系运算符:==、eq、!=、ne、<、lt、>、gt、<=、ge、>=、le。
可以与其他值、或布尔型、字符串型、整型或浮点型相比较。
∙空运算符:empty 运算符是可以用来确定值是否为 null 或空的前缀运算。
∙条件运算符:A ?B : C。
计算 B 或 C,具体情况取决于 A 的计算结果。
按从高到低,从左到右的顺序排列的运算符优先级如下所示:∙[] .∙() (更改运算符的优先级)∙-(一元) not ! empty∙* / div % mod∙+ -(二元)∙< > <= >= lt gt le ge∙== != eq ne∙&& and∙|| or∙? :第8章保留字以下单词是为表达式语言而保留的,不能用作标识符:and false le notdiv ge lt Nullempty gt mod oreq instanceof ne true1.from Sun/docs/jscreator/help/2update1/jsp-jsfel/jsf_ expression_language_intro.html2. from Java Enterprise in a NutShell/read/others/0512/OReilly.Java.Enterprise.in.a. Nutshell.3rd.Edition.Nov.2005_html/0596101422/javaentnut3-CHP-5-SECT-4.html。