在Stackoverflow社区,
我在带有JSF/Primefaces的Java11上使用Wildfly 16。
在.xhtml源代码中使用includes时,我注意到此构造中路径"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,使文件访问在两个操作系统上要么区分大小写,要么不区分大小写?
发布于 2020-10-31 02:22:08
解决方案
我认为解决这个问题的最好方法是只用小写字母命名每个文件,而引用将转换为小写。
首先创建一个包含toLowerCase(String)方法的类。
public final class Functions {
private Functions() {
// Hide constructor.
}
public static String toLowerCase(String s) {
return s.toLowerCase();
}
}然后你必须定义一个functions.taglib.xml (functions就是一个如何命名的例子)。
<?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中注册标记库。
<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? (函数定义的信用)
https://stackoverflow.com/questions/64612710
复制相似问题