在哪里放置组合组件?(JSF 2.0)

Posted

技术标签:

【中文标题】在哪里放置组合组件?(JSF 2.0)【英文标题】:Where to put composition components?(JSF 2.0) 【发布时间】:2011-10-26 22:17:30 【问题描述】:

我将继续使用 JSF 2.0 进行实践。 我认为模板是一件很棒的事情,它有很多优点。但是今天我有一个新的疑问。

我为我的页面创建了一个模板。 在模板中,我将标签 用于不同的部分(这些部分稍后将在页面中使用组合标签结合一个或多个定义标签来实现)。

<ui:insert name="content" />

同样在模板内部,为了避免在模板中放置太多代码,我创建了 标签来添加一些其他的 xhtml 块。

<ui:include src="/languageChanger.xhtml"/>

这就是我的文件夹结构的样子:

这一切都如我所料,但是当我在 url 中导航到 languageChanger.xhtml 时,我看到了 xhtml 的复合块:

我的疑惑是:

-那段独立的代码是否放置在正确的位置?或者是错误的,不应该允许用户从 URL 中看到?

-那个地方是否保存有其他组件,如登录、注册...?

-为了避免用户直接访问组件,我可以将它放在 WEB-INF 文件夹中,但是我遇到了一个问题,即包含标签找不到路径。我该怎么办?

-最佳实践是什么,将这些独立的代码块放在哪里?

【问题讨论】:

【参考方案1】:

那段独立的代码放对了吗?还是错了,不应该让用户从 URL 中看到?

把它放在/WEB-INF 的某个地方。容器不允许直接访问此文件夹。


那个地方是否保存有其他组件,如登录、注册...?

我不明白你。也许您的意思是说“安全”而不是“保存”? “其他组件”是什么意思?


为了避免用户直接访问组件,我可以将它放在 WEB-INF 文件夹中,但是我遇到了一个问题,即包含标签找不到路径。我该怎么办?

你的路径显然是错误的。 Facelet 模板、包含、标签和组合(不是复合组件)可以完美放置在/WEB-INF 中。


最佳实践是什么,将这些独立的代码块放在哪里?

把它放在/WEB-INF。最佳做法是使用绝对路径,即以/ 开头的路径。它将相对于 webcontent 根进行解析。例如

<ui:include src="/WEB-INF/languageChanger.xhtml" />

只有“主”页面(通过 URL 请求的页面)不能放在/WEB-INF 中。

【讨论】:

嗯,这太邪恶了; Mojarra 使用DefaultFacelet.getRelativePath() 来获取资源 URL,并且此方法可以返回绝对路径而不是相对路径(与其名称相反),从而使您的答案正确。 @BalusC 是的,它有效。我只是将那段代码放在 WEB-INF 文件夹中并且没有问题,我的错误是在包含标记处给出的路径中。但我仍然有点困惑 WEB-INF 可以访问哪些东西,哪些不是 :) /WEB-INF 中的东西可以被 webapp 本身访问,但不能被外界访问。您无法通过网络浏览器打开 example.com/context/WEB-INF/whatever。这同样适用于/META-INF。否则,如果 web.xml 以这种方式暴露在公众面前,这将是一个安全漏洞。 我明白,配置文件需要有一个像这样的安全地方... :) 谢谢!【参考方案2】:

对于您的前两个问题:

那块独立的代码放对了吗?还是错了,不应该让用户从 URL 中看到?

那个地方保存有其他组件,如登录、注册...?

他们使用的模板和默认内容都在正确的位置。它们必须存在于 Web 应用程序的文档根目录下,而不是其他位置。

最后两个问题:

为避免用户直接访问该组件,我可以将其放入 WEB-INF 文件夹,但是我遇到了包含标签的问题 找不到路径。我该怎么办?

最佳实践是什么,在哪里放置这个独立的 代码块?

上面提供了部分答案,其中提到了将包含文件放在文档根目录下的需要。 JSF 运行时使用的“资源解析器”要求 facelet 存在于应用程序的文档根目录下。由于这个原因,Facelets 不能放在 WEB-INF 中。

如果您需要阻止用户直接访问这些页面,那么您必须编写一个 Web 应用程序过滤器来阻止对这些页面的访问。

Mojarra 运行时不会在内部将任何 HTTP 请求转发到模板资源;相反,它包括文件的内容,作为流检索。这意味着您不需要将过滤器限制为单独调度 REQUEST 类型;您可以将过滤器应用于所有调度类型。

将所有模板和包含的 facelets 放在 /templates 目录中可以更轻松地对单个 URL 应用过滤器 - /templates/*

【讨论】:

现在我很明白了。我认为甚至没有理由担心这些组件的某种类型的安全问题,它更像是一个思维问题。无论如何,为了更安全,我认为编写您提到的过滤器以避免通过 URL 直接访问是个好主意。 @sfrj,如果您需要了解如何实现过滤器,请查看我的一个项目中的this recent commit。要查找的文件是 ResourceFilterweb.xml 感谢您的链接。我过去确实实现了类似的过滤器。我做过一次应用程序管理的安全性,所以或多或少我知道我应该做什么。感谢您的帮助。

以上是关于在哪里放置组合组件?(JSF 2.0)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSF 中创建现有组件的组合?

#cc.clientId 在升级到 JSF 2.2 后在错误的组合中评估

JSF 2.0 动态删除组件

有没有办法在组合框内放置一个树列?

在 PrimeFaces 3.4 JSF 2.0 中按 id 查找组件

JSF 2.0:跨多个视图保留组件状态