Velocity can be configured to support HTTP requests with different content types.
By default, the Velocity Servlet Extension is configured to respond to HTTP requests with
a content type text/html
. Change this request type by setting the
default MIME type using dsconfig
. For example, the following can be
used to set the default type to XML:
$ bin/dsconfig set-http-servlet-extension-prop \
--extension-name Velocity \
--set default-mime-type:application/xml
HTML requests can be supported as well as clients that seek content in other formats. Create one or more Velocity template loaders to load templates for other content types like XML or JSON.
The ability to serve multiple formats of a document to clients at the same URL is
typically called "content negotiation". HTTP clients indicate the type of content
desired using the Accept
header. A client may use a header like the
following to indicate that they prefer content in XML but will fallback to HTML if
necessary:
Accept:application/xml,text/html;q=0.9
The following can be used to create a Velocity template loader for XML content:
$ bin/dsconfig create-velocity-template-loader \
--extension-name Velocity \
--loader-name XML \
-–set evaluation-order-index:502 \
--set mime-type-matcher:application/xml \
–-set mime-type:application/xml \
-–set template-suffix:.vm.xml
Upon receiving a request, the Velocity Servlet first creates an ordered list of requested
media types from most desired to least based on the value of the Accept
header. Starting from the most desired type, it will then iterate over the defined
template loaders according to the evaluation-order-index
property from
lowest value to highest.
A template loader can indicate that it can handle content for requested media type by
comparing the requested type to its mime-type-matcher
property. A
loader can be configured to load templates from a specific directory or load template
files having a particular suffix. For example, XML templates are expected to be named
using a .vm.xml
suffix. If a loader indicates it handles the requested
content type and a template exists for the requested view, the template is loaded and
used to generate a response to the client. If no loaders are found for the requested
media type, the next most preferred media type (if any) is tried. If no loaders
indicated that they could satisfy the requested view, the client is sent an HTTP
404 (not found)
error. If no loaders could provide acceptable media but the
requested view exists in some other format, the client is sent an HTTP 406 (not
acceptable)
error.
In this example, a template file called hello.vm.xml can be used to generate a response in XML:
<hello name=”$ubid_request.parameters.name”/>
In this
case, the response will contain an HTTP Content-Type header with the value of the
mime-type
property of the Velocity template loader.