I'm not sure this solves my problem...
If I pull my Servlet out of my application's code then the instance will be constructed and loaded by Tomcat as usual, but then the Servlet can't access my application's internal data. I need the Servlet to have a callback into my application for it to obtain the data required for generating the response. As a more complex example, imagine creating an HTTP front-end to, say, a Java-based text editor. For the Servlet to see what's happening within the editor -- which file is being edited, where's the cursor, etc --it'll need direct access the editor's data structures. Spilling and updating this data to a shared file/database/whatever would be wasteful; in my intended application there's 100+ megs of constantly changing data that the Servlet may need to examine when generating its response. Todd On Friday 02 November 2001 14:10, Craig R. McClanahan wrote: > Here's the Tomcat 4 approach -- 3.x has similar things but I'm not as > familiar with the details. > > You have two fundamental choices, based on whether you want to use > server.xml to configure Tomcat or not: > > * To use server.xml, you just need to set up an environment > like the "catalina.sh" script does, and call > > Bootstrap.main("start"); > > in a separate thread. When you ultimately want to shut things > down, call: > > Bootstrap.main("stop"); > > * To configure all the components yourself, you will use the > org.apache.catalina.startup.Embedded class (similar to > EmbeddedTomcat in 3.x). This class includes a dummy main() > program that demonstrates how you do things. > > For actually processing the requests yourself, you would only need a > single webapp (the ROOT webapp) with a web.xml that configures your > servlet to handle all requests (i.e. a <servlet-mapping> with a pattern of > "/*"). There's no need for interceptors (3.x) or valves (4.x) to do this. > > I would recommend you implement the application logic as a standard > servlet, in its own class, and separate the startup/shutdown issues out to > their own class. There is nothing to be gained by combining them. > > Craig > > On Fri, 2 Nov 2001, Todd Wright wrote: > > Date: Fri, 2 Nov 2001 12:25:23 -0400 > > From: Todd Wright <[EMAIL PROTECTED]> > > Reply-To: Tomcat Users List <[EMAIL PROTECTED]> > > To: [EMAIL PROTECTED] > > Subject: Embedding Tomcat with intra-app Servlets > > > > > > I'd like to embed Tomcat within my Java application, but where some > > Servlet requests would *directly* call into my running application's code > > (+data). The current "EmbededTomcat" support seems to be aimed at > > launching a stand-alone Tomcat that only supports file contexts, with no > > callback support for access to the launching application. > > > > I'm thinking of Tomcat 3.3, 'though 4.0 could be used if required. > > > > For example, suppose I have a calendar application that I'd like to add > > web support. Inside my application I have all the data I need, and I'd > > like my servlets to directly access my the data structures. Flattening > > the data out to an external database/filesystem is not an option. All > > Servlet requests would funnel into my application so I can call my own > > (inner) Servlet. I still want Tomcat to do the HTTP parsing, SSL, > > sessions, Servlet-API, etc. My application must load the internal Servlet > > instance. > > > > Can I use an interceptor, or (if needed) pull apart "EmbededTomcat"? Is > > there an example of how to do this? I hope it's clear why this would be > > a very useful embedding scenario... > > > > Pseudocode: > > > > public class MyApp implements Runnable { > > > > /** launcher */ > > public static void main(String[] args) { > > // launch! > > (new MyApp()).run(); > > } > > > > public void run() { > > // create my internal Servlet before Tomcat is launched > > // > > // this inner class is defined later in this method > > Servlet myServlet = new MyServlet(); > > > > // launch Tomcat > > EmbeddedTomcat et = new EmbeddedTomcat(); > > et.setArgs(new String[] {"start"}); > > et.execute(); > > > > // > > // hand-waving here! Could be moved to before the > > "et.execute()". // > > insert myServlet into Tomcat to handle all "/*" requests > > > > // > > // I now want "myServlet" to be called with all "/*" requests > > // > > > > // run forever in this example... > > } > > > > /** > > * sample internal data method. > > * > > * MyServlet will call this method > > */ > > public String getInternalString() { > > return "foo"; > > } > > > > /** > > * My inner servlet -- has access back into "MyApp" > > * instance (non-static). > > */ > > private class MyServlet extends HttpServlet { > > public void doGet( > > HttpServletRequest request, > > HttpServletResponse response) > > throws IOException, ServletException { > > response.setContentType("text/html"); > > PrintWriter out = response.getWriter(); > > out.println("<html><body>Internal String is "); > > > > // access internal MyApp method/data! > > out.println(getInternalString()); > > > > out.println("</body></html>"); > > } > > } > > > > Thanks! > > Todd > > > > -- > > To unsubscribe: <mailto:[EMAIL PROTECTED]> > > For additional commands: <mailto:[EMAIL PROTECTED]> > > Troubles with the list: <mailto:[EMAIL PROTECTED]> > > -- > To unsubscribe: <mailto:[EMAIL PROTECTED]> > For additional commands: <mailto:[EMAIL PROTECTED]> > Troubles with the list: <mailto:[EMAIL PROTECTED]> -- To unsubscribe: <mailto:[EMAIL PROTECTED]> For additional commands: <mailto:[EMAIL PROTECTED]> Troubles with the list: <mailto:[EMAIL PROTECTED]>