`

JSF1.2自定义组件中EL表达式的处理。

    博客分类:
  • JSF
阅读更多
在基于Eclipse(MyEclipse)+Tomcat6的开发环境中,经常会碰到EL表达式被当作字符串来处理,而没有正确解析出EL表示式的值的情况。
这个问题有两点需要注意,一是tag.tld文件中的version要设置为2.1,同时把value属性设置为Object。
<taglib
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee web-jsptaglibrary_2_1.xsd"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1">
...
<tag>
<name>textCommand</name>
<tag-class>org.freesky.tag.TextCommandTag</tag-class>
<attribute>
<name>label</name>
<required>true</required>
</attribute>
<attribute>
<name>value</name>
<deferred-value>
<type>java.lang.Object</type>
</deferred-value>
</attribute>
</tag>
..
-----------------------------------------------------------------------


而是在Tag Class中要用如下方法获取

   1. FacesContext facesContext = getFacesContext(); 
   2.         Application app = facesContext.getApplication(); 
   3.         ExpressionFactory elFactory = app.getExpressionFactory(); 
   4.         ELContext elContext = facesContext.getELContext(); 
   5.         ValueExpression valueExp =  
   6.             elFactory.createValueExpression(elContext, expression,  
   7.                                             Object.class);

--------------TextCommandTag.java-----------------------

import javax.el.ValueExpression;
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.webapp.UIComponentELTag;

public class TextCommandTag extends UIComponentELTag {

private String label;
private ValueExpression value;


public void setLabel(String label) {
this.label = label;
}


public void setValue(ValueExpression value) {
this.value = value;
}


@Override
public String getComponentType() {

return "txtCmd.component";
}

@Override
public String getRendererType() {

return "txtCmd.renderer";
}

@Override
public void setProperties(UIComponent component) {
super.setProperties(component);

TextCommandComponent txtCmd = (TextCommandComponent) component;
txtCmd.setLabel(label);

FacesContext context = FacesContext.getCurrentInstance();
Application application = context.getApplication();

ValueExpression expression = application.getExpressionFactory()
.createValueExpression(context.getELContext(),
value.getExpressionString(), String.class);
txtCmd.setValue( expression.getValue(context.getELContext()) );
txtCmd.setValueExpression(value.getExpressionString());

}

@Override
public void release() {
this.label = null;
this.value = null;
}
}

-------------------------------------
在JSP页面中
<tc:textCommand label="OTP" value="#{user.otp}" />
---------------------------------------------------------------------------------
这里value是字符串,所以在上述createValueExpression()方法中用了String.class 表示类型。
这样可以获取EL表达式所表示的值。

反过来,在Form提交的时候,如何把修改后的value值设置到EL表达式所代表的对象中呢?
这需要在Component中定义一个字符串来保存EL表达式,
private String valueExpression;

public String getValueExpression() {
return valueExpression;
}

public void setValueExpression(String valueExpression) {
this.valueExpression = valueExpression;
}

在Tag class的setProperties()方法中设置该值,如上
txtCmd.setValueExpression(value.getExpressionString());

这样在Renderer class的decode方法中可以通过如下方式把value值设置回去。
@Override
public void decode(FacesContext context, UIComponent component) {
TextCommandComponent txtCmd = (TextCommandComponent) component;

Map<String, String> parameters = context.getExternalContext()
.getRequestParameterMap();
String id = txtCmd.getClientId(context);
String value = parameters.get(id);

Application application = context.getApplication();
ValueExpression expression = application.getExpressionFactory()
.createValueExpression(context.getELContext(),
txtCmd.getValueExpression(), String.class);

expression.setValue(context.getELContext(), value);

txtCmd.setSubmittedValue(value);

}
---------------------------------------------------------------------------
分享到:
评论

相关推荐

    jsf1.2官方例子

    在实践中,建议首先熟悉JSF的基础知识,如组件结构、生命周期、EL表达式等,然后逐步深入到更复杂的主题,如自定义组件、AJAX集成、CDI和JSF的集成等。同时,结合Mojarra的文档和社区资源,可以帮助你更好地理解和...

    core jsf 1.2 jsf 核心

    JSF 1.2引入了一些性能优化措施,比如延迟组件初始化、减少不必要的请求处理等,以提高整体性能。 ### 12. 开发工具支持 Eclipse、NetBeans等IDE提供了JSF 1.2的插件,简化了开发流程,包括自动完成、错误检查和...

    jsf1.2 jar包下载

    3. **EL表达式语言增强**:JSF 1.2对Expression Language (EL)进行了扩展,增强了其表达能力和灵活性,使得数据绑定和方法调用更加简便。 4. **更好的错误处理和调试**:提供了更丰富的错误信息和日志记录,帮助...

    JSF1.2.07版源代码

    这有助于理解自定义组件的开发和使用。 3. **UIComponent与RenderKit** UIComponent是JSF组件的基础类,代表用户界面中的一个可渲染元素。RenderKit则决定了组件如何在客户端呈现。源代码中,你可以看到各种预定义...

    jsf1.2_04api

    这个API包“jsf1.2_04api”包含了JSF 1.2版本的类库和接口,供开发者在项目中引用和使用。 JSF的核心组件包括: 1. **Facelets**:JSF 1.2引入了Facelets作为默认的视图定义语言,替代了原来的JSP。Facelets是一种...

    JSF1.2的jar包

    5. **EL(Expression Language)**:JSF 1.2中的EL是一种强大的表达式语言,用于在视图和模型之间绑定数据,以及调用Bean的方法。它简化了数据绑定和表达式评估。 6. **FacesServlet**:JSF框架的关键Servlet,负责...

    JSF1.2的新特性

    JSF 1.2最引人注目的改进之一便是其与JSP技术的整合,实现了更高效、一致的表达式语言(EL)使用。EL是JSF和JSP之间共享的一种强大工具,允许开发者在不离开HTML标签上下文的情况下访问JavaBean属性。在JSF 1.2中,...

    jsf1.2

    综上所述,JSF 1.2在组件模型、编程模式、数据处理、事件处理等方面都进行了改进,提升了开发者的效率和用户体验。对于需要下载和使用的"jsf-1.2-b20-FCS"压缩包,其中包含了JSF 1.2的完整实现,可用于开发和学习...

    试图化组件jsf1.2开发包

    总结来说,"试图化组件jsf1.2开发包"中的`myfaces-core-1.1.7`库为开发者提供了一套完整的JSF 1.2实现,涵盖了JSF的核心功能,包括组件模型、生命周期管理、事件处理和Ajax支持等。开发者可以通过这个库构建基于Java...

    jsf1.2_src

    JSF 1.2 是该框架的一个早期版本,它为开发者提供了丰富的组件库、事件处理机制以及与Java EE 5兼容的特性。本篇文章将深入探讨 JSF 1.2 的源码,以帮助开发者更好地理解其内部工作原理。 1. **组件模型** - JSF ...

    JSF1.2 jar包和相关doc

    3. **表达式语言(EL)**:JSF 1.2使用了JavaServer Pages Expression Language(EL),这是一种简洁的表达式语言,用于在JSP页面中访问JavaBeans属性和其他上下文信息。EL与JSF组件结合,使得数据绑定变得简单直观...

    jsf简单的国际化(jsf1.2)

    这里,`base-name`表示资源包的全限定类名,而`var`是我们在JSF EL表达式中引用资源的变量名。 3. **在页面中使用**:在JSF的XHTML页面中,我们可以使用EL(Expression Language)表达式来访问资源包中的字符串。...

    JSF1.2 Specification

    3. **表达式语言**:EL(Expression Language)是JSF中用于访问JavaBean属性的一种简洁语法。它允许开发者在不离开JSP页面的情况下轻松引用后端对象或方法调用结果。 4. **转换与验证**:为了确保数据正确性和完整...

    jsf 编程

    JSF的后续版本,如2.x和2.2,引入了更多改进,如更强大的表达式语言(EL),CDI集成,以及对RESTful服务的支持。JSF 2.x还引入了Facelets作为默认视图技术,并支持更灵活的组件和页面结构。 ### 结论 JSF作为一个...

    jsf api

    JSF API设计得非常灵活,允许第三方提供者创建自定义组件、渲染器、转换器和验证器。这使得JSF能够适应各种不同的应用场景。 **9. JSF 1.2 TLD文档** `jsf12-tlddoc`可能是指JSF 1.2版本的Tag Library Descriptors ...

    jsf_tld_api_english_html

    开发者可以通过TLD来扩展这些组件,创建自己的自定义组件,以满足特定的业务需求。 **5. 表达式语言(EL)与绑定属性** JSF的表达式语言(Expression Language, EL)允许开发者在页面上动态访问和操作Java对象。TLD...

    jsf-api-src.zip

    3. **Managed Bean**:这是JSF中的业务逻辑载体,使用注解或XML配置来管理其生命周期和属性,可以通过EL表达式在视图和后台之间传递数据。 4. **Facelets**:这是一种视图描述语言,允许开发者创建可重用的、声明式...

    介绍JSF框架的PPT

    JSF 1.2版本开始支持统一表达式语言(EL)和JSTL标签库,这极大地增强了框架的功能性和灵活性。之前,JSTL迭代标签无法与JSF组件一起使用,但现在这些限制已经被消除,这使得开发者能够更加高效地编写代码。 ##### ...

    jsf几个常用取值方法和技巧总结

    - 管理Converter和Validator:你可以注册新的Converter或Validator,或者获取已注册的实例,以便在EL表达式中使用。 总结,JSF提供了一系列丰富的API来处理Managed Bean、组件树和其他资源。熟练掌握这些方法和...

Global site tag (gtag.js) - Google Analytics