Class ScriptParam

All Implemented Interfaces:
EditableValueHolder, PartialStateHolder, StateHolder, TransientStateHolder, ValueHolder, ComponentSystemEventListener, FacesListener, SystemEventListenerHolder, EventListener

public class ScriptParam extends OnloadParam

The <o:scriptParam> is a component that extends the standard <f:viewParam> with support for setting results of client-side evaluated JavaScript code in bean.

Usage

It's similar to the <f:viewParam>.

 <f:metadata>
     <o:scriptParam script="new Date().getTimezoneOffset()" value="#{bean.clientTimeZoneOffset}" />
     <o:scriptParam script="window.screen.width" value="#{bean.clientScreenWidth}" />
     <o:scriptParam script="someFunctionName()" value="#{bean.resultOfSomeFunctionName}" />
 </f:metadata>
 

You can use the render attribute to declare which components should be updated when a script parameter has been set.

 <f:metadata>
     <o:scriptParam script="foo()" value="#{bean.resultOfFoo}" render="fooResult" />
 </f:metadata>
 ...
 <h:body>
     ...
     <h:panelGroup id="fooResult">
         <ui:fragment rendered="#{not empty bean.resultOfFoo}">
             The result of foo() script is: #{bean.resultOfFoo}
         </ui:fragment>
     </h:panelGroup>
     ...
 </h:body>
 

Note that as it extends from the standard <f:viewParam>, its built-in conversion and validation functionality is also supported on this component. So, the following is also possible:

 <f:metadata>
     <o:scriptParam script="window.navigator" value="#{bean.clientNavigator}" />
 </f:metadata>
 
With a clientNavigator being an instance of jakarta.json.JsonObject:
 private JsonObject clientNavigator;
 
And this converter:
 package com.example;

 import java.io.StringReader;
 import jakarta.faces.component.UIComponent;
 import jakarta.faces.context.FacesContext;
 import jakarta.faces.convert.Converter;
 import jakarta.faces.convert.ConverterException;
 import jakarta.faces.convert.FacesConverter;
 import jakarta.json.Json;
 import jakarta.json.JsonObject;

 @FacesConverter(forClass = JsonObject.class)
 public class JsobObjectConverter implements Converter<JsonObject> {

     @Override
     public String getAsString(FacesContext context, UIComponent component, JsonObject modelValue) {
         if (modelValue == null) {
             return "";
         }

         return modelValue.toString();
     }

     @Override
     public JsonObject getAsObject(FacesContext context, UIComponent component, String submittedValue) {
         if (submittedValue == null || submittedValue.isEmpty()) {
             return null;
         }

         try {
             return Json.createReader(new StringReader(submittedValue)).readObject();
         }
         catch (Exception e) {
             throw new ConverterException("Not a valid JSON object", e);
         }
     }
 }
 

Events

When the script params have been set, then any method with the PostScriptParam annotation will be fired:

 @PostScriptParam
 public void initScriptParams() {
     // ...
 }
 

This is useful in case you want to preload the model for whatever is rendered by <o:scriptParam render>.

Since:
3.6
Author:
Bauke Scholtz
See Also:
  • Field Details

    • COMPONENT_TYPE

      public static final String COMPONENT_TYPE
      The component type, which is "org.omnifaces.component.input.ScriptParam".
      See Also:
    • EVENT_VALUE

      public static final String EVENT_VALUE
      The omnifaces event value, which is "setScriptParamValues".
      See Also:
  • Constructor Details

    • ScriptParam

      public ScriptParam()
  • Method Details

    • getInitScript

      protected String getInitScript(FacesContext context)
      Description copied from class: OnloadParam
      Returns script which should be executed upon initialization of a new view.
      Overrides:
      getInitScript in class OnloadParam
      Parameters:
      context - The involved faces context.
      Returns:
      Script which should be executed upon initialization of a new view.
    • getEventValue

      protected String getEventValue(FacesContext context)
      Description copied from class: OnloadParam
      Returns the value of the OmniFaces.OMNIFACES_EVENT_PARAM_NAME associated with the current component.
      Specified by:
      getEventValue in class OnloadParam
      Parameters:
      context - The involved faces context.
      Returns:
      The value of the OmniFaces.OMNIFACES_EVENT_PARAM_NAME associated with the current component.
    • decodeAll

      protected void decodeAll(FacesContext context)
      Description copied from class: OnloadParam
      Decode all relevant OnloadParam components at once.
      Specified by:
      decodeAll in class OnloadParam
      Parameters:
      context - The involved faces context.
    • getScript

      public String getScript()
      Returns the script to be evaluated.
      Returns:
      The script to be evaluated.
    • setScript

      public void setScript(String script)
      Sets the script to be evaluated.
      Parameters:
      script - The script to be evaluated.
    • isScriptParamRequest

      public static boolean isScriptParamRequest(FacesContext context)
      Returns true if the current request is triggered by a script param request. I.e. if it is initiated by OmniFaces.ScriptParam.setScriptParamValues() script which runs on page load.
      Parameters:
      context - The involved faces context.
      Returns:
      true if the current request is triggered by a script param request.