想为我的DataObjects做一个自定义控件,它有两个属性,javaClass和javaModel。
因此,如果我有一个java类名为acme.com.model.Person,则javaClass属性为acme.com.model.Person,javaModel属性为Person。
我开始构建我的自定义控件但在遇到语法问题之前只收到了一些东西。
真正的问题是createObject。我不明白如何用createData值替换createObject中当前硬编码的“Person”。这甚至可能吗?
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xe="http://www.ibm.com/xsp/coreex">
<xp:this.data>
<xe:objectData
saveObject="#{javascript:compositeData.javaModel + 'save()'}"
var="${javascript:compositeData.javaModel}">
<xe:this.createObject><![CDATA[#{javascript:var Person = new com.scoular.model.Person();
var unid = context.getUrlParameter("key")
if (unid != "") {
Person.loadByUnid(unid);
viewScope.put("readOnly","Yes");
} else {
Person.create();
viewScope.put("readOnly","No");
}
return Person;}]]></xe:this.createObject>
</xe:objectData>
</xp:this.data>
</xp:view>
答案 0 :(得分:4)
正如您可能尝试将业务逻辑与“UI”(XPages标记)分离,您可以将“创建”代码移动到null
类的构造函数方法,其中一个:< / p>
Person
方法loadByUnid(String)
值放入readOnly
viewScope
然后你的public class Person implements Serializable {
private static final long serialVersionUID = 1L;
// constructor method
public Person(){
Map<String, Object> reqParm = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String unid = (String) reqParm.get("key");
Map<String, Object> vwScope = ExtLibUtil.getViewScope();
if (unid != "") {
this.loadByUnid(unid);
vwScope.put("readOnly","Yes");
} else {
this.create();
viewScope.put("readOnly","No");
}
}
//...
}
区块会更像:
createObject
这应该从标记层中移除足够多的细节,以便在特定类之间更加可重用,前提是每个自我构造都是这样。
对于一般混合<xe:this.createObject><![CDATA[#{javascript:return new com.scoular.model.Person();}]]></xe:this.createObject>
和文本,你应该传递一个对象引用,所以对于上面的save方法的例子,我认为你应该能够通过compositeData
更多地访问它,如果compositeData.javaModel.save();
引用的对象中存在save
方法。我不认为附加一个方法的字符串会起作用,但我不能说我已经尝试过了。