Package javax.faces.component.search


package javax.faces.component.search

APIs for searching for components in the component tree by using expressions.

This feature has two entry points: for the page author and for the Java programmer. Following is a brief overview of each.

For the Page Author

The following tags support the use of search expressions: <h:message />, <h:messages />, <h:outputLabel />, and <f:ajax />. Each of those tags have one or more attributes whose value must be a client identifier. This feature expands the capability of those attributes to be search expressions. A search expression is space separated list of tokens, where a token can either be a client identifier, a search keyword, or a combination of both. See the specification for SearchKeywordResolver for the list of keywords that must be supported. See the specification for SearchExpressionHandler to learn how the search is performed.

Here is a brief example of the page author use case:

  1. <h:body>
  2.   <h:outputLabel id="label" for="@next" value="Test" />
  3.   <h:inputText id="input">
  4.     <f:ajax render="@this @next" />
  5.   </h:inputText>
  6.   <h:inputText id="input2" />
  7. </h:body>

For the Java Programmer

Using search expressions from Java code offers more flexibility. One must obtain a handle to the SearchExpressionHandler and invoke methods on it as desired.

The following example resolves to a clientId:

  1. SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler();
  2. SearchExpressionContext context = SearchExpressionContext.createSearchExpressionContext(facesContext, facesContext.getViewRoot());
  3. String clientId = handler.resolveClientId(context, ":form:container:@next");

The following example resolves to a component:

  1. SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler();
  2. SearchExpressionContext context = SearchExpressionContext.createSearchExpressionContext(facesContext, facesContext.getViewRoot());
  3. handler.resolveComponent(context, ":form:container:@next",
  4.                new ContextCallback() {
  5.                    public void invokeContextCallback(FacesContext context,
  6.                                             UIComponent target) {
  7.                        // target == the resolved component
  8.                    }
  9.                });

The following example uses multiple expressions and therefor resolves to multiple components:

  1. SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler();
  2. SearchExpressionContext context = SearchExpressionContext.createSearchExpressionContext(facesContext, facesContext.getViewRoot());
  3. handler.resolveComponents(context, ":form:container:@next :input1 input2:@parent",
  4.                new ContextCallback() {
  5.                    public void invokeContextCallback(FacesContext context,
  6.                                             UIComponent target) {
  7.                        // target == the resolved component
  8.                    }
  9.                });

Extending the Capabilities of the Component Search Facility

Creation of the SearchExpressionContext

As with other factories in JSF, the FactoryFinder is used by the system to create instances of the SearchExpressionContext which holds state during the operation of this API.

Adding new SearchKewordResolvers

See SearchKeywordResolver for the specification of how the set of keywords can be expanded.