Oracle9iAS Web Cache Administration and Deployment Guide Release 2 (9.0.2) Part Number A95404-02 |
|
This chapter explains how to configure caching rules.
This chapter contains these topics:
Using Oracle9iAS Web Cache to specify caching rules, you can select to cache or not to cache content for static documents, multiple-version documents, personalized pages, pages that support a session cookie or embedded URL parameter, and dynamic pages.
This section discusses the following topics:
When you create caching rules, you create site-specific caching rules that apply to a particular site and global rules that apply to all sites.
Generally, when you assign caching rules, you specify the regular expression matching the URL and whether you want the documents contained within the URL cached or not cached. You then order the caching rules in order of priority. Higher priority rules are matched first.
For cacheable regular expressions that contain a document or a subset of documents that are not cacheable, give the non-cacheable documents a higher priority than the cacheable documents. For example, if you want all URLs containing /cec/cstage?ecaction=ecpassthru
to be cached except for /cec/cstage?ecaction=ecpassthru2
, you would enter the rules in the following order:
^/cec/cstage\?ecaction=ecpassthru2
, GET
and GET
with query string, Don't Cache
^/cec/cstage\?ecaction=ecpassthru.*
, GET
and GET
with query string, Cache
GET
and GET
with query string are the HTTP request methods used by the documents.
If the order were reversed, all documents starting with /cec/cstage?ecaction=ecpassthru
would be cached, including /cec/cstage?ecaction=ecpassthru2
.
Examples of content that administrators would typically declare non-cacheable include updating transactions, shopping cart views, personal account views, and so on. One of the easiest ways to set up caching rules in Oracle9iAS Web Cache is either to first specify the non-cacheable content, and then use a broad "catch-all" rule for the cacheable content, or to first specify the cacheable content followed by a non-cacheable catch-all rule. In practice, cacheable and non-cacheable rules can be interspersed.
In addition to the URL, you can specify optional selectors for more fine-grained caching rules. These additional selectors include the HTTP request method (GET
, GET
with query string, or POST
) and, if POST
is selected, the HTTP POST
body of the documents. In the following rule list, Rule 2 caches documents of the URL that use the GET
and GET
with query string methods, and Rule 3 caches documents of the URL that use the POST
method and a POST
body matching action=search
.
^/cec/cstage\?ecaction=ecpassthru2
, GET
and GET
with query string, Don't Cache
^/cec/cstage\?ecaction=ecpassthru.*
, GET
and GET
with query string, Cache
^/cec/cstage\?ecaction=ecpassthru.*
, POST
, action=search
, Cache
Note that caching rules use regular expression syntax, which is based on the POSIX 1003 extended regular expressions for URLs, as supported by Netscape Proxy Server 2.5.
When using POSIX regular expression, keep the following syntax rules in mind:
^
) to denote the beginning and a dollar sign ($
) to denote the end of the URL
If these characters are not used, POSIX assumes a substring match. For example, ^/a/b/.*\.gif$
will match GIF files under /a/b
or any of its subdirectories. /a/b/.*\.gif
, on the other hand, could match /x/y/a/b/c/d.gift
.
.
) to match any one character
?
) to match zero or one occurrence of the character that it follows
*
) to match zero or more occurrences of the pattern that it follows
\
) to escape any special characters, such as periods (\.
), question marks (\?
), or asterisks (\*
)
See Also::
http://www.cs.utah.edu/dept/old/texinfo/regex/regex_toc.html
for regular expression syntax
Table 7-1 shows examples of content to cache and how to enter regular expression syntax for corresponding caching rules for that content.
When Oracle9iAS Web Cache is installed, site-specific and global caching rules are established for the configured default site.
Figure 7-1 displays the default site-specific caching rules.
Table 7-2 describes the default site-specific caching rules.
Figure 7-2 displays the default global caching rules.
Table 7-3 describes the default global caching rules.
To configure caching rules:
The Cacheability Rules page appears.
The Create Cacheability Rule or Edit/Create Cacheability Rule dialog box appears.
Remember to use "^
" to denote the start of the URL and "$
" to denote the end of the URL.
GET
, GET
with query string, or POST
HTTP request methods.
You can select more than one request method.
POST
body of the documents in the POST Body Expression field.
To apply this rule to any POST
request body, enter ".*
" in the field.
In ESI Output Permission, select either Yes or No. The default is Yes.
Compression |
Select No to not serve compressed cacheable and non-cacheable documents for browsers. Select Yes to serve compressed cacheable and non-cacheable documents for browsers, and then select one of the following options:
The default is Yes and Compress for all browsers. Important: Netscape browsers are unable to uncompress included files, which may result in Netscape failures. If a document will be included in other files, such as a JavaScript file, then select Compress for non-Netscape browsers only. Notes:
See Also: "Compression" for an overview |
Expiration Rule |
From the list, select an expiration rule to apply to the documents. If you do not see an expiration rule suitable for the documents, then choose Create A New Rule to create a new rule. See Also:
|
Multiple Documents with the Same Selector by Cookies |
Select None to not have Oracle9iAS Web Cache cache multiple-version documents that use cookies. Select Apply the following to cache multiple-version documents that rely on category cookie values, and then select the required cookie rules. If you do not see a cookie rule that can be applied to these documents, then choose General Configuration > Cacheability > Multiple Documents with the Same Selector to create a new rule. See Also:
|
Multiple Documents with the Same Selector by Other Headers |
Select the HTTP request headers whose values Oracle9iAS Web Cache will use to cache and identify multiple-version documents. Oracle9iAS Web Cache Manager enables you to select one or more of the following:
An example of a request made with a Netscape 4.6 browser with HTTP request headers follows: User-Agent: Mozilla/4.61 [en] (WinNT; U) Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png,*/* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Notes:
See Also:
|
Session/Personalized Attribute Related Caching Rules |
Select None to not have Oracle9iAS Web Cache cache or serve documents based on session or personalized attribute information contained within a cookie or embedded in a URL as a parameter. Select Apply the following to specify how Oracle9iAS Web Cache caches and serves documents with session or personalized attribute cookies or embedded URL parameters. If you do not see the session rules these documents require, then choose General Configuration > Cacheability > Session/Personalized Caching Rules to create a new rule. See Also:
|
Simple Personalization |
Select No to not substitute session values used in session-encoded URLs or personalized attribute values enclosed within Select Yes to substitute session or personalized attribute values. Oracle9iAS Web Cache will replace the value information based on the value of the cookie or the embedded URL parameter. Oracle9iAS Web Cache then serves these pages for Web browser requests that contain the cookie or the embedded URL parameter. See Also:
|
HTTP Error Caching |
Enter the HTTP error codes you want Oracle9iAS Web Cache to cache. If you enter multiple codes, use a comma to separate them. If there is a problem on the origin server that will remain unresolved, then cache the error until the problem is resolved. Once the problem is resolved, you should invalidate the cached HTTP errors. See Also: "Invalidating Documents in the Cache" |
In addition to or as an alternative to creating caching rules with Oracle9iAS Web Cache Manager, application developers can choose to store the many of the caching attributes in the header of an HTTP response message. See "Configuring Caching Attributes in Response Headers" for details.
Tip:
Once the caching rules are configured, prioritize them.
To assign priority to rules:
Higher priority rules are processed first.
Table 7-4 illustrates how an administrator might set up caching rules for a catalog built on Oracle iStore 11i technology, which enables e-merchants to design, build, and publish their stores on the World Wide Web.
You can create rules for when to expire documents in the cache. In addition, you can specify how long documents can reside in the cache once they have expired. When a document expires, it is either immediately invalidated or invalidated based on when the application Web servers can refresh them.
To create expiration rules:
The Expiration Rules page appears.
The Create Expiration Rule dialog box appears.
While the first two options enable you to set expiration for Oracle9iAS Web Cache-specific rules, the third option recognizes the expiration policy established for the documents already programmed with an HTTP Expires
response-header field.
The Change Policy-Selector Association dialog box appears.
The selector moves to the left list and the dialog box closes.
If the selector you require does not exist, then create a caching rule, as described in "Configuring Caching Rules". In Step 10 of the procedure, select an expiration rule in the Expiration Rule row of the Create Cacheability Rule dialog box.
You can specify which category cookies whose values Oracle9iAS Web Cache will use to cache and identify multiple-version documents.
To specify cookie values for multiple-version URLs:
The Multiple Documents with the Same Selector by Cookies page appears.
The Edit/Create Multiple Documents with the Same Selector by Cookies Rule dialog box appears.
The Change Policy-Selector Association dialog box appears.
The selector moves to the left list and the dialog box closes.
If the selector you require does not exist, then create a caching rule, as described in "Configuring Caching Rules". In Step 10 of the procedure, select Apply the following and a rule in the Multiple Documents with the Same Selector by Cookies row of the Edit/Create Cacheability Rule dialog box.
See Also:
"Multiple Versions of the Same Document" for an overview and an example scenario |
You can specify which HTTP request headers whose values Oracle9iAS Web Cache will use to cache and identify multiple-version URLs. If a browser request passes a URL with one of the headers defined, then Oracle9iAS Web Cache serves the document from its cache.
To specify HTTP request headers for multiple-version documents, select one of the headers in the Multiple Documents with the Same Selector by Other Headers column of the Edit/Create Cacheability Rule dialog box.
You can configure Oracle9iAS Web Cache to ignore the value of embedded URL parameters so that one version of a page can served to multiple users.
See Also:
"Ignoring the Value of Embedded URL Parameters" for an overview and an example scenario |
To ignore the value of URL parameters:
The Session/Personalized Attribute Definitions page appears.
The Create Session/Personalized Attribute Definition dialog box appears.
Oracle9iAS Web Cache uses the default string for those requests without the parameter information. For these requests, Oracle9iAS Web Cache substitutes the session information with the default string. The string defaults to default
. If you want to instead require that the request obtain the embedded URL parameter settings from the origin server, perform Step 3.
You can specify caching rules for personalized pages that use session-encoded URLs. Session-encoded URLs enable Web sites to keep track of user sessions through session information contained within <A HREF=...>
HTML tags. You can configure Oracle9iAS Web Cache to substitute session information for one user with another based on the session information contained within a cookie or an embedded URL parameter.
See Also:
"Substituting Session Information in Session-Encoded URLs" for an overview and an example scenario |
To cache instructions for substituting session information in session-encoded URLs.
The Session/Personalized Attribute Definitions page appears.
The Create Session/Personalized Attribute Definition dialog box appears.
If you enter both a cookie name and an embedded URL parameter, keep in mind that both must support the same session substitution. If they support different substitutions, create separate session definitions. You can specify up to 20 definitions for each page.
Oracle9iAS Web Cache uses the default string for those requests without the cookie or parameter information. For these requests, Oracle9iAS Web Cache substitutes the session information with the default string. The string defaults to default
. If you want to instead require that the request get the cookie or embedded URL parameter settings from the origin server, perform Step 4.
In Step 10 of the procedure, select Yes in the Simple Personalization row of the Edit/Create Cacheability Rule dialog box to substitute session information in session-encoded URLs.
You can specify caching rules for personalized pages that use personalized attributes. Personalized attributes are often in the form of a personalized greeting like "Hello, Name." Personalized attributes can come in other forms, such as icons, addresses, or shopping cart snippets. You can configure Oracle9iAS Web Cache to substitute the value of personalized attributes contained within <!-- WEBCACHETAG-->
and <!-- WEBCACHEEND-->
tags based on the information contained within a cookie or an embedded URL parameter.
See Also:
"Personalized Attributes" for an overview and an example scenario |
To create rules for personalized pages:
The Session/Personalized Attribute Definitions page appears.
The Create Session/Personalized Attribute Definition dialog box appears.
For example, if the attribute is for a personalized greeting that uses the first name, you could enter first_name01
for the session name.
If you enter both a cookie name and an embedded URL parameter, keep in mind that both must support the same personalized attribute substitution. If they support different substitutions, create separate personalized definitions. You can specify up to 20 definitions for each page.
Oracle9iAS Web Cache uses the default string for those requests without the cookie or parameter information. For these requests, Oracle9iAS Web Cache substitutes the personalized attribute with the default string. The string defaults to default
. If you want to instead require that the request get the cookie or embedded URL parameter settings from the origin server, perform Step 4.
In Step 10 of the procedure, select Yes in the Simple Personalization row of the Edit/Create Cacheability Rule dialog box to substitute information in personalized attributes.
<!-- WEBCACHETAG-->
and<!-- WEBCACHEEND-->
as follows:
<!-- WEBCACHETAG="personalized_attribute
"-->personalized attribute HTML segment
<!-- WEBCACHEEND-->
Ensure that both tags have a space after <!--
.
Important:
The |
Note:
The
In the following example, the placement of htp.p('<FORM ACTION="test" METHOD="GET">'); htp.p('<TABLE BORDER="0" > <TR> <TD><INPUT TYPE="text" NAME="p_name" SIZE="8" VALUE="<!-- WEBCACHETAG="p_name"-->'||p_name||'<!-- WEBCACHEEND-->"></td> </TR> <TR> <TD><input type="submit" value="Search"></TD> </TR> </TABLE>'); To achieve personalization within an HTML tag, use ESI. See Also: "Example of Simple Personalization with Variable Expressions" |
To understand how to cache personalized content, consider the HTML page monthly.htm
in Figure 7-3.
October
is personalized content that can be substituted with other values.
The page has a URL of monthly.htm?Month=
month
, where Month
is an embedded URL parameter.
The following steps were performed to cache monthly.htm
and its personalized content.
TestMonth
was mapped to the embedded URL parameter Month
in the Edit/Create Session/Personalized Attribute Definition dialog box.
Month
in the Add Session/Personalized Attribute Related Caching Rule dialog box.
See Also:
"Configuring Session-Related or Personalized Attributed-Related Caching Rules" for more information about creating personalized attribute caching rules |
<!-- WEBCACHETAG-->
and <!-- WEBCACHEEND-->
HTML tags were added to monthly.htm
.
Current Month is: <!-- WEBCACHETAG="TestMonth"-->October<!-- WEBCACHEEND-->
monthly.htm
in the Create Cacheability Rules dialog box:
Month
was chosen.
To verify that Oracle9iAS Web Cache was caching monthly.htm
:
monthly.htm
at URL monthly.htm?Month=October
was requested. Because the initial request was forwarded by Oracle9iAS Web Cache to the application Web server, the value October
was required for the Month
parameter. This initial request inserted monthly.htm
into the cache.
monthly.htm
was sent to URL monthly.htm?Month=January
.
Oracle9iAS Web Cache substituted October
with the value of January
.
You can specify how Oracle9iAS Web Cache serves requests with the existence or nonexistence of session or personalized attribute cookies or embedded URL parameters.
See Also:
|
To create caching rules for pages that support session cookies or personalized attributes:
The Session/Personalized Attribute Related Caching Rules page appears.
The Add Session/Personalized Attribute Related Caching Rules dialog box appears.
If the sessions or personalized attributes listed do not contain the definition you require, then choose Cancel to exit the Add Session/Personalized Attribute Related Caching Rules dialog box. Continue to Step 5.
The Session/Personalized Attribute Definitions page appears.
The Create Session/Personalized Attribute Definitions dialog box appears.
If you enter both a cookie name and an embedded URL parameter, keep in mind that both must be used to support the same session or personalized attribute. If they support different sessions or personalized attributes, create separate definitions. You can specify up to 20 definitions for each page.
Oracle9iAS Web Cache uses the default string for those requests without the cookie or parameter information. For these requests, Oracle9iAS Web Cache substitutes the session ID or personalized attribute information with the default string. The string defaults to default
.
The Change Policy-Selector Association dialog box appears.
The selector moves to the left list and the dialog box closes.
If the selector you require does not exist, then create a caching rule for the pages the support session or personalized attributed cookie or embedded URL parameter, as described in "Configuring Caching Rules". In Step 10 of the procedure, select Apply the following and a rule in the Session/Personalized Attribute Related Caching row of the Edit/Create Cacheability Rule dialog box.
Some Web sites require users to have sessions while surfing most pages. If you want to preserve the session requirement, then create a Session/Personalized Attribute Related Caching Rule for those pages. This way, a request without a session will always be served by the origin server.
For some popular site entry pages, such as "/
", that typically require session establishment, session establishment effectively makes the page non-cacheable to all new users without a session. To cache these pages while preserving session establishment, make the following minor modifications to your application:
/
", that redirects to the real entry page.
In Step 10 of the procedure, select Apply the following, and then select a session-related caching rule with a value of cache with session, no cache w/o session in the Session/Personalized Attribute Related Caching Rules row of the Edit/Create Cacheability Rule dialog box.
With this configuration, all initial user requests to the entry URL first go to the blank page, which requires minimal resources to generate. The browsers receive the response and session establishment from the application Web server. Subsequent redirected requests to the entry page will carry the session, enabling the entry page to be served out of the cache.
Another solution to this issue is to use a JavaScript that sets a session cookie for the pages requiring sessions:
See Also:
"Content Assembly and Partial Page Caching" for an overview of partial page caching |
This section describes how to enable dynamic assembly of Web pages of fragments and create rules for the cacheable and non-cacheable page fragments. It contains the following topics:
To enable partial page caching:
ESI tags cannot be used on a page that contains
Important:
<!-- WEBCACHETAG-->
and<!-- WEBCACHEEND-->
tags. If you require simple personalization and are using ESI, see "Using ESI for Simple Personalization".
Surrogate-Control
response-header field in the HTTP response message. For example:
Surrogate-Control: max-age=30+60, content="ORAESI/9.0.2"
Surrogate-Control
response-header field does not include all the caching attributes required for the template page, then create a caching rule for the page.
Surrogate-Control
response-header field in the HTTP response message.
Surrogate-Control
response-header field does not include all the caching attributes required for the fragment, then create a caching rule for the fragment.
See Also:
Surrogate-Control
response-header field
You can use variable expressions to achieve the same substitution as personalized attributes and session-encoded URLs. Oracle Corporation recommends using ESI for simple personalization when you are utilizing other ESI features, otherwise continue to use the methods described in "Configuring Personalized Attribute Definitions and Rules for Personalized Attributes".
For example, the following HTML excerpt uses the <!-- WEBCACHETAG-->
and<!-- WEBCACHEEND-->
tags to substitute a user's name based on the value the browser passes with UserName
cookie. In addition, the session information contained within the sessionID
cookie is used to replace session information for one user with another user.
Welcome <!-- WEBCACHETAG="UserName"-->John<!-- WEBCACHEEND -->! Here is a <A HREF="/jsp/myPage.jsp?sessionID=13001">link</A>.
The same effect is achieved with the following ESI markup:
<esi:vars> Welcome $(HTTP_COOKIE{'username'})! Here is a <A HREF="/jsp/myPage.jsp?sessionID=$(QUERY_ STRING{'sessionid'})">link</A>. </esi:vars>
The <esi:vars>
tag enables you to use an ESI environment variable outside of an ESI tag. Variables can also be used with other ESI tags.
This section provides examples of ESI usage in the following topics:
Figure 7-8 shows a portal site response page, http://www.company.com/servlet/oportal?username=Mark
, for a registered user named Mark.
This page is assembled by Oracle9iAS Web Cache. A template page configured with ESI markup tags for a personalized greeting, weather, stocks, promotion advertisement, news, and sports fragments is assembled based on Mark's preferences. For example, since Mark chose San Francisco weather, the application looks up San Francisco weather information and puts it into the final full HTML page output. Because of its dynamic content, this page would not be cacheable. On the other hand, with ESI markup tags, Oracle9iAS Web Cache assembles and caches most of the content.
The following sections describe how the template page and its fragments are implemented using <esi:inline>
and <esi:include>
tags:
This section describes how <esi:inline>
tag fragmentation and assembly can drastically increase the value of dynamic content caching for pages with that do not contain real-time elements. It shows how to apply the <esi:inline>
tag for an existing application that supports non-fetchable fragments. The <esi:inline>
tag helps reduce space consumption and improves cache hit ratios by isolating the dynamic content.
Note:
If an application supports independently fetchable fragments, it is possible to use the |
To utilize the <esi:inline>
tag, the logical fragments in portal.esi
are marked with the <esi:inline>
tags. The personalized greeting, Weather Forecast, My Stocks, Promotion campaign, Latest News, and Latest Sports News naturally become fragments because they have individual caching properties and can be shared. The My Stock fragment is further broken down into five sub-fragments, one for each stock quote. In addition, to achieve the maximum fragment sharing, the common HTML code sections between each two personalized fragments are also enclosed as ESI fragments and are given constant names, so that the varying template contains as little common data as possible.
Figure 7-9 shows portal.esi
with <esi:inline>
tags.
<esi:inline name="/Common_Fragment_1" > <!-- First common fragment --> <HTML> ... <!-- Personalized Greeting With ESI variable --> Welcome, $(QUERY_STRING{username})! </esi:inline> <esi:inline name="/Weathers_San_Francisco" > ...<!-- Personalized Weather Forecast -->
Weather Forecast for San Francisco
<TABLE>
<TR>
<TD>
Currently: 63F
</TD>
</TR>
</TABLE>
</esi:inline>
<esi:inline name="/Common_Fragment_2" >
<!-- Second common fragment -->
...
</esi:inline>
<esi:inline name="/Stocks_$(QUERY_STRING{username})" >
<!-- Personalized Stock Quote Selections --> <TABLE> <TR> <TD> <esi:inline name="/ticker_IBM"> IBM 108.53 10/25/2001 1:33PM -0.04 </esi:inline> <BR> <esi:inline name="/ticker_ORCL"> ORCL 13.379 10/25/2001 1:38PM -1.281 </esi:inline> <BR> <esi:inline name="/ticker_YHOO"> YHOO 11.41 10/25/2001 1:37PM -0.54 </esi:inline> <BR> <esi:inline name="/ticker_SUNW"> SUNW 9.20 10/25/2001 1:38PM +0.01 </esi:inline> <BR> <esi:inline name="/ticker_PRSF"> PRSF 1.98 10/25/2001 1:37PM +0.08 </esi:inline> <TD> </TR> </TABLE> </esi:inline> <esi:inline name="/Common_Fragment_3"> <!-- Third common fragment -->...
</esi:inline> <esi:inline name="/ExternalAdvertisement"> <!-- External Advertisement --> <TABLE> <TR> <TD> <a href="http://www.companyad.com/advert?promotionID=126532"> <img src="http://www.companyad.com/advert_img?promotionID=126532"> </a> </TD> </TR> </TABLE> </esi:inline> <esi:inline name="/Common_Fragment_4"> <!-- Fourth common fragment --> ... </esi:inline> <esi:inline name="/Top_News_Finance"> <!-- Personalized Top News --> Latest News for finance <TABLE> <TR> Blue-Chip Stocks Cut Losses; Nasdaq Up MO Stocks Fall at Opening After Plane Crash New York Times French rig factory with explosives New York Times Volkswagen faces Brazil strike CNN Europe Airbuss reliability record BBC </TR> </TABLE> </esi:inline> <esi:inline name="/Sports_News_Soccer" > <!-- Personalized Sports News --> Latest Sports News for Soccer <TABLE> <TR> Hearts chief told to resign MO Owen and Gerrard fit for Blackburn game Ananova Hearts in positive AGM pledge Ananova Time for McIntosh to decide scotsman.com Bannon in call for calm as Gorgie faithfull gather to grill Robinson scotsman.com </TR> </TABLE> </esi:inline> <esi:inline name="/Common_Fragment_5" > ... </esi:inline>
Figure 7-10 shows the markup for the personalized greeting. The fragment is common to all personalized pages belonging to different users. Because the <esi:inline>
tag assigns this fragment a constant name, a different user, such as John, would have the same fragment in his template with the same fragment name. Two fragments are shared if and only if their names are identical. This way, the same shared fragment in all templates only need a single update when it expires or is invalidated. $(QUERY_STRING{username})
is an ESI environment variable that provide access to value of the username
. This variable is used here because this application uses the username
query string parameter to pass along the user's name. By using this variable, the first fragment becomes common to all users.
<esi:inline name="/Common_Fragment_1" > <!-- First common fragment --> <HTML> ... <!-- Personalized Greeting With ESI variable --> Welcome, $(QUERY_STRING{username})! </esi:inline>
Figure 7-11 shows the markup for Weather Forecast. The fragment is unique to each city. Every template selecting the same city would share this fragment with Mark's page due to the fragment naming.
<esi:inline name="/Weathers_San_Francisco" ><!-- Personalized Weather Forecast -->
Weather Forecast for San Francisco
<TABLE>
<TR>
<TD>
Currently: 63F
</TD>
</TR>
</TABLE>
</esi:inline>
Figure 7-12 shows the markup for My Stocks. The stock quotes fragment encloses all stock picks in Mark's page. It is further divided into five sub-fragments, one for each stock pick, using nested <esi:inline>
tags. Thus, Mark's ESI template references his stock selection fragment, which in turn references five particular stock pick fragments. While the stock picks are shared by many user's stock selection fragment, the stock selection fragment itself is also a template uniquely owned by Mark. This separates the unique information from shared information, maximizing the reduction of cache updates and space consumption of personal stock selection.
<esi:inline name="/Stocks_$(QUERY_STRING{username})" >
<!-- Personalized Stock Quote Selections -->
<TABLE>
<TR>
<TD>
<esi:inline name="/ticker_IBM">
IBM 108.53 10/25/2001 1:33PM -0.04
</esi:inline>
<BR>
<esi:inline name="/ticker_ORCL">
ORCL 13.379 10/25/2001 1:38PM -1.281
</esi:inline>
<BR>
<esi:inline name="/ticker_YHOO">
YHOO 11.41 10/25/2001 1:37PM -0.54
</esi:inline>
<BR>
<esi:inline name="/ticker_SUNW">
SUNW 9.20 10/25/2001 1:38PM +0.01
</esi:inline>
<BR>
<esi:inline name="/ticker_PRSF">
PRSF 1.98 10/25/2001 1:37PM +0.08
</esi:inline>
<TD>
</TR>
</TABLE>
</esi:inline>
Figure 7-13 shows the markup for referencing an advertisement in the Promotion section. promotionID
is the based on the user's identification.
<esi:inline name="/ExternalAdvertisement"> <!-- External Advertisement --> <TABLE> <TR> <TD> <a href="http://www.companyad.com/advert?promotionID=126532"> <img src="http://www.companyad.com/advert_img?promotionID=126532"> </a> </TD> </TR> </TABLE> </esi:inline>
Rotating advertisements that change in every response is an example of real- time content that renders little value in non-fetchable ESI <esi:inline>
caching. Even the smallest portion of real-time content embedded as a non-fetchable ESI inline fragment would require the entire response to be regenerated and fetched, effectively creating cache misses all the time. To utilize ESI and dynamic content caching for these real-time fragments, use the <esi:include>
tag.
See Also:
"Portal Example Using Include Tags" for an example of using |
The Latest News and Latest Sports News fragments are similar to the weather fragment. All the common areas are also defined as fragments. Although it is possible to leave them as part of the template, that would consume unnecessary storage space. Figure 7-14 shows the markup.
<esi:inline name="/Top_News_Finance"> <!-- Personalized Top News --> Latest News for finance <TABLE> <TR> Blue-Chip Stocks Cut Losses; Nasdaq Up MO Stocks Fall at Opening After Plane Crash New York Times French rig factory with explosives New York Times Volkswagen faces Brazil strike CNN Europe Airbuss reliability record BBC </TR> </TABLE> </esi:inline> <esi:inline name="/Sports_News_Soccer" > <!-- Personalized Sports News --> Latest Sports News for Soccer <TABLE> <TR> Hearts chief told to resign MO Owen and Gerrard fit for Blackburn game Ananova Hearts in positive AGM pledge Ananova Time for McIntosh to decide scotsman.com Bannon in call for calm as Gorgie faithfull gather to grill Robinson scotsman.com </TR> </TABLE> </esi:inline>
This section shows how the <esi:include>
tag can be used for fragmentation and assembly of fetchable fragments whose content are not embedded in the template.
Figure 7-15 shows portal.esi
with <esi:include>
tags.
<HTML>
...
<!-- Personal Profile -->
<esi:comment text="Profile refers to environment variables stored in
/servlet/GetProfile. GetProfile servlet enables access to a set of environment
variables with personal profile information."/>
<esi:environment src="/servlet/GetProfile?username=$(QUERY_STRING{username})"
name="Profile"/>
...
<!-- Personalized Greeting With ESI variable -->
<esi:vars>Welcome, $(QUERY_STRING{username})!</esi:vars>
...
<!-- Personalized Weather Forecast -->
<TABLE>
<TR>
<TD>
<esi:include
src="/servlet/Weather?city=$(Profile{city})&state=$(Profile{state})"/>
</TD>
</TR>
</TABLE>
...
<!-- Personalized Stock Quote Selections -->
<TABLE>
<TR>
<TD>
<esi:include src="/servlet/PersonalizedStockSelection?username=$(QUERY_
STRING{username})"/>
</TD>
</TR>
</TABLE>
...
<!-- External Advertisement -->
<TABLE>
<TR>
<TD>
<esi:try>
<esi:attempt>
<esi:comment text="Include an ad"/>
<esi:include src="/servlet/Advert"/>
</esi:attempt>
<esi:except>
<esi:comment text="Just write an HTML link instead"/>
<A HREF="http://www.oracle.com">http://www.oracle.com</a>
</esi:except>
</esi:try>
</TD>
</TR>
</TABLE>
...
<!-- Personalized Top News -->
Latest News for <esi:vars>$(Profile{news})</esi:vars>
<TABLE>
<TR>
<TD>
<esi:choose>
<esi:when test="$(Profile{news}) == `internet'">
<esi:include src="/servlet/News?type=Top&topic=internet"/>
</esi:when>
<esi:when test="$(Profile{news}) == `finance'">
<esi:include src="/servlet/News?type=Top&topic=business"/>
</esi:when>
<esi:otherwise>
<esi:include src="/servlet/News?type=Top&topic=technology"/>
</esi:otherwise>
</esi:choose>
</TD>
</TR>
</TABLE>
...
<!-- Personalized Sports News -->
Latest Sports News for <esi:vars>$(Profile{sport})</esi:vars>
<TABLE>
<TR>
<TD>
<esi:choose>
<esi:when test="$(Profile{sport}) == `golf'">
<esi:include src="/servlet/News?type=Sports&topic=golf"/>
</esi:when>
<esi:when test="$(Profile{sport}) == `soccer'">
<esi:include src="/servlet/News?type=Sports&topic=soccer"/>
</esi:when>
<esi:when test="$(Profile{sport}) == `basketball'">
<esi:include src="/servlet/News?type=Sports&topic=basketball"/>
</esi:when>
<esi:when test="$(Profile{sport}) == `baseball'">
<esi:include src="/servlet/News?type=Sports&topic=baseball"/>
</esi:when>
<esi:otherwise>
<esi:include src="/servlet/News?type=Sports&topic=soccer"/>
</esi:otherwise>
</esi:choose>
</TD>
</TR>
</TABLE>
Figure 7-16 specifies Profile
to refer to the environment variables stored in GetProfile
. GetProfile
enables access to user profile variables, which are used as parameters in the included fragments:
<!-- Personal Profile --> <esi:comment text="Profile refers to environment variables stored in /servlet/GetProfile. GetProfile servlet enables access to a set of environment variables with personal profile information."/> <esi:environment src="/servlet/GetProfile?username=$(QUERY_STRING{username})" name="Profile"/>
Figure 7-17 shows GetProfile
, which provides access to the city
, state
, news
, and sports
environment variables.
<?xml version=1.0?> <esi-environment esiversion="ORAESI/9.0.2"> <city>San_Francisco</city> <state>CA</state> <news>finance</news> <sports>soccer</sports> </esi-environment>
Figure 7-18 shows the markup for the personalized greeting Welcome, Mark!
. The personalized greeting is achieved by the <esi:vars>
tag, which bases the greeting on the username
parameter embedded in the URL. username
is the registered user's name. This markup enables the personalized greeting to be included in the cacheable template page.
<esi:vars>Welcome, $(QUERY_STRING{username})!</esi:vars>
Figure 7-19 shows the markup for Weather Forecast. Weather Forecast includes a servlet fragment name Weather
, which uses the value of the user's city
and state
environment variables in GetProfile
to display the correct weather forecast for the user. Because GetProfile
has a value of San Francisco
for the city
environment variable and California
for the state
environment variable, the weather forecast is for San Francisco, California.
<TABLE> <TR> <TD> <esi:include src="/servlet/Weather?city=$(Profile{city})&state=$(Profile{state})"/> </TD> </TR> </TABLE>
The markup for My Stocks is depicted in Figure 7-20. My Stocks includes a servlet fragment named PersonalizedStockSelection
. The displayed stocks are based on the userID
parameter encoded in the URL. userID
is the registered user's unique ID.
<TABLE> <TR> <TD> <esi:include src="/servlet/PersonalizedStockSelection?username=$(QUERY_ STRING{username})"/> </TD> </TR> </TABLE>
The markup for the included fragment PersonalizedStockSelection
is depicted in Figure 7-21. It includes fragments for five stock quotes: IBM, ORCL, YHOO, SUNW, and PRSF.
<TABLE> <TR> <TD> <BR> <esi:include src="Quote?symbol=IBM"/> <BR> <esi:include src="Quote?symbol=ORCL"/> <BR> <esi:include src="Quote?symbol=YHOO"/> <BR> <esi:include src="Quote?symbol=SUNW"/> <BR> <esi:include src="Quote?symbol=PRSF"/> <BR> </TD> </TR> </TABLE>
Because the output is different for each user, the PersonalizedStockSelection
fragment is not cacheable. However, the response to each of the included quotes is cacheable, enabling stock quotes to be shared by multiple users. Even when many users share quotes, only one browser reload is needed when the quotes are updated. For example, the PersonalizedStockSelection
fragment for another user named Scott is depicted in Figure 7-22. It includes fragments for three stock quotes: IBM, ORCL, and SCO. As already described, IBM and ORCL are also shared by Mark. If Mark reloads the page first and caches the quotes, then the IBM and ORCL quotes for Scott are automatically refreshed.
<TABLE> <TR> <TD> <BR> <esi:include src="Quote?symbol=IBM"/> <BR> <esi:include src="Quote?symbol=ORCL"/> <BR> <esi:include src="Quote?symbol=SCO"/> <BR> </TD> </TR> </TABLE>
Figure 7-23 shows the markup for rotating advertisements in the Promotion section. The advertisements rotates in the sense that the advertisement changes for each response. By separating the generation of the included image fragment response from the template page, Oracle9iAS Web Cache is able to cache the template and integrate the dynamic advertisement into the template.
<TABLE> <TR> <TD> <esi:try> <esi:attempt> <esi:comment text="Include an ad"/> <esi:include src="/servlet/Advert"/> </esi:attempt> <esi:except> <esi:comment text="Just write an HTML link instead"/> <A HREF="www.oracle.com">www.oracle.com</a> </esi:except> </esi:try> </TD> </TR> </TABLE>
As shown in Figure 7-24, the response to the included image fragment for the banner is not cacheable. When a user requests this page, Oracle9iAS Web Cache sends the request to the application Web server to generate the banner. From the application Web server, Advert
generates the banner for the request.
<TABLE> <TR> <TD> <A HREF="http://www.companyad.com/redirect?refID=11934502"> <IMG src="http://www.companyad.com/advert_img?refID=11934502"></A> </TD> </TR> </TABLE>
As shown in Figure 7-25, the next time the user reloads the page, Advert
generates another banner for the request.
<TABLE> <TR> <TD> <A HREF="http://www.companyad.com/redirect?refID=123456602"> <IMG src="http://www.companyad.com/advert_img?refID=123456602"></A> </TD> </TR> </TABLE>
The banner relies on alternate processing with the <esi:try>
tag. If the servlet cannot run Advert
, then a link to www.oracle.com
appears in the banner's place.
Figure 7-26 shows the markup for Latest News and Latest Sports News:
news
category, internet
, finance
, or technology
, by using conditional processing with the <esi:choose>
tag. Because GetProfile
has a value of finance
for the news
environment variable, the headlines displayed relate to finance, /servlet/News?type=Top&topic=business
.
sports
category, golf
, soccer
, basketball
, baseball
, or soccer
, by using conditional processing. Because GetProfile
has a value of soccer
for the sports
environment variable, the output includes headlines relating to soccer, /servlet/News?type=Sports&topic=soccer
.
Latest News for <esi:vars>$(Profile{news})</esi:vars> <TABLE> <TR> <TD> <esi:choose> <esi:when test="$(Profile{news}) == `internet'"> <esi:include src="/servlet/News?type=Top&topic=internet"/> </esi:when> <esi:when test="$(Profile{news}) == `finance'"> <esi:include src="/servlet/News?type=Top&topic=business"/> </esi:when> <esi:otherwise> <esi:include src="/servlet/News?type=Top&topic=technology"/> </esi:otherwise> </esi:choose> </TD> </TR> </TABLE> ... <!-- Personalized Sports News --> Latest Sports News for <esi:vars>$(Profile{sport})</esi:vars> <TABLE> <TR> <TD> <esi:choose> <esi:when test="$(Profile{sport}) == `golf'"> <esi:include src="/servlet/News?type=Sports&topic=golf"/> </esi:when> <esi:when test="$(Profile{sport}) == `soccer'"> <esi:include src="/servlet/News?type=Sports&topic=soccer"/> </esi:when> <esi:when test="$(Profile{sport}) == `basketball'"> <esi:include src="/servlet/News?type=Sports&topic=basketball"/> </esi:when> <esi:when test="$(Profile{sport}) == `baseball'"> <esi:include src="/servlet/News?type=Sports&topic=baseball"/> </esi:when> <esi:otherwise> <esi:include src="/servlet/News?type=Sports&topic=soccer"/> </esi:otherwise> </esi:choose> </TD> </TR> </TABLE>
As described in Step 6 of "Configuring Personalized Attribute Definitions and Rules for Personalized Attributes", the <!-- WEBCACHETAG-->
and <!-- WEBCACHEEND-->
tags can be used between other HTML tag pairs, but not within an HTML tag. However, ESI variables can be used within an HTML tag.
For example, consider Figure 7-27. Its HTML code uses PL/SQL for an HTML form with a text box in it.
htp.p('<form action="test" method="GET">'); htp.p('<table border="0" > <tr> <td><input type="text" name="p_name" size="8" value="'||p_name||'"></td> </tr> <tr> <td><input type="submit" value="Search"></td> </tr> </table>');
Figure 7-28 shows how the $HTTP_COOKIE
variable is used with the <esi:vars>
tag to replace the value of p_name
with the user's name.
htp.p('<form action="test" method="GET">'); htp.p('<table border="0" ><tr><esi:vars> <td><input type="text" name="p_name" size="8" value="$(HTTP_ COOKIE{'p_name'}"></td> </tr></esi:vars> <tr> <td><input type="submit" value="Search"></td> </tr> </table>');
In addition to or as an alternative to creating caching rules with Oracle9iAS Web Cache Manager, application developers can choose to store the many of the caching attributes in the header of an HTTP response message. This feature enables the application Web server to override the settings configured through the Oracle9iAS Web Cache Manager interface, as well as allowing other third-party caches to use Oracle9iAS Web Cache caching attributes. All except the following attributes described in "Configuring Caching Rules" are supported:
To enable this feature, configure the HTTP response with the Surrogate-Control
response-header field as follows:
Surrogate-Control:control_directive
,control_directive
,...
Table 7-5 describes the supported control directives.
no-store
and no-store-remote
are mutually exclusive
content="ORAESI/9.0.2"
, content="ESI-Inline/1.0"
, content="ESI/1.0"
are mutually exclusive with content="webcache/1.0"
In the following example, the Surrogate-Control
response-header field specifies that the document is to expire 30 seconds after it enters the cache and be removed 60 seconds after expiration. It also specifies that the document contains ESI tags that require processing:
Surrogate-Control: max-age=30+60, content="ORAESI/9.0.2"
In the following example, the Surrogate-Control
response-header field specifies that the document is not to be cached:
Surrogate-Control: no-store
In the following example, the Surrogate-Control
response-header field specifies ESI processing. It also specifies that the document is a multiple-version document that uses HTTP request headers of Accept
and MyCustomHeader
and cookies of news
and sports
.
Surrogate-Control: content="ORAESI/9.0.2", vary=headers(Accept MyCustomHeader);cookies(news sports)
|
Copyright © 2002 Oracle Corporation. All Rights Reserved. |
|