0
我已經創建了一個自定義組件,並且下面是組件的渲染器,在啓動組件時得到渲染確定,但AjaxOuputPanel永遠不會再得到每個Ajax請求的渲染......那麼,什麼是與代碼Richfaces自定義組件渲染器問題
也是在那個添加型HtmlAjaxOutputPanel的子組件的任何組件的情況下重複的問題,組件呈現在正常開始,但阿賈克斯走出面板不會再呈現...組件代碼:
包eg.com.etisalat.web.rich.components.inputtext;
import java.io.IOException;
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlGraphicImage;
import javax.faces.component.html.HtmlInputText;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import org.ajax4jsf.component.UIAjaxOutputPanel;
import org.ajax4jsf.component.html.HtmlAjaxOutputPanel;
import org.ajax4jsf.renderkit.AjaxComponentRendererBase;
public class InputTextRenderer extends AjaxComponentRendererBase {
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
protected Class getComponentClass() {
return eg.com.etisalat.web.rich.components.inputtext.HtmlInputText.class;
}
public void doEncodeBegin(ResponseWriter writer, FacesContext context,
UIComponent component) throws IOException {
ELContext elContext = context.getELContext();
Application app = context.getApplication();
ExpressionFactory exprFactory = app.getExpressionFactory();
String clientId = component.getClientId(context);
String componentId = component.getId();
component.getChildren().clear();
String readonly = (String) component.getAttributes().get(Constants.ATT_READ_ONLY);
String styleClass = (String) component.getAttributes().get(Constants.ATT_STYLE_CLASS);
String required = (String) component.getAttributes().get(Constants.ATT_REQUIRED);
String requiredMessage = (String) component.getAttributes().get(Constants.ATT_REQUIRED_MESSAGE);
writer.startElement("div", component);
getUtils().writeAttribute(writer, "id", clientId);
String inputFieldId = componentId + "InputField";
javax.faces.component.html.HtmlInputText inputTextCom = new HtmlInputText();
inputTextCom.setId(inputFieldId);
inputTextCom.setOnchange(inputFieldId + "StoredValue = this.value");
if (null != readonly) inputTextCom.setReadonly(Boolean.parseBoolean(readonly));
if (null != styleClass) inputTextCom.setStyleClass(styleClass);
if (null != required) inputTextCom.setRequired(Boolean.parseBoolean(required));
if (null != requiredMessage) inputTextCom.setRequiredMessage(requiredMessage);
component.getChildren().add(inputTextCom);
if(null != required && Boolean.parseBoolean(required)) {
HtmlAjaxOutputPanel outpanel = new HtmlAjaxOutputPanel();
outpanel.setId(componentId + "InputFieldValidation");
outpanel.setAjaxRendered(true);
HtmlGraphicImage icon = new HtmlGraphicImage();
icon.setUrl((String)exprFactory.createValueExpression(elContext, "" +
"#{(not empty webUtil.messagesMap['" + inputFieldId + "']) ? '/images/info_red_16_16_.png' : " +
"'/images/info_yellow_16_16_.png'}"
, String.class).getValue(elContext));
icon.setStyleClass("errorIcon");
icon.setTitle(requiredMessage);
outpanel.getChildren().add(icon);
component.getChildren().add(outpanel);
}
String elementId = inputTextCom.getClientId(context);
writer.startElement("script", component);
writer.writeAttribute("type", "text/javascript", null);
writer.write("if(typeof " + inputFieldId + "StoredValue != \"undefined\") document.getElementById('" +
elementId + "').value = " + inputFieldId + "StoredValue;");
writer.endElement("script");
}
@Override
protected void doEncodeEnd(ResponseWriter writer, FacesContext context,
UIComponent component) throws IOException {
writer.endElement("div");
}
}
我使用的是richfaces版本3.3.3最終和JSF 1.2 – adevedo 2011-04-14 13:36:52