【问题标题】:How to control case sensitivity of JSF Facelet files如何控制 JSF Facelet 文件的区分大小写
【发布时间】:2021-02-13 04:07:09
【问题描述】:

您好 Stackoverflow 社区,

我在带有 JSF/Primefaces 的 Java11 上使用 Wildfly 16。

在 .xhtml 源中使用包含时,我注意到此结构中路径“xyz/abc.xhtml”的大小写敏感度取决于操作系统:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<ui:include src="xyz/abc.xhtml"/>

意思是,如果文件名为 Abc.xhtml,这将适用于 Windows,但不适用于文件系统区分大小写的 Linux。

现在我想保证在 Windows 和 Linux 上的行为相同。

是否可以以某种方式配置 JSF,以便文件访问在两个操作系统上都区分大小写或不区分大小写?

【问题讨论】:

  • 您能否更清楚地说明您想要什么,以便我改进答案。
  • 好吧,我没有否决你的回答,但我能看出其中的意义。您提供了解决方法,谢谢。但这不是问题所在。问题是如何使服务器(或技术堆栈)在 Windows 和 Linux 上以相同的方式运行。请参阅我原来问题的最后一句话。更具体地说:请假设我无法控制引用的文件,因此其他人可能不遵循仅使用小写文件名的约定。可能是故意的,也可能是错误的。
  • 请注意,我问过这是否可能。如果不可能,那么通过简短的解释这样说将是一个非常好的答案。

标签: jsf wildfly jsf-2.2 java-ee-7


【解决方案1】:

解决方案

我认为解决这个问题的最好方法是只用小写字母命名每个文件,并且引用将被转换为小写。


首先创建一个包含toLowerCase(String) 方法的类。

public final class Functions {

    private Functions() {
        // Hide constructor.
    }

    public static String toLowerCase(String s) {
        return s.toLowerCase();
    }
}

然后你必须定义一个functions.taglib.xmlfunctions 是一个如何命名的例子)。

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">
    <namespace>http://example.com/functions</namespace>

    <function>
        <function-name>contains</function-name>
        <function-class>com.example.Functions</function-class>
        <function-signature>boolean contains(java.util.Collection, java.lang.Object)</function-signature>
    </function>
</facelet-taglib>

最后一步是在 web.xml 中注册 taglib。

<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/functions.taglib.xml</param-value>
</context-param>

现在您可以使用它了:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:fn="http://example.com/functions">

    <ui:include src="fn:toLowerCase('xyz/Abc.xhtml')}"/>
</html>

说明

基本上这个例子会将源引用转换为小写。这仅适用于您的文件也都以小写字符命名的情况。

如果定义自定义标签库对您来说太耗时,您还可以使用@ApplicationScoped bean 并在其中添加方法(请参阅Utility methods in application scoped bean

当然,将文件名的第一个字母大写也适用于小写文件名。您只需要使用capitalize() 方法(我可以根据要求添加该方法或查看How to capitalize the first letter of a String in Java?)。

可能还有其他方法,但它们会比这更难。


另见

How to create a custom EL function to invoke a static method?(函数定义的功劳)

Why are files case (in)sensitive on Linux and Windows?

【讨论】:

    猜你喜欢
    • 2012-02-03
    • 2012-04-04
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2013-03-06
    • 1970-01-01
    • 2011-10-14
    相关资源
    最近更新 更多