问题描述
|
我已经创建了一个自定义组件,下面是该组件的渲染器,一开始该组件就可以渲染,但是AjaxOuputPanel永远不会在每个ajax请求中再次渲染...所以代码是什么问题呢
同样在添加了HtmlAjaxOutputPanel类型的子组件的任何组件上重复这种情况,该组件在开始时呈现OK,但是ajax out面板再也没有呈现...组件代码:
包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,UIComponent component) throws IOException {
writer.endElement(\"div\");
}
}
解决方法
好的,我发现了问题所在,它是facelets.REFRESH_PERIOD的问题,如果此属性为正值,将使ui树可以使用原始文档中的每个请求进行重建(调用facelets刷新方法)
所以解决方案是通过将该属性设置为-1来禁用该属性