5.2. web.xml

Next, we need to update web.xml to specify the servlets, listeners and filters needed for Restful Objects. You'll find that some of these are shared with HTML viewer.

5.2.1. DTD and Display Name

To start with, we have the boilerplate DTD reference and <displayname>:t

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"[]>
<web-app>
  <display-name>Restful Objects</display-name>

  ...
</web-app> 

5.2.2. Context Parameters

There is one context parameter to add:

<web-app>
  ...
  <context-param>
    <param-name>javax.ws.rs.Application</param-name>
    <param-value>org.starobjects.restful.viewer.RestfulApplication</param-value>
  </context-param>
  ...
</web-app>

This is used by RestEasy to defines the supported resources.

5.2.3. Filters and Filter Mappings

Next, filters.

<web-app>
  ...
  <filter>
    <filter-name>NakedObjectsSessionFilter</filter-name>
    <filter-class>org.nakedobjects.webapp.NakedObjectsSessionFilter</filter-class>
    <init-param>
      <param-name>authenticationSessionLookupStrategy</param-name>
      <param-value>org.starobjects.restful.viewer.authentication.AuthenticationSessionLookupStrategyExtended</param-value>
    </init-param>
  </filter>

  <filter>
    <filter-name>NakedObjectsStaticContentFilter</filter-name>
    <filter-class>org.nakedobjects.webapp.NakedObjectsSessionFilter</filter-class>
  </filter>
  ...
</web-app>

The NakedObjectsSessionFilter is used to ensure that there is an authentication session in place. As you might infer from its <init-param>, the mechanism it does to lookup this authentication session is pluggable. The one specified will fake a session if running in EXPLORATION mode. But, again, more on this in Section 5.4, “Authentication”.

The NakedObjectsStaticContentFilter is used to decorate any static resources (Javascript, CSS or images) so that they are cached client-side.

The mappings for these two filters are:

<web-app>
  ...
  <filter-mapping>
    <filter-name>NakedObjectsSessionFilter</filter-name>
    <url-pattern>*</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>NakedObjectsStaticContentFilter</filter-name>
    <url-pattern>*.js</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>NakedObjectsStaticContentFilter</filter-name>
    <url-pattern>*.css</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>NakedObjectsStaticContentFilter</filter-name>
    <url-pattern>*.png</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>NakedObjectsStaticContentFilter</filter-name>
    <url-pattern>*.jpg</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>NakedObjectsStaticContentFilter</filter-name>
    <url-pattern>*.gif</url-pattern>
  </filter-mapping>
  ...
</web-app>

5.2.4. Listeners

Two listeners are required, one for Restful Objects/Naked Objects and one for RestEasy. These both bootstrap the respective libraries:

<web-app>
  ...
  <listener>
    <listener-class>org.nakedobjects.webapp.NakedObjectsWebAppBootstrapper</listener-class>
  </listener>

  <listener>
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
  </listener>
  ...
</web-app>

5.2.5. Servlets and Servlet Mappings

Finally, we have the servlets:

<web-app>
  ...
  <servlet>
    <servlet-name>RestEasyDispatcher</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
  </servlet>

  <servlet>
    <servlet-name>ResourceServlet</servlet-name>
    <servlet-class>org.nakedobjects.webapp.servlets.ResourceServlet</servlet-class>
  </servlet>
  ...
</web-app>

The main servlet is RestEasy's HttpServletDispatcher servlet, that handles all inbound requests. In addition though we configure a Naked Objects' ResourceServlet to serve up Javascript, CSS and images (the same as those decorated by the NakedObjectsStaticContentFilter).

The mappings for these servlets are:

<web-app>
  ...
  <servlet-mapping>
    <servlet-name>RestEasyDispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>ResourceServlet</servlet-name>
    <url-pattern>*.js</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ResourceServlet</servlet-name>
    <url-pattern>*.css</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ResourceServlet</servlet-name>
    <url-pattern>*.png</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ResourceServlet</servlet-name>
    <url-pattern>*.jpg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ResourceServlet</servlet-name>
    <url-pattern>*.gif</url-pattern>
  </servlet-mapping>

</web-app>