您好我仍在尝试为XPage开发自己的java控件。我想知道如何使用现有的控件并在我的新控件中使用它。
假设我想开发类似登录弹出控件的东西。我从com.ibm.xsp.extlib.component.dialog
扩展了UIDialog但是如何在其上添加xp:inputText
?
好的,在这个例子中,我可以在xp:callback
的标记部分添加control.xsp-config
方面,所以我只需要像标准控件那样拖动一些输入字段,但如果我需要它,该怎么办?我可以使用更新站点部署一个控件。
更新
好的尝试了你的解决方案keithstric。我猜你在你的组件上工作。我使用e渲染器作为我的组件。因此,如果我使用渲染器或直接在我的组件中添加组件,那么组件树中是否存在差异:
渲染器:
public class MyRenderer extends Renderer {
public void encodeBegin(FacesContext context, UIComponent component)throws IOException {
ResponseWriter w = context.getResponseWriter();
NewComponentXY comp = new ComponentXY();
component.getChildren().add(comp);
}
或直接:
public class MyComponent extends UIComponentBase {
public void encodeBegin(FacesContext context, UIComponent component)throws IOException {
ResponseWriter w = context.getResponseWriter();
NewComponentXY comp = new ComponentXY();
this.getChildren().add(comp);
}
jsf生命周期有区别吗?
答案 0 :(得分:1)
首先,为了确保我们都说同一种语言,你所谓的“java控件”,实际上是一个“组件”。这样它就不会与自定义控件混淆。
您需要在组件的encodeBegin方法中注入任何其他组件,而不是渲染器的encodeBegin,而是组件的encodeBegin。要做到这一点,你需要一个面板或div的某种容器,如果你不需要数据源我推荐一个div。然后将您的用户名和密码字段以及您可能想要的任何标签注入div。根据您希望的复杂程度(即一个带有标签列和另一列密码的表),此代码可能会变得相当大。但一个简单的例子是:
XspDiv cont = new XspDiv();
cont.setId("loginFormContainer");
cont.setStyleClass("loginFormContainer");
XspInputText userName = new XspInputText();
userName.setId("userNameInputId");
Attr placeHolderAttr = new Attr();
placeHolderAttr.setComponent(userName);
placeHolderAttr.setName("placeholder");
placeHolderAttr.setValue("Enter your Username");
userName.addAttr(attr);
XspInputText password = new XspInputText();
password.setId("passwordInputId");
password.setPassword(true);
//NOTE: I can't get the placeholder attr to work on a password field but
//you can try as your mileage may vary
cont.getChildren().add(userName);
cont.getChildren().add(password);
this.getChildren().add(cont);
您可以找到IBM here提供的90%的组件类以及所有组件属性的细分。我的博客here上还有一篇关于组件注入的文章,另一篇关于组件开发的文章here。如果encodeBegin方法太晚并且需要对注入的组件进行部分刷新,则可能需要添加FacesComponent接口并在initBeforeContents方法中执行注入。
作为奖励,要点击部分刷新,这需要通过CSJS完成。所以看看
((UIViewRootEx2)FacesContext.getCurrentInstance()。getViewRoot())。postScript(“CSJS Code here”);