I am using embedded jetty and loading contexts through xml file. In my application, following contexts were deployed in my jetty 6.1.7 version:
<New class="org.mortbay.jetty.servlet.Context">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.home" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.mortbay.jetty.servlet.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.TransformationServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.mortbay.jetty.servlet.Context">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/monitor</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.home" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.mortbay.jetty.servlet.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.MonitorServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.mortbay.jetty.servlet.Context">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/blazon</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.home" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.mortbay.jetty.servlet.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.BlazonJobServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.mortbay.jetty.servlet.Context">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/getCapabilities</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.home" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.mortbay.jetty.servlet.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.CapabilityServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.mortbay.jetty.servlet.Context">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/output</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.home" default="."/>/../cache/</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.FileProxyServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.mortbay.jetty.servlet.Context">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/resource</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.home" default="."/>/../resource/</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.FileProxyServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.mortbay.jetty.servlet.Context">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/canExecute</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.home" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.mortbay.jetty.servlet.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.CanExecuteServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.mortbay.jetty.servlet.Context">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/getOccupancy</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.home" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.mortbay.jetty.servlet.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.GetOccupancyServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.mortbay.jetty.servlet.Context">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/delete</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.home" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.mortbay.jetty.servlet.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.CleanupJobServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
We are moving to jetty 9 and and tried deploying contexts something like this:
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.base" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.eclipse.jetty.server.session.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.TransformationServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/monitor</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.base" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.eclipse.jetty.server.session.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.MonitorServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/blazon</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.base" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.eclipse.jetty.server.session.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.BlazonJobServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/getCapabilities</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.base" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.eclipse.jetty.server.session.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.CapabilityServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/output</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.base" default="."/>/../cache/</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.FileProxyServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/resource</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.base" default="."/>/../resource/</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.FileProxyServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/canExecute</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.base" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.eclipse.jetty.server.session.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.CanExecuteServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/getOccupancy</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.base" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.eclipse.jetty.server.session.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.GetOccupancyServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Arg>
<Ref id="Contexts"/>
</Arg>
<Arg>/cts/delete</Arg>
<Set name="resourceBase">
<SystemProperty name="jetty.base" default="."/>/</Set>
<Set name="sessionHandler">
<New class="org.eclipse.jetty.server.session.SessionHandler"/>
</Set>
<Call name="addServlet">
<Arg>com.docu.cts.webservices.remote.CleanupJobServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
</Configure>
basically I have used latest APIs of jetty thats it, I am not sure if this is the correct way of deploying contexts or not. Any inputs provided will be really helpful.
All of these details were covered in my prior answer to you at How to enable embedded jetty 9 in SSL mode through xml configuration? (including a link to an example project that does exactly what you asked there and here)
Don't use the
ServletContextHandlerconstructor technique (aka<Arg>elements) when doing things with contexts and XML (those techniques are reserved for implementations ofAppProviderfrom theDeploymentManager, which you are obviously not using).Your Jetty 9 XML is setup to configure the id of
Contexts(which is of classorg.eclipse.jetty.server.handler.ContextHandlerCollection).Then it creates a bunch of
ServletContextHandlerobjects (the<New>elements), and doesn't add them to anywhere. Again, don't use the Constructor techniques.What you have are orphaned contexts that don't belong anywhere, and Jetty is unaware of them.
You have a few things to fix.
<Arg>element inside the first level of<New class="org.eclipse.jetty.servlet.ServletContextHandler">, all of them.<Set name="contextPath">/cts</Set>for eachServletContextHandler(be sure not to overlap or cause conflicts across your chosen contexts, like you currently have)url-patternappropriately. If you use theurl-patternof/that's the "default" pattern, and that means yourresourceBaseis super important and your have to satisfy the rules of the "Default Servlet" in your servlet implementations.ServletContextHandlerto avoid having separateHttpSessionobjects / trees / storage for each and every context (this is enforced by Jetty and the Servlet Spec and cannot be overridden). For example: your/cts/deletecontext cannot set / see / use theHttpSessionfrom/ctsand vice-versa.ServletContextHandlerto theContextHandlerCollection.Taking all of the advice together, smashing this into a single
ServletContextHandler(to avoid issues with ResourceBase and HttpSession) you have the following result: