HstComponent Java Class Examples
Below is the code for a very simple HstComponent that sets the HippoBean that belongs to the resolved sitemap item on the HstRequest ( HttpServletRequest). We also set the site content base bean, which is the 'root' bean for the current (sub)site on the request as an example.
Simple HstComponent extending BaseHstComponent:
public class Detail extends BaseHstComponent {
@Override
public void doBeforeRender(final HstRequest request,
final HstResponse response) throws HstComponentException {
HstRequestContext ctx = request.getRequestContext();
// get the content bean for the current resolved sitemap item and
// set it on the request to make it available for
// the renderer like jsp or freemarker
HippoBean documentBean = ctx.getContentBean();
request.setAttribute("document",documentBean);
// or, getting the content bean strong typed and null if the bean is
// not of type NewsDocument
NewsDocument newsDocument = ctx.getContentBean(NewsDocument.class);
// get the content bean for the root of the current (sub)site and set
// it on the request to make it available for
// the renderer like jsp or freemarker
HippoBean rootBean = ctx.getSiteContentBaseBean();
request.setAttribute("root",rootBean);
// get the base bean where all assets are stored, for example to use
// in a HstQuery
HippoFolderBean assetBaseBean = getAssetBaseBean(request);
// get the base bean where all gallery items are stored, for example
// to use in a HstQuery
HippoFolderBean galleryBaseBean = getGalleryBaseBean(request);
}
}
Example about accessing namespaced and public request parameters:
Accessing namespaced and public request paramaters:
public class Detail extends BaseHstComponent {
// tries to get the namespaced request parameter 'page'.
// For example, when the namespace of this component is
// r1_r2, then, only when the request parameter is
// 'r2_r2:page', it's value will be assigned to strPage
// below
String strPage = request.getParameter("page");
// getPublicRequestParameter fetches the request parameter 'query' without
// namespacing! This is useful when for example the query is submitted
// through a html form, and needs to be rendered in a different
// HstComponent than the one that dispatched to the jsp that created the
// search form.
String query = getPublicRequestParameter(request, "query");
}
Example about getting hst component configuration parameters without ParametersInfo annotation (note that using ParametersInfo is preferred, see HstComponent ParametersInfo annotation)
public class Detail extends BaseHstComponent {
// get the page size parameter from the HstComponent. If the parameter
// value contained property place holders like ${1} then these are
// resolved
String pageSize = getComponentParameter("pageSize");
// get the page size parameter from the HstComponent. If the parameter
// value contained property place holders like ${1} these are *not*
// resolved
String pageSizeRaw = getComponentConfiguration().getRawParameters()
.get("pageSize");
// get the page size parameter from the HstComponent *without inheritance*
// from ancestor components
String localPageSize = getComponentLocalParameter("pageSize");
// get the page size parameter from the HstComponent *without inheritance*
// from ancestor components and *without* having property place holders
// like ${1} resolved
String localRawPageSize = getComponentConfiguration()
.getRawLocalParameters().get("pageSize");
}
The example below is an example of an HstComponent which is a Search implementation. Note that it does not use ParametersInfo annotation, which is the preferred way, see Define a Component's Configuration Parameters. On the HstRequest, the search result, the crPage, the query and a list of available page numbers is set. The renderer (jsp / freemarker) can iterate through the result which returns HippoBean's for every hit.
public class Search extends BaseHstComponent {
@Override
public void doBeforeRender(final HstRequest request,
final HstResponse response) throws HstComponentException {
// get the root content bean for the current (sub)site.
// This is the scope to search below
HstRequestContext ctx = request.getRequestContext();
HippoBean scope = ctx.getSiteContentBaseBean();
if (scope == null) {
throw new HstComponentException("Scope is not allowed to be null for a search");
}
int pageSize = 10; // the free text to search on
String query = getPublicRequestParameter(request, "query");
if (query == null) { // test namespaced query parameter
query = request.getParameter("query");
}
String crPageStr = request.getParameter("page");
int crPage = 1;
if (crPageStr != null) {
try {
crPage = Integer.parseInt(crPageStr);
} catch (NumberFormatException e) {
throw new HstComponentException("Invalid page number '" + crPage + "'");
}
} // search for news items
Class filterClass = getObjectConverter()
.getAnnotatedClassFor("myproject:news");
try {
HstQuery hstQuery = ctx.getQueryManager()
.createQuery(scope, filterClass, true);
hstQuery.setLimit(pageSize);
if (query != null && !"".equals(query)) {
Filter f = hstQuery.createFilter();
f.addContains(".", query);
hstQuery.setFilter(f);
}
HstQueryResult result = hstQuery.execute();
request.setAttribute("result", result);
request.setAttribute("crPage", crPage);
request.setAttribute("query", query);
request.setAttribute("totalSize", result.getTotalSize()); // add pages
if (result.getTotalSize() > pageSize) {
List<Integer> pages = new ArrayList<Integer>();
int numberOfPages = result.getTotalSize() / pageSize;
if (result.getTotalSize() % pageSize != 0) {
numberOfPages++;
}
for (int i = 0; i < numberOfPages; i++) {
pages.add(i + 1);
}
request.setAttribute("pages", pages);
}
} catch (QueryException e) {
throw new HstComponentException("Exception occured during creation " +
"or execution of HstQuery.", e);
}
}
}