当前位置: 首页 > 知识库问答 >
问题:

在Wicket中拥有一个静态“子站点”(即:在Wicket中安装一个目录)

谢铭
2023-03-14

我正在使用Wicket开发一个web应用程序。

虽然网站的大部分是通过wicket动态生成的,但我需要让网站的一部分成为一个正常的“静态”HTML网站。基本上是主网站中的一个小“子站点”,根本不由wicket管理,而是静态内容(html页面、css、图像)的集合。

这能做到吗?这个想法是“挂载”某个子路径以指向子站点,但我不知道这是否可能,因为mountresource()方法需要一个资源作为输入。

编辑:我需要一个解决方案,允许我直接在文件系统上修改静态html文件,这就是我试图通过Wicket“挂载一个目录”的原因。我不能简单地将页面放在我的webapp文件夹中,因为这样它们最终会在应用程序的WAR文件中,而且每次对静态页面的修改都需要完全部署。

有什么想法吗?

共有1个答案

刁瀚昂
2023-03-14

最后,我自己使用动态资源实现了这一点。我不是检票口的专家,所以出于某种原因,这可能是一个“糟糕”的解决方案,但它似乎有效。在这里发布代码,以便其他人可以在需要时使用:

我所做的是创建这个资源:

public class DirectoryResolverResource implements IResource {
    private static final long serialVersionUID = 1L;

    private File servedDirectory;
    private String urlPrefix;

    //served directory is the directory you want to mount as a static sub-site
    //urlPrefix is the mountpoint where you're going to mount this resource, without the leading "/". E.g.: if you mount your directory in "/help" so that the sub-site URL is www.yoursite.com/pages/help the urlPrefix value must be "help"
    public DirectoryResolverResource(File servedDirectory, String urlPrefix) {
        super();
        if (servedDirectory == null || !servedDirectory.isDirectory()) {
            throw new IllegalArgumentException("Directory is null or doesn't exist");
        }
        this.servedDirectory = servedDirectory;
        this.urlPrefix = urlPrefix;
    }

    @Override
    public void respond(Attributes attributes) {
        Url url = attributes.getRequest().getUrl();
        String subPath = "";
        try {
            //we decode the URL by reversing the percent-encoding, so that filenames are properly resolved
            subPath = URLDecoder.decode(url.toString(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_BAD_REQUEST, "Encoding is invalid");
        }

        if (subPath.startsWith(urlPrefix)) {
            subPath = subPath.substring(urlPrefix.length());
        } else {
            throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Url is invalid");
        }

        File file = new File(servedDirectory.getAbsolutePath() + (subPath.startsWith("/") ? "" : "/") + subPath);
        if (file.isDirectory()) {
            // In case of a directory, redirect to the path ending in "/", otherwise browsers will fail to resolve relative paths in the page
            if (!subPath.endsWith("/")) {
                throw new RedirectToUrlException("." + (subPath.isEmpty() ? "/" + urlPrefix : subPath) + "/", HttpServletResponse.SC_MOVED_PERMANENTLY);
            }
            // no specific file specified, try to return index.html
            file = new File(file.getAbsolutePath(), "index.html");
        }
        if (!file.exists() || file.isDirectory()) {
            // file not found
            throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, "Resource not found");
        }

        if (!FSManager.isInSubDirectory(servedDirectory, file)) {
            // Security check: user is trying to escape the served directory via a non-canonical path
            throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_FORBIDDEN, "Access to this resource is forbidden");
        }

        // Serve the file
        FileResourceStream fileResourceStream = new FileResourceStream(file);
        ResourceStreamResource resource = new ResourceStreamResource(fileResourceStream);
        resource.respond(attributes);
    }

}

您可以像这样挂载此资源:

mountResource("/help", new ResourceReference("helpres") {
                private static final long serialVersionUID = 1L;

                @Override
                public IResource getResource() {
                    return new DirectoryResolverResource(helpDir, "help");
                }
            });

希望这对某人有帮助。如有任何改进/评论/更正/建设性的批评,不胜感激!

注意:isinsubdirectory()方法只检查文件是否在某个目录树中。我不会让您厌烦细节,您可以在这里找到这样的方法的实现:检查文件是否在(子)目录中

 类似资料:
  • 我有一个wordpress多站点在Centos 6.5在 /var/www/html/site1访问在site1.com和一切都很好。 我想安装一个单一的网站称为site2在 /var/www/html/site2但可在site1.com/site2 这个site1的conf具有如下服务器块: 当我使用try files try_files/index时。html/索引。php$uri$uri/;

  • 有一个简单的网站,我们称之为http://foo.com/,使用一个简单的用户/通行证表单将post请求发送到http://foo.com/login.php登录用户。 如何在另一个网站中创建一个链接,比如说http://foo_autologin.com/,它将在http://foo.com/上用预先确定的密码登录,并在另一个标签中打开它,登录?

  • 我有多个方法,我希望有静态锁定,以便没有两个对象可以访问一个方法,但同时不同的方法不会被这些对象锁定,并且可以独立运行。 现在我希望这两个方法在被锁定时相互独立,但同时我希望同一个类的多个实例被锁定在一个方法上。 如何实现这一点?通过使用不同的类。仅仅这样做能达到目的吗?

  • 问题内容: 我有一个包含每个测试结果一行。测试结果可能附有注释,需要在测试结果下方突出显示,希望可以提供类似于以下内容的表格: 有什么方法可以使用Wicket DataTable构造来实现此行插入(最好使用列跨越)。当我深入研究源代码时,我可以找到渲染器,但是没有一行可以处理。 目前,我有以下内容: 问题答案: 我认为没有做到这一点的干净方法,您将不得不修改生成的HTML。 我会将自定义行为附加到

  • Wicket 是一个 Java 语言的 Web 开发框架,与 Struts,WebWork,Tapestry 相类似。 其特点在于对 Html 和代码进行了有效的分离(有利于程序员和美工的合作),基于规则的配置(减少了 XML 等配置文件的使用),学习曲线较低(开发方式与 C/S 相似),更加易于调试(错误类型比较少,而且容易定位)。

  • Wicket Bench这个Eclipse插件允许重复利用JUnit测试装置器+Mocked测试组件在隔离应用程序其余部份的情况下单独运行Wicket组件。它还提供一个综合测试工具Selenium来对Wicket构件进行自动测试。 安装地址:http://www.laughingpanda.org/svn/wicket-bench/trunk/wicket-bench-site