這里介紹的是讓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組件就完成了。