这里介绍的是让Component自身负责编码,解码的例子。
我们设置一个简单的组件,一个文本框加一个按钮。
这里我们可以继承已经实现的UIComponent组件UIInput。
package
test;
import
java.io.IOException;
import
java.util.Map;
import
javax.faces.component.UIInput;
import
javax.faces.context.FacesContext;
import
javax.faces.context.ResponseWriter;
继承已经实现UIComponent的UIInput。
|
|
public class
UITextWithCmd extends UIInput {
private
static final String TEXT = ".text";
private static final String CMD =
".cmd";
//不使用Renderer进行解码
可以设定此组件的解码,编码不使用Renderer。
|
|
public UITextWithCmd() {
setRendererType(null);
}
//--------编码,生成HTML标签--------------
public void encodeBegin(FacesContext
context)
实现前台表现层的编码。可以编写成HTML或者其他表现层语言。
|
|
throws
IOException {
ResponseWriter writer =
context.getResponseWriter();
String clientId =
getClientId(context);
encodeTextField(writer, clientId);
encodeCommand(writer, clientId);
}
private void
encodeTextField(ResponseWriter writer,
String clientId) throws IOException {
writer.startElement("input",
this);
writer.writeAttribute("name", clientId + TEXT, null);
//getValue()继承于UIInput
Object value = getValue();
if(value != null) {
writer.writeAttribute("value",
value.toString(), null);
}
String size = (String)
getAttributes().get("size");
if(size != null) {
writer.writeAttribute("size", size, null);
}
writer.endElement("input");
}
private void encodeCommand(ResponseWriter
writer,
String clientId)
throws IOException {
writer.startElement("input",
this);
writer.writeAttribute("type", "submit", null);
writer.writeAttribute("name", clientId + CMD, null);
writer.writeAttribute("value", "submit", null);
writer.endElement("input");
}
实现标签输入值的解码。取得标签的输入值绑定到响应的Bean。
|
|
// ..........解码,取得标签的输入值...................................
public void decode(FacesContext context) {
Map reqParaMap =
context.getExternalContext().
getRequestParameterMap();
String clientId = getClientId(context);
String submittedValue =
(String)
reqParaMap.get(clientId + TEXT);
setSubmittedValue(submittedValue);
setValid(true);
}
}
在配置文件faces-config.xml中声明自定义组件。
<!-- 自定义组件 -->
<component>
<component-type>test.TextWithCmd</component-type>
<component-class>test.UITextWithCmd</component-class>
</component>
这样,自定义的UIComponent组件就完成了。