我正在尝试通过扩展XspDiv创建新的UI控件。这个控件有像XspInputText这样的子项,我想用dataSource绑定它,比如“#{document.field}”或“{sessionScope.variable}”
出于绑定目的,我使用方法setValueBinding(“value”,valueBinding),当我在SSJS上打印该绑定的值时。第一次产生“null”,第二次产生“null”,结果正确。如何立即为绑定设置ValueBinding,这样当我打印该值时,它将正确生成而不会产生null。
这是我的代码
package com.forte.component;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import com.ibm.xsp.util.FacesUtil;
import com.ibm.xsp.util.StateHolderUtil;
import com.ibm.xsp.component.xp.XspDiv;
import com.ibm.xsp.component.xp.XspInputText;
import com.ibm.xsp.component.xp.XspOutputLabel;
import com.ibm.xsp.component.xp.XspOutputText;
public class ForteInputText extends ForteBase {
public static final String RENDERER_TYPE = "com.forte.InputText";
private String inputPicker;
private String inputSize;
private String inputType;
private String inputBinding;
private String maxLength;
private String placeHolder;
private Object event;
// Component
private ValueBinding vbBinding;
private XspInputText xspInput;
private XspDiv xspDivPicker;
private XspOutputLabel xspLabelPicker;
private XspOutputText xspTag;
public ForteInputText() {
xspInput = new XspInputText();
xspInput.setId("forte_"+getId());
xspDivPicker = new XspDiv();
xspLabelPicker = new XspOutputLabel();
xspTag = new XspOutputText();
setRendererType(RENDERER_TYPE);
}
@Override
public String getFamily() {
return RENDERER_TYPE;
}
// MAXLENGTH
public String getMaxLength() {
if (null != this.maxLength) {
return this.maxLength;
}
ValueBinding _vb = getValueBinding("maxLength");
if (_vb != null) {
return (String) _vb.getValue(FacesContext.getCurrentInstance());
}
return null;
}
public void setMaxLength(String maxLength){
this.maxLength = maxLength;
}
// PLACEHOLDER
public String getPlaceHolder() {
if (null != this.placeHolder) {
return this.placeHolder;
}
ValueBinding _vb = getValueBinding("placeHolder");
if (_vb != null) {
return (String) _vb.getValue(FacesContext.getCurrentInstance());
}
return null;
}
public void setPlaceHolder(String placeHolder){
this.placeHolder = placeHolder;
}
//INPUT BINDING
public String getInputBinding() {
if (null != this.inputBinding) {
String valueExp = "#{"+inputBinding+"}";
vbBinding = FacesContext.getCurrentInstance().getApplication().createValueBinding(valueExp);
((XspInputText) xspInput).setValueBinding("value", vbBinding);
return this.inputBinding;
}
ValueBinding _vb = getValueBinding("inputBinding");
if (_vb != null) {
String valueExp = "#{"+inputBinding+"}";
vbBinding = FacesContext.getCurrentInstance().getApplication().createValueBinding(valueExp);
xspInput.setValueBinding("value", vbBinding);
return (String) _vb.getValue(FacesContext.getCurrentInstance());
}
return null;
}
public void setInputBinding(String inputBinding){
this.inputBinding = inputBinding;
String valueExp = "#{"+inputBinding+"}";
vbBinding = FacesContext.getCurrentInstance().getApplication().createValueBinding(valueExp);
xspInput.setValueBinding("value", vbBinding);
}
//INPUT SIZE
public String getInputSize() {
if (null != this.inputSize) {
return this.inputSize;
}
ValueBinding _vb = getValueBinding("inputSize");
if (_vb != null) {
return (String) _vb.getValue(FacesContext.getCurrentInstance());
}
return null;
}
public void setInputSize(String inputSize){
this.inputSize = inputSize;
}
//INPUT TYPE
public String getInputType() {
if (null != this.inputType) {
return this.inputType;
}
ValueBinding _vb = getValueBinding("inputType");
if (_vb != null) {
return (String) _vb.getValue(FacesContext.getCurrentInstance());
}
return null;
}
public void setInputType(String inputType){
this.inputType = inputType;
}
//INPUT PICKER
public String getInputPicker() {
if (null != this.inputPicker) {
return this.inputPicker;
}
ValueBinding _vb = getValueBinding("inputPicker");
if (_vb != null) {
return (String) _vb.getValue(FacesContext.getCurrentInstance());
}
return null;
}
public void setInputPicker(String inputPicker){
this.inputPicker = inputPicker;
}
//INPUT EVENT
public Object getEvent() {
if (null != this.event) {
return this.event;
}
ValueBinding _vb = getValueBinding("event");
if (_vb != null) {
return _vb.getValue(FacesContext.getCurrentInstance());
}
return null;
}
public void setEvent(Object event){
this.event = event;
}
// VALUE
public Object getValue() {
return xspInput.getValue();
}
public void setValue(Object value){
xspInput.setValue(value);
}
@Override
public void restoreState(FacesContext _context, Object _state) {
Object _values[] = (Object[]) _state;
super.restoreState(_context, _values[0]);
this.placeHolder = (String) FacesUtil.objectFromSerializable(_context, this, _values[1]);
this.inputBinding = (String) FacesUtil.objectFromSerializable(_context, this, _values[2]);
this.inputSize = (String) FacesUtil.objectFromSerializable(_context, this, _values[3]);
this.inputType = (String) FacesUtil.objectFromSerializable(_context, this, _values[4]);
this.inputPicker = (String) FacesUtil.objectFromSerializable(_context, this, _values[5]);
this.maxLength = (String) FacesUtil.objectFromSerializable(_context, this, _values[6]);
this.event = (Object) FacesUtil.objectFromSerializable(_context, this, _values[7]);
this.vbBinding = StateHolderUtil.restoreValueBinding(_context, xspInput, _values[8]);
}
@Override
public Object saveState(FacesContext _context) {
Object _values[] = new Object[8];
_values[0] = super.saveState(_context);
_values[1] = FacesUtil.objectToSerializable(_context, placeHolder);
_values[2] = FacesUtil.objectToSerializable(_context, inputBinding);
_values[3] = FacesUtil.objectToSerializable(_context, inputSize);
_values[4] = FacesUtil.objectToSerializable(_context, inputType);
_values[5] = FacesUtil.objectToSerializable(_context, inputPicker);
_values[6] = FacesUtil.objectToSerializable(_context, maxLength);
_values[7] = FacesUtil.objectToSerializable(_context, event);
_values[8] = StateHolderUtil.saveValueBinding(_context, vbBinding);
return _values;
}
public Object getInputTextChild(String strChild){
if(strChild=="input")return xspInput;
if(strChild=="divPicker") return xspDivPicker;
if(strChild=="labelPicker") return xspLabelPicker;
return null;
}
// GET CHILD COMPONENT
public XspInputText getInputText(){
return xspInput;
}
public XspDiv getDivPicker(){
return xspDivPicker;
}
public XspOutputLabel getLabelPicker(){
return xspLabelPicker;
}
public XspOutputText getTag(){
return xspTag;
}
}
答案 0 :(得分:0)
我通过改变来自" private"的变量声明解决了这个问题。组件到"受保护"。另外,我在组件类的构造函数中添加了getChildren()。add(childComponent)而不是渲染器类。
请参阅我的代码:
protected XspInputText xspInput;
protected XspDiv xspDivPicker;
protected XspOutputLabel xspLabelPicker;
protected XspOutputText xspTag;
public ForteInputText() {
xspInput = new XspInputText();
xspDivPicker = new XspDiv();
xspLabelPicker = new XspOutputLabel();
xspTag = new XspOutputText();
xspTag.setTagName("i");
xspDivPicker.getChildren().add(xspInput);
xspDivControl.getChildren().add(xspDivPicker);
setRendererType(RENDERER_TYPE);
}