Differences between revisions 11 and 12
Revision 11 as of 2006-07-20 17:17:01
Size: 16629
Comment:
Revision 12 as of 2009-09-20 23:12:30
Size: 16649
Editor: localhost
Comment: converted to 1.6 markup
Deletions are marked like this. Additions are marked like this.
Line 130: Line 130:
 * [http://www.port80software.com/support/articles/nextgenerationurls Towards Next Generation URLs] -- contains links to other notable resources, like Tim Berners Lee's [http://www.w3.org/Provider/Style/URI Cool URIs don't change] and Jakob Nielsen's [http://www.useit.com/alertbox/990321.html URL as UI].  * [[http://www.port80software.com/support/articles/nextgenerationurls|Towards Next Generation URLs]] -- contains links to other notable resources, like Tim Berners Lee's [[http://www.w3.org/Provider/Style/URI|Cool URIs don't change]] and Jakob Nielsen's [[http://www.useit.com/alertbox/990321.html|URL as UI]].
Line 149: Line 149:
 * [http://codinginparadise.org/weblog/2005/08/ajax-tutorial-saving-session-across.html Saving Session Across Page Loads Without Cookies, On The Client Side] -- tutorial by Brad Neuberg  * [[http://codinginparadise.org/weblog/2005/08/ajax-tutorial-saving-session-across.html|Saving Session Across Page Loads Without Cookies, On The Client Side]] -- tutorial by Brad Neuberg
Line 187: Line 187:
 * Use [http://struts.apache.org/1.x/struts-taglib/tlddoc/html/form.html <html:form> tag] to display data entry form, and a single [:StrutsFormBeans: ActionForm] to handle both render and submit phases of request/response cycle. On render phase Struts renders HTML form fields using values from an !ActionForm. On submit phase Struts automatically populates !ActionForm properties with values of HTML form fields. This setup ensures that content of form fields is saved and redisplayed automatically. Automatic saving/restoring of HTML form fields is similar to handling ''postback controls'' in ASP.NET. Struts does not have notion of ''non-postback controls'' like labels or data grids, and does not automatically save such information.
 * Use [http://struts.apache.org/1.x/struts-taglib/tlddoc/html/hidden.html <html:hidden> tag] to store stringified data in an HTML form and to submit it to location specified in <html:form> tag. Struts does not provide built-in functionality to encrypt hidden fields.
 * Use [http://struts.apache.org/1.2.9/api/org/apache/struts/util/TokenProcessor.html TokenProcessor class] to distinguish resubmits.
 * Use [[http://struts.apache.org/1.x/struts-taglib/tlddoc/html/form.html|<html:form> tag]] to display data entry form, and a single [[StrutsFormBeans| ActionForm]] to handle both render and submit phases of request/response cycle. On render phase Struts renders HTML form fields using values from an !ActionForm. On submit phase Struts automatically populates !ActionForm properties with values of HTML form fields. This setup ensures that content of form fields is saved and redisplayed automatically. Automatic saving/restoring of HTML form fields is similar to handling ''postback controls'' in ASP.NET. Struts does not have notion of ''non-postback controls'' like labels or data grids, and does not automatically save such information.
 * Use [[http://struts.apache.org/1.x/struts-taglib/tlddoc/html/hidden.html|<html:hidden> tag]] to store stringified data in an HTML form and to submit it to location specified in <html:form> tag. Struts does not provide built-in functionality to encrypt hidden fields.
 * Use [[http://struts.apache.org/1.2.9/api/org/apache/struts/util/TokenProcessor.html|TokenProcessor class]] to distinguish resubmits.
Line 228: Line 228:
 * Struts allows to define session scope for an [:StrutsFormBeans: ActionForm] in {{{struts-config.xml}}} file.  * Struts allows to define session scope for an [[StrutsFormBeans| ActionForm]] in {{{struts-config.xml}}} file.
Line 262: Line 262:
 * Use [http://struts.apache.org/1.x/struts-taglib/tlddoc/html/hidden.html <html:hidden> tag] to store hidden field information and to submit it to location specified in <html:form> tag.
 * Use [http://struts.apache.org/1.2.9/api/org/apache/struts/util/TokenProcessor.html TokenProcessor class] to distinguish resubmits.
 * Use [[http://struts.apache.org/1.x/struts-taglib/tlddoc/html/hidden.html|<html:hidden> tag]] to store hidden field information and to submit it to location specified in <html:form> tag.
 * Use [[http://struts.apache.org/1.2.9/api/org/apache/struts/util/TokenProcessor.html|TokenProcessor class]] to distinguish resubmits.

Work in progress!

Client Techniques

Server Techniques

Client + Server Techniques

Cookies

URLs

HTML form hidden fields

Browser Objects

Session

Database

Hidden fields + session

Hidden fields + database

Query parameters

Clean URLs

Advantages

Can store complex data types

+

+

Works well in load balancing environments

+

+

+

+

+

Works well in Ajax applications

+

+

+

Disadvantages

User can tamper with state information

+

+

+

Requires cookies

+

+

Requires coding

+

+

+

Requires redirection

+

Requires Javascript

+

+

Can store only small amount of data (~2,000 bytes)

+

+

Increased network traffic and slightly slower response times

+

+

+

+

Requires server resources to save state information

+

Application logic tightly coupled to the user interface implementation

+

Does not work well with redirection

+

+

State can be lost on page reload

+

State can be lost on direct navigation

+

+

+

State can be lost when client is idle

+

Neither Advantages Or Disadvantages

State is not tied to view

+

+

+

Client-Side Techniques

Cookies

Pro:

  • Not visible to a user
  • Can be submitted to originating server only - better security
  • Does not depend on request method (GET or POST) or how request is issued (HTML form, link, direct URL in the address bar)
  • State is not linked to page address, can not get stale when a user navigates back on browser session history.
  • Can have lifetime different from a user session; can be preserved after browser is closed (persistent cookies) or can be removed during user session.

Neither:

  • State and page address are not related.

Cons:

  • Does not work if cookies are turned off in a browser.
  • May be percieved as potential privacy concern.

Best fit: non-critical information about a particular client, session, or application. Usually employed for user profiling, like zip code or preferred language. Also used for "remember me" login.

How Struts can help:

  • Struts does not have functions specific to storing state in cookies.
  • Struts helps to maintain session if cookies are not enabled. Struts automatically calls response.encodeURL() when processing <html:form> and <html:link> tags. This tells server to add session ID to links and HTML forms.

Rewritten URLs

Query parameters

URL query parameters allow to express a website structure using base path to a resource, in case of Struts that would be an action, and series of query parameters

For example, an online tire store may expose its structure like this:

    www.tirestore.com/vehicle.do?year=2002&make=TOYOTA&model=mr2spyder

A series of HTML forms may help a user to get to desired location, making the address more detailed from step to step:

Welcome page allows to select search criteria:
    www.tirestore.com/welcome.do

We choose to search product by vehicle year and make:
    www.tirestore.com/vehicle.do?year=2002&make=TOYOTA

Then application shows a listbox with applicable model names and allows to select one:
    www.tirestore.com/vehicle.do?year=2002&make=TOYOTA&model=mr2spyder

Pro:

  • Easy to create: by submitting a form using GET method, by clicking on a link or by manually editing the resource address.
  • Reloading a page that was previously obtained with GET method does not cause POSTDATA dialog.

Cons:

  • Can be easily damaged by a user.
  • Exposes data that is sent to the server.
  • Has limited size, usually about 2000 characters.
  • State is lost if a user navigates to an arbitrary page.
  • State is linked to page address, can get stale when a user navigates back on browser session history.

Neither:

  • State is tied to page address.

Best fit: applications where the query string only affects the view, like online catalogs or magazines. A page can be reloaded without affecting the server and without POSTDATA messages. Navigating back and forward is not an issue.

Clean URLs

Clean URLs or cool URLs is a way to express website structure using location path instead of query parameters. Clean URLs work best for static websites. Representing state with clean URLs is less common. It is not convenient either, especially when location is being built as a result of an HTML form submission.

For example, an online tire store may expose its structure like this:

www.tirestore.com/vehicle/2002/toyota/mr2spyder/

A series of HTML forms may help a user to get to desired location, making the address more detailed from step to step:

Welcome page allows to select search criteria:
    www.tirestore.com/welcome

We choose to search product by vehicle year and make:
    www.tirestore.com/vehicle/2002/toyota/

Then application shows a listbox with applicable model names and allows to select one:
    www.tirestore.com/vehicle/2002/toyota/mr2spyder/

Pros:

  • URLs may help visualize the site structure.
  • Such URLs are more likely to be saved by search engines and crawling machines.
  • Manually editing URL allows to move "up" and "down" hierarchical structure of an application just like navigating directory structure on a local computer.
  • Underlying technology is not exposed; easier to replace a web framework, harder for hackers to get into.

Cons:

  • Can be easily damaged by a user.
  • Has limited size, usually about 2000 characters.
  • Creating a clean URL from a browser requires either building it on client using Javascript or building it on server and then using redirect.

Neither:

  • State is tied to page address.

Best fit: online catalogs or magazines that have hierarchical structure and should be represented as a static website. May improve site searchability and page rankings.

Additional information:

Browser objects (DOM elements, Javascript variables, Flash storage)

Pro:

  • Can store complex structures and objects.
  • Depending on application requirements, state can be made relative or non-relative to page address.

Neither:

  • State and page address are not related.

Cons:

  • Lost when a page is reloaded unless special care is taken.

Best fit: Ajax-style Single Page applications.

How Struts can help:

  • Struts does not have built-in features for saving state in client DOM/Javascript objects.

Additional information:

HTML form hidden fields

By year, vehicle, make:

<form action="...">
  <input type="hidden" name="yr" value="2002"/>
  <input type="hidden" name="mk" value="TOYOTA"/>
  <input type="hidden" name="model" value="mrspyder"/>
  ...
</form>  

Pros:

  • No size limitations.
  • URLs are short.

Neither:

  • State and page address are not directly related.

Cons:

  • Every page must be an HTTP form to transfer state from page to page.
  • HTTP forms must be submitted with POST method only, hidden fields are not submitted with GET.
  • State is lost on redirection or on direct navigation; breaking out of a predefined page flow is not possible.
  • State information grows while a user moves forward from page to page.
  • Reloading a page or navigating back/forward in browser session history causes a resubmit that is preceded by a user-unfriendly POSTDATA message.
  • The application is unfriendly to search engines.

When to use: all application pages are based on HTML forms and storing state information in the URL is undesireble.

What to store: non-critical state information, like state of controls and widgets (viewstate).

What to keep in mind: the moment you update the server objects or database, you switch from pure client-based technique to combined client-server tecnhique, which is a totally different beast. Many developers using hidden fields think they use client-based state tracking technique while in fact they are not.

Implications: Application must provide explicit navigational links and buttons so users would not have to use standard browser navigation buttons. Application must recognize and handle double-submit situations.

How Struts can help:

  • Use <html:form> tag to display data entry form, and a single ActionForm to handle both render and submit phases of request/response cycle. On render phase Struts renders HTML form fields using values from an ActionForm. On submit phase Struts automatically populates ActionForm properties with values of HTML form fields. This setup ensures that content of form fields is saved and redisplayed automatically. Automatic saving/restoring of HTML form fields is similar to handling postback controls in ASP.NET. Struts does not have notion of non-postback controls like labels or data grids, and does not automatically save such information.

  • Use <html:hidden> tag to store stringified data in an HTML form and to submit it to location specified in <html:form> tag. Struts does not provide built-in functionality to encrypt hidden fields.

  • Use TokenProcessor class to distinguish resubmits.

Server-Side Techniques

Server session object

Server session object only

Pro:

  • Can be tied to model state, not affected by browser state or current page.
  • Allows to separate the concerns, keeping state safely and securely where model resides, while treating browser as an agent providing interface with a user.
  • Developing interactive applications is greatly simplified.

Neither:

  • State and page address are not related.

Cons:

  • Session size should be carefully controlled, can affect perfomance.
  • Degrades performance in clustered system.
  • Session object can expire when browser is still open.
  • Leaving a webapp and then navigating to it again by specifying location in the address bar leads to losing state if cookies have not been enabled.

Best fit: Ajax- and non-Ajax applications that treat server state as primary, and client state is secondary. If discrepancy between view and model occurs, view is synched with the model, not vice versa.

Server session object + redirection after submitting an HTML form

Pro:

  • Clean URLs (with cookies enabled)
  • One URL can be used for one logical page or a series of pages, this makes back/forward navigation easier for a user.
  • POSTDATA dialog is now shown when a user tries to refresh a page.
  • Double submit does not occur when a user tries to refresh a page, or navigates back/forward.
  • Developing interactive applications is greatly simplified.

Cons:

  • Redirection may increase response time.
  • Can be problematic in clustered systems or with address-translating web servers since the proper redirection location cannot be obtained.

Best fit: applications that treat server state as primary state source. Non-Ajax Single Page Applications.

How Struts can help:

  • Struts allows to define session scope for an ActionForm in struts-config.xml file.

  • EventActionDispatcher helps to structure and simplify the action code, if both input and render request phases are processed by one action.

  • StrutsWebIslands -- how single-page web resources (web-islands) can be implemented with Struts, no Ajax.

Combination Client-Server Techniques

HTML form hidden fields + database

This is one of the more popular state management techniques. It is often used in situations where storing complete state information on server is undesired for performance reasons. Hidden fields store intermediate state during, for example, filling out a series of forms like wizard pages. One of the classic examples is web store checkout process. A series of screens ask for name, address, payment information, delivery optins, etc. The last page in the series submits the shopping cart to the server, where it is processed, the inventory is adjusted and user's credit card is charged.

Two different states have been created: client state and server state. At this point these states are synchronized, but what happens if a user clicks Back or Reload button? A Reload button will cause resubmit of the same request, which will cause server code to charge a user's credit card and to adjust warehouse inventory one more time.

Clicking Back button will cause browser to display checkout page with the cart, this page does not represent server state anymore, here you can see that server state and client state got out of sync. Synchonizing server to client is not possible, database update has been committed and cannot be rolled back. What is left is either synchronizing view to server (preferred choice), or throwing exception and bailing out to some safe location like welcome page.

Pros:

  • No size limitations.
  • URLs are short.

Cons:

  • Every page must be an HTTP form to transfer state from page to page.
  • HTTP forms must be submitted with POST method only, hidden fields are not submitted with GET.
  • State is lost on redirection or on direct navigation; breaking out of a predefined page flow is not possible.
  • State information grows while a user moves forward from page to page.
  • Reloading a page or navigating back/forward in browser session history causes a resubmit that is preceded by a user-unfriendly POSTDATA message.
  • The application is unfriendly to search engines.

When to use: all application pages are based on HTML forms and storing state information in the URL is undesireble.

What to store: non-critical state information, like state of controls and widgets (viewstate).

Implications: With this technique state information is saved on server from time to time (checkpoints). Thus, synchronization between client and server state will be required. Moving back in browser session history should either be prohibited after a "save-to-server" checkpoint, or application must be able to synchronize client and server state. Application must recognize and handle double-submit situations. Application must provide explicit navigational links and buttons so users would not have to use standard browser navigation buttons.

How Struts can help:

todo, saved for later

  • Same URL can be used for several pages/forms or same URL can be used to redisplay data entry form. In most browsers this allows to reduce number of entries in page history buffer and to provide Single Page Application behavior.
  • If submitting a form changes server state like updating a database, then resubmitting a request can potentially produce cumulative (and wrongful) changes to server state. At this point state is handled both on client and server and its synchronization becomes problematic.

    Example: a typical ASP.NET WebForms application.

StateManagement (last edited 2009-09-20 23:12:30 by localhost)