Business Requirement
Customer wants to upload HTML files to a specific folder under IBM HTTP web-server (e.g. /opt/webserver/htdocs/staticcontent) which can be picked up and displayed on a WebSphere Commerce store. The URLs needs to be SEO friendly & HTML files can be added to sub-folders up to 4 levels deep, for example:
- /opt/webserver/htdocs/staticcontent/file.html
- /opt/webserver/htdocs/staticcontent/folder1/file1.html
- /opt/webserver/htdocs/staticcontent/folder1/folder2/file2.html
Suggested Solution
The code snippets below shows what the sort of changes that can be done to SEOURLPatterns-ext.xml as well as a sample JSP (CustomStaticContent.jsp) that is responsible for rendering the HTML files. The full JSP is not included but just a small sample that demonstrate how to handle the parameters passed by the SEO (e.g. folder1, folder2, ..). For sake of more clarity, in case of trying to access file /opt/webserver/htdocs/staticcontent/myfolder/file1.html, the parameters passed to the JSP will be as follows:
- normalizedURL=file1
- staticHTMLContent=/opt/webserver/htdocs/staticcontent (variable initialized from a constant)
- param.folder1=myfolder
On WebSphere Commerce store, you will need to access the file using a link which will look as follows (file1 without .html extension)
http://<myserver/en/mystore/staticcontent/myfolder/file1
Limitations
- File-name can't be specified with an extension, you have to add the extension grammatically (as shown in CustomStaticContent.html)
- You are limited to 4 levels, if you need more, you will need to add more SEO patterns as well as update application code.
SEOURLPatterns-ext.xml
<seourl:token name="AtoZStoresToken" >
<seourl:tokenValue value="[[a-z]*]" />
</seourl:token>
<seourl:token name="FileNameToken" >
<seourl:tokenValue value="[[a-z0-9\-\.]*]" />
</seourl:token>
<seourl:token name="FolderNameToken1" >
<seourl:tokenValue value="[[a-z0-9\-\.]*]" />
</seourl:token>
<seourl:token name="FolderNameToken2" >
<seourl:tokenValue value="[[a-z0-9\-\.]*]" />
</seourl:token>
<seourl:token name="FolderNameToken3" >
<seourl:tokenValue value="[[a-z0-9\-\.]*]" />
</seourl:token>
<seourl:token name="FolderNameToken4" >
<seourl:tokenValue value="[[a-z0-9\-\.]*]" />
</seourl:token>
<seourl:token name="ExtendedStaticContentToken" >
<seourl:tokenValue value="staticcontent" />
</seourl:token>
</seourl:tokenDef>
<!--/en /dunlem/staticcontent/file1-->
<seourl:seoUrlPatternDef name="StaticContentURLLevel0" >
<seourl:seoUrlPattern viewName="StaticContent" >/LanguageToken/StoreToken:CatalogToken/ExtendedStaticContentToken/FileNameToken</seourl:seoUrlPattern >
<seourl:urlToParamMapping>
<seourl:mapping name="langId" value="?LanguageToken?"/>
<seourl:mapping name="storeId" value="?StoreToken?"/>
<seourl:mapping name="catalogId" value="?CatalogToken?"/>
<seourl:mapping name="url" value="?FileNameToken?"/>
</seourl:urlToParamMapping>
<seourl:paramToUrlMapping>
<seourl:mapping name="LanguageToken" value="?langId?" defaultValue="-1" />
<seourl:mapping name="StoreToken" value="?storeId?"/>
<seourl:mapping name="CatalogToken" value="?catalogId?"/>
<seourl:mapping name="FileNameToken" value="?url?"/>
<seourl:mapping name="ExtendedStaticContentToken" value="ExtendedStaticContentToken" />
</seourl:paramToUrlMapping>
<seourl:usageDef CMCPrefix="true" >
<seourl:usage device="browser" >
<seourl:target> StaticContentLevel0</seourl:target >
</seourl:usage>
</seourl:usageDef>
</seourl:seoUrlPatternDef >
<!--/en/dunlem/staticcontent/folder1/file1-->
<seourl:seoUrlPatternDef name="StaticContentURLLevel1">
<seourl:seoUrlPattern viewName="StaticContent" >/LanguageToken/StoreToken:CatalogToken/ExtendedStaticContentToken/FolderNameToken1/FileNameToken </seourl:seoUrlPattern>
<seourl:urlToParamMapping>
<seourl:mapping name="langId" value="?LanguageToken?"/>
<seourl:mapping name="storeId" value="?StoreToken?"/>
<seourl:mapping name="catalogId" value="?CatalogToken?"/>
<seourl:mapping name="url" value="?FileNameToken?"/>
<seourl:mapping name="folder1" value="?FolderNameToken1?"/>
</seourl:urlToParamMapping>
<seourl:paramToUrlMapping>
<seourl:mapping name="LanguageToken" value="?langId?" defaultValue="-1" />
<seourl:mapping name="StoreToken" value="?storeId?"/>
<seourl:mapping name="CatalogToken" value="?catalogId?"/>
<seourl:mapping name="FileNameToken" value="?url?"/>
<seourl:mapping name="FolderNameToken1" value="folder1"/>
<seourl:mapping name="ExtendedStaticContentToken" value="staticcontent" />
</seourl:paramToUrlMapping>
<seourl:usageDef CMCPrefix="true" >
<seourl:usage device="browser" >
<seourl:target> StaticContentLevel1</seourl:target >
</seourl:usage>
</seourl:usageDef>
</seourl:seoUrlPatternDef >
<!--/en/dunlem/staticcontent/folder1/folder2/file1-->
<seourl:seoUrlPatternDef name="StaticContentURLLevel2">
<seourl:seoUrlPattern viewName="StaticContent" >/LanguageToken/StoreToken:CatalogToken/ExtendedStaticContentToken/FolderNameToken1/FolderNameToken2/FileNameToken </seourl:seoUrlPattern>
<seourl:urlToParamMapping>
<seourl:mapping name="langId" value="?LanguageToken?"/>
<seourl:mapping name="storeId" value="?StoreToken?"/>
<seourl:mapping name="catalogId" value="?CatalogToken?"/>
<seourl:mapping name="url" value="?FileNameToken?"/>
<seourl:mapping name="folder1" value="?FolderNameToken1?"/>
<seourl:mapping name="folder2" value="?FolderNameToken2?"/>
</seourl:urlToParamMapping>
<seourl:paramToUrlMapping>
<seourl:mapping name="LanguageToken" value="?langId?" defaultValue="-1" />
<seourl:mapping name="StoreToken" value="?storeId?"/>
<seourl:mapping name="CatalogToken" value="?catalogId?"/>
<seourl:mapping name="FileNameToken" value="?url?"/>
<seourl:mapping name="FolderNameToken1" value="folder1"/>
<seourl:mapping name="FolderNameToken2" value="folder2"/>
<seourl:mapping name="ExtendedStaticContentToken" value="staticcontent" />
</seourl:paramToUrlMapping>
<seourl:usageDef CMCPrefix="true" >
<seourl:usage device="browser" >
<seourl:target> StaticContentLevel2</seourl:target >
</seourl:usage>
</seourl:usageDef>
</seourl:seoUrlPatternDef >
<!--/en/dunlem/staticcontent/folder1/folder2/folder3/file1-->
<seourl:seoUrlPatternDef name="StaticContentURLLevel3">
<seourl:seoUrlPattern viewName="StaticContent" >/LanguageToken/StoreToken:CatalogToken/ExtendedStaticContentToken/FolderNameToken1/FolderNameToken2/FolderNameToken3/FileNameToken </seourl:seoUrlPattern>
<seourl:urlToParamMapping>
<seourl:mapping name="langId" value="?LanguageToken?"/>
<seourl:mapping name="storeId" value="?StoreToken?"/>
<seourl:mapping name="catalogId" value="?CatalogToken?"/>
<seourl:mapping name="url" value="?FileNameToken?"/>
<seourl:mapping name="folder1" value="?FolderNameToken1?"/>
<seourl:mapping name="folder2" value="?FolderNameToken2?"/>
<seourl:mapping name="folder3" value="?FolderNameToken3?"/>
</seourl:urlToParamMapping>
<seourl:paramToUrlMapping>
<seourl:mapping name="LanguageToken" value="?langId?" defaultValue="-1" />
<seourl:mapping name="StoreToken" value="?storeId?"/>
<seourl:mapping name="CatalogToken" value="?catalogId?"/>
<seourl:mapping name="FileNameToken" value="?url?"/>
<seourl:mapping name="FolderNameToken1" value="folder1"/>
<seourl:mapping name="FolderNameToken2" value="folder2"/>
<seourl:mapping name="FolderNameToken3" value="folder3"/>
<seourl:mapping name="ExtendedStaticContentToken" value="staticcontent" />
</seourl:paramToUrlMapping>
<seourl:usageDef CMCPrefix="true" >
<seourl:usage device="browser" >
<seourl:target> StaticContentLevel3</seourl:target >
</seourl:usage>
</seourl:usageDef>
</seourl:seoUrlPatternDef >
<!--/en/dunlem/ staticcontent/folder1/folder2/folder3/folder4/file1-->
<seourl:seoUrlPatternDef name="StaticContentURLLevel4">
<seourl:seoUrlPattern viewName="StaticContent" >/LanguageToken/StoreToken:CatalogToken/ExtendedStaticContentToken/FolderNameToken1/FolderNameToken2/FolderNameToken3/FolderNameToken4/FileNameToken </seourl:seoUrlPattern>
<seourl:urlToParamMapping>
<seourl:mapping name="langId" value="?LanguageToken?"/>
<seourl:mapping name="storeId" value="?StoreToken?"/>
<seourl:mapping name="catalogId" value="?CatalogToken?"/>
<seourl:mapping name="url" value="?FileNameToken?"/>
<seourl:mapping name="folder1" value="?FolderNameToken1?"/>
<seourl:mapping name="folder2" value="?FolderNameToken2?"/>
<seourl:mapping name="folder3" value="?FolderNameToken3?"/>
<seourl:mapping name="folder4" value="?FolderNameToken4?"/>
</seourl:urlToParamMapping>
<seourl:paramToUrlMapping>
<seourl:mapping name="LanguageToken" value="?langId?" defaultValue="-1" />
<seourl:mapping name="StoreToken" value="?storeId?"/>
<seourl:mapping name="CatalogToken" value="?catalogId?"/>
<seourl:mapping name="FileNameToken" value="?url?"/>
<seourl:mapping name="FolderNameToken1" value="folder1"/>
<seourl:mapping name="FolderNameToken2" value="folder2"/>
<seourl:mapping name="FolderNameToken3" value="folder3"/>
<seourl:mapping name="FolderNameToken4" value="folder4"/>
<seourl:mapping name="ExtendedStaticContentToken" value="staticcontent" />
</seourl:paramToUrlMapping>
<seourl:usageDef CMCPrefix="true" >
<seourl:usage device="browser" >
<seourl:target> StaticContentLevel4</seourl:target >
</seourl:usage>
</seourl:usageDef>
</seourl:seoUrlPatternDef >
CustomStaticContent.jsp
<c:set var="normalizedURL" value="${normalizedURL} .html" />
</c:if >
<c:if test="${! empty param.folder1}" >
<c:set var="staticHtmlLocation" value=" ${staticHtmlLocation}/${param.folder1} " />
</c:if >
<c:if test="${! empty param.folder2}" >
<c:set var="staticHtmlLocation" value=" ${staticHtmlLocation}/${param.folder2} " />
</c:if >
<c:if test="${! empty param.folder3}" >
<c:set var="staticHtmlLocation" value=" ${staticHtmlLocation}/${param.folder3} " />
</c:if >
<c:if test="${! empty param.folder3}" >
<c:set var="staticHtmlLocation" value=" ${staticHtmlLocation}/${param.folder4} " />
</c:if >
No comments:
Post a Comment