【问题标题】:How to use modal windows with ZK and spring?如何在 ZK 和 spring 中使用模态窗口?
【发布时间】:2022-06-29 19:34:06
【问题描述】:

我正在升级 ZK,但在创建模态窗口时遇到了一些问题。因为它们是在另一个线程中创建的,所以没有 hibernate 和 springsecurity 会话。如何在我的应用程序上调用窗口组件而不丢失 servlet 变量上下文?

例如,应用程序会根据用户的偏好创建一个窗口,但是当我单击保存时,它会引发无休眠会话错误。

在整个项目中都有.zul 文件和window 组件,它们通过点击事件在作曲家中被调用:

<?xml version="1.0" encoding="UTF-8"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<?link rel="shortcut icon" type="image/x-icon" href="/static/images/favicon.ico"?>

<zk xmlns="http://www.zkoss.org/2005/zul"
    xmlns:h="http://www.w3.org/1999/xhtml"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd">
    <window title="Projetos" apply="common.PreferencesComposer"
            maximizable="true" minimizable="true" closable="true" maximized="true"
            mode="overlapped" border="normal" height="100%" width="100%"
            style="opacity:0.94;">
            [hidden for brevity]
    </window>
</zk>

Composer onClick 方法:

Window win = (Window) Executions.createComponents("/common/preferences.zul", null, args);
win.doModal();

【问题讨论】:

    标签: zk


    【解决方案1】:

    ...它们是在另一个线程中创建的...

    如果您在 ZK 作曲家的 onClick 侦听器中创建模态窗口,那么它应该在 servlet 线程中。

    除非您启用已弃用的Event Threads。 我强烈建议您禁用事件线程,因为它违反了 Java Servlet 规范,并且使您难以与 Spring 等其他框架集成。

    记得阅读Event Threads 以更新与某些组件相关的代码,例如模态窗口或消息框。

    如何使用 Spring 在我的应用程序中使用窗口组件?

    问题不清楚。你指的具体用法是什么? 您可以在 composer 中放置一个 varialbe 解析器,以将 spring bean 连接到 composer 并使用该 bean。请参考

    请注意,该示例仅适用于 spring 4.3 或更早版本。

    【讨论】:

      【解决方案2】:
      1. 在您使用 MVC 架构时。在 ZK 中,MVVM 架构被认为更可取

      2. 您的问题更多与如何与 Spring Framework 集成并获得 Hibernate Session 相关

      要与Spring集成,可以使用@VariableResolver注解(DelegatingVariableResolver.class) 和@WireVariable 然后你可以注入任何bean,包括hibernate Session 示例:

      @VariableResolver annotation(DelegatingVariableResolver.class)
          class МyVM {
           @WireVariable
            Session hibernateSesion;
         //....... your code...
          
            @Command
            public void save(){
              hibernateSesion.save(obj)
            }
          }
      

      http://books.zkoss.org/zkessentials-book/master/spring_integration/index.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多