`
tendy
  • 浏览: 47713 次
  • 来自: ...
社区版块
存档分类
最新评论

把ExtJS的组件包装成 JSF 组件(2)

    博客分类:
  • java
阅读更多

(续)Ext 的 DateField 输入日期很方便,因此决定把它做成 JSF 组件来使用。

写一个 JSF 组件比较麻烦,至少要写Component 类和一个 Tag 类,这种情况下,Component 负责 render  工作。
但通常我们都会写多一个 Renderer,负责 encode 、decode 及 转换客户端提交的数值。
btw,Renderer 其实是通过 component 来调用的,因此,Renderer 中有什么方法,都可在UIComponent 中找到。

这个组件叫 ExtInputDate,Component 代码:

java 代码
  1. public class ExtInputDate extends ExtInput {   
  2.        
  3.     public final static String COMPONENT_TYPE = "example.ExtInputDate";   
  4.     public final static String COMPONENT_FAMILY = "example.ExtInputDate";   
  5.        
  6.     public final static String DEFAULT_FORMAT = "yyyy-MM-dd";   
  7.        
  8.     private String format;   
  9.        
  10.     private Integer width;   
  11.        
  12.     private Boolean readonly;   
  13.        
  14.     private Boolean disabled;   
  15.        
  16.     private String styleClass;   
  17.        
  18.     @Override  
  19.     public String getFamily() {   
  20.         return COMPONENT_FAMILY;   
  21.     }   
  22.   
  23.     @Override  
  24.     public String getEndingScript() {   
  25.         // 输出 JavaScript 代码,略。注意转换 Java 的日期格式为 Ext 的日期格式   
  26.         // ...   
  27.     }   
  28.   
  29.     public String getFormat() {   
  30.         if (format == null) {   
  31.             ValueExpression ve = getValueExpression("format");   
  32.             if (ve != null) {   
  33.                 format = (String) FacesUtils.getExpressionValue(ve, getFacesContext().getELContext());   
  34.             }   
  35.                
  36.             if (format == null) {   
  37.                 format = DEFAULT_FORMAT;   
  38.             }   
  39.         }   
  40.            
  41.         return format;   
  42.     }   
  43.   
  44.     public void setFormat(String format) {   
  45.         this.format = format;   
  46.     }   
  47.   
  48.     // 其他 getter / setter, 略   
  49.     // TODO: ...   
  50.   
  51.     @Override  
  52.     public void restoreState(FacesContext context, Object state) {   
  53.         Object values[] = (Object[]) state;   
  54.         super.restoreState(context, values[0]);   
  55.         format = (String)values[1];   
  56.         width = (Integer)values[2];   
  57.         readonly = (Boolean)values[3];   
  58.         disabled = (Boolean)values[4];   
  59.         styleClass = (String)values[5];   
  60.     }   
  61.   
  62.     @Override  
  63.     public Object saveState(FacesContext context) {   
  64.         Object values[] = new Object[6];   
  65.         values[0] = super.saveState(context);   
  66.         values[1] = format;   
  67.         values[2] = width;   
  68.         values[3] = readonly;   
  69.         values[4] = disabled;   
  70.         values[5] = styleClass;   
  71.   
  72.         return ((Object) (values));   
  73.     }   
  74.   
  75. }   

Component 必须有 restoreState 和 saveState 方法,而且在这两个方法里面必须调用 super 的同名方法。
这一点,感觉很不爽...


UIInput 类的组件,有个变量叫 submittedValue,这个是客户端提交的值,
在 Apply Request Value 阶段 decode 的时候被设置,可以转换为String 类型;
另外有个 value 变量,存放 value 表达式的值。
那么,在 render 的时候,显示哪个值呢?
一般的做法是,如果 submittedValue 不为null,显示 submittedValue;否则显示 value。

Renderer类:

java 代码
  1. public class ExtInputDateRenderer extends Renderer {   
  2.   
  3.     public final static String RENDERER_TYPE = "example.ExtInputDateRenderer";   
  4.   
  5.     @Override  
  6.     public void encodeBegin(FacesContext context, UIComponent component)   
  7.             throws IOException {   
  8.   
  9.         if (component.isRendered()) {   
  10.             ResponseWriter writer = context.getResponseWriter();   
  11.             String clientId = component.getClientId(context);   
  12.             writer.startElement("div", component);   
  13.             writer.writeAttribute("id", clientId, "clientId");   
  14.             String styleClass = (String) component.getAttributes().get("styleClass");   
  15.                
  16.             if (StringUtils.isNotEmpty(styleClass)) {   
  17.                 writer.writeAttribute("class", styleClass, null);   
  18.             }   
  19.             writer.endElement("div");   
  20.         }   
  21.     }   
  22.   
  23.   
  24.     @Override  
  25.     public void decode(FacesContext context, UIComponent component) {   
  26.         if (component.isRendered() && component instanceof ExtInputDate) {   
  27.             Map paramMap = context.getExternalContext()   
  28.                     .getRequestParameterMap();   
  29.             String clientId = component.getClientId(context);   
  30.   
  31.             // 允许 readonly   
  32.             if (RendererUtils.isDisabled(component))   
  33.                 return;   
  34.   
  35.             if (paramMap.containsKey(clientId)) {   
  36.                 ((EditableValueHolder) component).setSubmittedValue(paramMap.get(clientId));   
  37.             }   
  38.   
  39.         } else {   
  40.             throw new IllegalArgumentException("Unsupported component class "  
  41.                     + component.getClass().getName());   
  42.         }   
  43.     }   
  44.   
  45.     @SuppressWarnings("unchecked")   
  46.     public Object getConvertedValue(FacesContext context,   
  47.             UIComponent component, Object submittedValue)   
  48.             throws ConverterException {   
  49.   
  50.         ValueExpression valueExpression = component.getValueExpression("value");   
  51.            
  52.         if (valueExpression == null)   
  53.             return null;   
  54.   
  55.         Class converterType = valueExpression.getType(context.getELContext());   
  56.   
  57.         if (converterType == String.class) {   
  58.                
  59.             return submittedValue;   
  60.                
  61.         } else if (converterType == Date.class  
  62.                 || converterType == java.sql.Date.class) {   
  63.             String s = (String) submittedValue;   
  64.             if (StringUtils.isEmpty(s))   
  65.                 return null;   
  66.                
  67.             ExtInputDate inputDate = (ExtInputDate) component;   
  68.             SimpleDateFormat df = new SimpleDateFormat(inputDate.getFormat());   
  69.             try {   
  70.                 return df.parse(s);   
  71.             } catch (ParseException e) {   
  72.                 throw new ConverterException(e);   
  73.             }   
  74.         } else {   
  75.             throw new ConverterException();   
  76.   
  77.         }   
  78.     }   
  79. }   

这个组件里面,decode 所做的事情只是设置 submittdValue,
getConvertedValue() 函数把客户端提交的值,转换为相应的类型。
这个函数在 Update Model Value阶段由 Component 调用,
更新 managed-bean 的值。
一般来说,需要考虑是否有 converter。
不过这个组件中,自己负责日期转换的工作,因此不需要 converter。
此外,这个组件只支持 String, java.util.Date, java.sql.Date 三种类型的值。

分享到:
评论

相关推荐

    Ext组件转化成JSF

    ExtJS组件包括其概念、创建方式、与服务器的交互方式以及如何组合组件。JSF技术原理涉及其生命周期、组件模型以及渲染器的概念。同时,了解HTTP和Ajax的基本知识,以及JDK 1.5及以上版本的新特性(如泛型、元数据和...

    第二波又来了:AOM3.2之8款皮肤分享(for extjs3.31)

    这些皮肤的实现主要通过CSS样式表和JavaScript代码来调整ExtJS组件的外观,使得开发者可以轻松地改变整个应用的视觉风格,而无需对核心功能进行修改。 在实际应用中,更换皮肤不仅能够改变应用程序的整体色调和风格...

    java extjs 仿163邮箱源码

    Java和ExtJS是两种在开发Web应用程序时...开发者需要熟悉Java服务器端编程,理解ExtJS组件的使用,并且可能需要对邮件协议和Office文档处理有一定的了解。通过这样的实践,开发者可以提升在Web应用开发中的综合能力。

    EXTJS+RICHFACES

    RichFaces作为内容部分,它的AJAX和JSF组件可以无缝集成到EXTJS界面中,以提供动态数据更新和复杂的用户界面元素。 RichFaces的核心特性包括: 1. **AJAX支持**:RichFaces提供了一系列的AJAX-enabled组件,允许...

    MyEclipse 8.5 + Spket 1.6.18 + ExtJS ext-4.0.0

    Spket IDE Plugin v1.6.18版本特别提到了对ext.jsb2的支持,这是ExtJS 3.0.0及以上版本中用于定义类和组件的二进制包,它包含了ExtJS框架的核心结构和功能,能够被Spket识别和解析,从而提供更精准的代码提示和导航...

    java-Struts-Hibernatelib.zip_extjs4

    【标题】"java-Struts-Hibernate-lib.zip_extjs4" 涉及的是一个Java Web开发中的集成框架,其中包括了Struts、Hibernate和Spring这三个核心组件,以及ExtJS4前端框架,配合Jbpm4流程引擎和Oracle10g数据库的实践项目...

    liliya

    1. **前言**:阐述了Lilya平台的目标和定位,即在不替换原有ExtJs API的前提下,通过使用ExtJs、WZGrapher等组件简化JSF等技术的开发流程。 2. **Lilya介绍**:针对初次接触Lilya的用户提供入门级教程,旨在快速...

    JavaEExt:使用Java EE和ExtJS进行快速应用程序开发-开源

    在Java EE平台上,JavaEExt利用了诸如Servlet、JSP、JavaServer Faces (JSF) 和Enterprise JavaBeans (EJB) 等核心组件。Servlet负责处理HTTP请求,JSP用于生成动态内容,而JSF则提供了模型-视图-控制器(MVC)架构...

    spket1-1.6.23

    2. **MyEclipse集成**:通过集成,Spket1-1.6.23能够无缝地在MyEclipse环境中运行,使得开发者能够在熟悉的MyEclipse环境中享受到Spket的智能编码辅助。这包括在MyEclipse的JavaScript项目中自动完成ExtJS的API,...

    javascript,css,dhtml,ext3.0,java web,api文档大全中文chm

    `Ext 3.0 中文API.CHM`将帮助开发者了解EXTJS的组件系统、数据绑定、事件处理等高级特性。 **Java Web**:Java Web是指使用Java技术栈开发的Web应用程序,包括Servlet、JSP、JavaServer Faces (JSF) 等。`java web ...

    基于J2EE的客户关系管理系统的设计与实现

    通过深入研究J2EE技术及其相关组件,如AJAX、ExtJS、Struts和Hibernate等,可以更好地满足企业在客户关系管理方面的需求。未来,随着新技术的不断发展,客户关系管理系统的功能和服务也将更加完善。

    J2EE程序员需掌握的技术

    - JSF(Facelets,Richfaces,Ajax4jsf,ICEFaces):提供组件化开发,易于构建用户界面。 - Struts2:基于MVC的框架,整合了许多其他技术如OGNL和拦截器。 - Spring MVC:Spring框架的一部分,提供了强大的MVC...

    java学习线路

    * JSF<选学>:MVC 与 JSF 设计理念、托管 Bean 与导航模型、JSF 流程与事件机制、JSF 标签库、类型转换与输入检验 * EJB 及相关技术:JNPI 与 RMI、会话 Bean 及其生命周期、IoC 与 EJB拦截器、JMS 与 MDB、会话 ...

    java面试宝典和学习必备

    5. **中心控制器**:Tapestry、JSF(JavaServer Faces)和Struts2都是Web应用的中心控制器,负责处理用户请求和响应。 6. **视图层**:TML、ExtJS、XHTML、JSP和HTML是视图层技术,用于展示数据和用户界面。其中,...

    SOA通用架构.docx

    17. **Web前端**:HTML、JavaScript、JSP、JSF、Velocity、EasyUI、ExtJS、jQuery、Struts、SpringMVC、SpringSide等技术构建用户界面,同时,Apache HTTP Server、HttpClient、Nginx等用于Web服务器和反向代理。...

    demo工程列表说明1

    38. **JSF(JavaServer Faces)**:jsf22demo展示了JSF 2.2的应用,包括Facelet模板页面的使用。 39. **JavaScript库**:jslibdemo中包含了不同JavaScript库的示例,如ExtJS的表格控件,Dojo的EnhancedGrid和dgrid...

    java的各种技术.pdf

    JQuery和ExtJS是流行的JavaScript库,提供丰富的UI组件和简化DOM操作。 3. **JavaFX**:JavaFX是一种用于创建桌面和移动设备的现代图形用户界面的平台,使用声明式语法,支持静态类型编程。 4. **JSP/Servlet/...

Global site tag (gtag.js) - Google Analytics