Fork me on GitHub

Programming Design Notes

自動將 Spring Bean 注入到 ZK Controller 內

| Comments

ZK 能夠自動根據 Spring Bean 的名稱注入相對應的變數內,而且非常簡單。
首先制作一個 Spring Bean,命名為 com.blogspot.lawpronotes.beans.HelloBean。

HelloBean 程式碼:
package com.blogspot.lawpronotes.beans;

public class HelloBean {
public String sayHello(){
return "Hello";
}
}

在 applicationContext.xml 內加上以下內容:
<bean id="hello" class="com.blogspot.lawpronotes.beans.HelloBean" />

新增 index.zul 並加入以下內容:
<?page title="Index" contentType="text/html;charset=UTF-8"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<zk>
<window title="Index" border="normal"
apply="com.blogspot.lawpronotes.web.ui.IndexController">
<button id="btn1" label="Say Hello" />
<label id="labMessage" />
</window>
</zk>

其中這句是關鍵,沒有引入這個類別將不能夠自動將 bean 注入。
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>

現在新增 com.blogspot.lawpronotes.web.ui.IndexController,將以下程式碼貼上。
package com.blogspot.lawpronotes.web.ui;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Button;
import org.zkoss.zul.Label;

import com.blogspot.lawpronotes.beans.HelloBean;

public class IndexController extends GenericForwardComposer{
//Spring Bean
private HelloBean hello;

//ZK Component
private Button btn1;
private Label labMessage;

@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
}

public void onClick$btn1(){
labMessage.setValue(hello.sayHello());
}
}

可以是私有變數,ZK 一樣可以將 bean 注入,但有一點要注意,其中
private HelloBean hello;
<bean id="hello" class="com.blogspot.lawpronotes.beans.HelloBean" />
變數名稱一定要跟定義 bean 時的 id 一樣,不一樣會注入失敗。即是不可以是以下這種情況:
private HelloBean helloBean;
<bean id="hello" class="com.blogspot.lawpronotes.beans.HelloBean" />
這樣便會注入失敗。

除了自動注入,亦可用以下方法將 bean 注入。
public void onClick$btn1(){
Object obj = org.zkoss.zkplus.spring.SpringUtil.getBean("hello");
if (obj instanceof HelloBean){
HelloBean helloBean = (HelloBean)obj;
labMessage.setValue(helloBean.sayHello());
}else
labMessage.setValue("HelloBean not found");
}

現在用瀏覽器打開 index.zul,按下按鈕會顯示 Hello 字樣。

相關書籍: ZK: Ajax without the Javascript FrameworkZK Developer's Guide: Developing responsive user interfaces for web applications using Ajax, XUL, and the open source ZK rich web client development frameworkSpring Recipes: A Problem-Solution Approach