The store.war/browse/gadgets/recentlyViewed.jsp
gadget is responsible for rendering the Recently Viewed panel at the bottom of the product detail page. For each recently viewed product, recentlyViewed.jsp
renders the product name, image, pricing, and site the product was viewed on. Also, each recently viewed product in the panel is rendered as a link that takes the customer to the product detail pages for the individual products.
To do its job, recentlyViewed.jsp
uses the RecentlyViewedFilterDroplet
to generate a filtered collection of recently viewed products that are appropriate for the current site context. As described in Filtering Products in the Recently Viewed List, the RecentlyViewedFilterDroplet
can take an exclude
parameter so that any specified products are excluded from the recently viewed products list. Commerce Reference Store’s implementation of the product detail page takes advantage of this mechanism to prevent the currently displayed product from also appearing in the recently viewed products list. To do this, the product detail page specifies the current product’s ID in an exclude
page parameter when it calls recentlyViewed.jsp
, and then recentlyViewed.jsp
passes the excluded product to the RecentlyViewedFilterDroplet
.
The RecentlyViewedDroplet
calls RecentlyViewedFilter
to do the actual filtering. RecentlyViewedFilter
returns the filtered list of recently viewed products in descending timestamp order so that the most recently viewed product is returned first, the second most recently viewed product is returned second, and so on. A ForEach
servlet bean is used to iterate over the filtered list in this same order, so that the most recently viewed product is rendered farthest to the left and the least recently viewed product is rendered farthest to the right. The ForEach
servlet bean’s output
open parameter includes the generic gadget, store.war/global/gadgets/promotedProductRenderer.jsp
, to render each recently viewed product, including its associated information and a link to its product detail page.
Note that the recently viewed product’s site ID is passed to the promotedProductRenderer.jsp
gadget. The promotedProductRenderer.jsp
gadget then forwards this site ID on to the gadget that renders the site indicator portion of the recently viewed product information, namely store.war/global/gadgets/siteIndicator.jsp
. This is necessary because a product may be associated with more than one site and, if a site ID is not provided, siteIndicator.jsp
will pick a site ID based on its own internal logic. In the case of a recently viewed product, we want the site indicator to represent the site the product was viewed on, so we must explicitly pass the recently viewed product’s site ID to siteIndicator.jsp
.
On a final note, if RecentlyViewedFilter
returns an empty list, the ForEach
servlet bean terminates itself and the Recently Viewed panel is not rendered.