我正在继续使用JSF 2.0。 我认为模板是一件好事,它有很多优点。但是今天我对它有了新的疑问。
我为自己的网页创建了一个模板。 在模板中,我使用标签 作为不同的部分(这些部分稍后将在一个页面中使用组合标记结合一个或多个定义标记来实现)。
<ui:insert name="content" />
同样在模板内部,为了避免在模板中添加太多代码,我创建了 标记来添加其他一些xhtml。
<ui:include src="/languageChanger.xhtml"/>
这就是我的文件夹结构:
这一切都像我一样工作,但是当我在网址中导航到languageChanger.xhtml时,我看到了xhtml的复合块:
我的怀疑是:
- 这个独立代码块放在正确的位置吗?或者它是错误的,不应该允许用户从URL中看到它?
- 那个地方保存有其他组件,如登录,注册......?
- 为了避免用户直接访问组件,我可以将其放在WEB-INF文件夹中,但是我遇到包含标签找不到路径的问题。我该怎么办?
- 什么是最佳实践,在哪里放置这些独立的代码块?
答案 0 :(得分:5)
是否有一大堆独立代码放在正确的位置?或者它是错误的,不应该允许用户从URL中看到它?
把它放在/WEB-INF
的某个地方。容器不允许直接访问此文件夹。
该地方是否保存其他组件,如登录,注册......?
我不明白你。也许你想说“安全”而不是“保存”?你对“其他组件”的意思是什么?
为了避免用户直接访问组件,我可以将其放在WEB-INF文件夹中,但是我遇到包含标签找不到路径的问题。我该怎么办?
你的道路显然是完全错误的。 Facelet模板,包含,标签和合成(非复合组件)可以完美地放在/WEB-INF
。
什么是最佳做法,在哪里放置这些独立的代码块?
将其放入/WEB-INF
。最佳做法是使用绝对路径,即以/
开始路径。它将相对于webcontent根进行解析。 E.g。
<ui:include src="/WEB-INF/languageChanger.xhtml" />
只有“主要”页面(URL请求的页面)无法放入/WEB-INF
。
答案 1 :(得分:1)
前两个问题:
是否有一大堆独立代码放在正确的位置?或者它是错误的,不应该允许用户从URL中看到它?
该地方是否保存其他组件,如登录,注册......?
模板及其使用的默认内容位于正确的位置。它们必须位于Web应用程序的文档根目录下,而不是其他位置。
关于你的最后两个问题:
为避免用户直接访问我可以放入的组件 WEB-INF文件夹,但是我有一个include标签的问题 找不到路径。我该怎么办?
最佳做法是什么,将其置于何处独立 代码块?
上面提供了部分答案,其中提到了在文档根目录下放置包含文件的需要。 JSF运行时使用的“资源解析器”要求facelet位于应用程序的文档根目录下。由于这个原因,Facelets不能放在WEB-INF
中。
如果您需要阻止用户直接访问这些页面,则必须编写Web应用程序过滤器以阻止访问这些页面。
Mojarra运行时不会在内部将任何HTTP请求转发到模板资源;相反,它包括文件的内容,作为流检索。这意味着您无需将过滤器限制为仅REQUEST
的调度类型;您可以将过滤器应用于所有调度类型。
将所有模板和所包含的facelets放在/templates
目录中可以更轻松地将过滤器应用于单个网址 - /templates/*
。