Top Description Fields Constructors Methods
javax.faces.application

public abstract Class ResourceHandler

extends Object
Class Inheritance
Known Direct Subclasses
javax.faces.application.ResourceHandlerWrapper, com.sun.faces.application.resource.ResourceHandlerImpl
Imports
java.io.IOException, java.util.HashSet, .Set, java.util.stream.Stream, javax.faces.context.FacesContext

ResourceHandler is the run-time API by which javax.faces.component.UIComponent and javax.faces.render.Renderer instances, and the javax.faces.view.ViewDeclarationLanguage can reference Resource instances. An implementation of this class must be thread-safe.

Packaging Resources

ResourceHandler defines a path based packaging convention for resources. The default implementation of ResourceHandler must support packaging resources in the classpath or in the web application root. See section JSF.2.6.1 of the spec prose document linked in the overview summary for the normative specification of packaging resources.

Briefly, The default implementation must support packaging resources in the web application root under the path

resources/<resourceIdentifier>

relative to the web app root. "resources" is the default location, but this location can be changed by the value of the WEBAPP_RESOURCES_DIRECTORY_PARAM_NAME <context-param>.

For the default implementation, resources packaged in the classpath must reside under the JAR entry name

META-INF/resources/<resourceIdentifier>

In the case of Faces Flows packaged within jar files, resources packaged in the classpath must reside under the jar entry name

META-INF/flows/<resourceIdentifier>

<resourceIdentifier> consists of several segments, specified as follows.

[localePrefix/][libraryName/][libraryVersion/]resourceName[/resourceVersion]

None of the segments in the resourceIdentifier may be relative paths, such as ‘../otherLibraryName’. The implementation is not required to support the libraryVersion and resourceVersion segments for the JAR packaging case.

Note that resourceName is the only required segment.

Encoding Resources

During the handling of view requests, the JSF run-time may be called upon to encode a resource in such a way as to instruct the user-agent to make a subsequent resource request. This behavior is orchestrated by one of the resource renderers (ScriptRenderer, StylesheetRenderer, ImageRenderer), which all call Resource#getRequestPath to obtain the encoded URI for the resource. See Resource#getRequestPath and the Standard HTML RenderKit specification for the complete specification.

This usage of resources does not apply for resources that correspond to VDL resources.

Decoding Resources

During the handling of resource requests, the JSF run-time will be called upon to decode a resource in such a way as to serve up the bytes of the resource to the user-agent. This behavior is orchestrated by handleResourceRequest, which calls Resource#getInputStream to obtain bytes of the resource. See handleResourceRequest for the complete specification.

This usage of resources does not apply for resources that correspond to VDL resources.

Since
2.0

Field Summary

Modifier and TypeField and Description
public static final String
JSF_SCRIPT_LIBRARY_NAME

Library name of JSF script resource.

public static final String
JSF_SCRIPT_RESOURCE_NAME

Resource name of JSF script resource.

public static final String
LOCALE_PREFIX

The name of a key within the application message bundle named by the return from Application#getMessageBundle whose value is the locale prefix used to find a packaged resource to return from createResource (or one of its variants).

public static final String
RESOURCE_CONTRACT_XML

This file must be located in META-INF/contracts/<contractName>/ in a jar file that contains a resource library contract, where <contractName> is the name of the contract.

public static final String
RESOURCE_EXCLUDES_DEFAULT_VALUE

The default value for the RESOURCE_EXCLUDES_PARAM_NAME init param.

public static final String
RESOURCE_EXCLUDES_PARAM_NAME

The ServletContext init parameter consulted by the handleResourceRequest to tell which kinds of resources must never be served up in response to a resource request.

public static final String
RESOURCE_IDENTIFIER

Resource#getRequestPath returns the value of this constant as the prefix of the URI.

public static final String
WEBAPP_CONTRACTS_DIRECTORY_PARAM_NAME

If a <context-param> with the param name equal to the value of WEBAPP_CONTRACTS_DIRECTORY_PARAM_NAME exists, the runtime must interpret its value as a path, relative to the web app root, where resource library contracts are to be located.

public static final String
WEBAPP_RESOURCES_DIRECTORY_PARAM_NAME

If a <context-param> with the param name equal to the value of WEBAPP_RESOURCES_DIRECTORY_PARAM_NAME exists, the runtime must interpret its value as a path, relative to the web app root, where resources are to be located.

Constructor Summary

AccessConstructor and Description
public

Method Summary

Modifier and TypeMethod and Description
public abstract Resource

Returns:

a newly created Resource instance, suitable for use in encoding or decoding the named resource.
createResource
(String
the name of the resource.
resourceName
)

Create an instance of ViewResource given the argument resourceName.

public abstract Resource

Returns:

a newly created Resource instance, suitable for use in encoding or decoding the named resource.
createResource
(String
the name of the resource.
resourceName
,
String
the name of the library (or contract) in which this resource resides, may be null. If there is a conflict between the name of a resource library and a resource library contract, the resource library takes precedence. May not include relative paths, such as "../".
libraryOrContractName
)

Create an instance of Resource with a resourceName given by the value of the argument resourceName that is a member of the library named by the argument libraryName.

public abstract Resource

Returns:

a newly created Resource instance, suitable for use in encoding or decoding the named resource.
createResource
(String
the name of the resource.
resourceName
,
String
the name of the library in which this resource resides, may be null. May not include relative paths, such as "../".
libraryName
,
String
the mime content that this Resource instance will return from Resource#getContentType. If the value is null, The content-type of the resource is derived by passing the resourceName to javax.faces.context.ExternalContext#getMimeType
contentType
)

Create an instance of Resource with a resourceName given by the value of the argument resourceName that is a member of the library named by the argument libraryName that claims to have the content-type given by the argument content-type.

public Resource

Returns:

a newly created Resource instance, suitable for use in encoding or decoding the named resource.
createResourceFromId
(String
the resource identifier of the resource.
resourceId
)

Create an instance of Resource given the argument resourceId.

public ViewResource

Returns:

a newly created ViewResource instance, suitable for use by the javax.faces.view.ViewDeclarationLanguage.
createViewResource
(FacesContext
the FacesContext for this request.
context
,
String
the name of the resource to be interpreted as a view by the javax.faces.view.ViewDeclarationLanguage.
resourceName
)

Create an instance of Resource given the argument resourceName, which may contain "/" characters.

public abstract String

Returns:

the renderer type.
getRendererTypeForResourceName
(String
the resource name.
resourceName
)

Return the renderer-type for a javax.faces.render.Renderer that is capable of rendering this resource.

public Stream<String>

Returns:

the Stream of view resource names
getViewResources
(FacesContext
The FacesContext for this request.
facesContext
,
String
The initial path from which to start looking for view resources
path
,
int
The absolute maximum depth of nested directories to visit counted from the root (/).
maxDepth
,
ResourceVisitOption...
The options to influence the traversal. See ResourceVisitOption for details on those.
options
)

Return a Stream possibly lazily populated by walking the resource tree rooted at a given initial path.

public Stream<String>

Returns:

the Stream of view resource names
getViewResources
(FacesContext
The FacesContext for this request.
facesContext
,
String
The initial path from which to start looking for view resources
path
,
ResourceVisitOption...
The options to influence the traversal. See ResourceVisitOption for details on those.
options
)

Return a Stream possibly lazily populated by walking the resource tree rooted at a given initial path.

public abstract void
handleResourceRequest(FacesContext context)

This method specifies the contract for satisfying resource requests.

public boolean

Returns:

Whether the resource as identified by given resource and library name has been rendered.
isResourceRendered
(FacesContext
The FacesContext for this request.
context
,
String
The name of the resource.
resourceName
,
String
The name of the library in which this resource resides, may be null.
libraryName
)

Returns whether the resource as identified by given resource and library name has been rendered.

public abstract boolean

Returns:

true if the current request is a resource request, false otherwise.
isResourceRequest
(FacesContext context)

Return true if the current request is a resource request.

public boolean

Returns:

true if this is a resource URL, false otherwise.
isResourceURL
(String
the url to inspect for the presence of ResourceHandler#RESOURCE_IDENTIFIER.
url
)

Return true if the argument url contains the string given by the value of the constant ResourceHandler#RESOURCE_IDENTIFIER, false otherwise.

public abstract boolean

Returns:

true if the library exists, false otherwise.
libraryExists
(String
the library name.
libraryName
)

Return true if the resource library named by the argument libraryName can be found.

public void
markResourceRendered(FacesContext
The FacesContext for this request.
context
,
String
The name of the resource.
resourceName
,
String
The name of the library in which the resource resides, may be null.
libraryName
)

Mark the resource as identified by given resource and library name as rendered.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

JSF_SCRIPT_LIBRARY_NAMEback to summary
public static final String JSF_SCRIPT_LIBRARY_NAME

Library name of JSF script resource.

Since
2.3
JSF_SCRIPT_RESOURCE_NAMEback to summary
public static final String JSF_SCRIPT_RESOURCE_NAME

Resource name of JSF script resource.

Since
2.3
LOCALE_PREFIXback to summary
public static final String LOCALE_PREFIX

The name of a key within the application message bundle named by the return from Application#getMessageBundle whose value is the locale prefix used to find a packaged resource to return from createResource (or one of its variants).

RESOURCE_CONTRACT_XMLback to summary
public static final String RESOURCE_CONTRACT_XML

This file must be located in META-INF/contracts/<contractName>/ in a jar file that contains a resource library contract, where <contractName> is the name of the contract. If the jar file contains multiple contracts, the marker file must be present in each one. See “constant field values” for the name of the file that must be placed at that location.

Since
2.2
RESOURCE_EXCLUDES_DEFAULT_VALUEback to summary
public static final String RESOURCE_EXCLUDES_DEFAULT_VALUE

The default value for the RESOURCE_EXCLUDES_PARAM_NAME init param.

RESOURCE_EXCLUDES_PARAM_NAMEback to summary
public static final String RESOURCE_EXCLUDES_PARAM_NAME

The ServletContext init parameter consulted by the handleResourceRequest to tell which kinds of resources must never be served up in response to a resource request. The value of this parameter is a single space separated list of file extensions, including the leading '.' character (without the quotes). If not specified, the default value given in the value of the RESOURCE_EXCLUDES_DEFAULT_VALUE constant is used. If manually specified, the given value entirely overrides the default one and does not supplement it.

RESOURCE_IDENTIFIERback to summary
public static final String RESOURCE_IDENTIFIER

Resource#getRequestPath returns the value of this constant as the prefix of the URI. handleResourceRequest(javax.faces.context.FacesContext) looks for the value of this constant within the request URI to determine if the request is a resource request or a view request.

WEBAPP_CONTRACTS_DIRECTORY_PARAM_NAMEback to summary
public static final String WEBAPP_CONTRACTS_DIRECTORY_PARAM_NAME

If a <context-param> with the param name equal to the value of WEBAPP_CONTRACTS_DIRECTORY_PARAM_NAME exists, the runtime must interpret its value as a path, relative to the web app root, where resource library contracts are to be located. This param value must not start with a "/", though it may contain "/" characters. If no such <context-param> exists, or its value is invalid, the value "contracts", without the quotes, must be used by the runtime as the value.

Since
2.2
WEBAPP_RESOURCES_DIRECTORY_PARAM_NAMEback to summary
public static final String WEBAPP_RESOURCES_DIRECTORY_PARAM_NAME

If a <context-param> with the param name equal to the value of WEBAPP_RESOURCES_DIRECTORY_PARAM_NAME exists, the runtime must interpret its value as a path, relative to the web app root, where resources are to be located. This param value must not start with a "/", though it may contain "/" characters. If no such <context-param> exists, or its value is invalid, the value "resources", without the quotes, must be used by the runtime as the value.

Since
2.2

Constructor Detail

ResourceHandlerback to summary
public ResourceHandler()

Method Detail

createResourceback to summary
public abstract Resource createResource(String resourceName)

Create an instance of ViewResource given the argument resourceName. The content-type of the resource is derived by passing the resourceName to javax.faces.context.ExternalContext#getMimeType

The algorithm specified in section JSF.2.6.1.4 of the spec prose document linked in the overview summary must be executed to create the Resource. New requirements were introduced in version 2.2 of the specification. For historical reasons, this method operate correctly when the argument resourceName is of the form libraryName/resourceName, even when resourceName contains '/' characters.

Parameters
resourceName:String

the name of the resource.

Returns:Resource

a newly created Resource instance, suitable for use in encoding or decoding the named resource.

Exceptions
NullPointerException:
if resourceName is null.
createResourceback to summary
public abstract Resource createResource(String resourceName, String libraryOrContractName)

Create an instance of Resource with a resourceName given by the value of the argument resourceName that is a member of the library named by the argument libraryName. The content-type of the resource is derived by passing the resourceName to javax.faces.context.ExternalContext#getMimeType.

The algorithm specified in section JSF.2.6.1.4 of the spec prose document linked in the overview summary must be executed to create the Resource. New requirements were introduced in version 2.2 of the specification.

Parameters
resourceName:String

the name of the resource.

libraryOrContractName:String

the name of the library (or contract) in which this resource resides, may be null. If there is a conflict between the name of a resource library and a resource library contract, the resource library takes precedence. May not include relative paths, such as "../".

Returns:Resource

a newly created Resource instance, suitable for use in encoding or decoding the named resource.

Exceptions
NullPointerException:
if resourceName is null
createResourceback to summary
public abstract Resource createResource(String resourceName, String libraryName, String contentType)

Create an instance of Resource with a resourceName given by the value of the argument resourceName that is a member of the library named by the argument libraryName that claims to have the content-type given by the argument content-type.

The algorithm specified in section JSF.2.6.1.4 of the spec prose document linked in the overview summary must be executed to create the Resource. New requirements were introduced in version 2.2 of the specification.

Parameters
resourceName:String

the name of the resource.

libraryName:String

the name of the library in which this resource resides, may be null. May not include relative paths, such as "../".

contentType:String

the mime content that this Resource instance will return from Resource#getContentType. If the value is null, The content-type of the resource is derived by passing the resourceName to javax.faces.context.ExternalContext#getMimeType

Returns:Resource

a newly created Resource instance, suitable for use in encoding or decoding the named resource.

Exceptions
NullPointerException:
if resourceName is null.
createResourceFromIdback to summary
public Resource createResourceFromId(String resourceId)

Create an instance of Resource given the argument resourceId. The content-type of the resource is derived by passing the resourceName to javax.faces.context.ExternalContext#getMimeType

The resource must be identified according to the specification in JSF.2.6.1.3 of the spec prose document linked in the overview summary. New requirements were introduced in version 2.2 of the specification.

Parameters
resourceId:String

the resource identifier of the resource.

Returns:Resource

a newly created Resource instance, suitable for use in encoding or decoding the named resource.

Exceptions
NullPointerException:
if resourceId is null.
Since
2.2
createViewResourceback to summary
public ViewResource createViewResource(FacesContext context, String resourceName)

Create an instance of Resource given the argument resourceName, which may contain "/" characters. The javax.faces.view.ViewDeclarationLanguage calls this method when it needs to load a view from a persistent store, such as a filesystem. This method is functionality equivalent to createResource(java.lang.String), but all callsites that need to load VDL views must use this method so that classes that want to decorate the ResourceHandler in order to only affect the loading of views may do so without affecting the processing of other kinds of resources, such as scripts and stylesheets. A javax.faces.context.FacesContext must be present before calling this method. To preserve compatibility with prior revisions of the specification, a default implementation must be provided that calls createResource(java.lang.String).

The default implementation must look for the resource in the following places, in this order.

  • Considering resource library contracts (at the locations specified in the spec prose document section Resource Library Contracts in the Request Processing Lifecycle chapter).

  • Considering the web app root.

  • Considering faces flows (at the locations specified in the spec prose document section Faces Flows in the Using JSF in Web Applications chapter).

Call FacesContext#getResourceLibraryContracts. If the result is non-null and not empty, for each value in the list, treat the value as the name of a resource library contract. If the argument resoureName exists as a resource in the resource library contract, return it. Otherwise, return the resource (not in the resource library contract), if found. Otherwise, return null.

Parameters
context:FacesContext

the FacesContext for this request.

resourceName:String

the name of the resource to be interpreted as a view by the javax.faces.view.ViewDeclarationLanguage.

Returns:ViewResource

a newly created ViewResource instance, suitable for use by the javax.faces.view.ViewDeclarationLanguage.

Exceptions
NullPointerException:
if resourceName is null.
Since
2.2
getRendererTypeForResourceNameback to summary
public abstract String getRendererTypeForResourceName(String resourceName)

Return the renderer-type for a javax.faces.render.Renderer that is capable of rendering this resource. The default implementation must return values according to the following table. If no renderer-type can be determined, null must be returned.

resource name to renderer-type mapping
example resource name renderer-type
mycomponent.js javax.faces.resource.Script
mystyle.css javax.faces.resource.Stylesheet
Parameters
resourceName:String

the resource name.

Returns:String

the renderer type.

getViewResourcesback to summary
public Stream<String> getViewResources(FacesContext facesContext, String path, int maxDepth, ResourceVisitOption... options)

Return a Stream possibly lazily populated by walking the resource tree rooted at a given initial path. The resource tree is traversed breadth-first, the elements in the stream are view resource names that would yield a ViewResource when passed into ResourceHandler#createViewResource as the resourceName parameter.

The maxDepth parameter is the maximum depth of directory levels to visit beyond the initial path, which is always visited. The value is relative to the root (/), not to the given initial path. E.g. given maxDepth = 3 and initial path /foo/, visiting will proceed up to /foo/bar/, where / counts as depth 1, /foo/ as depth 2 and /foo/bar/ as depth 3. A value lower or equal to the depth of the initial path means that only the initial path is visited. A value of MAX_VALUE may be used to indicate that all levels should be visited.

Parameters
facesContext:FacesContext

The FacesContext for this request.

path:String

The initial path from which to start looking for view resources

maxDepth:int

The absolute maximum depth of nested directories to visit counted from the root (/).

options:ResourceVisitOption[]

The options to influence the traversal. See ResourceVisitOption for details on those.

Returns:Stream<String>

the Stream of view resource names

Since
2.3
getViewResourcesback to summary
public Stream<String> getViewResources(FacesContext facesContext, String path, ResourceVisitOption... options)

Return a Stream possibly lazily populated by walking the resource tree rooted at a given initial path. The resource tree is traversed breadth-first, the elements in the stream are view resource names that would yield a ViewResource when passed into ResourceHandler#createViewResource as the resourceName parameter.

This method works as if invoking it were equivalent to evaluating the expression:

getViewResources(facesContext, start, Integer.MAX_VALUE, options)
Put differently, it visits all levels of the resource tree.
Parameters
facesContext:FacesContext

The FacesContext for this request.

path:String

The initial path from which to start looking for view resources

options:ResourceVisitOption[]

The options to influence the traversal. See ResourceVisitOption for details on those.

Returns:Stream<String>

the Stream of view resource names

Since
2.3
handleResourceRequestback to summary
public abstract void handleResourceRequest(FacesContext context) throws IOException

This method specifies the contract for satisfying resource requests. This method is called from javax.faces.webapp.FacesServlet#service after that method determines the current request is a resource request by calling isResourceRequest. Thus, handleResourceRequest may assume that the current request is a resource request.

The default implementation must implement an algorithm semantically identical to the following algorithm.

For discussion, in all cases when a status code is to be set, this spec talks only using the Servlet API, but it is understood that in a portlet environment the appropriate equivalent API must be used.
  • If the resourceIdentifier ends with any of the extensions listed in the value of the RESOURCE_EXCLUDES_PARAM_NAME init parameter, HttpServletRequest.SC_NOT_FOUND must be passed to HttpServletResponse.setStatus(), then handleResourceRequest must immediately return.

  • Extract the resourceName from the resourceIdentifier by taking the substring of resourceIdentifier that starts at RESOURCE_IDENTIFIER.length() + 1 and goes to the end of resourceIdentifier. If no resourceName can be extracted, HttpServletRequest.SC_NOT_FOUND must be passed to HttpServletResponse.setStatus(), then handleResourceRequest must immediately return.

  • Extract the libraryName from the request by looking in the request parameter map for an entry under the key "ln", without the quotes. If found, use its value as the libraryName.

  • If resourceName and libraryName are present, call createResource(String, String) to create the Resource. If only resourceName is present, call createResource(String) to create the Resource. If the Resource cannot be successfully created, HttpServletRequest.SC_NOT_FOUND must be passed to HttpServletResponse.setStatus(), then handleResourceRequest must immediately return.

  • Call Resource#userAgentNeedsUpdate. If this method returns false, HttpServletRequest.SC_NOT_MODIFIED must be passed to HttpServletResponse.setStatus(), then handleResourceRequest must immediately return.

  • Pass the result of Resource#getContentType to HttpServletResponse.setContentType.

  • Call Resource#getResponseHeaders. For each entry in this Map, call HttpServletResponse.setHeader(), passing the key as the first argument and the value as the second argument.

  • Call Resource#getInputStream and serve up the bytes of the resource to the response.

  • Call HttpServletResponse.setContentLength() passing the byte count of the resource.

  • If an IOException is thrown during any of the previous steps, log a descriptive, localized message, including the resourceName and libraryName (if present). Then, HttpServletRequest.SC_NOT_FOUND must be passed to HttpServletResponse.setStatus(), then handleResourceRequest must immediately return.

  • In all cases in this method, any streams, channels, sockets, or any other IO resources must be closed before this method returns.

Parameters
context:FacesContext

the javax.faces.context.FacesContext for this request

Exceptions
IOException:
when an I/O error occurs.
isResourceRenderedback to summary
public boolean isResourceRendered(FacesContext context, String resourceName, String libraryName)

Returns whether the resource as identified by given resource and library name has been rendered. The default implementation must during the render response phase of the current view return true when the resource has been marked as rendered via markResourceRendered(FacesContext, String, String).

Parameters
context:FacesContext

The FacesContext for this request.

resourceName:String

The name of the resource.

libraryName:String

The name of the library in which this resource resides, may be null.

Returns:boolean

Whether the resource as identified by given resource and library name has been rendered.

Annotations
@SuppressWarnings:unchecked
Since
2.3
isResourceRequestback to summary
public abstract boolean isResourceRequest(FacesContext context)

Return true if the current request is a resource request. This method is called by javax.faces.webapp.FacesServlet#service to determine if this request is a view request or a resource request.

Parameters
context:FacesContext

the javax.faces.context.FacesContext for this request

Returns:boolean

true if the current request is a resource request, false otherwise.

isResourceURLback to summary
public boolean isResourceURL(String url)

Return true if the argument url contains the string given by the value of the constant ResourceHandler#RESOURCE_IDENTIFIER, false otherwise.

Parameters
url:String

the url to inspect for the presence of ResourceHandler#RESOURCE_IDENTIFIER.

Returns:boolean

true if this is a resource URL, false otherwise.

Exceptions
NullPointerException:
if the argument url is null.
libraryExistsback to summary
public abstract boolean libraryExists(String libraryName)

Return true if the resource library named by the argument libraryName can be found. If there is a localePrefix for this application, as defined in LOCALE_PREFIX, first look for the library with the prefix. If no such library is found, look for the library without the prefix. This allows developers to avoid duplication of files. For example, consider the case where the developer wants to have a resource library containing a localized image resource and a non-localized script resource. By checking both locations for the existence of the library, along with other spec changes in section 2.6.1.4, this scenario is enabled.

Parameters
libraryName:String

the library name.

Returns:boolean

true if the library exists, false otherwise.

Since
2.0
markResourceRenderedback to summary
public void markResourceRendered(FacesContext context, String resourceName, String libraryName)

Mark the resource as identified by given resource and library name as rendered. The default implementation must ensure that isResourceRendered(FacesContext, String, String) will return true when the resource has already been rendered during the render response phase of the current view.

Parameters
context:FacesContext

The FacesContext for this request.

resourceName:String

The name of the resource.

libraryName:String

The name of the library in which the resource resides, may be null.

Annotations
@SuppressWarnings:unchecked
Since
2.3