无法使用Java Use API和Sightly(Htl)获取对象列表
我正在尝试使用sighly将link List类型的自定义对象列表转换成html。但我无法用肉眼看出来。示例代码粘贴在下面: Javabean:无法使用Java Use API和Sightly(Htl)获取对象列表,java,aem,sightly,Java,Aem,Sightly,我正在尝试使用sighly将link List类型的自定义对象列表转换成html。但我无法用肉眼看出来。示例代码粘贴在下面: Javabean: public class MiniNavBean { private String fPath; private String activeAttr; public MiniNavBean(String fPath, String activeAttr){ this.fPath = fPath;
public class MiniNavBean {
private String fPath;
private String activeAttr;
public MiniNavBean(String fPath, String activeAttr){
this.fPath = fPath;
this.activeAttr = activeAttr;
}
public String getFpath() {
return fPath;
}
public void setFpath(String fpath) {
this.fPath = fpath;
}
public String getActiveattr() {
return activeAttr;
}
public void setActiveattr(String activeattr) {
this.activeAttr = activeattr;
}
}
public class MiniNav extends WCMUsePojo {
private List<MiniNavBean> navList;
MiniNavBean miniNav;
public List<MiniNavBean> getNavList() {
return navList;
}
public void setNavList(List<MiniNavBean> navList) {
this.navList = navList;
}
@Override
public void activate() {
navList = new LinkedList<MiniNavBean>();
fPath = "fpaths";
activeAttr = "activeattrs;"
miniNav = new MiniNavBean(fpath, activeattr);
navList.add(miniNav);
}
}
<div data-sly-include="/apps/project/components/global.jsp"></div>
<div data-sly-use.mininav="com.components.MiniNav" data-sly-unwrap>
<div data-sly-list.navlist="${mininav.navList}">
<li>
<p>${navlist.fPath}</p>
<p>${navlist.activeAttr}</p>
</li>
</div>
扩展WCMUsePojo的Java类:
public class MiniNavBean {
private String fPath;
private String activeAttr;
public MiniNavBean(String fPath, String activeAttr){
this.fPath = fPath;
this.activeAttr = activeAttr;
}
public String getFpath() {
return fPath;
}
public void setFpath(String fpath) {
this.fPath = fpath;
}
public String getActiveattr() {
return activeAttr;
}
public void setActiveattr(String activeattr) {
this.activeAttr = activeattr;
}
}
public class MiniNav extends WCMUsePojo {
private List<MiniNavBean> navList;
MiniNavBean miniNav;
public List<MiniNavBean> getNavList() {
return navList;
}
public void setNavList(List<MiniNavBean> navList) {
this.navList = navList;
}
@Override
public void activate() {
navList = new LinkedList<MiniNavBean>();
fPath = "fpaths";
activeAttr = "activeattrs;"
miniNav = new MiniNavBean(fpath, activeattr);
navList.add(miniNav);
}
}
<div data-sly-include="/apps/project/components/global.jsp"></div>
<div data-sly-use.mininav="com.components.MiniNav" data-sly-unwrap>
<div data-sly-list.navlist="${mininav.navList}">
<li>
<p>${navlist.fPath}</p>
<p>${navlist.activeAttr}</p>
</li>
</div>
公共类MiniNav扩展了WCMUsePojo{
私人名单;
迷你导航豆迷你导航;
公共列表getNavList(){
返回导航列表;
}
公共作废设置导航列表(列表导航列表){
this.navList=navList;
}
@凌驾
公开作废激活(){
navList=newlinkedlist();
fPath=“fpaths”;
activeAttr=“activeattrs;”
miniNav=新的MiniNavBean(fpath,activeattr);
导航列表。添加(迷你导航);
}
}
Html文件(很明显):
public class MiniNavBean {
private String fPath;
private String activeAttr;
public MiniNavBean(String fPath, String activeAttr){
this.fPath = fPath;
this.activeAttr = activeAttr;
}
public String getFpath() {
return fPath;
}
public void setFpath(String fpath) {
this.fPath = fpath;
}
public String getActiveattr() {
return activeAttr;
}
public void setActiveattr(String activeattr) {
this.activeAttr = activeattr;
}
}
public class MiniNav extends WCMUsePojo {
private List<MiniNavBean> navList;
MiniNavBean miniNav;
public List<MiniNavBean> getNavList() {
return navList;
}
public void setNavList(List<MiniNavBean> navList) {
this.navList = navList;
}
@Override
public void activate() {
navList = new LinkedList<MiniNavBean>();
fPath = "fpaths";
activeAttr = "activeattrs;"
miniNav = new MiniNavBean(fpath, activeattr);
navList.add(miniNav);
}
}
<div data-sly-include="/apps/project/components/global.jsp"></div>
<div data-sly-use.mininav="com.components.MiniNav" data-sly-unwrap>
<div data-sly-list.navlist="${mininav.navList}">
<li>
<p>${navlist.fPath}</p>
<p>${navlist.activeAttr}</p>
</li>
</div>
${navlist.fPath}
${navlist.activeAttr}
当我试图执行上述代码时,我能够看到链表被java类中的数据实例化。但是,当我试图在前端显示列表的值时,sightly无法读取它
由于LinkedList是CustomObject类型(MiniNavBean),我怀疑它无法读取它,因为它不知道这个bean,因为我们没有在任何地方引用该bean。有没有办法使用sightly标记和读取数据来解决此问题?在您的示例中,您既没有为
MiniNav
的navList
成员赋值,也没有向其添加MiniNavBean
实例
将以下行添加到activate()
方法中:
this.navList = new LinkedList<>();
this.navList.add(navList);
this.navList=newlinkedlist();
this.navList.add(navList);
另外,Java getter和HTL/Sightly访问器没有正确对齐,即:对于getFpath()
您应该使用navlist.fpath
如果您已经有了这些错误,您是否从HTL/Sightly获得了任何编译或运行时错误
HTL/Sightly通常使用反射来查找对象的属性,因此它不太关心对象的类型。在您的示例中,您既没有为
MiniNav
的navList
成员赋值,也没有向其添加MiniNavBean
实例
将以下行添加到activate()
方法中:
this.navList = new LinkedList<>();
this.navList.add(navList);
this.navList=newlinkedlist();
this.navList.add(navList);
另外,Java getter和HTL/Sightly访问器没有正确对齐,即:对于getFpath()
您应该使用navlist.fpath
如果您已经有了这些错误,您是否从HTL/Sightly获得了任何编译或运行时错误
HTL/Sightly通常使用反射来查找对象的属性,因此它不太关心对象的类型。Sightly也会在Java对象上循环。我不认为这有什么问题。看来你的getter是错的。如下所示更改bean
public class MiniNavBean {
private String fPath;
private String activeAttr;
public MiniNavBean(String fPath, String activeAttr){
this.fPath = fPath;
this.activeAttr = activeAttr;
}
public String getfPath() {
return fPath;
}
public void setfPath(String fPath) {
this.fPath = fPath;
}
public String getActiveAttr() {
return activeAttr;
}
public void setActiveAttr(String activeAttr) {
this.activeAttr = activeAttr;
}
}
如果不希望更改bean,那么可以直接访问Sightly文件中的getter,并检查它是否工作正常
<div data-sly-include="/apps/project/components/global.jsp"></div>
<div data-sly-use.mininav="com.components.MiniNav" data-sly-unwrap>
<div data-sly-list.navlist="${mininav.navList}">
<li>
<p>${navlist.getFpath}</p>
<p>${navlist.getActiveattr}</p>
</li>
</div>
${navlist.getFpath}
${navlist.getActiveattr}
编辑:根据评论解释更多内容
不能访问类外的私有字段,这些字段通常使用公共getter方法完成。然而,很明显,当您在点运算符之后使用字段名时,您并不是直接访问字段,而是根据命名getter/setter的Java规范调用相应的getter方法。因此,根据规范,您的getter和setter在bean中是错误的,这是因为它不起作用
正如我上面提到的,您只能更改bean,并且代码可以正常工作。或者,您可以让bean保持原样,并更改Sightly代码以使其正常工作。Sightly也可以在Java对象上循环。我不认为这有什么问题。看来你的getter是错的。如下所示更改bean
public class MiniNavBean {
private String fPath;
private String activeAttr;
public MiniNavBean(String fPath, String activeAttr){
this.fPath = fPath;
this.activeAttr = activeAttr;
}
public String getfPath() {
return fPath;
}
public void setfPath(String fPath) {
this.fPath = fPath;
}
public String getActiveAttr() {
return activeAttr;
}
public void setActiveAttr(String activeAttr) {
this.activeAttr = activeAttr;
}
}
如果不希望更改bean,那么可以直接访问Sightly文件中的getter,并检查它是否工作正常
<div data-sly-include="/apps/project/components/global.jsp"></div>
<div data-sly-use.mininav="com.components.MiniNav" data-sly-unwrap>
<div data-sly-list.navlist="${mininav.navList}">
<li>
<p>${navlist.getFpath}</p>
<p>${navlist.getActiveattr}</p>
</li>
</div>
${navlist.getFpath}
${navlist.getActiveattr}
编辑:根据评论解释更多内容
不能访问类外的私有字段,这些字段通常使用公共getter方法完成。然而,很明显,当您在点运算符之后使用字段名时,您并不是直接访问字段,而是根据命名getter/setter的Java规范调用相应的getter方法。因此,根据规范,您的getter和setter在bean中是错误的,这是因为它不起作用
正如我上面提到的,您只能更改bean,并且代码可以正常工作。或者,您可以让bean保持原样,并更改代码以使其正常工作。很抱歉,这是一个复制粘贴错误。我的代码中已经有了这些更改。但是,它不会读取存储在链接列表中的自定义对象的值。如果链表的类型为String,则可以读取值,即new LinkedList()。我在列表中没有看到任何控制台错误或错误日志backend@RRN
li
元素是否至少得到渲染?我刚刚注意到您的getter/属性之间没有正确对齐,即:对于getFpath()
您应该使用navlist.fpath
很抱歉,这是一个复制粘贴错误。我的代码中已经有了这些更改。但是,它不会读取存储在链接列表中的自定义对象的值。如果链表的类型为String,则可以读取值,即new LinkedList()。我在列表中没有看到任何控制台错误或错误日志backend@RRNli
元素是否至少得到渲染?我刚刚注意到您的getter/属性没有正确地相互对齐,例如:for