| Title: Web Applications |
| |
| |
| |
| <H3><A name="WebApplications-PuttingCayenneFilesinWebApplicationCLASSPATH"></A>Putting Cayenne Files in Web Application CLASSPATH</H3> |
| |
| <P>When deploying an application in a web container it is possible to follow the procedure for the standalone applications, i.e. put all XML files in the application CLASSPATH (e.g. in "mywebapp/WEB-INF/classes/", but DON'T put it in container shared locations!). Session DataContext can be obtained via ServletUtil:</P> |
| |
| <DIV class="code panel" style="border-width: 1px;"><DIV class="codeContent panelContent"> |
| <PRE class="code-java">HttpSession session = ...; |
| DataContext context = ServletUtil.getSessionContext(session);</PRE> |
| </DIV></DIV> |
| |
| <P>However you may consider a deployment procedure described below, as it provides more flexibility and a number of additional useful features.</P> |
| |
| <H3><A name="WebApplications-CayenneServletFilter"></A>Cayenne Servlet Filter</H3> |
| |
| <P>Adding the following filter to the <TT>web.xml</TT> would automate Cayenne setup in the web application:</P> |
| |
| <DIV class="preformatted panel" style="border-width: 1px;"><DIV class="preformattedContent panelContent"> |
| <PRE><filter> |
| <filter-name>CayenneFilter</filter-name> |
| <filter-class>org.objectstyle.cayenne.conf.WebApplicationContextFilter</filter-class> |
| </filter> |
| <filter-mapping> |
| <filter-name>CayenneFilter</filter-name> |
| <url-pattern>/*</url-pattern> |
| </filter-mapping> |
| </PRE> |
| </DIV></DIV> |
| |
| <P>The filter will ensure that for each matching request a DataContext is bound to the request thread. So you can retrieve it anywhere in the application, even if you don't have a reference to the web environment:</P> |
| |
| <DIV class="code panel" style="border-width: 1px;"><DIV class="codeContent panelContent"> |
| <PRE class="code-java">DataContext context = DataContext.getThreadDataContext();</PRE> |
| </DIV></DIV> |
| |
| <P>Filter can match a specific URL as shown above, or a specific servlet:</P> |
| |
| <DIV class="preformatted panel" style="border-width: 1px;"><DIV class="preformattedContent panelContent"> |
| <PRE><servlet> |
| <servlet-name>MyServlet</servlet-name> |
| <servlet-class>org.example.MyServlet</servlet-class> |
| <load-on-startup>0</load-on-startup> |
| </servlet> |
| |
| <filter> |
| <filter-name>CayenneFilter</filter-name> |
| <filter-class>org.objectstyle.cayenne.conf.WebApplicationContextFilter</filter-class> |
| </filter> |
| <filter-mapping> |
| <filter-name>CayenneFilter</filter-name> |
| <servlet-name>MyServlet</servlet-name> |
| </filter-mapping></PRE> |
| </DIV></DIV> |
| |
| |
| <P>Additionally the filter supports putting files in <TT>myapp/WEB-INF/</TT> directory instead of the CLASSPATH, so a .war file may look like this:</P> |
| |
| <DIV class="preformatted panel" style="border-width: 1px;"><DIV class="preformattedContent panelContent"> |
| <PRE>index.jsp |
| WEB-INF/cayenne.xml |
| WEB-INF/xyz.map.xml |
| WEB-INF/lib/...</PRE> |
| </DIV></DIV> |
| |
| <P>Actually, Cayenne files can be stored in any subdirectory of <TT>myapp/WEB-INF/</TT>. To specify a subdirectory, you'll need to add <TT><context-param></TT> named <TT>cayenne.configuration.path</TT> to your application descriptor:</P> |
| |
| <DIV class="preformatted panel" style="border-width: 1px;"><DIV class="preformattedContent panelContent"> |
| <PRE><context-param> |
| <param-name>cayenne.configuration.path</param-name> |
| <param-value>/WEB-INF/config/cayenne-files</param-value> |
| </context-param></PRE> |
| </DIV></DIV> |