【问题标题】:zk framework: how to load zul pages from WEB-INF under directory zulzk框架:如何从zul目录下的WEB-INF加载zul页面
【发布时间】:2012-12-31 12:37:24
【问题描述】:

我正在使用 zk 框架 6。 我正在尝试将我的 zul 页面放在 /WEB-INF/zul 目录中。 我的 index.zul 文件将请求转发到 /WEB-INF/zul/login.zul,它有一个 composer LoginComposer。 但是当我在登录页面时,我想将用户重定向到另一个页面,例如家.zul。但我收到 404 错误。

login.zul 和 home.zul 和它们各自的作曲家都在 zul 目录中。

在 loginComposer.java 中,我有以下代码重定向到单击按钮时调用的主页。

 Execution exec = Executions.getCurrent();
                HttpServletResponse response = (HttpServletResponse)exec.getNativeResponse();
                response.sendRedirect(response.encodeRedirectURL("/WEB-INF/zul/home.zul")); //assume there is /login
                exec.setVoided(true); 

我将项目创建为 eclipse 中的 zk 项目,并且我没有对 web.xml 进行任何更改。

请指导我如何从这里出发。

提前致谢。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>abc</display-name>
  <listener>
    <description>
    Used to cleanup when a session is destroyed</description>
    <display-name>ZK Session cleaner</display-name>
    <listener-class>org.zkoss.zk.ui.http.HttpSessionListener</listener-class>
  </listener>
  <servlet>
    <description>
    The ZK loader for ZUML pages</description>
    <servlet-name>zkLoader</servlet-name>
    <servlet-class>org.zkoss.zk.ui.http.DHtmlLayoutServlet</servlet-class>
    <init-param>
        <param-name>update-uri</param-name>
        <param-value>/zkau</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
    <description>
    The asynchronous update engine for ZK</description>
    <servlet-name>auEngine</servlet-name>
    <servlet-class>org.zkoss.zk.au.http.DHtmlUpdateServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>zkLoader</servlet-name>
    <url-pattern>*.zul</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>zkLoader</servlet-name>
    <url-pattern>*.zhtml</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>auEngine</servlet-name>
    <url-pattern>/zkau/*</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>index.zul</welcome-file>
  </welcome-file-list>
</web-app>

zk.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
    Created by ZK Studio
-->

<zk>

        <device-config>
            <device-type>ajax</device-type>
            <timeout-uri>/timeout.zul</timeout-uri><!-- An empty URL can cause the browser to reload the same URL -->
        </device-config>

    </zk>

LoginComposer.java

public class LoginComposer extends SelectorComposer<Component>{

    private static final long serialVersionUID = -1657004425904043268L;

    @Wire
    private Button buttontestButton;

    @Listen("onClick = #testButton")
    public void cancelButton(){


             Executions.sendRedirect("/WEB-INF/zul/home.zul");


    }
}

【问题讨论】:

  • 你的登录页面是Spring控制的吗?
  • 为什么要把你的zul目录放在WEB-INF而不是WebContent下?
  • 因为这是 java web 开发中的常见做法。它保护页面不被直接访问。我们也对 jsps 使用类似的机制。所以我想遵循这种做法。
  • 如果您真的关心安全性,我想最好使用 spring 进行身份验证和映射/保护 url。

标签: java zk zul


【解决方案1】:

不可能

我环顾四周,发现一个德国网站解释说,该规范
java-servlet 将 WEB-INF 文件夹定义为客户端不可访问,
因为它包含数据作为永远不应该从服务器外部访问的类。

如果您在非 WEB-INF 的文件夹中遇到问题:

你最好使用Executions.sendRedirect(java.lang.String uri)
通过单击按钮进行重定向,需要服务器端操作。
如果您只想重定向,请设置按钮 href
它应该看起来像

Executions.sendRedirect("/zul/home.zul");

或 在java中:

myButton.setHref("/zul/home.zul");

在祖尔:

<button ... href="/zul/home.zul" ...>

编辑

我可以写很多,但最好是说,如果你

  1. 不要使用 Spring 关注 this 如果你得到 404
    检查你的部署选项/部署的东西。
  2. 使用 Spring,我更喜欢它,因为它很简单
    ajax 登录站点,java 方法的安全注释
    和简单的 zk 集成,请关注zk guide for spring

如果您仍然有 404 并且无法弄清楚,请发布您的
配置文件或类。

【讨论】:

  • 我也试过了,但没用。我的 url 更改为 localhost:8080/abc/zul/home.zul 并且我在浏览器 HTTP 状态 404 中出现错误 - /zul/home.zul 和描述 请求的资源 (/zul/home.zul) 不可用。记住登录和主页都在 web-inf 下的 zul 中。
  • 转发位于 webRoot 的 from 索引,我使用以下语句:
  • 我添加了 web.xml、zk.xml 和 LoginComposer.java 文件。不幸的是,我仍然收到 404。我遵循了您之前的指南。
  • 文件看起来没问题,所以这似乎是一个部署问题。检查您的部署选项并进行干净的部署。意味着从服务器中删除所有内容并进行部署。如果您使用 eclipse,请右键单击服务器并单击您在此处找到的两个干净选项。
  • 我这样做了,但仍然是同样的错误。可能是 zk 不支持这个功能,我必须使用 spring 来做到这一点。你说什么???
【解决方案2】:

正如其他人指出的那样,servlet 规范不允许直接/重定向访问 WEB-INF 下的页面,最佳做法是将 login.zul 保存在 WEB-INF 文件夹之外,以便应用程序的用户可以直接访问它。现在对于其余文件,您可以将它们保存在 WEB-INF 文件夹下并使用包含组件或Executions.createComponents() 呈现它们。

通常我将部分 zul 页面保存在 WEB-INF 文件夹中,因此它们不能直接访问,但我保留我的布局页面,例如。 WEB-INF 文件夹外的 home.zul 或 main.zul(如果用户未登录,也应限制访问)参考 here 了解如何使用 Spring Security 限制页面访问

【讨论】:

  • 您还建议使用 Spring。 ZK 没有自己的工具来重定向 WEB-INF 文件夹中的文件。
  • 我建议使用 Spring Security 来保护 WEB-INF 之外的页面而不是重定向。 ZK 没有任何工具来重定向 WEB-INF 内的文件,因为 Servlet 规范不允许这样做。我不相信即使是 Spring 也能做到这一点。您能否指出任何展示 Spring 允许您重定向到 WEB-INF 下的文件的功能的资源/文章?我很好奇。
【解决方案3】:

我希望这对某人有所帮助:

将zul文件转发到另一个zul文件你可以使用这个代码

<?forward uri="/directory_name/zul_fileName.zul"?>

对于在同一 zul 页面上包含 zul 页面,您可以使用此代码

<include src="/directory_name/zul_fileName.zul" > </include>

【讨论】:

    【解决方案4】:

    你不能。

    /WEB-INF 文件夹中的文件不可直接访问。如果你想拥有这样的文件系统,那么你应该更好地集成spring框架。

    【讨论】:

    • 使用 Spring,不抵消 Servlet 规范的安全措施。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2012-04-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多