ZK中继承SelectorComposer的控制器获取Zk Sessions报错如何解决
问题根因
GenericForwardComposer默认会自动注入session、request等ZK隐式对象作为类成员变量,可直接调用;但SelectorComposer没有该自动注入逻辑,直接调用session变量会提示变量未定义错误。
解决方法
两种方案任选其一即可,推荐使用方法2,代码更符合SelectorComposer的使用规范:
方法1:主动获取当前Session
通过ZK执行上下文手动获取Session对象,无需额外注解:
- 新增import语句:
import org.zkoss.zk.ui.Executions; - 替换原
session.getAttribute行代码为:
Session session = Executions.getCurrent().getSession(); DaoFactory daofactory = (DaoFactory) session.getAttribute("daofactory");
方法2:使用@WireVariable注解注入Session
SelectorComposer支持@WireVariable注解自动注入隐式对象,原有session.getAttribute代码无需修改:
- 新增import语句:
import org.zkoss.zk.ui.select.annotation.WireVariable; - 在类中添加Session成员变量并加注解:
@WireVariable private Session session;
修改后完整代码示例
package com.ctrl; import com.impl.ChartImpl; import com.koneksi.DaoFactory; import org.zkoss.chart.Charts; import org.zkoss.chart.Legend; import org.zkoss.chart.PlotLine; import org.zkoss.zk.ui.Session; import org.zkoss.chart.model.ChartsModel; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.select.SelectorComposer; import org.zkoss.zk.ui.select.annotation.Wire; import org.zkoss.zk.ui.select.annotation.WireVariable; import org.zkoss.zul.Window; public class LineBasicComposerCtrl extends SelectorComposer<Window> { @Wire Charts chart; // 若使用方法2,取消下面两行注释即可,无需手动调用Executions获取session // @WireVariable // private Session session; @Override public void doAfterCompose(Window comp) throws Exception { super.doAfterCompose(comp); // 若使用方法2,删除下面获取session的一行代码即可 Session session = Executions.getCurrent().getSession(); DaoFactory daofactory = (DaoFactory) session.getAttribute("daofactory"); chart.setModel((ChartsModel) ChartImpl.getCategoryModel(daofactory)); chart.getTitle().setX(-20); chart.getSubtitle().setX(-20); chart.getYAxis().setTitle("Temperature (°C)"); PlotLine plotLine = new PlotLine(); plotLine.setValue(0); plotLine.setWidth(1); plotLine.setColor("#808080"); chart.getYAxis().addPlotLine(plotLine); chart.getTooltip().setValueSuffix("°C"); Legend legend = chart.getLegend(); legend.setLayout("vertical"); legend.setAlign("right"); legend.setVerticalAlign("middle"); legend.setBorderWidth(0); } }
内容的提问来源于stack exchange,提问作者Daryl Darussalam
相关产品推荐
相关产品推荐

