gpt4 book ai didi

java - 是否可以在 JSF 中包含一个文件夹中的所有 javascripts 文件?

转载 作者:搜寻专家 更新时间:2023-11-01 02:17:19 25 4
gpt4 key购买 nike

我正在使用 JSF 2.0,并且正在寻找一种方法来在页面上包含给定文件夹中的所有 javascript,即做类似的事情

<h:outputScript library="javascript" name="*.js" target="head" />

这种事情有可能吗?我是否应该使用 Java 代码编写自定义组件来实现此目的?

谢谢你的帮助,
塞巴斯蒂安·特龙普

最佳答案

好主意。 JSF API 不支持这一点,但理论上可以使用自定义脚本渲染器。我围绕它玩了一些,这确实是可能的。只需创建一个 MultiScriptRenderer,它 extends ScriptRenderer 并覆盖 encodeEnd()检查 name 属性是否包含 * 通配符,然后通过在资源文件夹中扫描与此模式匹配的文件来进行相应处理。

这是一个启动示例:

package com.example;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import com.sun.faces.renderkit.html_basic.ScriptRenderer;

public class MultiScriptRenderer extends ScriptRenderer {

@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
Map<String, Object> attributes = component.getAttributes();
String name = (String) attributes.get("name");
if (name.contains("*")) {
String pattern = name.replace(".", "\\.").replace("*", ".*");
String library = (String) attributes.get("library");
File root = new File(context.getExternalContext().getRealPath("/resources/" + (library != null ? library : "")));
for (File file : root.listFiles()) {
if (file.getName().matches(pattern)) {
attributes.put("name", file.getName());
super.encodeEnd(context, component);
}
}
attributes.put("name", name); // Put original name back. You never know.
} else {
super.encodeEnd(context, component);
}
}
}

faces-config.xml 中注册它,如下所示 (抱歉,@FacesRenderer 注释只有在 JSF 2.2 中针对这个特定的特殊情况修复后才会起作用,另请参阅JSF issue 1748 ):

<render-kit>
<renderer>
<component-family>javax.faces.Output</component-family>
<renderer-type>javax.faces.resource.Script</renderer-type>
<renderer-class>com.example.MultiScriptRenderer</renderer-class>
</renderer>
</render-kit>

在此处的 Mojarra 2.0.3 上工作正常。您可以使用 *.jsprefix*.js 等模式。特定的代码示例仅与特定的 JSF 实现紧密耦合以保存代码样板。它还要求在部署时扩展 WAR,否则将无法通过 File#listFiles() 浏览目录(因此不包括某些(较旧的)servletcontainer 版本/配置)。对于其他 JSF 实现,您必须改为扩展其 ScriptRenderer,或者如果您希望独立于实现,则编写一个全新的实现(尽管这应该非常简单,只需查看标准的 ScriptRenderer source 如果你卡住了)。

关于java - 是否可以在 JSF 中包含一个文件夹中的所有 javascripts 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4482443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com