PATH |
WOComponent
Inherits from: WOElement Object
Implements: NSKeyValueCoding NSKeyValueCoding.ErrorHandling NSKeyValueCodingAdditions NSValidation WOActionResults Cloneable Serializable
Package: com.webobjects.appserver
Class Description
WOComponent objects dynamically render web pages (or sections of pages) at run time. They provide custom navigation and other logic for the page, provide a framework for organizing constituent objects (static and dynamic HTML elements and subcomponents), and enable the attribute bindings of dynamic elements.
The WOComponent class has many methods that have the same names as methods of the WOApplication class. However, the scope of the WOComponent methods is limited to a component rather than being application-wide. For example, you can control component-definition caching on a per-component basis using setCachingEnabled, which has a WOApplication counterpart. When this kind of caching is enabled for a component, the application parses the contents of the component directory the first time the component is requested, creates the component definition, stores this object in memory, and restores it for subsequent requests.
WOComponent objects also respond to awake, sleep, and the three request-handling messages: takeValuesFromRequest, invokeAction,and appendToResponse. You can override these methods in your compiled subclasses, and thereby integrate your custom behavior into the request-response loop.
Subcomponents
A WOComponent object can represent a dynamic fragment of a Web page as well as an entire page. Such subcomponents, or reusable components, are nested within a parent component representing the page or another subcomponent. Each component keeps track of its parent and subcomponents-when a component receives a request-handling message, such as takeValuesFromRequest, it forwards that message to its subcomponents
The WOComponent class also provides a child-parent callback mechanism to allow a child component to communicate with its parent. In the parent's declaration file, bind an arbitrary attribute of the child to an action method of the parent. Then, as the last step in the child's action method, invoke performParentAction with the argument being the arbitrary attribute, returning the object received back as the response page. See the method description for performParentAction for details.
Stateless Components
For extra efficiency, you can create stateless components: components that can be shared between sessions. Stateless components aren't replicated each time they're needed; rather, a single shared instance is referenced each time the component is used.
Stateless components cannot have state. They can have instance variables, but the variable's content must be transient. To ensure that when the shared instance of a component is reused by another session there are no side effects, reset your component's instance variables by implementing the reset method. In your implementation of reset , release and set to null each instance variable. Note that a stateless component's instance variables will remain valid for the duration of the phase ( takeValuesFromRequest, invokeAction, appendToResponse); this lets you use instance variables in your stateless components to hold things analgous to items in a WORepetition.
Stateless components primarily save memory, but they can significantly speed up your application as well depending on how many stateless components you use in your application. To make a component stateless, override the component's isStateless method so that it returns true.
If a stateless component is needed simultaneously in separate threads, additional instances of the component are created (and later discarded) as necessary to prevent conflicts. Thus, the number of threads in which a component could be used determines the maximum number of instances of a stateless component that may be allocated at any given time.
Interfaces Implemented
WOActionResults generateResponse NSKeyValueCoding takeValueForKey valueForKey NSKeyValueCodingAdditions takeValueForKeyPath valueForKeyPath NSKeyValueCoding.ErrorHandling handleQueryWithUnboundKey handleTakeValueForUnboundKey unableToSetNullForKey
Method Types
Creation WOComponent Obtaining attributes application baseURL bindingKeys context frameworkName hasSession name pageWithName path session Caching isCachingEnabled setCachingEnabled Handling requests appendToResponse awake ensureAwakeInContext invokeAction sleep takeValuesFromRequest Logging debugString isEventLoggingEnabled logString Template parsing templateWithHTMLString Component statistics descriptionForResponse Invoking actions parent performParentAction Synchronizing components canGetValueForBinding canSetValueForBinding hasBinding pullValuesFromParent pushValuesToParent setValueForBinding synchronizesVariablesWithBindings valueForBinding Other canAccessFieldsDirectly isStateless reset set_componentUnroll set_unroll template templateWithName toString validateTakeValueForKeyPath
Constructors
WOComponent
public WOComponent(WOContext aContext)
public WOComponent()
Static Methods
canAccessFieldsDirectly
public static boolean canAccessFieldsDirectly()
true
, indicating that key/value coding is allowed to access fields in this object if an appropriate method isn't present.
debugString
public static void debugString(String aString)
logString
public static void logString(String aString)
int i = 500; float f = 2.045; WOComponent.logString("Amount = " + i + ", Rate = " + f ", Total = " + i*f);
templateWithHTMLString
public static WOElement templateWithHTMLString( String anHTMLString, String aDeclarationString, NSArray languages)
See Also: templateWithName
Instance Methods
appendToResponse
public void appendToResponse( WOResponse aResponse, WOContext aContext)
See Also: invokeAction, takeValuesFromRequest
application
public WOApplication application()
See Also: WOApplication class, context, session
awake
public void awake()
See Also: ensureAwakeInContext, sleep
baseURL
public String baseURL()
bindingKeys
public NSArray bindingKeys()
canGetValueForBinding
public boolean canGetValueForBinding(String aBindingName)
See Also: canSetValueForBinding, hasBinding, valueForBinding
canSetValueForBinding
public boolean canSetValueForBinding(String aBindingName)
See Also: canGetValueForBinding, hasBinding, setValueForBinding
clone()
public Object clone() throws CloneNotSupportedException
context
public WOContext context()
See Also: WOContext class, application, session
descriptionForResponse
public String descriptionForResponse( WOResponse aResponse, WOContext aContext)
This message is sent only to the top-level response component, that is, the one representing the entire page. Components nested inside of that top-level component do not receive this message.
If a CLFF log file is kept for this application, the string returned by this method is recorded in that log file. Thus, you must ensure that the string you return can be analyzed by a CLFF-analysis tool.
See Also: WOStatisticsStore class
ensureAwakeInContext
public void ensureAwakeInContext(WOContext aContext)
Ensures that the receiver is awake in the specified context. Invoke this method before using a component which was stored in a variable. You don't need to invoke ensureAwakeInContext if the component was just created with pageWithName, if it was restored from the WebObjects page cache, or if the page will simply be returned as the result of an action. That is, you only need to invoke this method if you're going to send messages to a component that is otherwise not awakened. If the receiving component is already awake, this method has no effect.
See Also: awake
frameworkName
public String frameworkName()
If the component is not stored in a framework, this method returns null.
See Also: WOResourceManager class
generateResponse
public WOResponse generateResponse()
See Also: generateResponse (WOResponse)
handleQueryWithUnboundKey
public Object handleQueryWithUnboundKey(String key)
handleTakeValueForUnboundKey
public void handleTakeValueForUnboundKey(Object value, String key)
hasBinding
public boolean hasBinding(String aBindingName)
See Also: canGetValueForBinding, canSetValueForBinding
hasSession
public boolean hasSession()
See Also: session
invokeAction
public WOActionResults invokeAction( WORequest aRequest, WOContext aContext)
See Also: appendToResponse, takeValuesFromRequest
isCachingEnabled
public boolean isCachingEnabled()
See Also: setCachingEnabled
isEventLoggingEnabled
public boolean isEventLoggingEnabled()
Called to determine if a component wants event logging. This is not desirable, for example, for components which are associated with event display as they would interfere with the actual event logging. The default implementation of this method returns true.
See Also: WOEvent class
isStateless
public boolean isStateless()
By default, this method returns false, indicating that state will be maintained for instances of the receiver. Overriding this method to return true will make the component stateless. A single instance of each stateless component is shared between multiple sessions, reducing your application's memory footprint.
See Also: reset
name
public String name()
pageWithName
public WOComponent pageWithName(String aName)
See Also: restorePageForContextID (WOSession), savePage (WOSession)
parent
public WOComponent parent()
path
public String path()
performParentAction
public Object performParentAction(String anActionName)
An example best illustrates this mechanism. Let's say you have a Palette subcomponent, and this WOComponent is nested in a parent component with a "displaySelection" action method. When the user selects an item in the palette (perhaps a color), you want to invoke "displaySelection" to show the result of the new selection (perhaps a car in the new color). The declaration in the parent's ".wod" file would look like this:
PALETTE: Palette { selection = number; callBack = "displaySelection"; };
The "callBack" item is an arbitrary attribute of the child component bound in this declaration to the parent component's "displaySelection" method.The performParentAction method is used to activate this binding. Let's assume the child component has an action method called "click"; the implementation would look like this:
public WOComponent click() { /* this is the child's action */ selection = /* some value */; /* now invoke the parent's action */ return performParentAction(callBack); }
pullValuesFromParent
public void pullValuesFromParent()
true
), this method causes binding values to be pulled from the parent component.
pushValuesToParent
public void pushValuesToParent()
true
), this method causes binding values to be pushed up to the parent component.
reset
public void reset()
This method-which is only invoked if the component is stateless-allows a component instance to reset or delete temporary references to objects that are specific to a given context. To ensure that when the shared instance of a component is reused by another session there are no side effects, implement this method so that it releases and sets to null each of the component's instance variables.
See Also: isStateless
session
public WOSession session()
See Also: WOSession class, application, context, hasSession
setCachingEnabled
public void setCachingEnabled(boolean flag)
With WOApplication's method of the same name, you can turn component-definition caching off globally. You can then control caching of individual component definitions using WOComponent's version of this method. Selective caching is an especially valuable technique for very large applications where only the most frequently requested components should be cached.
See Also: isCachingEnabled
set_componentUnroll
public void set_componentUnroll(Object anObject)
set_unroll
public void set_unroll(Object anObject)
setValueForBinding
public void setValueForBinding( Object aValue, String aBindingName)
See Also: isValueSettableInComponent (WOAssociation class)
sleep
public void sleep()
synchronizesVariablesWithBindings
public boolean synchronizesVariablesWithBindings()
See Also: setValueForBinding, valueForBinding
takeValueForKey
public void takeValueForKey(Object value, String key)
takeValueForKeyPath
public void takeValueForKeyPath(Object value, String keyPath)
takeValuesFromRequest
public void takeValuesFromRequest( WORequest aRequest, WOContext aContext)
See Also: appendToResponse, invokeAction
template
public WOElement template()
templateWithName
public WOElement templateWithName(String aName)
See Also: setCachingEnabled
toString
public String toString()
unableToSetNullForKey
public void unableToSetNullForKey(String key)
validationFailedWithException
public void validationFailedWithException( Throwable exception, Object value, String keyPath)
validateTakeValueForKeyPath
public Object validateTakeValueForKeyPath(Object value, String keyPath) throws NSValidation.ValidationException
Validates (and coerces) the given value, assigning it if it is different than the current value. Throws a validation exception if validateValueForKey returns an exception. Returns the coerced (assigned) value.
validateValueForKey
public Object validateValueForKey(Object value, String key) throws NSValidation.ValidationException
valueForBinding
public Object valueForBinding(String aBindingName)
See Also: canGetValueForBinding, setValueForBinding, synchronizesVariablesWithBindings
valueForKey
public Object valueForKey(String key)
valueForKeyPath
public Object valueForKeyPath(String keyPath)
© 2001 Apple Computer, Inc. (Last Published April 15, 2001)