0
# Embedded Tomcat API
1
2
Simplified API for programmatically creating, configuring, and managing embedded Tomcat server instances. Ideal for standalone applications, microservices, testing environments, and development tools that need a lightweight servlet container without external dependencies.
3
4
## Capabilities
5
6
### Tomcat Class
7
8
Primary class for creating and managing embedded Tomcat instances.
9
10
```java { .api }
11
public class Tomcat {
12
// Constructor
13
public Tomcat();
14
15
// Server configuration
16
public void setPort(int port);
17
public void setBaseDir(String basedir);
18
public void setHostname(String s);
19
20
// Web application management
21
public Context addWebapp(String contextPath, String docBase);
22
public Context addWebapp(String contextPath, URL source) throws IOException;
23
public Context addWebapp(Host host, String contextPath, String docBase);
24
public Context addWebapp(Host host, String contextPath, String docBase, LifecycleListener config);
25
public Context addContext(String contextPath, String docBase);
26
public Context addContext(Host host, String contextPath, String docBase);
27
public Context addContext(Host host, String contextPath, String contextName, String dir);
28
29
// Servlet management
30
public Wrapper addServlet(String contextPath, String servletName, String servletClass);
31
public static Wrapper addServlet(Context ctx, String servletName, String servletClass);
32
public Wrapper addServlet(String contextPath, String servletName, Servlet servlet);
33
public static Wrapper addServlet(Context ctx, String servletName, Servlet servlet);
34
35
// Webapp defaults and configuration
36
public void enableNaming();
37
public void setSilent(boolean silent);
38
public void setAddDefaultWebXmlToWebapp(boolean addDefaultWebXmlToWebapp);
39
public LifecycleListener getDefaultWebXmlListener();
40
public String noDefaultWebXmlPath();
41
public void initWebappDefaults(String contextPath);
42
public static void initWebappDefaults(Context ctx);
43
public static void addDefaultMimeTypeMappings(Context context);
44
45
// User/role management
46
public void addUser(String user, String pass);
47
public void addRole(String user, String role);
48
49
// Lifecycle management
50
public void init() throws LifecycleException;
51
public void init(ConfigurationSource source) throws LifecycleException;
52
public void init(ConfigurationSource source, String[] catalinaArguments) throws LifecycleException;
53
public void start() throws LifecycleException;
54
public void stop() throws LifecycleException;
55
public void destroy() throws LifecycleException;
56
57
// Component access
58
public Server getServer();
59
public Service getService();
60
public Engine getEngine();
61
public Host getHost();
62
public void setHost(Host host);
63
public Connector getConnector();
64
public void setConnector(Connector connector);
65
66
// Command line execution
67
public static void main(String[] args) throws Exception;
68
}
69
```
70
71
### Context Interface
72
73
Represents a web application context with servlets, filters, and resources.
74
75
```java { .api }
76
public interface Context extends Container {
77
// Path configuration
78
void setPath(String path);
79
String getPath();
80
void setDocBase(String docBase);
81
String getDocBase();
82
83
// Servlet container initializers
84
void addServletContainerInitializer(ServletContainerInitializer sci, Set<Class<?>> classes);
85
void setContainerSciFilter(String containerSciFilter);
86
String getContainerSciFilter();
87
Set<String> addServletSecurity(ServletRegistration.Dynamic registration,
88
ServletSecurityElement servletSecurityElement);
89
90
// Listeners
91
void addApplicationListener(String listener);
92
void removeApplicationListener(String listener);
93
String[] findApplicationListeners();
94
void addApplicationEventListener(Object listener);
95
void addApplicationLifecycleListener(Object listener);
96
Object[] getApplicationEventListeners();
97
void setApplicationEventListeners(Object[] listeners);
98
Object[] getApplicationLifecycleListeners();
99
void setApplicationLifecycleListeners(Object[] listeners);
100
boolean fireRequestInitEvent(ServletRequest request);
101
boolean fireRequestDestroyEvent(ServletRequest request);
102
void addWrapperLifecycle(String listener);
103
void removeWrapperLifecycle(String listener);
104
String[] findWrapperLifecycles();
105
void addWrapperListener(String listener);
106
void removeWrapperListener(String listener);
107
String[] findWrapperListeners();
108
109
// Servlets and mappings
110
void addServletMappingDecoded(String pattern, String name);
111
void addServletMappingDecoded(String pattern, String name, boolean jspWildCard);
112
void removeServletMapping(String pattern);
113
String findServletMapping(String pattern);
114
String[] findServletMappings();
115
Wrapper createWrapper();
116
void setWrapperClass(String wrapperClass);
117
String getWrapperClass();
118
void setResourceOnlyServlets(String resourceOnlyServlets);
119
String getResourceOnlyServlets();
120
boolean isResourceOnlyServlet(String servletName);
121
122
// Filters
123
void addFilterDef(FilterDef filterDef);
124
void removeFilterDef(FilterDef filterDef);
125
FilterDef findFilterDef(String filterName);
126
FilterDef[] findFilterDefs();
127
void addFilterMap(FilterMap filterMap);
128
void addFilterMapBefore(FilterMap filterMap);
129
void removeFilterMap(FilterMap filterMap);
130
FilterMap[] findFilterMaps();
131
132
// Security constraints and roles
133
void addConstraint(SecurityConstraint constraint);
134
void removeConstraint(SecurityConstraint constraint);
135
SecurityConstraint[] findConstraints();
136
void addSecurityRole(String role);
137
void removeSecurityRole(String role);
138
boolean findSecurityRole(String role);
139
String[] findSecurityRoles();
140
void addRoleMapping(String role, String link);
141
void removeRoleMapping(String role);
142
String findRoleMapping(String role);
143
void setDenyUncoveredHttpMethods(boolean denyUncoveredHttpMethods);
144
boolean getDenyUncoveredHttpMethods();
145
LoginConfig getLoginConfig();
146
void setLoginConfig(LoginConfig config);
147
Authenticator getAuthenticator();
148
void setPreemptiveAuthentication(boolean enable);
149
boolean getPreemptiveAuthentication();
150
151
// Initialization parameters
152
void addParameter(String name, String value);
153
String findParameter(String name);
154
String[] findParameters();
155
void removeParameter(String name);
156
157
// Error pages
158
void addErrorPage(ErrorPage errorPage);
159
void removeErrorPage(ErrorPage errorPage);
160
ErrorPage findErrorPage(int errorCode);
161
ErrorPage findErrorPage(Throwable throwable);
162
ErrorPage[] findErrorPages();
163
164
// MIME mappings
165
void addMimeMapping(String extension, String mimeType);
166
String findMimeMapping(String extension);
167
String[] findMimeMappings();
168
void removeMimeMapping(String extension);
169
170
// Welcome files
171
void addWelcomeFile(String name);
172
boolean findWelcomeFile(String name);
173
String[] findWelcomeFiles();
174
void removeWelcomeFile(String name);
175
176
// Configuration
177
void setCookies(boolean cookies);
178
boolean getCookies();
179
void setCrossContext(boolean crossContext);
180
boolean getCrossContext();
181
void setReloadable(boolean reloadable);
182
boolean getReloadable();
183
void setDisplayName(String displayName);
184
String getDisplayName();
185
186
// Classloader
187
void setLoader(Loader loader);
188
Loader getLoader();
189
190
// Manager
191
void setManager(Manager manager);
192
Manager getManager();
193
194
// Resource management
195
void setResources(WebResourceRoot resources);
196
WebResourceRoot getResources();
197
void setAddWebinfClassesResources(boolean addWebinfClassesResources);
198
boolean getAddWebinfClassesResources();
199
JarScanner getJarScanner();
200
void setJarScanner(JarScanner jarScanner);
201
NamingResourcesImpl getNamingResources();
202
void setNamingResources(NamingResourcesImpl namingResources);
203
Object getNamingToken();
204
205
// Session configuration
206
void setSessionTimeout(int timeout);
207
int getSessionTimeout();
208
void setSessionCookieName(String sessionCookieName);
209
String getSessionCookieName();
210
void setUseHttpOnly(boolean useHttpOnly);
211
boolean getUseHttpOnly();
212
void setUsePartitioned(boolean usePartitioned);
213
boolean getUsePartitioned();
214
void setSessionCookieDomain(String sessionCookieDomain);
215
String getSessionCookieDomain();
216
void setSessionCookiePath(String sessionCookiePath);
217
String getSessionCookiePath();
218
void setSessionCookiePathUsesTrailingSlash(boolean sessionCookiePathUsesTrailingSlash);
219
boolean getSessionCookiePathUsesTrailingSlash();
220
void setValidateClientProvidedNewSessionId(boolean validateClientProvidedNewSessionId);
221
boolean getValidateClientProvidedNewSessionId();
222
void setAlwaysAccessSession(boolean alwaysAccessSession);
223
boolean getAlwaysAccessSession();
224
CookieProcessor getCookieProcessor();
225
void setCookieProcessor(CookieProcessor cookieProcessor);
226
227
// Deployment configuration
228
void setConfigFile(URL configFile);
229
URL getConfigFile();
230
Resource findConfigFileResource(String name) throws IOException;
231
void setAltDDName(String altDDName);
232
String getAltDDName();
233
void setPublicId(String publicId);
234
String getPublicId();
235
void setConfigured(boolean configured);
236
boolean getConfigured();
237
void setPrivileged(boolean privileged);
238
boolean getPrivileged();
239
void setDistributable(boolean distributable);
240
boolean getDistributable();
241
void setOverride(boolean override);
242
boolean getOverride();
243
void setWebappVersion(String webappVersion);
244
String getWebappVersion();
245
String getBaseName();
246
String getEncodedPath();
247
void reload();
248
boolean getPaused();
249
250
// Servlet version
251
void setEffectiveMajorVersion(int major);
252
int getEffectiveMajorVersion();
253
void setEffectiveMinorVersion(int minor);
254
int getEffectiveMinorVersion();
255
boolean isServlet22();
256
257
// Watched resources
258
void addWatchedResource(String name);
259
void removeWatchedResource(String name);
260
String[] findWatchedResources();
261
262
// Annotation processing
263
void setIgnoreAnnotations(boolean ignoreAnnotations);
264
boolean getIgnoreAnnotations();
265
void setParallelAnnotationScanning(boolean parallelAnnotationScanning);
266
boolean getParallelAnnotationScanning();
267
268
// Instance management
269
InstanceManager getInstanceManager();
270
void setInstanceManager(InstanceManager instanceManager);
271
InstanceManager createInstanceManager();
272
void addPostConstructMethod(String clazz, String method);
273
void removePostConstructMethod(String clazz);
274
String findPostConstructMethod(String clazz);
275
Map<String,String> findPostConstructMethods();
276
void addPreDestroyMethod(String clazz, String method);
277
void removePreDestroyMethod(String clazz);
278
String findPreDestroyMethod(String clazz);
279
Map<String,String> findPreDestroyMethods();
280
281
// Application parameters
282
void addApplicationParameter(ApplicationParameter parameter);
283
void removeApplicationParameter(String name);
284
ApplicationParameter[] findApplicationParameters();
285
286
// Character encoding
287
void setRequestCharacterEncoding(String encoding);
288
String getRequestCharacterEncoding();
289
void setResponseCharacterEncoding(String encoding);
290
String getResponseCharacterEncoding();
291
void addLocaleEncodingMappingParameter(String locale, String encoding);
292
String getCharset(Locale locale);
293
294
// Multipart configuration
295
void setAllowCasualMultipartParsing(boolean allowCasualMultipartParsing);
296
boolean getAllowCasualMultipartParsing();
297
void setSwallowAbortedUploads(boolean swallowAbortedUploads);
298
boolean getSwallowAbortedUploads();
299
void setCreateUploadTargets(boolean createUploadTargets);
300
boolean getCreateUploadTargets();
301
302
// Advanced configuration
303
void setSwallowOutput(boolean swallowOutput);
304
boolean getSwallowOutput();
305
ClassLoader getParentClassLoader();
306
void setParentClassLoader(ClassLoader parent);
307
void setFailCtxIfServletStartFails(boolean failCtxIfServletStartFails);
308
boolean getFailCtxIfServletStartFails();
309
ServletContext getServletContext();
310
String getRealPath(String path);
311
JspConfigDescriptor getJspConfigDescriptor();
312
void setJspConfigDescriptor(JspConfigDescriptor descriptor);
313
void setTldValidation(boolean tldValidation);
314
boolean getTldValidation();
315
void setXmlNamespaceAware(boolean xmlNamespaceAware);
316
boolean getXmlNamespaceAware();
317
void setXmlValidation(boolean xmlValidation);
318
boolean getXmlValidation();
319
void setXmlBlockExternal(boolean xmlBlockExternal);
320
boolean getXmlBlockExternal();
321
void setLogEffectiveWebXml(boolean logEffectiveWebXml);
322
boolean getLogEffectiveWebXml();
323
324
// Request processing
325
void setSendRedirectBody(boolean enable);
326
boolean getSendRedirectBody();
327
void setUseRelativeRedirects(boolean useRelativeRedirects);
328
boolean getUseRelativeRedirects();
329
void setMapperContextRootRedirectEnabled(boolean mapperContextRootRedirectEnabled);
330
boolean getMapperContextRootRedirectEnabled();
331
void setMapperDirectoryRedirectEnabled(boolean mapperDirectoryRedirectEnabled);
332
boolean getMapperDirectoryRedirectEnabled();
333
void setDispatchersUseEncodedPaths(boolean dispatchersUseEncodedPaths);
334
boolean getDispatchersUseEncodedPaths();
335
void setFireRequestListenersOnForwards(boolean enable);
336
boolean getFireRequestListenersOnForwards();
337
void setEncodedSolidusHandling(String encodedSolidusHandling);
338
String getEncodedSolidusHandling();
339
EncodedSolidusHandling getEncodedSolidusHandlingEnum();
340
void setEncodedReverseSolidusHandling(String encodedReverseSolidusHandling);
341
String getEncodedReverseSolidusHandling();
342
EncodedSolidusHandling getEncodedReverseSolidusHandlingEnum();
343
void setContextGetResourceRequiresSlash(boolean contextGetResourceRequiresSlash);
344
boolean getContextGetResourceRequiresSlash();
345
void setDispatcherWrapsSameObject(boolean dispatcherWrapsSameObject);
346
boolean getDispatcherWrapsSameObject();
347
void setSuspendWrappedResponseAfterForward(boolean suspendWrappedResponseAfterForward);
348
boolean getSuspendWrappedResponseAfterForward();
349
void setAllowMultipleLeadingForwardSlashInPath(boolean allowMultipleLeadingForwardSlashInPath);
350
boolean getAllowMultipleLeadingForwardSlashInPath();
351
void setThreadBindingListener(ThreadBindingListener threadBindingListener);
352
ThreadBindingListener getThreadBindingListener();
353
354
// Async processing
355
void incrementInProgressAsyncCount();
356
void decrementInProgressAsyncCount();
357
358
// Background processing
359
void backgroundProcess();
360
}
361
```
362
363
### Wrapper Interface
364
365
Represents an individual servlet within a context.
366
367
```java { .api }
368
public interface Wrapper extends Container {
369
// Servlet class
370
void setServletClass(String servletClass);
371
String getServletClass();
372
void setServlet(Servlet servlet);
373
Servlet getServlet();
374
375
// Load on startup
376
void setLoadOnStartup(int value);
377
int getLoadOnStartup();
378
379
// Run-as role
380
void setRunAs(String runAs);
381
String getRunAs();
382
383
// Servlet state
384
boolean isUnavailable();
385
long getAvailable();
386
void setAvailable(long available);
387
388
// Request monitoring
389
void incrementErrorCount();
390
391
// Servlet methods
392
String[] getServletMethods() throws ServletException;
393
394
// Multipart configuration
395
void setMultipartConfigElement(MultipartConfigElement multipartConfig);
396
MultipartConfigElement getMultipartConfigElement();
397
398
// Async support
399
void setAsyncSupported(boolean asyncSupported);
400
boolean isAsyncSupported();
401
402
// Enabled
403
void setEnabled(boolean enabled);
404
boolean isEnabled();
405
406
// Overridable
407
boolean isOverridable();
408
void setOverridable(boolean overridable);
409
410
// Servlet lifecycle
411
Servlet allocate() throws ServletException;
412
void deallocate(Servlet servlet) throws ServletException;
413
void load() throws ServletException;
414
void unload() throws ServletException;
415
void unavailable(UnavailableException unavailable);
416
417
// Init parameters
418
void addInitParameter(String name, String value);
419
String findInitParameter(String name);
420
String[] findInitParameters();
421
void removeInitParameter(String name);
422
423
// Mappings
424
void addMapping(String mapping);
425
String[] findMappings();
426
void removeMapping(String mapping);
427
428
// Security references
429
void addSecurityReference(String name, String link);
430
String findSecurityReference(String name);
431
String[] findSecurityReferences();
432
void removeSecurityReference(String name);
433
}
434
```
435
436
## Usage Examples
437
438
### Basic Embedded Server
439
440
```java
441
import org.apache.catalina.startup.Tomcat;
442
import org.apache.catalina.Context;
443
import org.apache.catalina.LifecycleException;
444
import java.io.File;
445
446
public class SimpleEmbeddedTomcat {
447
public static void main(String[] args) throws LifecycleException {
448
Tomcat tomcat = new Tomcat();
449
tomcat.setPort(8080);
450
tomcat.setBaseDir(new File("target/tomcat").getAbsolutePath());
451
452
// Add empty context (for servlets added programmatically)
453
Context ctx = tomcat.addContext("", new File(".").getAbsolutePath());
454
455
// Start server
456
tomcat.start();
457
tomcat.getServer().await();
458
}
459
}
460
```
461
462
### Adding Servlets Programmatically
463
464
```java
465
import org.apache.catalina.startup.Tomcat;
466
import org.apache.catalina.Context;
467
import jakarta.servlet.http.HttpServlet;
468
import jakarta.servlet.http.HttpServletRequest;
469
import jakarta.servlet.http.HttpServletResponse;
470
import java.io.IOException;
471
import java.io.PrintWriter;
472
473
public class ServletExample {
474
public static void main(String[] args) throws Exception {
475
Tomcat tomcat = new Tomcat();
476
tomcat.setPort(8080);
477
478
Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir"));
479
480
// Add servlet instance
481
HttpServlet servlet = new HttpServlet() {
482
@Override
483
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
484
throws IOException {
485
resp.setContentType("text/html");
486
PrintWriter writer = resp.getWriter();
487
writer.println("<h1>Hello from Embedded Tomcat</h1>");
488
}
489
};
490
491
Tomcat.addServlet(ctx, "helloServlet", servlet);
492
ctx.addServletMappingDecoded("/hello", "helloServlet");
493
494
// Add servlet by class name
495
Tomcat.addServlet(ctx, "myServlet", "com.example.MyServlet");
496
ctx.addServletMappingDecoded("/my/*", "myServlet");
497
498
// Configure async support for async servlets
499
Wrapper asyncWrapper = Tomcat.addServlet(ctx, "asyncServlet", new AsyncServlet());
500
asyncWrapper.setAsyncSupported(true);
501
ctx.addServletMappingDecoded("/async", "asyncServlet");
502
503
// Configure multipart support for file upload servlets
504
Wrapper uploadWrapper = Tomcat.addServlet(ctx, "uploadServlet", new FileUploadServlet());
505
uploadWrapper.setMultipartConfigElement(new MultipartConfigElement("/tmp"));
506
ctx.addServletMappingDecoded("/upload", "uploadServlet");
507
508
tomcat.start();
509
tomcat.getServer().await();
510
}
511
}
512
```
513
514
**Configuration Notes:**
515
- **Async Servlets:** Use `wrapper.setAsyncSupported(true)` to enable asynchronous processing
516
- **File Upload Servlets:** Use `wrapper.setMultipartConfigElement(new MultipartConfigElement("/tmp"))` to enable multipart/form-data processing
517
518
### Adding Web Application
519
520
```java
521
import org.apache.catalina.startup.Tomcat;
522
import org.apache.catalina.Context;
523
import java.io.File;
524
525
public class WebAppExample {
526
public static void main(String[] args) throws Exception {
527
Tomcat tomcat = new Tomcat();
528
tomcat.setPort(8080);
529
tomcat.setBaseDir(new File("target/tomcat").getAbsolutePath());
530
531
// Add existing web application
532
String webappDirLocation = "src/main/webapp/";
533
Context ctx = tomcat.addWebapp("/myapp",
534
new File(webappDirLocation).getAbsolutePath());
535
536
tomcat.start();
537
tomcat.getServer().await();
538
}
539
}
540
```
541
542
### Multiple Contexts
543
544
```java
545
import org.apache.catalina.startup.Tomcat;
546
import org.apache.catalina.Context;
547
import org.apache.catalina.Host;
548
import java.io.File;
549
550
public class MultiContextExample {
551
public static void main(String[] args) throws Exception {
552
Tomcat tomcat = new Tomcat();
553
tomcat.setPort(8080);
554
tomcat.setBaseDir(new File("target/tomcat").getAbsolutePath());
555
556
Host host = tomcat.getHost();
557
558
// API context
559
Context apiCtx = tomcat.addContext(host, "/api",
560
new File("target/api").getAbsolutePath());
561
562
// Admin context
563
Context adminCtx = tomcat.addContext(host, "/admin",
564
new File("target/admin").getAbsolutePath());
565
566
// Web context
567
Context webCtx = tomcat.addWebapp(host, "/",
568
new File("src/main/webapp").getAbsolutePath());
569
570
tomcat.start();
571
tomcat.getServer().await();
572
}
573
}
574
```
575
576
### Custom Connector Configuration
577
578
```java
579
import org.apache.catalina.startup.Tomcat;
580
import org.apache.catalina.connector.Connector;
581
import org.apache.coyote.http11.Http11NioProtocol;
582
583
public class CustomConnectorExample {
584
public static void main(String[] args) throws Exception {
585
Tomcat tomcat = new Tomcat();
586
tomcat.setBaseDir("target/tomcat");
587
588
// Create custom HTTP connector
589
Connector httpConnector = new Connector("HTTP/1.1");
590
httpConnector.setPort(8080);
591
httpConnector.setProperty("maxThreads", "200");
592
httpConnector.setProperty("maxConnections", "10000");
593
httpConnector.setProperty("connectionTimeout", "20000");
594
httpConnector.setProperty("compression", "on");
595
httpConnector.setProperty("compressibleMimeType",
596
"text/html,text/xml,text/plain,text/css,text/javascript,application/json");
597
598
tomcat.setConnector(httpConnector);
599
tomcat.getService().addConnector(httpConnector);
600
601
// Add HTTPS connector
602
Connector httpsConnector = new Connector("HTTP/1.1");
603
httpsConnector.setPort(8443);
604
httpsConnector.setSecure(true);
605
httpsConnector.setScheme("https");
606
httpsConnector.setProperty("SSLEnabled", "true");
607
httpsConnector.setProperty("keystoreFile", "conf/keystore.jks");
608
httpsConnector.setProperty("keystorePass", "changeit");
609
610
tomcat.getService().addConnector(httpsConnector);
611
612
Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir"));
613
614
tomcat.start();
615
tomcat.getServer().await();
616
}
617
}
618
```
619
620
### Adding Users and Roles
621
622
```java
623
import org.apache.catalina.startup.Tomcat;
624
import org.apache.catalina.Context;
625
import java.io.File;
626
627
public class SecurityExample {
628
public static void main(String[] args) throws Exception {
629
Tomcat tomcat = new Tomcat();
630
tomcat.setPort(8080);
631
tomcat.setBaseDir(new File("target/tomcat").getAbsolutePath());
632
633
// Add users and roles
634
tomcat.addUser("admin", "admin123");
635
tomcat.addRole("admin", "manager");
636
tomcat.addRole("admin", "admin-gui");
637
638
tomcat.addUser("user", "user123");
639
tomcat.addRole("user", "user");
640
641
Context ctx = tomcat.addContext("", new File(".").getAbsolutePath());
642
643
tomcat.start();
644
tomcat.getServer().await();
645
}
646
}
647
```
648
649
### Testing Utility
650
651
```java
652
import org.apache.catalina.startup.Tomcat;
653
import org.apache.catalina.Context;
654
import org.apache.catalina.LifecycleException;
655
import org.junit.jupiter.api.AfterEach;
656
import org.junit.jupiter.api.BeforeEach;
657
import org.junit.jupiter.api.Test;
658
import java.io.File;
659
660
public class TomcatTestHelper {
661
private Tomcat tomcat;
662
private int port = 8080;
663
664
@BeforeEach
665
public void setUp() throws LifecycleException {
666
tomcat = new Tomcat();
667
tomcat.setPort(port);
668
tomcat.setBaseDir(new File("target/tomcat-test").getAbsolutePath());
669
670
Context ctx = tomcat.addContext("", new File(".").getAbsolutePath());
671
672
tomcat.start();
673
}
674
675
@AfterEach
676
public void tearDown() throws LifecycleException {
677
if (tomcat != null) {
678
tomcat.stop();
679
tomcat.destroy();
680
}
681
}
682
683
@Test
684
public void testServer() throws Exception {
685
// Test HTTP requests against embedded server
686
String url = "http://localhost:" + port + "/test";
687
// ... perform HTTP request testing
688
}
689
}
690
```
691
692
### Advanced Context Configuration
693
694
```java
695
import org.apache.catalina.startup.Tomcat;
696
import org.apache.catalina.Context;
697
import org.apache.catalina.Host;
698
import java.io.File;
699
700
public class AdvancedContextExample {
701
public static void main(String[] args) throws Exception {
702
Tomcat tomcat = new Tomcat();
703
tomcat.setPort(8080);
704
tomcat.setBaseDir("target/tomcat");
705
706
Host host = tomcat.getHost();
707
708
// Create context with explicit name (useful for managing multiple contexts)
709
Context ctx = tomcat.addContext(host, "/myapp", "myapp-v1",
710
new File("webapps/myapp").getAbsolutePath());
711
712
// Initialize with default servlets, JSP support, and MIME types
713
Tomcat.initWebappDefaults(ctx);
714
715
tomcat.start();
716
tomcat.getServer().await();
717
}
718
}
719
```
720
721
### Custom Webapp Configuration without Default web.xml
722
723
```java
724
import org.apache.catalina.startup.Tomcat;
725
import org.apache.catalina.Context;
726
import org.apache.catalina.LifecycleListener;
727
import org.apache.catalina.startup.ContextConfig;
728
import java.io.File;
729
730
public class CustomWebappConfig {
731
public static void main(String[] args) throws Exception {
732
Tomcat tomcat = new Tomcat();
733
tomcat.setPort(8080);
734
tomcat.setBaseDir("target/tomcat");
735
736
// Prevent default web.xml from being applied
737
tomcat.setAddDefaultWebXmlToWebapp(false);
738
739
Context ctx = tomcat.addContext("", new File("webapp").getAbsolutePath());
740
741
// Manually add default web.xml listener for JSP support
742
LifecycleListener listener = tomcat.getDefaultWebXmlListener();
743
ctx.addLifecycleListener(listener);
744
745
// Configure to skip default web.xml processing
746
String noDefaultWebXml = tomcat.noDefaultWebXmlPath();
747
for (LifecycleListener l : ctx.findLifecycleListeners()) {
748
if (l instanceof ContextConfig) {
749
((ContextConfig) l).setDefaultWebXml(noDefaultWebXml);
750
}
751
}
752
753
// Add only specific default MIME type mappings
754
Tomcat.addDefaultMimeTypeMappings(ctx);
755
756
tomcat.start();
757
tomcat.getServer().await();
758
}
759
}
760
```
761
762
## Types
763
764
### EncodedSolidusHandling
765
766
Enum for handling encoded solidus characters in request dispatcher paths.
767
768
```java { .api }
769
public enum EncodedSolidusHandling {
770
/** Reject requests that contain encoded solidus */
771
REJECT,
772
/** Pass encoded solidus through without decoding */
773
PASS_THROUGH,
774
/** Decode encoded solidus */
775
DECODE
776
}
777
```
778
779
### ThreadBindingListener
780
781
Interface for receiving notifications when a request enters/exits the application scope.
782
783
```java { .api }
784
public interface ThreadBindingListener {
785
/** Called when a thread is bound to the context */
786
void bind();
787
/** Called when a thread is unbound from the context */
788
void unbind();
789
}
790
```
791