IceFaces 4.2中JavascriptContext.includeLib的替代方案及外部JS加载方法
Hey there! I get it—moving from IceFaces 1.8 to 4.2 means saying goodbye to some old APIs like JavascriptContext.includeLib, but there are several solid alternatives to load external JS files. Let's break them down based on your use case:
1. Static Inclusion (Simplest Approach)
If you know which scripts you need upfront, use standard JSF's <h:outputScript> tag directly in your XHTML. This works seamlessly with IceFaces and is the most straightforward method:
- For local scripts stored in your project's resources folder (e.g.,
src/main/webapp/resources/js/external.js):
<h:outputScript library="js" name="external.js" />
- For remote scripts (like CDN-hosted libraries):
<h:outputScript src="https://cdn.example.com/external.js" />
2. Dynamic Inclusion via Backing Bean
If you need to load scripts conditionally (e.g., only when a certain button is clicked or a view is rendered), use JSF's ResourceHandler API in your backing bean:
import javax.faces.application.Resource; import javax.faces.application.ResourceHandler; import javax.faces.context.FacesContext; import javax.faces.component.UIViewRoot; public void loadScriptDynamically() { FacesContext context = FacesContext.getCurrentInstance(); ResourceHandler resourceHandler = context.getApplication().getResourceHandler(); // For local script Resource resource = resourceHandler.createResource("external.js", "js"); if (resource != null) { UIViewRoot viewRoot = context.getViewRoot(); viewRoot.addComponentResource(context, resource, "head"); } // For remote script (direct rendering approach) context.getResponseWriter().write("<script src='https://cdn.example.com/external.js'></script>"); }
3. Using @ResourceDependency Annotation
If you want a script to be automatically included whenever a specific managed bean or component is used, annotate your bean with @ResourceDependency:
import javax.faces.annotation.ResourceDependency; @ResourceDependency(library = "js", name = "external.js", target = "head") public class MyManagedBean { // Bean logic here }
A Quick Note on JavascriptRunner
You mentioned finding JavascriptRunner—it's important to clarify that this API is designed for executing inline JavaScript code (like calling a function dynamically), not for loading external JS files. For example, you'd use it like this:
import org.icefaces.util.JavascriptRunner; public void runInlineScript() { JavascriptRunner.runScript("alert('Hello from IceFaces!');"); }
Choose the method that best fits your use case: static inclusion for fixed scripts, dynamic inclusion for conditional loading, or the annotation for bean-dependent scripts.
内容的提问来源于stack exchange,提问作者Rishi Singhal

