我正在嘗試編寫一個將在<h:inputText>
組件上處理placeholder
屬性的呈示器。 我在閱讀JSF 2.0 strips out needed HTML5 attributes後走向了這條路,看起來正確。這裏是我的自定義渲染將自定義屬性(HTML5)支持添加到JSF 2.0 UIInput組件
public class InputRenderer extends com.sun.faces.renderkit.html_basic.TextRenderer{
@Override
public void encodeBegin(FacesContext context, UIComponent component)
throws IOException {
System.out.println("Rendering :"+component.getClientId());
String placeholder = (String)component.getAttributes().get("placeholder");
if(placeholder != null) {
ResponseWriter writer = context.getResponseWriter();
writer.writeAttribute("placeholder", placeholder, "placeholder");
}
super.encodeBegin(context, component);
}
@Override
public void decode(FacesContext context, UIComponent component) {
super.decode(context, component);
}
@Override
public void encodeEnd(FacesContext context, UIComponent component)
throws IOException {
super.encodeEnd(context, component);
}
}
而且此渲染登記在臉上配置爲
<render-kit>
<renderer>
<component-family>javax.faces.Input</component-family>
<renderer-type>javax.faces.Text</renderer-type>
<renderer-class>com.example.renderer.InputRenderer</renderer-class>
</renderer>
</render-kit>
這就會引入精細,沒有任何問題存在。
我的意圖是處理placeholder
屬性,插入它,然後將處理委託給super。我上面的代碼不起作用,因爲我在錯誤的地方插入了屬性。必須在writer.startElement('input')
執行後插入。但是,startElement必須在超級的encodeBegin()
方法中發生。那麼如何插入一個自定義屬性(在這種情況下爲'placeholder'),然後繼續執行流程?
注意:上面的代碼確實會添加一個placeholder
屬性,但不會添加到我打算輸入的組件中,它將它寫入Input的父級(因爲我試圖在組件本身實際進行寫入之前寫入屬性寫在流,它適用的屬性給當前的組件)
這是迄今爲止最實用,最好的答案! :) – Nikhil
感謝您的迴應,雖然這是一個公平的答案代碼有一個錯誤。 get(attribute)的返回值是一個Object,它可能是一個布爾值(例如,考慮「required」屬性)。完全刪除(String)轉換並將返回類型設置爲Object。 –
請注意,這不適用於''家長''子女。 JSF將'required'屬性放在''元素中,而不是''元素中。我說我喜歡JSF嗎? –