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

JSF资源库是用来做什么的,应该如何使用它?

司寇研
2023-03-14

JSF 组件具有Library属性。这是什么,这应该如何使用?web上有很多示例使用它,如下所示,根据所使用的标记,将常用内容/文件类型cssjsimg(或image)作为库名:

<h:outputStylesheet library="css" name="style.css" />
<h:outputScript library="js" name="script.js" />
<h:graphicImage library="img" name="logo.png" />

它有什么用?这些示例中的library值似乎只是重复标记名所表示的内容。对于 ,它基于标记名,即它表示“CSS库”。跟下面的有什么区别,它们也是同样的工作方式?

<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />

而且,生成的HTML输出有点不同。给定/contextName的上下文路径和FacesServlet映射到*.xhtml的URL模式上,前者将以库名作为请求参数生成以下HTML:

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/style.css.xhtml?ln=css" />
<script type="text/javascript" src="/contextname/javax.faces.resource/script.js.xhtml?ln=js"></script>
<img src="/contextname/javax.faces.resource/logo.png.xhtml?ln=img" alt="" />

而后者生成以下HTML,其库名正好位于URI的路径中:

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml" alt="" />

后一种方法在事后看来也比前一种方法更有意义。那么library属性到底有什么用处呢?

共有1个答案

聂溪叠
2023-03-14

实际上,web上的所有示例都将常见的内容/文件类型(如“js”、“css”、“img”等)用作库名,这是误导性的。

首先,让我们看看现有的JSF实现(如Mojarra和MyFaces)以及JSF组件库(如PrimeFaces和OmniFaces)是如何使用它的。他们中没有人以这种方式使用资源库。他们以以下方式使用它(通过@ResourceDependencyUIViewRoot#AddComponentResource()):

<h:outputScript library="javax.faces" name="jsf.js" />
<h:outputScript library="primefaces" name="jquery/jquery.js" />
<h:outputScript library="omnifaces" name="omnifaces.js" />
<h:outputScript library="omnifaces" name="fixviewstate.js" />
<h:outputScript library="omnifaces.combined" name="[dynamicname].js" />
<h:outputStylesheet library="primefaces" name="primefaces.css" />
<h:outputStylesheet library="primefaces-aristo" name="theme.css" />
<h:outputStylesheet library="primefaces-vader" name="theme.css" />

它基本上代表了所有这些资源共同所属的公共库/模块/主题名称,这一点应该变得很清楚。

此外,当您使用自定义ResourceHandler时,如果library的使用方式正确,您还可以对来自特定库的资源应用更细粒度的控制。如果所有组件库都对其所有JS文件使用“JS”,那么resourcehandler将如何区分它是否来自特定的组件库?例如,OmniFacesCombinedResourceHandlerGraphicResourceHandler;检查createResource()方法,其中在委托给链中的下一个资源处理程序之前检查库。这样,他们就知道何时为此目的创建combinedresourcegraphicresource

值得注意的是有钱人做错了。它根本没有使用任何library,而是在其上自制了另一个资源处理层,因此不可能以编程方式识别RichFaces资源。这正是为什么OmniFacesCombinedResourceHander必须引入基于反射的攻击,以便使其能够与RichFaces资源一起工作的原因。

您自己的webapp不一定需要资源库。你最好省略一下。

<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />

或者,如果你真的需要一个,你可以给它一个更合理的通用名称,比如“default”或某个公司名称。

<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />

或者,当资源特定于某些主Facelets模板时,您也可以给它指定模板的名称,这样彼此之间的关联就更容易了。换句话说,更多的是为了自我纪实。例如。在/WEB-INF/templates/layout.xhtml模板文件中:

<h:outputStylesheet library="layout" name="css/style.css" />
<h:outputScript library="layout" name="js/script.js" />

/WEB-INF/templates/admin.xhtml模板文件:

<h:outputStylesheet library="admin" name="css/style.css" />
<h:outputScript library="admin" name="js/script.js" />
<h:outputStylesheet library="common" name="css/style.css" />
<h:outputScript library="common" name="js/script.js" />
<h:graphicImage library="common" name="img/logo.png" />
WebContent
 |-- resources
 |    `-- default
 |         `-- 1_0
 |              |-- css
 |              |    `-- style.css
 |              |-- img
 |              |    `-- logo.png
 |              `-- js
 |                   `-- script.js
 :

使用此标记时:

<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />

这将生成以下HTML,库版本为v参数

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&amp;v=1_0" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&amp;v=1_0"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&amp;v=1_0" alt="" />

因此,如果您已经编辑/更新了某些资源,那么您所需要做的就是将版本文件夹复制或重命名为一个新的值。如果您有多个版本文件夹,那么JSFresourcehandler将根据数字排序规则自动为来自最高版本号的资源提供服务。

WebContent
 |-- resources
 |    `-- default
 |         |-- 1_0
 |         |    :
 |         |
 |         `-- 1_1
 |              |-- css
 |              |    `-- style.css
 |              |-- img
 |              |    `-- logo.png
 |              `-- js
 |                   `-- script.js
 :
<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&amp;v=1_1" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&amp;v=1_1"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&amp;v=1_1" alt="" />
  • JSF资源版本控制
  • JSF2静态资源缓存
  • 具有共享代码的多个JSF项目的结构
  • JSF 2.0规范-第2.6章资源处理
 类似资料:
  • 问题内容: 我正在使用cython为数学模型生成更快的代码。我很难编译代码,但是以某种方式设法使用.bat做到了: 运行正常… 我的问题是关于pyximport。我有其他人使用pyximport.install()编写的旧代码。我无法弄清楚它的作用以及为什么要使用它,因为我已经在自己编译代码了。因此,有人可以以非常简单的方式(对于虚拟对象)向我解释pyximport的作用吗? 附加信息:我有一个使

  • 问题内容: 在JSF中,每个页面都有一个视图状态,该视图状态与Submit等来回传递。 我知道viewstate是使用页面上各种控件的状态计算得出的,您可以将其存储在客户端或服务器端。 问题是:如何使用此值?是否用于验证在提交时发送的值,以确保同一请求不会发送两次? 另外,它是如何计算的-我意识到Richfaces的计算方式可能与myfaces不同,但是有一个不错的主意。 谢谢。 问题答案: 问题

  • 我看到它包含了DejaVu Sans字体,但我不知道如何使用这个jar(我在网上什么也没有找到),也不知道这是否能以一种优雅、简单的方式解决我的跨平台软件。 你能告诉我更多关于这个罐子的事吗?

  • 给定一个电话号码列表,其中每个号码都以开头,并且每个电话号码都与特定的客户详细信息相关联。没有与之关联的客户信息。 因此,如果请求的编号为< code>1234567890123,那么响应应该是< code>400错误请求还是< code>404未找到? 号码是正确的电话号码格式,但后缀号999的附加要求使我混淆了它应该是400还是404。

  • 问题内容: 我一直在搜索,但仍然不确定“盐”是什么以及如何使用/实现它。对不起这个问题,我是自学php。 问题答案: 我绝对不是专家,但是真正简短的答案是“涂一行”文本意味着在其末尾添加一些额外的字符。您可以将“ salt”和“ abcdefg”加盐以获得“ saltabcdefg”。如果“盐”恰好是您想要使其更难猜测的密码,则这可能很有用。 通常,密码+盐会通过一些难以逆转的过程转换(“散列”)