You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by Apache Wiki <wi...@apache.org> on 2006/02/16 23:54:35 UTC
[Struts Wiki] Update of "ModelingNotes" by MichaelJouravlev
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Struts Wiki" for change notification.
The following page has been changed by MichaelJouravlev:
http://wiki.apache.org/struts/ModelingNotes
The comment on the change is:
Orphaned; Not really a wiki page, just a scratchpad.
------------------------------------------------------------------------------
- Modeling Notes
+ deleted
- This is a scatchpad page that tries to describe the Struts workflow in generic form, and then reconstruct a generic configuration file to match the description. This is a brainstorming document only.
-
- ----
-
- On startup, controller parses configuration and deploys the decorator objects, including the handlers, as its ControllerConfig object.
-
- The configuration elements are decorators that are used to create and manage other objects. At runtime, the target objects may be passed a reference to its decorator. The object can then alter its behavior according to the properties of its decorator. If the target object is a singleton, the decorator lets us reuse the object without changing its member properties.
-
- A reference to the servlet's ControllerConfig is placed in application scope, using upper-case versions of the servlet-name and config-name properties as the attribute name {$SERVLET-NAME.$CONFIG-NAME}.
- If an attribute by this name already exists, a servlet exception must be thrown.
- At runtime, container passes request to controller (servlet). Controller passes both get and post requests to its processor object.
-
- Processor matches URI with handler's matchPath property. (This is the handler decorator, not its target object.)
- If no path matches, processor checks for the default-handler before surrendering request back to container.
- Processor checks for secure attribute and the security role and throws an exception if user is not authorized to access this handler.
-
- Processor obtains a copy of the handler (decorator) and passes it the details of this request event. A reference to the handler is placed in the request (under the default token: HANDLER). If so configured by the controller, the processor also obtains a reference to the standard locale object in the user's session.
-
- If a handler already exists in the request, it is set to to the new handler's previous property. The new object then replaces the old in the request.
-
- {A reference collection of the handlers (decorators) is deployed at startup. The processor refers to this collection when creating a new copy of the handler for a request. When a handler (later) refers to other handler, a reference from the collection may be returned to avoid unnecessary object creates. The handlers have a locked property which indicate whether they are global singletons (locked) or local to this request (not locked).}
-
- By default, the controller will maintain a standard locale object in the user's session (LOCALE).
- The processor may be configured to place additional helper beans in every request. The helper beans must have a zero-arguments constructor and a handler property.
-
- If the handler specifies an input decorator, the processor obtains the input-object and, if appropriate, calls the input bean's reset, populate, and validate methods, passing each method a reference to the handler for this request.
- The handler encapsulates details such as a reference to the pending request (which includes the handler instance.)
- To obtain the input-object, processor first checks to see if there is already an object under the name and scope specified by the input decorator. Otherwise, a new input-object is instantiated.
-
- If the input-object's locked property is true, processor will not call reset or populate (but may still call validate).
- If the handler's validateInput property is false, validate on the input bean is not called.
-
- The validate method can examine the input-object's properties (populated from the request). If messages are generated, the method can pass a queue of errors to the handler.
- If validate returns false, the processor uses the specified input-location to complete this cycle. If the input-location is non-null, the processor uses its path (or handler-name) to return a URI to the controller. If null is returned, the response is considered complete.
-
- Processor obtains the handler-object and any helper bean. When a handler-object is specified, the processor calls the object's dispatch method, passing it the handler for this request. The dispatch method returns a location or null.
- If the handler (decorator) specifies a forward-path property or redirect-path property instead of a handler-object, a servlet-forward or servlet-redirect is performed instead of calling the handler-object. One of these three must be specified.
-
- When a non-null location is return, the processor uses its match-path to return a URI to the controller. If null is returned, the response is considered complete.
-
- Other components in the application (servlet or presentation-layer) may access the handler from the request (and any helper beans) to obtain whatever implementation details may be needed. The controller configuration may also be accessed by other components.
-
- On the presentation layer, handlers may be used to create hyperlinks. The link-param property is provided to help create hyperlinks that use a query string. The hyperlink may be to a handler or any other resource. If the hyperlink is to a resource handled by another component or service (JSPs, HTMLs, VMs,), the handler-object property may be omitted (null). In this case, the match-path will not correspond to the pattern registered for our controller servlet. (But it other cases it may.)
-
- A handler is recommended to create links to local resources, but locations may also be used to create hyperlinks, expecially when the location is outside the application context.
-
- The controller may be passed a module name and template by the web deployment descriptor (web.xml). By default, the module name and template will be applied when matching URIs or rendering the match-path as a hyperlink. When modules are used, non-virtual resources (JSPs, HTMLs) must be placed in a subdirectory corresponding to the module name and template. For a reference outside the module, but within the same application, set the <context> property on the handler to "application". For a reference in the same domain, but in another application, set the <content> property to "server" or "domain". For a reference to another domain, set the <context> property to "absolute". Including the scheme ("http://") in the property value forces the context to be absolute.
-
- Note that all handlers, whether to internal or external resources, share a common name space. All components refer to the handler by its logical name. The match-path is used when the URI first enters the controller, but does not need to be referenced by other components
-
- ----
-
- These are some scratchpad elements to illustrate the workflow. Note that it tries to distinguish between the "decorator" objects (like Struts FormBeans) and the "worker" objects (like Struts ActionForms).
-
- <controller-config>
- <name/>
- <module-name/>
- <module-template/>
- <default-handler/>
- <decorators>
-
- <input["classname"]>
- <name/>
- <input-object-classname/>
- <dyna-property/>+
- <init-param/>+
- <scope/>
- </input>
-
- <!-- input-object interface
- boolean isLocked();
- void setLocked(boolean locked);
- void reset(Handler handler);
- void populate(Handler handler);
- boolean validate(Handler handler);
- -->
-
- ----
-
- <helper["classname"]>
- <name/>
- <helper-object-classname/>
- <dyna-property///>+
- <init-param/>+
- <scope/>
- </helper>
-
- ----
-
- <location["classname"]>
- <name/>
- <path/>
- </location>
- or
- <location["classname"]>
- <name/>
- <handler-name/>
- </location>
-
- ----
-
- <handler["classname"]>
- <name/>
- <handler-object-classname/>
- <dyna-property/>+
- <init-param>+
- <scope/>
- <match-path/>
- <scheme/>
- <secure/>
- <context["module"]]/>
- <roles/>
- <validate-input/>
- <input-location-name/>
- <error-location-name/>
- <helper-name/>
- <exception-location-name/>+
- <exit-location-name/>+
- </handler>
-
- <!-- handler interface
- handler-object-instance
- previous-handler
- locked
- locale
- void setMessages(Messages messages, String bundleName);
- Messages getMessages(referenceName);
- -->
-
- <!-- handler-object interface
- Location dispatch(Handler handler);
- ControllerConfig getConfig();
- ServletRequest getRequest();
- -->
-
- <!-- http-handler-object interface
- HttpLocation HttpDispatch(HttpHandler HttpHandler);
- HttpServletRequest getHttpRequest();
- HttpServletResponse getHttpResponse();
- String getHref();
- -->
-
- {alternate forms: servlet forward, servlet redirect, hyperlink}
- <handler>
- <name/>
- <match-path/>
- <forward-path/>
- </handler>
-
- <handler>
- <name/>
- <match-path/>
- <redirect-path/>
- </handler>
- <handler>
- <name/>
- <match-path>
- <link-param/>+
- </handler>
-
- ----
-
- <event["classname"]>
- <name/>
- <classname/>
- <init-param/>+
- <handler-name/>
- </event>
-
- ----
-
- <processor/>
-
- ----
-
- <session/>
-
- ----
-
- <exception/>
- ----
-
- <properties/>
-
- ----
-
- <resourceBundle/>
- {first = default bundle}
-
- ----
-
- <resource/> <!-- including DataSources -->
-
- ----
-
- </decorators>
- </controller-config>
-
- -----
-
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org