h:outputScript
タグを使用して、動的リソース(生成されたJavaScript、技術的にはJSONでの構成)を動的リソースとしてロードしたいと思います。私は、独自のサーブレットを作成し、通常のタグスクリプトを介してそれをロードすることでそれを実行できることを認識しています。これは、リソースをロードする「JSF-way」を好むためです。
それは可能ですか、そしてどのように?
はい、可能です。これは、特定のリソースライブラリ名を使用してカスタムインターセプトを設定し、特定のライブラリのリソースが要求されたときにResourceHandler
カスタムを返すことで実現できます。Resource
例えば
<h:outputScript library="dynamicJs" name="some.js" />
と
public class DynamicJsResourceHandler extends ResourceHandlerWrapper {
public DynamicJsResourceHandler(ResourceHandler wrapped) {
super(wrapped);
}
@Override
public Resource createResource(String resourceName, String libraryName) {
if ("dynamicJs".equals(libraryName)) {
return new DynamicJsResource(resourceName);
} else {
return super.createResource(resourceName, libraryName);
}
}
}
と
public class DynamicJsResource extends Resource {
private String resourceName;
public DynamicJsResource(String resourceName) {
this.resourceName;
}
@Override
public String getRequestPath() {
// TODO: return "/context/javax.faces.resource/" + resourceName + ".xhtml?ln=dynamicJs";
}
@Override
public URL getURL() {
// TODO: return new URL("http://localhost:8080" + getRequestPath());
}
@Override
public Map<String, String> getResponseHeaders() {
// TODO: return desired HTTP response headers.
}
@Override
public InputStream getInputStream() throws IOException {
// TODO: return InputStream by resourceName.
}
@Override
public boolean userAgentNeedsUpdate(FacesContext context) {
// TODO: return true when resource has been modified in server side.
}
}
実行するには、faces-config.xmlに次のように登録します。
<application>
<resource-handler>com.example.DynamicJsResourceHandler</resource-handler>
</application>
JSFユーティリティライブラリOmniFacesを使用している場合は、ボイラープレートコードを保存して、代わりにそのコードから拡張することもできるため、org.omnifaces.resourcehandler.DynamicResource
実装するだけで済みますgetInputStream()
。OmniFacesを使用しない場合は、いつでもそのソースコードをガイダンスとして使用できます。