Apache Tomcat 7 Servlet API 3.0 (7.0.6 Release)

VIServers

Oct 14, 2011 (5 years and 8 months ago)

1,349 views

Peter Roßbach pr@objektpark.de

Apache Tomcat 7
Servlet API 3.0
(7.0.6 Release)
Peter Roßbach
probjektpark.de
© 2011 Peter Roßbach (
probjektpark.de
)

Peter Roßbach

Freiberuflicher
IT-Systemarchitekt, Berater, Trainer und Autor

Entwickler im Apache Tomcat Projekt

Mitglied der Apache Software Foundation

Webexperte

Autor der TomC@Kolumne im Java Magazin

Autor

http://tomcat.objektpark.org/


Buch Tomcat 4x
und
Java Server und Servlets

E-Mail :
pr@objektpark.de

Fachautor und Speaker auf deutschen Java Konferenzen
Mein Rucksack
2
© 2011 Peter Roßbach (
probjektpark.de
)
Was gibt es Neues?

Servlet API 3.0 Support ( JSR 315)

JSP API 2.2 ( Expression Language 2.2) JSR 254

Apache Tomcat 7.0.6 Release ist fertig

offizielle Test (TCK) zu 100% erfolgreich

Redesign und Refactoring abgeschlossen

Integration JEE 6 Web Profile

Geronimo 3 ,OpenEJB 3.1.2, MyFaces 2 (Dev)

SIwpas-1.0.0-CR4

JBOSS 6/7 und JBoss Web 3

Eclipse 3.6 - WTP 2.2

Tomcat 6 als Basis im neuen Amazon Beanstalk Service
3
© 2011 Peter Roßbach (
probjektpark.de
)
Projekt wächst

Standard Taglib Projekt (JSTL) ist nun Teilprojekt des Apache Tomcat
Projekts

http://tomcat.apache.org/taglibs/

JSTL 1.0, 1.1 und 1.2

24 Entwickler im Apache Tomcat Projekt!

http://wiki.apache.org/tomcat/PoweredBy

94 Referenz Unternehmen

32 Hosting Provider

ca. 10 Mio Downloads
4
© 2011 Peter Roßbach (
probjektpark.de
)
History
5
4.1
5.0.trunk
3.3
5.5.25
6.0.15
X
1997
1999
2000
tomcat.next
2001
jserv
tomcat ref
2002
3.3.trunk
2007
3.2
3.1
3.3.2
2004
4.0
2003
3.2.4
2005
2006
4.0.6
X
X
4.1.10
4.1.36
5.0
5.5.12
4.1.31
3.0
5.0.27
5.0.19
5.5
5.5.20
4.1.34
6.0.10
6.0
T
omcat
Architektur
Catalina
Architektur
5.5.27
2008
4.1.37
6.0.26
2009
6.0.18
7.0
2010
7.0.0
X
X
5.5.28
201
1
Servlet
Api 2.4 JSP
2.0
Servlet
Api 0.x-2.1 JSP
0.4-1.0
Servlet
Api 2.2 + JSP
1.0
Servlet
Api 2.3 JSP
1.1-1.2
7.0.6
5.5.31
6.0.31
ServletAPI 2.5 JSP
2.1
ServletAPI 3.0 JSP
2.2
© 2011 Peter Roßbach (
probjektpark.de
)
Web Container API‘s
6
Servlet
JSP
Tomcat
Java
3.0
2.2
7.0.x
1.6
2.5
2.1
6.0.x
1.5
2.4
2.0
5.0.x & 5.5.x
1.4
2.3
1.2
4.0.x & 4.1.x
1.3
2.2
1.1
3.2.x & 3.3.x
1.2
© 2011 Peter Roßbach (
probjektpark.de
)
Servlet API 3.0

Programmierung mit Annotationen

Modularität der Anwendung und des Containers verbessern

Web-Fragement

Ressourcen

Asynchrone Kommunikation

Server Push

Entkoppelung vom Container Thread

File Upload direkt im Container

Session und Cookie Handling verbessert
7
© 2011 Peter Roßbach (
probjektpark.de
)
Apache Tomcat 7 Basis

Neues Lifecycle API der Komponenten (JMX Update)

Alle Connectoren haben den Async Support

Effizient nur mit NIO oder APR Connectoren

Alle Connectoren nutzen nun die Executor ThreadPools

MemoryLeakDetection für Anwendungsredeployment

Deployment von Anwendungsversionen

Einige Packages oder Komponenten sind verschoben

CRSR Prevention Filter (s. Manager Anwendung)

Module für eigenen JDBC Pool und Bayeux Implementierung

Embedded und Unit testen mit Tomcat

org.apache.catalina.startup.TomcatBaseTest

org.apache.catalina.startup.Tomcat
8
© 2011 Peter Roßbach (
probjektpark.de
)
Neuer Start Screen
9
© 2011 Peter Roßbach (
probjektpark.de
)
Servlet API 3.0

Programmatischen und modulare Erweiterbarkeit

Vereinfachung des Deployments

Async Servlet Support

Kleinere Erweiterungen ...

File Upload

Session Tracking
10
© 2011 Peter Roßbach (
probjektpark.de
)
Neue Möglichkeiten API 3.0

Integration von Web-Frameworks ohne weitere
Konfiguration in der Datei
web.xml
.

Annotationen von Servlets/Filter/Listener ...

API für Servlet/Filter/Listener am ServletContext

Modularisierung der
web.xml
: „Ein Framework bzw. JAR
kann ein Stück der gesamten
web.xml
Konfiguration
enthalten.“

META-INF/
web.xml
in jedem Jar (WEB-INF/lib/*.jar)
möglich

web-fragment Element definieren Servlets, Filters,
Listeners und ...
11
© 2011 Peter Roßbach (
probjektpark.de
)
Annotations
@WebServlet(“/myServlet”)
public class MySampleServlet extends HttpServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse res) {}
}
@WebFilter(”/myServlet/*“)
public class MyFilter extends Filter{
public void doFilter(req,res) {}
}
12
© 2011 Peter Roßbach (
probjektpark.de
)
ServletFilter
13
import
javax.servlet.FilterChain;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
javax.servlet.http.annotation.FilterMapping;
import
javax.servlet.http.annotation.WebFilter;
@WebFilter(
"/myservlet/*"
)
public

class
SetCharacterEncodingFilter implements Filter
{
....

public

void
doFilter (HttpServletRequest request, HttpServletResponse
response, FilterChain chain)

throws
java.io.IOException, javax.servlet.ServletException
{
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
}
}
© 2011 Peter Roßbach (
probjektpark.de
)
weitere Beispiele
@WebServlet(name= "MyServlet", urlPatterns={"/foo", "/bar"})
public class SampleUsingAnnotationAttributes extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse res) {
}
}
14
@WebServlet(value="/foo",
initParams = {
@WebInitParam(name=“debug“,value=“true“)
}
)
public class SampleUsingAnnotationAttributes extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) {
}
}
© 2011 Peter Roßbach (
probjektpark.de
)
Annotations
web.xml

WebServlet(name,urlPatterns,value,
load-on-startup,description,smallIcon,largeIcon,asyncSupported)

WebFilter(display-name,
filter-name,description,smallIcon,largeIcon,urlPatterns,servlet-names,
dispatcher-types,value, asyncSupported)

dispatcher-types ERROR,FORWARD,INCLUDE,REQUEST,
ASYNC

WebFilter(value  "/param", filterName  "paramFilter",
dispatcherTypes  {
DispatcherType.ERROR, DispatcherType.ASYNC },
initParams  {
WebInitParam(name  "message", value  "Servlet says: ") })

WebInitParam(description,name,value)

WebListener(description)
15
© 2010 Peter Roßbach (
probjektpark.de
)
Eclipse Java Annotation Support
16
© 2011 Peter Roßbach (
probjektpark.de
)
Annotation Overwrite

Deklaration in der
web.xml
überschreibt Konfiguration in
der Annotation

nur urlPatterns der
web.xml
gelten, sonst die der
Annotation

initParameter werden durch Deskriptor
überschrieben oder durch Annotation ergänzt

Ergänzung der Werte durch die Annotation, wenn
nicht im Deskriptor explizit definiert.
17
© 2011 Peter Roßbach (
probjektpark.de
)
Disable Servlet
18

<
servlet
>

<
servlet-name
>
param
</
servlet-name
>

<
servlet-class
>
annotation.ParamServlet
</
servlet-class
>

<
init-param
>

<
param-name
>
foo
</
param-name
>

<
param-value
>
hello
</
param-value
>

</
init-param
>

<
init-param
>

<
param-name
>
bar
</
param-name
>

<
param-value
>
peter
</
param-value
>

</
init-param
>
<!-- Disable this servlet -->

<
enabled
>
false
</
enabled
>

</
servlet
>
© 2011 Peter Roßbach (
probjektpark.de
)
WebSecurity Constraint
19
@WebServlet("/security")
@ServletSecurity((httpMethodConstraints = {

@HttpMethodConstraint(
value = "GET",
rolesAllowed = {"user", "manager"}),

@HttpMethodConstraint(
value = "POST",
rolesAllowed = "manager",
transportGuarantee = TransportGuarantee.CONFIDENTIAL)

})
public class SecurityServlet extends HttpServlet {

...
}

© 2011 Peter Roßbach (
probjektpark.de
)
Listener
@WebListener(description="init fine tricks")
public class MyListener implements ServletContextListener {
public void contextInialized(ServletContextEvent event)
{
...
}
public void contextDestroy(ServletContextEvent event)
{
...
}
}
20
© 2011 Peter Roßbach (
probjektpark.de
)
ServletContext.addServlet
@WebListener
public class MyListener implements ServletContextListener{
public void contextInitialized (ServletContextEvent sce) {
ServletContext servletContext = event.getServletContext();
ServletRegistration reg =
servletContext.addServlet("Hello",
HelloApiServlet.class);
reg.addMapping("/hello2");
Map<String,String> initParameters = new
HashMap<String,String>();
initParameters.put("foo", "bar");
reg.setInitParameters(initParameters);
}
...
}
21
© 2011 Peter Roßbach (
probjektpark.de
)
ServletContext.addFilter
@WebListener
public class MyListener implements ServletContextListener {
public void contextInitialized (ServletContextEvent sce) {
ServletContext servletContext =
event.getServletContext();
FilterRegistration freg =
servletContext.addFilter("helloFilter",
ParamFilter.class);

freg.addMappingForUrlPatterns(
EnumSet.of(DispatcherType.REQUEST,
DispatcherType.ASYNC), true, "/hello2", "/param");
}
}
22
© 2011 Peter Roßbach (
probjektpark.de
)
ServletContext
23
© 2011 Peter Roßbach (
probjektpark.de
)
Annotations 3.0

Voraussetzung in WEB-INF/
web.xml

metadata-completefalsemetadata-complete

Es müssen alle Klassen in WEB-INF/classes und WEB-INF/lib/*.jar
untersucht werden.

Erweiterung im Tomcat

JarScanner Konfiguration im Context

Context JarScanner
className"org.apache.tomcat.util.scan.StandardJarScanne
r" scanClassPath "true" / /Context

Deny System Property

-Dtomcat.util.scan.DefaultJarScanner.jarsToSkip
"logging-api.jar,admin.jar"
24
© 2011 Peter Roßbach (
probjektpark.de
)
Servlet API 3.0: web-fragment
<web-fragment>
<servlet>
<servlet-name>welcome</servlet-name>
<servlet-class>
WelcomeServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>welcome</servlet-name>
<url-pattern>/Welcome</url-pattern>
</servlet-mapping>
...
</web-fragment>
25

jar:/WEB-INF/lib/
hello.jar!/META-INF/
web-fragment.xml
© 2011 Peter Roßbach (
probjektpark.de
)
Ressoure Loading

Anwendung modularisieren

WEB-INF/lib/fragments.jar!META-INF/
resources

Servlets, Filter, Listener

Konfigurationen: web-fragments.xml

Ressourcen
26
© 2011 Peter Roßbach (
probjektpark.de
)
War
27
war
WEB-INF
resourceA.jsp
lib
web.xml
resources2.jar
resources.jar
resourceE.jsp
folder
resourceC.jsp
© 2011 Peter Roßbach (
probjektpark.de
)
resources.jar
28
resources.jar
MET
A-INF
anno.ServletA
resources
web-fragment.xml
folder
resourceC.jsp
resourceA.jsp
resourceD.jsp
resourceB.jsp
© 2011 Peter Roßbach (
probjektpark.de
)
resource2.jar
29
resources2.jar
MET
A-INF
anno.ServletA
resources
web-fragment.xml
folder
resourceC.jsp
resourceF
.jsp
© 2011 Peter Roßbach (
probjektpark.de
)
ServletContainerInitializer

Unterstützung des JDK 6 JAR Service API

META-INF/services/javax.servlet.ServletContainerInitializer

Name der Klassen ServletContainerInitializer für dieses Jar

Bekommt alle Klassen aus allen „Jars“ die Klassen HandlesTypes
implementieren.

Berücksichtigung der WebFragment Ordering

Beispiele: Mojarra(JSF RI) und Jersey (JAX-RS)
30
@HandlesTypes(AnnotationA.class)
AServletContainerInitializer implements ServletContainerInitializer
{
public void onStartup(Set<Class<A>> c, ServletContext ctx)
throws ServletException {
// framework setup Servlets/Filter/Listener
ServletRegistration reg = ctx.addServlet("AServlet", "com.foo.AServlet");
reg.addServletMapping("/foo");
...
}
© 2011 Peter Roßbach (
probjektpark.de
)
Module ausserhalb der WebApp
Context

aliases
"/content${catalina.base}/content"
JarScanner scanClassPath"true" /
Loader
className"org.apache.catalina.loader.VirtualWebappLoader"
virtualClasspath
"${catalina.base}/admin/lib/hello2.jar" /
/Context
31
© 2011 Peter Roßbach (
probjektpark.de
)
Plugins(aliases, JAR‘s)
32
<apps1>.war
apps1/static
webapps
contents
/static=contents/apps1/static
aliases
WEB-INF/lib/*.jar
apps1/lib/*.jar
virtualClasspath="${catalina.base}/app1/lib/*.jar
V
irtualW
ebappLoader
© 2011 Peter Roßbach (
probjektpark.de
)
Web-Plugins?

Beim Undeploy der Anwendung bleiben die Plugins erhalten.

Bei Context allowLinking "true" werden die Inhalte der
Links mit gelöscht, da sie vollwertige Bestandteile der
Anwendung für den Tomcat sind.

Integration von Ressourcen und Funktionserweiterung sind nun
sehr elegant unterstützt.
33
© 2011 Peter Roßbach (
probjektpark.de
)
Ladereihenfolge

Reihenfolge
1.
Zuerst werden die Informationen der WEB-INF/
web.xml
geladen

Tomcat lädt noch conf/web.xml!
2.
Dann werden die web-fragmente.xml geladen

absolute oder relative Ordering!
3.
Dann werden die Annotations ausgewertet

evtl. ServletContainerInitializer ausgewertet

ServletContextListener Event Handling (1. oder 3.)

addServlets and addFilters  Mappings
34
© 2011 Peter Roßbach (
probjektpark.de
)
Ordnung...

Absolute Ordnung

web.xml
 absolute-ordering

Relative Ordnung

web-fragment.xml  ordering
35
<web-fragment>
<name>MyWebFragment1</name>
<ordering> <!-- Ingore as absolute ordering exists -->
<before>MyWebFragment2</before>
<after></others></after>
</ordering>
</web-fragment>
<web-app>

<name>MyApp</name>

<absolute-ordering>

<name>MyFragment3</name>

<name>MyFragment2</name>

</absolute-ordering>

...

</web-app>
© 2011 Peter Roßbach (
probjektpark.de
)
Weitere Ressourcen laden...
36
<web-app>

<name>MyApp</name>

<absolute-ordering>

<name>MyFragment3</name>

<name>MyFragment2</name>
<others/>

</absolute-ordering>

...

</web-app>
© 2011 Peter Roßbach (
probjektpark.de
)
Konflikte

Es wird im Prinzip ein grosser Merge durchgeführt.

Ergebnis im ServletContext Attribute
„org.apache.tomcat.util.scan.MergedWebXml“

Bei Konflikten gewinnt der Eintrag in der
web.xml
.

Konflikte zwischen Elemente verschiedener web-
Fragments führen zu einem Fehler und die
Anwendung ist nicht verfügbar!

Es gibt additive Elemente wie context-param und
init-param!

Tomcat log: Context logEffectiveWebXml"true" /

Ausgabe der
web.xml
mit dem Merge-Resultat!
37
© 2011 Peter Roßbach (
probjektpark.de
)
metadata-complete
3.0 Notation: <web-app> <
metadata-complete>
false<metadata-
complete>...
API
metadata-
complete
Annotations
bzw.
Fragments
2,5
true
NEIN
2,5
false
JA
3,0
true
NEIN
3,0
false
JA
2.5 Notation: <web-app
metadata-complete=
“false“>
38
© 2011 Peter Roßbach (
probjektpark.de
)
SessionTracking
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
HttpSession session = request.getSession();
Cart cart = (Cart)session.getValue(“cart”);

// ...

// do logic to get the inventory number and
// quantity of goods that user wants to add to cart
cart.addItem(inventoryNumber, quanity);
}
39
© 2011 Peter Roßbach (
probjektpark.de
)
Session Markierung

Bisher:

Cookie ( JSESSIONID)

URL- Paramater ( jsessionid)

ab 3.0 kann Namen der Parameter im Container
geändert werden.

ab Tomcat 6.0.20

-Dorg.apache.catalina.SESSION_COOKIE_NAMEJSESSIONID

-Dorg.apache.catalina.SESSION_PARAMETER_NAMEjsessionid

ab mod_jk 1.2.28 ( worker.lb.session_cookieJSESSIONID und
worker.lb.session_path=;jsessionid
40
© 2011 Peter Roßbach (
probjektpark.de
)
SessionCookieConfig

Voreinstellung der SessionCookie Information

SessionCookieConfig(
String
!
domain,
String path,
String
!
comment,
boolean
!
isHttpOnly
,
boolean
!
isSecure)
41
@WebListener
public class MyListener implements ServletContextListener {
public void contextInitialized (ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
SessionCookieConfig scc = new SessionCookieConfig(
„my.domain“,context,“/jup“,true, false) ;
context.setSessionCookieConfig(scc);
}
© 2011 Peter Roßbach (
probjektpark.de
)
SessionTrackingModes

setSessionTrackingModes
(java.util.EnumSetSessionTrackingMode
!
sessionTrackingModes)

SessionTrackingMode.COOKIE (default)

SessionTrackingMode.URL (default)

SessionTrackingMode.SSL
42
@WebListener
public class MyListener implements ServletContextListener {
public void contextInitialized (ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
context.setSessionTrackingMode(EnumSet.of
(
SessionTrackingMode.COOKIE,
SessionTrackingMode.URL, SessionTrackingMode.SSL)
);
}
© 2011 Peter Roßbach (
probjektpark.de
)
Async Servlet
Die berücksichtigten Use Cases für Asynchronität sind
-Server Side AJAX Push per Comet
- Asynchrone Web Services und Web Proxies
- Ermöglicht non-blocking Verhalten des Containers bei langen Requests
Erweiterung von ServletRequest um folgende Methoden
addAsyncListener(AsyncListener listener)
addAsyncListener(AsyncListener listener,
ServletRequest req, ServletResponse res)
getAsyncContext()
startAsync() oder startAsync(ServletRequest req, ServletResponse res)
43
© 2011 Peter Roßbach (
probjektpark.de
)
Asynchron IO

Aktueller Stand entspricht einer Entkoppelung des
Container Request Threads von der Bearbeitung von
Request und Response

Was ist der Asynch IO in der Servlet Spec nicht?

Eine Non Blocking IO Implementierung

Warum?

Problem mit der Rückwärtskompatibilität

Bewusst ein komplexes Programmiermodel vermieden
44
© 2011 Peter Roßbach (
probjektpark.de
)
AsyncSupport
45
@
WebFilter(
value=“/hello“,
asyncSupported=true)
public class myFilter implements Filter {}
@
WebServlet(value=“/hello“,asyncSupported=true)
public class myServlet extend HttpServlet {}
© 2011 Peter Roßbach (
probjektpark.de
)
AsyncSupport
46
interface javax.servlet.ServletRequest {
AsyncContext startAsync();
AsyncContext startAsync(Request,Response);
}
throws IllegalStateException
wenn

isAsyncSupported() returns false
© 2011 Peter Roßbach (
probjektpark.de
)
Async Beispiel
47
@WebServlet(value = "/simple", asyncSupported = true)
public class SimpleDispatch extends HttpServlet {
protected void service(final HttpServletRequest req,
final HttpServletResponse resp) throws ServletException,
IOException {
if (null == req.getAttribute("dispatch")) {
resp.setContentType("text/plain");
AsyncContext actx = req.startAsync();
actx.setTimeout(Long.MAX_VALUE);
Runnable run = new Runnable() {
public void run() {
try {
req.setAttribute("dispatch", System
.currentTimeMillis());
Thread.currentThread().setName("Simple-Thread");
Thread.sleep(2 * 1000);

actx.dispatch();
} catch (Exception x) {}
}
};
actx.start(run);
//Thread t = new Thread(run);
//t.start();
} else {
resp.getWriter().write(
"Simple request start at" + req.getAttribute("dispatch")
+ " and dispatch worked at"
+ System.currentTimeMillis() + "\n");
req.getAsyncContext().complete();
}

}
}
© 2011 Peter Roßbach (
probjektpark.de
)
Besser....
48
service(Request req, Response res) {
if (
req.isAsyncSupported()
) {
AsyncContext actx =
req.isAsyncStarted()?
req.getAsyncContext():
req.startAsync();

...
} else {
...
}
}
© 2011 Peter Roßbach (
probjektpark.de
)
Listener von ServletRequest

Registriere einen AsyncListener für Complete und Timeout

void addAsyncListener(AsyncListener
!
listener)

void addAsyncListener(AsyncListener
!
listener,
ServletRequest
!
servletRequest, ServletResponse
!
servletResponse)

Bestückung mit Wrapper

asyncContext.
setTimeout(long
!
timeout)
49
interface javax.servlet.AsyncListener {
void onComplete(AsyncEvent
 
event)

void onTimeout(AsyncEvent
 
event)
...
}
© 2011 Peter Roßbach (
probjektpark.de
)
Timeout

Wenn kein Timeout explizit gesetzt ist, gilt im Tomcat das Timeout des
Connectors

Default 10 sec

Datei server.xml: Connector asyncTimeout“30000“ ...

Besser immer ein programmatisches Timeout in der eigenen Anwendung
setzen:

asyncContext.setTimeout("15000");
50
© 2011 Peter Roßbach (
probjektpark.de
)
dispatch
51
interface javax.servlet.AsyncContext {
void dispatch();
void dispatch(String path);

void dispatch(ServletContext ctx,
String path)
...
}
Es wird ein Container Thread genutzt oder
gestartet!
Path muss mit ,/‘ starten und ist relative zum
ServletContext
© 2011 Peter Roßbach (
probjektpark.de
)
Beispiel Forward
52
service(Request req, Response res) {
final AsyncContext acontext = req.startAsync();
Runnable runnable = new Runnable() {
public void run() {
Message m = jmsListener.receive();
req.setAttribute(“quote”,m);

//Neuer Container Thread wird gestartet
acontext.dispatch(“/stock/quote.jsp”);
}
};
executor.submit(runnable);

// Ende des bestehenden Container Threads
// Kein Recycle oder Close des Request/Response!
}
© 2011 Peter Roßbach (
probjektpark.de
)
Async Dispatch Attribute

javax.servlet.async.request_uri

javax.servlet. async.context_path

javax.servlet. async.servlet_path

javax.servlet. async.path_info

javax.servlet. async.query_string
53
© 2011 Peter Roßbach (
probjektpark.de
)
AsyncContext
54
© 2011 Peter Roßbach (
probjektpark.de
)
File Upload

Anfrage ist vom Type „
multipart/form-data“

Neue Methoden am HttpServletRequest

public IterablePart getParts()

public Part getPart(String name)

Annotation MultipartConfig erforderlich
55
@
WebServlet(name="upload")
@MultipartConfig(location="temp",
fileSizeThreshold="8196",
maxFileSize="10485760",
maxRequestSize="10485760")
public class myUploadServlet extend HttpServlet {}
© 2011 Peter Roßbach (
probjektpark.de
)
Part
56
© 2011 Peter Roßbach (
probjektpark.de
)
Weiteres

Memory Leak Detection

Connectoren nutzen alle die Executor Threadpools

Module

JDBC 4 DataSource Pool

Comet Bayeux Implementierung

AccessLogging von allen Requests und Async
57
© 2011 Peter Roßbach (
probjektpark.de
)
MemoryLeaks

http://wiki.apache.org/tomcat/MemoryLeakProtection

Falsche Nutzung von Threads

Falsche Nutzung von ThreadLocals

Risiko Shared Libs (JDBC DriverRegistration, Log API)

Löschen von statischen Referenzen um den Speicherverbrauch des
Lochs zu verkleinern

Server Listener: JreMemoryPreventionListener

ab Tomcat 6.0.24

Behandelt JDK API‘S die nicht innerhalb eines WebAppCLassLoader
instanziert werden dürfen.
58
© 2011 Peter Roßbach (
probjektpark.de
)
Konfiguration
59
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.JasperListener"/>
<Listener className=
"org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<GlobalNamingResources>
<Resource name="UserDatabase"
auth="Container"
type="org.apache.catalina.UserDatabase"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml"
readonly="true"/>
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080"/>
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase" />
<Host name="localhost" appBase="webapps" />
</Engine>
</Service>
</Server>
© 2011 Peter Roßbach (
probjektpark.de
)
Beispiele probieren...

Listener
className"org.apache.catalina.core.JreMemoryLeakPreventionListener" /

neue Attribute im Context

clearReferencesStatictrue

Löschen aller public static‘s

clearReferencesStopThreadstrue

Löschen aller Threads die in der Anwendung gestartet sind.

clearReferencesThreadLocalstrue

Lösche aller ThreadLocals Entries die vom ClassLoader noch
referenziert sind.

unloadDelay2000
60
© 2011 Peter Roßbach (
probjektpark.de
)
Thread Leaks...

Konfiguration in der server.xml, bzw context.xml
Server ...
Listener className“org.apache.catalina.core.
ThreadLocalLeakPreventionListener“/
Context renewThreadsWhenStoppingContext“true“ ...

Nach dem Undeploy einer Anwendung werden alle aktiven Thread der
beteiligten Executors erneuert, wenn Sie das nächste Mal in den Pool
zurückkommen.

Dies verhindert effektiv versteckte Memory-Problem mit ThreadLocals die
beim Undeployment der Anwendung nicht bereinigt werden.
61
© 2011 Peter Roßbach (
probjektpark.de
)
webapp - Versionen
62
Context Path
Context Version
Context Name
Base filename
/foo
None
/foo
foo
/foo/bar
None
/foo/bar
foo#bar
Empty String
None
Empty String
ROOT
/foo
42
/foo##42
foo##42
/foo/bar
42
/foo/bar##42
foo#bar##42
Empty String
42
##42
ROOT##42
© 2011 Peter Roßbach (
probjektpark.de
)
Versioniertes Deployment
63
© 2011 Peter Roßbach (
probjektpark.de
)
Fazit: Deployment

SubContext ist auch im Tomcat 6.0.x vorhanden (appmoduleA).

Mit Tomcat 7.0.6 kommt das versionierte Deployment hinzu.

Session sind immer fest einer Version zugeordent.

Neue Session werden in der neuste Version gestartet, wenn diese aktive
ist.

Versionierte oder Submodule sind eigenen vollständige Anwendungen.

Kombinierbar mit alle Servlet API 3.0 Eigenschaften und den Besonderheiten
eines Tomcat 7 Context.
64
© 2011 Peter Roßbach (
probjektpark.de
)
Combined Relam
65
Realm className"org.apache.catalina.realm.CombinedRealm"
Realm className"org.apache.catalina.realm.UserDatabaseRealm"
resourceName"UserDatabase"/
Realm className"org.apache.catalina.realm.DataSourceRealm"
dataSourceName"jdbc/nutzer"
userTable"users"
userNameCol"user_name"
userCredCol"user_pass"
userRoleTable"user_roles"
roleNameCol"role_name"/
/Realm
Mehrere Authenfikations-Quellen
© 2011 Peter Roßbach (
probjektpark.de
)
Realm

Login Brute-Force Attack-Schutz

5 Versuche

5 Minute Sperre

Speicherung von 1000 Vorfällen

Ein Löschen vor Ablauf einer Stunde aus dem Attack Cache gibt in der
ersten Stunden eine Warnung!
66
!-- Use the LockOutRealm to prevent attempts to guess user passwords
via a brute-force attack --
Realm className"org.apache.catalina.realm.LockOutRealm"
!-- This Realm uses the UserDatabase configured in the global JNDI
resources under the key "UserDatabase". Any edits
that are performed against this UserDatabase are immediately
available for use by the Realm. --
Realm className"org.apache.catalina.realm.UserDatabaseRealm"
resourceName"UserDatabase"/
/Realm
© 2010 Peter Roßbach (
probjektpark.de
)
Test eines Servlets
67
package hello;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
WebServlet("/Hello")
public class Hello extends HttpServlet {
Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
response.getWriter().println("Hello World!");
}

}
© 2010 Peter Roßbach (
probjektpark.de
)
Tomcat HelloTest
68
package
hello;
import
java.io.File;
import
org.apache.catalina.core.StandardContext;
import
org.apache.catalina.startup.Tomcat;
import
org.apache.catalina.startup.TomcatBaseTest;
import
org.apache.tomcat.util.buf.ByteChunk;
import
org.junit.Test;
public

class
HelloTest
extends
TomcatBaseTest {


@Test

public

void
testHello()
throws
Exception {
Tomcat tomcat = getTomcatInstance();
File appDir =
new
File(
"WebContent"
);
StandardContext ctx = (StandardContext)
tomcat.addWebapp(
null
,
"/hello"
, appDir.getAbsolutePath());

tomcat.addServlet(ctx,
"hello"
,
new
Hello())
;
ctx.addServletMapping(
"/Hello"
,
"hello"
);
tomcat.start();
ByteChunk out = getUrl(
"http://127.0.0.1:"
+ getPort() +
"/hello/Hello"
);
assertEquals(
"Hello World!\n"
, out.toString());
}
}
© 2010 Peter Roßbach (
probjektpark.de
)
Eclipse Ausgabe
69
© 2011 Peter Roßbach (
probjektpark.de
)
Status

Tomcat 7.0.6 - Starter Release

TCK passed

Kleiner Bugs

Nun brauchen wir Euch!!

Integration in JEE 6 Web Profile in Geronimo

Vermutlich Q1 2011
70
© 2011 Peter Roßbach (
probjektpark.de
)
F&Q

Peter Roßbach

News
!
http://tomcat.objektpark.org/

Kommen Sie zum meinen Workshop‘s und Sessions
!
JAX Mainz 2011
!
Beratung, Schulung, Workshops und Tomcat Support

mailto:probjektpark.de

71
© 2011 Peter Roßbach (
probjektpark.de
)
Hilfe ist nah...

LinuxHotel.de -- Lernen in angenehmer Atmosphäre mit Experten

Schulungen für Administratoren und Entwickler

Alles im Bereich Linux, Netzwerk und OS Services

Groovy & Grails ( Dierk König & Marc Guillemot)

Osgi (Gerd Wütherich )

Apache Tomcat (Peter Roßbach)

Apache httpd (Michael Wandel & Peter Roßbach)

Webcontainer Firewalls (
Christian Schneider & Thomas Krautgartner)

Java für Architekten (Torsten Friebe)

bald mehr...
72