- 浏览: 123464 次
- 性别:
- 来自: 重庆
文章分类
最新评论
-
sunxiangfei91:
引用[*][url][/url]
Spring使用MimeMessageHelper -
lhb3015:
lz, Coder 这个类的代码呢??
Java RSA算法加密 -
b_lee:
顶顶顶 加两个字,再顶
Facelets是JSF更好的外衣 -
zhuqing08:
楼主 Coder 这个类的代码呢?
Java RSA算法加密 -
evajhhot:
貌似不行 有异常
BlazeDS 与Spring集成指南之一
Component可以将译码、编码的动作交给Renderer,这让您的表现层技术可以轻易的抽换,我们可以将之前的自定义组件的译码、编码动作移出至 Renderer,不过由于我们之前设计的Component是个很简单的组件,事实上,如果只是要新增一个Command在输入字段旁边,我们并不需要大费周章的自定义一个新的组件,我们可以直接为输入字段更换一个自定义的Renderer。
要自定义一个Renderer,您要继承javax.faces.render.Renderer,我们的自定义Renderer如下:
TextCmdRenderer.java
package onlyfun.caterpillar;
import java.io.IOException;
import java.util.Map;
import javax.faces.component.EditableValueHolder;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.Renderer;
public class TextCmdRenderer extends Renderer {
private static final String TEXT = ".text";
private static final String CMD = ".cmd";
public void encodeBegin(FacesContext context,
UIComponent component) throws IOException {
ResponseWriter writer = context.getResponseWriter();
String clientId = component.getClientId(context);
encodeTextField(component, writer, clientId);
encodeCommand(component, writer, clientId);
}
public void decode(FacesContext context,
UIComponent component) {
Map reqParaMap = context.getExternalContext().
getRequestParameterMap();
String clientId = component.getClientId(context);
String submittedValue =
(String) reqParaMap.get(clientId + TEXT);
((EditableValueHolder) component).setSubmittedValue(
submittedValue);
((EditableValueHolder) component).setValid(true);
}
private void encodeTextField(UIComponent component,
ResponseWriter writer, String clientId)
throws IOException {
writer.startElement("input", component);
writer.writeAttribute("name", clientId + TEXT, null);
Object value = ((UIInput) component).getValue();
if(value != null) {
writer.writeAttribute("value",
alue.toString(), null);
}
String size =
(String) component.getAttributes().get("size");
if(size != null) {
writer.writeAttribute("size", size, null);
}
writer.endElement("input");
}
private void encodeCommand(UIComponent component,
ResponseWriter writer,
String clientId) throws IOException {
writer.startElement("input", component);
writer.writeAttribute("type", "submit", null);
writer.writeAttribute("name", clientId + CMD, null);
writer.writeAttribute("value", "submit", null);
writer.endElement("input");
}
}
这个自定义的Renderer其译码、编码过程,与之前直接在Component中进行译码或编码过程是类似的,所不同的是在译码与编码的方法上,多了 UIComponent参数,代表所代理绘制的Component。
接下来在自定义Tag上,我们的TextWithCmdTag与之前主题所介绍的没什么差别,只不过在getComponentType()与 getRendererType()方法上要修改一下:
TextWithCmdTag.java
package onlyfun.caterpillar;
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import javax.faces.webapp.UIComponentTag;
public class TextWithCmdTag extends UIComponentTag {
private String size;
private String value;
public String getComponentType() {
return "javax.faces.Input";
}
public String getRendererType() {
return "onlyfun.caterpillar.TextCmd";
}
.....
}
getComponentType()取得的是"javax.faces.Input",它实际上对应至UIInput类别,而getRendererType()取回的是"onlyfun.caterpillar.TextCmd",这会在faces-config.xml中定义,以对应至实际的Renderer类别:
faces-config.xml
....
<faces-config>
<render-kit>
<renderer>
<component-family>
javax.faces.Input
</component-family>
<renderer-type>
onlyfun.caterpillar.TextCmd
</renderer-type>
<renderer-class>
onlyfun.caterpillar.TextCmdRenderer
</renderer-class>
</renderer>
</render-kit>
....
</faces-config>
为Component定义一个Renderer,必须由component family与renderer type共同定义,这并不难理解,因为一个Component可以搭配不同的Renderer,但它是属于同一个component family,例如UIInput就是属于javax.faces.Input这个组件家族,而我们为它定义一个新的Renderer。
接下未完成的范例可以取之前主题介绍过的,我们虽然没有自定义组件,但我们为UIInput置换了一个新的Renderer,这个Renderer会在输入字段上加入一个按钮。
如果您坚持使用之前自定义的UITextWithCmd,则可以如下修改:
UITextWithCmd.java
package onlyfun.caterpillar;
import javax.faces.component.UIInput;
public class UITextWithCmd extends UIInput {
public UITextWithCmd() {
setRendererType("onlyfun.caterpillar.TextCmd");
}
}
我们只是单纯的继承UIInput,然后使用setRendererType()设定"onlyfun.caterpillar.TextCmd",但并没有为组件加入什么行为,看来什么事都没有作,但事实上这是因为继承了UIInput,它为我们处理了大多数的细节。
接下来同样的,设定自定义Tag:
TextWithCmdTag.java
package onlyfun.caterpillar;
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import javax.faces.webapp.UIComponentTag;
public class TextWithCmdTag extends UIComponentTag {
private String size;
private String value;
public String getComponentType() {
return "onlyfun.caterpillar.TextWithCmd";
}
public String getRendererType() {
return "onlyfun.caterpillar.TextCmd";
}
.....
}
要使用自定义的Component,记得要在faces-config.xml中再加入:
....
<component>
<component-type>
onlyfun.caterpillar.TextWithCmd
</component-type>
<component-class>
onlyfun.caterpillar.UITextWithCmd
</component-class>
</component>
...
要自定义一个Renderer,您要继承javax.faces.render.Renderer,我们的自定义Renderer如下:
TextCmdRenderer.java
package onlyfun.caterpillar;
import java.io.IOException;
import java.util.Map;
import javax.faces.component.EditableValueHolder;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.Renderer;
public class TextCmdRenderer extends Renderer {
private static final String TEXT = ".text";
private static final String CMD = ".cmd";
public void encodeBegin(FacesContext context,
UIComponent component) throws IOException {
ResponseWriter writer = context.getResponseWriter();
String clientId = component.getClientId(context);
encodeTextField(component, writer, clientId);
encodeCommand(component, writer, clientId);
}
public void decode(FacesContext context,
UIComponent component) {
Map reqParaMap = context.getExternalContext().
getRequestParameterMap();
String clientId = component.getClientId(context);
String submittedValue =
(String) reqParaMap.get(clientId + TEXT);
((EditableValueHolder) component).setSubmittedValue(
submittedValue);
((EditableValueHolder) component).setValid(true);
}
private void encodeTextField(UIComponent component,
ResponseWriter writer, String clientId)
throws IOException {
writer.startElement("input", component);
writer.writeAttribute("name", clientId + TEXT, null);
Object value = ((UIInput) component).getValue();
if(value != null) {
writer.writeAttribute("value",
alue.toString(), null);
}
String size =
(String) component.getAttributes().get("size");
if(size != null) {
writer.writeAttribute("size", size, null);
}
writer.endElement("input");
}
private void encodeCommand(UIComponent component,
ResponseWriter writer,
String clientId) throws IOException {
writer.startElement("input", component);
writer.writeAttribute("type", "submit", null);
writer.writeAttribute("name", clientId + CMD, null);
writer.writeAttribute("value", "submit", null);
writer.endElement("input");
}
}
这个自定义的Renderer其译码、编码过程,与之前直接在Component中进行译码或编码过程是类似的,所不同的是在译码与编码的方法上,多了 UIComponent参数,代表所代理绘制的Component。
接下来在自定义Tag上,我们的TextWithCmdTag与之前主题所介绍的没什么差别,只不过在getComponentType()与 getRendererType()方法上要修改一下:
TextWithCmdTag.java
package onlyfun.caterpillar;
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import javax.faces.webapp.UIComponentTag;
public class TextWithCmdTag extends UIComponentTag {
private String size;
private String value;
public String getComponentType() {
return "javax.faces.Input";
}
public String getRendererType() {
return "onlyfun.caterpillar.TextCmd";
}
.....
}
getComponentType()取得的是"javax.faces.Input",它实际上对应至UIInput类别,而getRendererType()取回的是"onlyfun.caterpillar.TextCmd",这会在faces-config.xml中定义,以对应至实际的Renderer类别:
faces-config.xml
....
<faces-config>
<render-kit>
<renderer>
<component-family>
javax.faces.Input
</component-family>
<renderer-type>
onlyfun.caterpillar.TextCmd
</renderer-type>
<renderer-class>
onlyfun.caterpillar.TextCmdRenderer
</renderer-class>
</renderer>
</render-kit>
....
</faces-config>
为Component定义一个Renderer,必须由component family与renderer type共同定义,这并不难理解,因为一个Component可以搭配不同的Renderer,但它是属于同一个component family,例如UIInput就是属于javax.faces.Input这个组件家族,而我们为它定义一个新的Renderer。
接下未完成的范例可以取之前主题介绍过的,我们虽然没有自定义组件,但我们为UIInput置换了一个新的Renderer,这个Renderer会在输入字段上加入一个按钮。
如果您坚持使用之前自定义的UITextWithCmd,则可以如下修改:
UITextWithCmd.java
package onlyfun.caterpillar;
import javax.faces.component.UIInput;
public class UITextWithCmd extends UIInput {
public UITextWithCmd() {
setRendererType("onlyfun.caterpillar.TextCmd");
}
}
我们只是单纯的继承UIInput,然后使用setRendererType()设定"onlyfun.caterpillar.TextCmd",但并没有为组件加入什么行为,看来什么事都没有作,但事实上这是因为继承了UIInput,它为我们处理了大多数的细节。
接下来同样的,设定自定义Tag:
TextWithCmdTag.java
package onlyfun.caterpillar;
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import javax.faces.webapp.UIComponentTag;
public class TextWithCmdTag extends UIComponentTag {
private String size;
private String value;
public String getComponentType() {
return "onlyfun.caterpillar.TextWithCmd";
}
public String getRendererType() {
return "onlyfun.caterpillar.TextCmd";
}
.....
}
要使用自定义的Component,记得要在faces-config.xml中再加入:
....
<component>
<component-type>
onlyfun.caterpillar.TextWithCmd
</component-type>
<component-class>
onlyfun.caterpillar.UITextWithCmd
</component-class>
</component>
...
发表评论
-
Seam管理的事务
2010-01-28 15:22 1203EJB会话Bean有声明式事务 ... -
配置Seam组件之二
2010-01-16 20:30 949如果你有大量的组件需要在XML中进行配置,那么就很有必要将 c ... -
配置Seam组件之一
2010-01-16 20:29 988Seam所崇尚的哲学是XML配 ... -
Seam上下文
2009-12-25 15:23 1023Seam上下文是由框架创建 ... -
JSF和Spring的集成之二
2009-12-23 17:55 953使用框架 1 介绍 这个 ... -
JSF和Spring的集成之一
2009-12-19 20:45 775JSF和Spring集成的资料比较少,原理是获得彼此的上下文引 ... -
Seam配置和Seam应用程序打包之二
2009-11-28 09:15 1296将Seam与你的EJB容器集成 我们需要将 SeamInter ... -
Seam配置和Seam应用程序打包之一
2009-11-20 22:25 1150Seam基本配置 首先,让我们看看每当将Seam和JSF一起使 ... -
用Java Server Faces建立交互式WEB站点
2009-11-07 10:12 648步骤1:开发组件的Java ... -
集成JSF与BEEHIVE PAGE FLOW之二
2009-10-10 21:54 1041从后台bean访问当前页面 ... -
集成JSF与BEEHIVE PAGE FLOW之一
2009-10-07 23:13 1003JSF对通过关联组件和事件来构建页面而说是非常棒的,但是,与所 ... -
借助Ajax自动保存JSF表单之二
2009-09-19 12:53 1220创建和发送 Ajax 请求 submitFormData() ... -
借助 Ajax 自动保存 JSF 表单之一
2009-09-13 11:00 1108在客户端获取表单数据 本节将给出一个 JSF 表单,其数据通 ... -
基于AJAX和JSF打造丰富的互联网组件之Weblets篇
2009-09-04 15:08 948为了在JSF开发中联合使用AJAX和Mozilla XUL技术 ... -
JSF 2.0的一个AJAX例子
2009-08-21 10:49 2425首先创建一个ManagedBean用来记录我们提交按钮的数量。 ... -
JSF2.0的页面模版化
2009-08-15 10:28 1739本篇介绍可以与Tapestry相媲美的页面模版化定义。 我 ... -
JSF2.0中自定义组件模型例子
2009-08-11 07:59 1341在本篇介绍中,我们开始接触JSF2.0纳为标准的最重要的特性之 ... -
Java Server Faces 2.0重要新功能以及相关改进简介
2009-08-01 10:00 1092JSF 2.0的最终规范也已经发布了有近一个月了,在近期试 ... -
JSF2: Ajax事件和错误
2009-07-09 09:13 1096JSF2的Ajax支持包含一个 ... -
Facelets是JSF更好的外衣
2009-06-16 15:53 1591是由 Sun 公司在 dev.java.net 上的一个开源项 ...
相关推荐
### JSF自定义组件知识点详解 #### 一、JSF生命周期与组件概述 **1.1 JSF生命周期** JavaServer Faces (JSF) 是一种基于Java的Web应用框架,主要用于构建用户界面。为了更好地理解如何自定义JSF组件,首先需要...
### JSF自定义组件知识点详解 #### 一、JSF生命周期与组件概述 **1.1 JSF生命周期** JavaServer Faces (JSF) 是一种基于Java的Web应用框架,主要用于构建用户界面。为了更好地理解如何自定义JSF组件,首先需要...
在JSF 2.0版本中,它引入了许多改进和新特性,其中包括对自定义组件的强大支持。自定义组件允许开发人员根据特定需求创建自己的UI组件,这些组件可以扩展和定制,以满足应用程序的独特功能。 自定义组件的核心概念...
为了解决这些问题,本文提出了一种结合JSF自定义呈现器组件技术实现分页查询的方法。 #### 自定义分页呈现器的设计原理 自定义分页呈现器的核心思想在于实现JSF中的自定义渲染器(Renderer),该渲染器负责绘制...
在JavaServer Faces (JSF) 2.0中,自定义组件是开发人员扩展框架功能的关键方式。通过创建自定义组件,你可以构建符合特定需求的用户界面元素,这些元素可以复用并集成到多个JSF应用程序中。本教程将深入探讨如何在...
创建JSF自定义组件是一项复杂但强大的任务,它允许开发者根据项目需求定制Web应用的界面和交互。通过理解组件和渲染器的工作原理,以及如何注册和使用它们,开发者可以极大地提升JSF应用的灵活性和可扩展性。
在JSF(JavaServer Faces)2.0中,自定义`<h:head>`标签是一项重要的功能,它允许开发者对页面头部区域进行精细化控制,包括引入CSS样式表、JavaScript脚本和其他元信息。这一特性极大地提高了应用的灵活性和可维护...
### 使用自定义渲染器实现JSF数据库表分页显示 #### 概述 在JavaServer Faces (JSF) 应用程序中处理大量的数据时,分页是一个非常实用且必要的功能。通过合理地分页展示数据,不仅可以提高用户体验,还可以减少...
5. **自定义Renderer** "自订 Renderer.htm"涵盖了如何扩展JSF的渲染机制,以满足特定的输出需求。Renderer决定了组件在客户端显示的方式。 6. **错误消息处理** 在"错误讯息处理.htm"中,你会学到如何有效地处理...
JSF的核心是UI组件,它们通过自定义标记在JSP页面中使用,这些标记与renderer关联,使得组件可以以多种方式呈现。例如,同一个UI组件可以用不同的renderer来呈现HTML或其他格式。UIComponent、Renderer和标记协同...
在提供的文件`mojarra-2.0.3-FCS-source`中,我们可以看到Mojarra的源代码,这对于我们理解JSF的工作原理、自定义组件以及优化应用性能等方面都非常有帮助。 **二、JSF 2.0的关键特性** 1. **Faces-Config.xml配置...
这涉及到组件的编码和解码、组件标签的定义以及自定义Renderer的实现,虽然过程复杂,但能创造出高度个性化的Web应用。 #### 总结 JavaServer Faces是一个全面而强大的Web开发框架,通过将复杂的细节抽象化,使得...
自定义组件是JSF的强大特性之一,它允许开发者扩展JSF的默认组件库,以满足特定的应用需求。 **自定义组件的构成**: 1. **UIComponent**: 自定义组件的基础是UIComponent类,它是所有JSF组件的基类。它包含了一...
接着,他们可以在JSF页面上直接使用Ajax4JSF提供的组件,或者通过自定义组件和行为来扩展其功能。此外,需要在web.xml配置文件中进行必要的设置,以启用Ajax4JSF的过滤器和监听器。 **总结** Ajax4JSF 1.1.1是一个...
- **编写 JSF 页面**:在 MyEclipse 中创建 JSF 页面,使用自定义标签来构建用户界面。 - **配置服务器**:配置 MyEclipse 连接到 Tomcat 或其他支持 JSF 的应用服务器。 - **调试和测试**:利用 MyEclipse 内置的...
- **自订Renderer**:解释了如何实现自定义的Renderer以控制组件的渲染方式。 #### 五、总结 本教程全面覆盖了JSF的基础知识和高级特性,适合初次接触JSF的开发者。通过学习本教程,你可以掌握JSF的核心概念和...