Apache Tomcat 7
Servlet API 3.0
(7.0.6 Release)
Peter Roßbach
probjektpark.de
© 2011 Peter Roßbach (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.de
)
Neuer Start Screen
9
© 2011 Peter Roßbach (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.de
)
Eclipse Java Annotation Support
16
© 2011 Peter Roßbach (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.de
)
ServletContext
23
© 2011 Peter Roßbach (
probjektpark.de
)
Annotations 3.0
•
Voraussetzung in WEB-INF/
web.xml
•
metadata-completefalsemetadata-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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.de
)
War
27
war
WEB-INF
resourceA.jsp
lib
web.xml
resources2.jar
resources.jar
resourceE.jsp
folder
resourceC.jsp
© 2011 Peter Roßbach (
probjektpark.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 (
probjektpark.de
)
resource2.jar
29
resources2.jar
MET
A-INF
anno.ServletA
resources
web-fragment.xml
folder
resourceC.jsp
resourceF
.jsp
© 2011 Peter Roßbach (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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_NAMEJSESSIONID
•
-Dorg.apache.catalina.SESSION_PARAMETER_NAMEjsessionid
•
ab mod_jk 1.2.28 ( worker.lb.session_cookieJSESSIONID und
worker.lb.session_path=;jsessionid
40
© 2011 Peter Roßbach (
probjektpark.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 (
probjektpark.de
)
SessionTrackingModes
•
setSessionTrackingModes
(java.util.EnumSetSessionTrackingMode
!
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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.de
)
AsyncSupport
46
interface javax.servlet.ServletRequest {
AsyncContext startAsync();
AsyncContext startAsync(Request,Response);
}
throws IllegalStateException
wenn
isAsyncSupported() returns false
© 2011 Peter Roßbach (
probjektpark.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 (
probjektpark.de
)
Besser....
48
service(Request req, Response res) {
if (
req.isAsyncSupported()
) {
AsyncContext actx =
req.isAsyncStarted()?
req.getAsyncContext():
req.startAsync();
...
} else {
...
}
}
© 2011 Peter Roßbach (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.de
)
AsyncContext
54
© 2011 Peter Roßbach (
probjektpark.de
)
File Upload
•
Anfrage ist vom Type „
multipart/form-data“
•
Neue Methoden am HttpServletRequest
•
public IterablePart 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 (
probjektpark.de
)
Part
56
© 2011 Peter Roßbach (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.de
)
Beispiele probieren...
•
Listener
className"org.apache.catalina.core.JreMemoryLeakPreventionListener" /
•
neue Attribute im Context
•
clearReferencesStatictrue
•
Löschen aller public static‘s
•
clearReferencesStopThreadstrue
•
Löschen aller Threads die in der Anwendung gestartet sind.
•
clearReferencesThreadLocalstrue
•
Lösche aller ThreadLocals Entries die vom ClassLoader noch
referenziert sind.
•
unloadDelay2000
60
© 2011 Peter Roßbach (
probjektpark.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 (
probjektpark.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 (
probjektpark.de
)
Versioniertes Deployment
63
© 2011 Peter Roßbach (
probjektpark.de
)
Fazit: Deployment
•
SubContext ist auch im Tomcat 6.0.x vorhanden (appmoduleA).
•
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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.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 (
probjektpark.de
)
Eclipse Ausgabe
69
© 2011 Peter Roßbach (
probjektpark.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 (
probjektpark.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:probjektpark.de
•
71
© 2011 Peter Roßbach (
probjektpark.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
Enter the password to open this PDF file:
File name:
-
File size:
-
Title:
-
Author:
-
Subject:
-
Keywords:
-
Creation Date:
-
Modification Date:
-
Creator:
-
PDF Producer:
-
PDF Version:
-
Page Count:
-
Preparing document for printing…
0%
Σχόλια 0
Συνδεθείτε για να κοινοποιήσετε σχόλιο