Using Custom ZK Scopes For Spring Beans"

From Documentation
Line 91: Line 91:
 
Being a "desktop"-scoped (may also be "prototype" - depending on your requirement) bean the controller can use <code>@Autowired</code> to get the SimpleMessageBean injected.
 
Being a "desktop"-scoped (may also be "prototype" - depending on your requirement) bean the controller can use <code>@Autowired</code> to get the SimpleMessageBean injected.
  
<source lang="java">
+
<source lang="java" high="2,5,6,23">
 
@Component("scopedCtrl")
 
@Component("scopedCtrl")
 
@Scope("desktop")
 
@Scope("desktop")
Line 120: Line 120:
 
</source>
 
</source>
  
Now when you click Show window button on the main page it creates a new page called customScopesWindow.zul and attaches it to the current desktop. Here is the source code for this page
+
The onClick listener of the "Show Window"-button (above line 21-25), append "customScopesWindow.zul" (code below) to the current desktop.
<source lang="xml">
+
 
 +
<source lang="xml" high="6">
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
 
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>

Revision as of 02:27, 22 January 2019

Using Custom ZK Scopes For Spring Beans



Purpose

Use ZK custom scope for Spring beans.

Example

In this example we will present user to enter a message which can be set into a Spring bean. This bean is set to the custom desktop-scope[1] so that it can be shared by other pages, controllers, view models attached to this same desktop.

  1. Besides desktop-scope, ZK Spring also support webapp- and execution-scope (page-scope, idspace-scope have been deprecated)

Configuration

Java Config

import org.zkoss.spring.config.ZkScopesConfigurer;

@Configuration
@Import(ZkScopesConfigurer.class)
public class YourApplicationConfiguration {
    ...
}

XML Config

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:zksp="http://www.zkoss.org/2008/zkspring/core"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.zkoss.org/2008/zkspring/core http://www.zkoss.org/2008/zkspring/core/zkspring-core-4.0.xsd">

	<!-- Enables ZK custom scopes for Spring Beans -->
	<zksp:zk-config/>
</beans>

Previous version 3.2 (or earlier)

To enable ZK custom scopes for your Spring Beans all you need is to add <zk-config/> element to your spring bean configuration file. Here is snippet from our sample application configuration

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:zksp="http://www.zkoss.org/2008/zkspring/core"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.zkoss.org/2008/zkspring/core http://www.zkoss.org/2008/zkspring/core/zkspring-core.xsd">

    <!-- Enables ZK custom scopes for Spring Beans -->
    <zksp:zk-config/>
...

Note that you need to declare ZK Spring Core namespace at the start of your configuration file.

ZUML

Let's take a look at the main page source

<?xml version="1.0" encoding="UTF-8"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<window title="Custom Scopes Example - Main Page" border="normal" height="100px" width="400px" 
    apply="${scopesCtrl}">
    <label value="Enter Message Text:"></label>
    <textbox id="name" />
    <button id="setMsgBtn" label="Set" />
    <button id="showMsgBtn" label="Show Message" />
    <button id="showWinBtn" label="Show Window" />
</window>

It has one textbox to enter a message. On clicking Set button we store this text in a SimpleMessageBean which is Autowired into scopesCtrl controller.

Java

The SimpleMessageBean is set to "desktop"-scope using the @Scope-annotation.

@Component("msgBean")
@Scope("desktop")
public class SimpleMessageBean {

    private String msg;
    
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

Being a "desktop"-scoped (may also be "prototype" - depending on your requirement) bean the controller can use @Autowired to get the SimpleMessageBean injected.

@Component("scopedCtrl")
@Scope("desktop")
public class ScopedController extends SelectorComposer {

    @Autowired
    private SimpleMessageBean msgBean; //wire spring bean

    @Wired
    private Textbox name; //wire ZK component

    @Listen("onClick = #setMsgBtn")
    public void setMessage(Event evt) {
        msgBean.setMsg(name.getValue());
    }
    
    @Listen("onClick = #showMsgBtn")
    public void showMessage(Event evt) throws InterruptedException {
        Messagebox.show(msgBean.getMsg());
    }

    @Listen("onClick = #showWinBtn")
    public void showMessage(Event evt) throws InterruptedException {
        Window win = (Window) Executions.getCurrent().createComponents("customScopesWindow.zul", null, null);
        win.doHighlighted();
    }
}

The onClick listener of the "Show Window"-button (above line 21-25), append "customScopesWindow.zul" (code below) to the current desktop.

<?xml version="1.0" encoding="UTF-8"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<window title="Custom Scopes Example - Window Page" border="normal" height="100px"
    width="400px" closable="true">
    <label value="Message Text:"></label>
    <textbox id="name" value="${msgBean.msg}"/>
</window>

Since it is attached to the same desktop we have access SimpleMessageBean instance stored in the desktop scope. We use our standard approach to use DelegatingVariableResolver to access such bean and assign its value to a textbox.

Version History

Last Update : 2019/01/22


Version Date Content
     


Last Update : 2019/01/22

Copyright © Potix Corporation. This article is licensed under GNU Free Documentation License.