juneau-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jamesbog...@apache.org
Subject [juneau] branch master updated: Javadocs.
Date Tue, 11 Dec 2018 01:13:31 GMT
This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 198b9d5  Javadocs.
198b9d5 is described below

commit 198b9d5bf97fb306aa2bf8c3a28bfdd46143dc4a
Author: JamesBognar <jamesbognar@apache.org>
AuthorDate: Mon Dec 10 20:13:14 2018 -0500

    Javadocs.
---
 .../12.juneau-microservice-jetty/03.Config.html    | 139 ------
 ...esourceClasses.html => 03.ResourceClasses.html} |  90 +++-
 ...sses.html => 04.PredefinedResourceClasses.html} |   2 +-
 .../12.juneau-microservice-jetty/05.Config.html    | 221 ++++++++
 .../12.juneau-microservice-jetty/06.JettyXml.html  |  99 ++++
 .../12.juneau-microservice-jetty/07.Extending.html |  64 ---
 ...iCustomization.html => 07.UiCustomization.html} |   4 +-
 .../12.juneau-microservice-jetty/08.Extending.html |  90 ++++
 .../14.juneau-examples-core/01.Examples.html       |   4 +-
 juneau-doc/src/main/javadoc/overview.html          | 553 +++++++++++++++------
 juneau-doc/src/main/javadoc/resources/docs.txt     |   3 +-
 .../src/main/javadoc/resources/fragments/toc.html  |  11 +-
 12 files changed, 914 insertions(+), 366 deletions(-)

diff --git a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/03.Config.html b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/03.Config.html
deleted file mode 100644
index d4659e1..0000000
--- a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/03.Config.html
+++ /dev/null
@@ -1,139 +0,0 @@
-<!--
-/***************************************************************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *  
- *  http://www.apache.org/licenses/LICENSE-2.0
- *  
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations under the License.
- ***************************************************************************************************************************/
- -->
-
-{todo} Config
-
-<p>
-	The microservice config file is an external INI-style configuration file that is used to configure
-	your microservice.
-</p>
-<h5 class='section'>See Also:</h5>
-<ul class='doctree'>
-	<li class='link'>{@doc juneau-config}
-</ul>
-
-
-<p>
-	There are 3 primary ways of getting access to the config file.
-</p>
-<ul class='doctree'>
-	<li class='jm'>{@link oaj.microservice.Microservice#getConfig()} 
-		<br>Any {@doc DefaultRestSvlVariables initialization-time variables} can be used.
-	<li class='jm'>{@link oajr.RestContext#getConfig()} 
-		<br>Any {@doc DefaultRestSvlVariables initialization-time variables} can be used.
-		<h5 class='figure'>Example usage:</h5>
-		<p class='bcode w800'>
-	<cc>#-------------------------------</cc>
-	<cc># Properties for MyHelloResource </cc>
-	<cc>#-------------------------------</cc>
-	<cs>[MyHelloResource]</cs>
-	<ck>greeting</ck> = <cv>Hello world!</cv> 
-				</p>
-				<p class='bcode w800'>
-	<ja>@RestResource</ja>(...)
-	<jk>public class</jk> MyHelloResource <jk>extends</jk> BasicRestServlet {
-		<jc>// Access config file when initializing fields.</jc>
-		<jk>private</jk> String greeting = getConfig().getString(<js>"MyHelloResource/greeting"</js>); 
-		
-		<jc>// Or access config file in servlet init method.</jc>
-		<ja>@Override</ja> <jc>/* Servlet */</jc>
-		<jk>public void</jk> init() {
-			String greeting = getConfig().getString(<js>"MyHelloResource/greeting"</js>); 
-		}
-	}		
-		</p>
-		<p>
-			Additional user-defined variables can be defined at this level by adding a  
-			{@link oajr.annotation.HookEvent#INIT} hook method
-			and using the {@link oajr.RestContextBuilder#vars(Class...)} method.
-		</p>
-	<li class='jm'>
-		{@link oajr.RestRequest#getConfig()} 
-		- An instance method to access it from inside a REST method.
-		<br>Any {@doc DefaultRestSvlVariables initialization-time or request-time variables} can be used.
-		
-		<h5 class='figure'>Example usage:</h5>
-		<p class='bcode w800'>
-	<cc>#-----------------------------</cc>
-	<cc># Contents of microservice.cfg </cc>
-	<cc>#-----------------------------</cc>
-	<cs>[MyHelloResource]</cs>
-	<ck>greeting</ck> = <cv>Hello $RP{person}!</cv> 
-	<ck>localizedGreeting</ck> = <cv>$L{HelloMessage,$RP{person}}</cv> 
-				</p>
-				<p class='bcode w800'>
-	<cc>#---------------------------------</cc>
-	<cc># Contents of MyHelloResource.java </cc>
-	<cc>#---------------------------------</cc>
-	<ja>@RestResource</ja>(
-		path=<js>"/hello"</js>,
-		messages=<js>"nls/Messages"</js>,
-		...
-	)
-	<jk>public class</jk> MyHelloResource <jk>extends</jk> BasicRestServlet {
-
-		<jd>/** Standard hello message. */</jd>
-		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{person}"</js>)
-		<jk>public</jk> String sayHello(RestRequest req) {
-			<jk>return</jk> req.getConfig().getString(<js>"MyHelloResource/greeting"</js>);
-		}
-
-		<jd>/** Hello message in users language. */</jd>
-		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/localized/{person}"</js>)
-		<jk>public</jk> String sayLocalizedHello(RestRequest req) {
-			<jk>return</jk> req.getConfig().getString(<js>"MyHelloResource/localizedGreeting"</js>);
-		}
-	}		
-		</p>
-		<p class='bcode w800'>
-	<cc>#---------------------------------------</cc>
-	<cc># Contents of nls/Messages_en.properties </cc>
-	<cc>#---------------------------------------</cc>
-	<ck>MyHelloResource.HelloMessage</ck> = <cv>Hello {0}!</cv> 
-		</p>
-		<p>
-			Additional user-defined variables can be defined at this level by overriding the 
-			{@link oajr.RestContextBuilder#vars(Class...)} method.
-		</p>
-</ul>
-<p>
-	That <l>sayLocalizedHello()</l> example might need some explanation since there's a lot going on there.
-	<br>Here's what happens when an HTTP call is made to <l>GET /hello/localized/Bob</l>:
-</p>
-<ol class='spaced-list'>
-	<li>
-		The HTTP call matches the <l>/hello</l> path on the <l>MyHelloResource</l> class.
-	<li>
-		The HTTP call matches the <l>/localized/{person}</l> path on the <l>sayLocalizedHello()</l> method.
-	<li>
-		The request attribute <l>person</l> gets assigned the value <l>"Bob"</l>.
-	<li>
-		The call to <l>req.getConfig().getString("MyHelloResource/localizedGreeting")</l> 
-		finds the value <l>"$L{HelloMessage,$RP{person}}"</l>.
-	<li>
-		The arguments in the <l>$L{}</l> variable get resolved, resulting in <l>"$L{HelloMessage,Bob}"</l>.
-	<li>
-		The <l>$L{}</l> variable gets resolved to the message <l>"Hello {0}!"</l> in the localized properties 
-		file of the servlet based on the <l>Accept-Language</l> header on the request.
-	<li>
-		The arguments get replaced in the message resulting in <l>"Hello Bob!"</l>. 
-	<li>
-		The resulting message <l>"Hello Bob!"</l> is returned as a POJO to be serialized to whatever content 
-		type was specified on the <l>Accept</l> header on the request.
-</ol>
-<p>
-	This particular example is needlessly complex, but it gives an idea of how variables can be used 
-	recursively to produce sophisticated results
-</p>
diff --git a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/04.ResourceClasses.html b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/03.ResourceClasses.html
similarity index 51%
rename from juneau-doc/docs/Topics/12.juneau-microservice-jetty/04.ResourceClasses.html
rename to juneau-doc/docs/Topics/12.juneau-microservice-jetty/03.ResourceClasses.html
index 2d2b548..1b7a6f7 100644
--- a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/04.ResourceClasses.html
+++ b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/03.ResourceClasses.html
@@ -13,21 +13,15 @@
  ***************************************************************************************************************************/
  -->
 
-{todo} Resource Classes
+{new} Resource Classes
 
 <p>
-	Now let's take a look at the resource classes themselves.  
-	<br>The top-level page...
+	This section describes how to define a top-level REST resource page and deploy it in our microservice.
+	The example is a router page that serves as a jumping off page to child resources.
 </p>
 <p class='bpcode w800'>
-	http://localhost:10000
-</p>			
-<img class='bordered w800' src='doc-files/juneau-microservice-server.Running.1.png'>
-<p>
-	...is generated by this class...
-<p class='bpcode w800'>
 	<ja>@RestResource</ja>(
-		path=<js>"/"</js>,
+		path=<js>"/*"</js>,
 		title=<js>"My Microservice"</js>,
 		description=<js>"Top-level resources page"</js>,
 		htmldoc=<ja>@HtmlDoc</ja>(
@@ -45,6 +39,13 @@
 		<jc>// No code! </jc>
 	}
 </p>
+<p>
+	When deployed, it looks like this in a browser:
+</p>
+<p class='bpcode w800'>
+	http://localhost:10000
+</p>			
+<img class='bordered w800' src='doc-files/juneau-microservice-server.Running.1.png'>
 <ul class='spaced-list'>
 	<li>
 		The </l>title</l> and <l>description</l> annotations define the titles on the page.
@@ -83,3 +84,72 @@
 		}
 	}		
 </p>
+<p>
+	The most-common case for deploying the top-level resource is to use the {@link oaj.microservice.jetty.JettyMicroserviceBuilder#servlet(Class)} method:
+</p>	
+<p class='bpcode w800'>
+	<jk>public class</jk> App {
+		<jk>public static void</jk> main(String[] args) {
+			JettyMicroservice
+				.<jsm>create</jsm>() 
+				.args(args)
+				.servlet(RootResources.<jk>class</jk>) <jc>// Our root resource.</jc>
+				.build() 
+				.start()
+			;
+		}
+	}
+</p>
+<p>
+	However, there are multiple ways of deploying top-level resources:
+</p>
+<ul class='spaced-list'>
+	<li>
+		{@link oaj.microservice.jetty.JettyMicroserviceBuilder#servlet(Class)} - Using the builder.  Several methods provided.
+	<li>
+		{@link oaj.microservice.jetty.JettyMicroservice#addServlet(Servlet,String)} - After the Jetty container has been started.
+	<li>
+		As a configuration variable <js>"Jetty/servlets"</js>.
+		<p class='bcode w800'>
+	<cc>#=======================================================================================================================
+	# Jetty settings
+	#=======================================================================================================================</cc>
+	<cs>[Jetty]</cs>
+
+	<cc># Subclasses of RestServlet</cc>	
+	<ck>servlets</ck> = <cv>org.apache.juneau.examples.rest.RootResources</cv>	
+		</p>
+	<li>
+		As a configuration variable <js>"Jetty/servletMap"</js>.
+		<p class='bcode w800'>
+	<cc>#=======================================================================================================================
+	# Jetty settings
+	#=======================================================================================================================</cc>
+	<cs>[Jetty]</cs>
+
+	<cc># Any servlets and their path specs</cc>	
+	<ck>servletMap</ck> = 
+		<cv>{
+			'/*': 'org.apache.juneau.examples.rest.RootResources'
+		}</cv>
+	</cv>	
+	<li>
+		Directly in the <code>jetty.xml</code> file.
+		<p class='bcode w800'>
+	<xt>&lt;Configure</xt> <xa>id</xa>=<xs>"ExampleServer"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.server.Server"</xs><xt>&gt;</xt>
+		...
+		<xt>&lt;New</xt> <xa>id</xa>=<xs>"context"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.servlet.ServletContextHandler"</xs><xt>&gt;</xt>
+			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"contextPath"</xs><xt>&gt;/&lt;/Set&gt;</xt>
+			<xt>&lt;Call</xt> <xa>name</xa>=<xs>"addServlet"</xs><xt>&gt;</xt>
+				<xt>&lt;Arg&gt;</xt>org.apache.juneau.rest.test.Root<xt>&lt;/Arg&gt;</xt>
+				<xt>&lt;Arg&gt;</xt>/*<xt>&lt;/Arg&gt;</xt>
+			<xt>&lt;/Call&gt;</xt>
+			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"sessionHandler"</xs><xt>&gt;</xt>
+				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.session.SessionHandler"</xs> <xt>/&gt;</xt>
+			<xt>&lt;/Set&gt;</xt>
+		<xt>&lt;/New&gt;</xt>
+		...
+		</p>
+</ul>
+
+
diff --git a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/05.PredefinedResourceClasses.html b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/04.PredefinedResourceClasses.html
similarity index 98%
rename from juneau-doc/docs/Topics/12.juneau-microservice-jetty/05.PredefinedResourceClasses.html
rename to juneau-doc/docs/Topics/12.juneau-microservice-jetty/04.PredefinedResourceClasses.html
index cd6dea2..af6c1d0 100644
--- a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/05.PredefinedResourceClasses.html
+++ b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/04.PredefinedResourceClasses.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{todo} Predefined Resource Classes
+{new} Predefined Resource Classes
 
 <p>
 	The following predefined resource classes are also provided for easy inclusion into your microservice:
diff --git a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/05.Config.html b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/05.Config.html
new file mode 100644
index 0000000..f88431e
--- /dev/null
+++ b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/05.Config.html
@@ -0,0 +1,221 @@
+<!--
+/***************************************************************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *  
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations under the License.
+ ***************************************************************************************************************************/
+ -->
+
+{new} Config
+
+<p>
+	In {@doc juneau-microservice-core.Config}, we described how to associate a configuration file with your
+	microservice.
+	In this section we describe how that configuration can be used to customize the behavior or your REST resource
+	classes.
+</p>	
+<p>
+	The most common usage for the configuration file is to reference values using the {@link oaj.config.vars.ConfigVar $C} variable in annotations.
+	For example, the {@link oajr.BasicRestConfig} interface that defines the annotations that control the look-and-feel of
+	classes that extend from {@link oajr.BasicRestServlet} use several <code>$C</code> variables to externalize values:
+</p>
+<p class='bpcode w800'>
+	<ja>@RestResource</ja>(
+		...
+			
+		<jc>// HTML-page specific settings</jc>
+		htmldoc=<ja>@HtmlDoc</ja>(
+	
+			<jc>// Default page header contents.</jc>
+			header={
+				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,  <jc>// Use @RestResource(title)</jc>
+				<js>"&lt;h2&gt;$R{methodSummary,resourceDescription}&lt;/h2&gt;"</js>, <jc>// Use either @RestMethod(summary) or @RestResource(description)</jc>
+				<js>"$C{REST/header}"</js>  <jc>// Extra header HTML defined in external config file.</jc>
+			},
+	
+			<jc>// Default stylesheet to use for the page.
+			// Can be overridden from external config file.
+			// Default is DevOps look-and-feel (aka Depression look-and-feel).</jc>
+			stylesheet=<js>"$C{REST/theme,servlet:/htdocs/themes/devops.css}"</js>,
+	
+			<jc>// Default contents to add to the &lt;head&gt; section of the HTML page.
+			// Use it to add a favicon link to the page.</jc>
+			head={
+				<js>"&lt;link rel='icon' href='$U{$C{REST/favicon}}'/&gt;"</js>
+			},
+	
+			<jc>// No default page footer contents.
+			// Can be overridden from external config file.</jc>
+			footer=<js>"$C{REST/footer}"</js>,
+			...
+		),
+
+		<jc>// These are static files that are served up by the servlet under the specified sub-paths.
+		// For example, "/servletPath/htdocs/javadoc.css" resolves to the file "[servlet-package]/htdocs/javadoc.css"
+		// By default, we define static files through the external configuration file.</jc>
+		staticFiles=<js>"$C{REST/staticFiles}"</js>
+	)
+	<jk>public interface</jk> BasicRestConfig {}
+</p>
+<p>
+	These values in turn are pulled from the external configuration file shown below.
+	Note that the configuration file can also contain <code>$C</code> variables.
+</p>
+<p class='bpcode w800'>
+	<cc>#=======================================================================================================================
+	# REST settings
+	#=======================================================================================================================</cc>
+	<cs>[REST]</cs>
+	
+	<cc># Mappings to folders containing static files.</cc>
+	<cc># Can be in the working directory or in the classpath.</cc>
+	<ck>staticFiles</ck> = <cv>htdocs:files/htdocs</cv>
+	
+	<cc># Stylesheet to use for HTML views.</cc>
+	<ck>theme</ck> = <cv>servlet:/htdocs/themes/devops.css</cv>
+	
+	<ck>headerIcon</ck> = <cv>servlet:/htdocs/images/juneau.png</cv>
+	<ck>headerLink</ck> = <cv>http://juneau.apache.org</cv>
+	<ck>footerIcon</ck> = <cv>servlet:/htdocs/images/asf.png</cv>
+	<ck>footerLink</ck> = <cv>http://www.apache.org</cv>
+	
+	<ck>favicon</ck> = <cv>$C{REST/headerIcon}</cv>
+	<ck>header</ck> = 
+		<cv>&lt;a href='$U{$C{REST/headerLink}}'&gt;</cv>
+			<cv>&lt;img src='$U{$C{REST/headerIcon}}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;</cv>
+		<cv>&lt;/a&gt;</cv>
+	<ck>footer</ck> = 
+		<cv>&lt;a href='$U{$C{REST/footerLink}}'&gt;</cv>
+			<cv>&lt;img src='$U{$C{REST/footerIcon}}' style='float:right;padding-right:20px;height:32px'/&gt;</cv>
+		<cv>&lt;/a&gt;</cv>
+</p>
+
+<p>
+	Configuration files can also be accessed programmatically.
+	There are 3 primary ways of getting access to the config file:
+</p>
+<ul class='doctree'>
+	<li class='jm'>{@link oaj.microservice.Microservice#getConfig()} 
+		<p>Any {@doc DefaultRestSvlVariables initialization-time variables} can be used.</p>
+	<li class='jm'>{@link oajr.RestContext#getConfig()} 
+		<p>Any {@doc DefaultRestSvlVariables initialization-time variables} can be used.</p>
+		<h5 class='figure'>Example usage:</h5>
+		<p class='bcode w800'>
+	<cc>#----------------------------------</cc>
+	<cc># Configuration for MyHelloResource </cc>
+	<cc>#----------------------------------</cc>
+	<cs>[MyHelloResource]</cs>
+	<ck>greeting</ck> = <cv>Hello world!</cv> 
+				</p>
+				<p class='bcode w800'>
+	<cc>#---------------------------------</cc>
+	<cc># Contents of MyHelloResource.java </cc>
+	<cc>#---------------------------------</cc>
+	<ja>@RestResource</ja>(...)
+	<jk>public class</jk> MyHelloResource <jk>extends</jk> BasicRestServlet {
+		<jk>private</jk> String <jf>greeting</jf>; 
+		
+		<jc>// Or access config file in servlet init method.</jc>
+		<ja>@Override</ja> <jc>/* Servlet */</jc>
+		<jk>public void</jk> init() {
+			Config c = getContext().getConfig();
+			<jk>this</jk>.<jf>greeting</jf> = c.getString(<js>"MyHelloResource/greeting"</js>); 
+		}
+	}		
+		</p>
+		<p>
+			Additional user-defined variables at the servlet level can be defined by adding a  
+			{@link oajr.annotation.HookEvent#INIT} hook method
+			and using the {@link oajr.RestContextBuilder#vars(Class...)} method.
+		</p>
+	<li class='jm'>
+		{@link oajr.RestRequest#getConfig()} 
+		- An instance method to access it from inside a REST method.
+		<p>Any {@doc DefaultRestSvlVariables initialization-time or request-time variables} can be used.</p>
+		
+		<h5 class='figure'>Example usage:</h5>
+		<p class='bcode w800'>
+	<cc>#----------------------------------</cc>
+	<cc># Configuration for MyHelloResource</cc>
+	<cc>#----------------------------------</cc>
+	<cs>[MyHelloResource]</cs>
+	<ck>greeting</ck> = <cv>Hello $RP{person}!</cv> <cc>// $RP is RequestPathVar</cc>
+	<ck>localizedGreeting</ck> = <cv>$L{HelloMessage,$RP{person}}</cv> <cc>// $L is LocalizationVar with args</cc>
+				</p>
+				<p class='bcode w800'>
+	<cc>#---------------------------------</cc>
+	<cc># Contents of MyHelloResource.java </cc>
+	<cc>#---------------------------------</cc>
+	<ja>@RestResource</ja>(
+		path=<js>"/hello"</js>,
+		messages=<js>"nls/Messages"</js>,
+		...
+	)
+	<jk>public class</jk> MyHelloResource <jk>extends</jk> BasicRestServlet {
+
+		<jd>/** Standard hello message. */</jd>
+		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{person}"</js>)
+		<jk>public</jk> String sayHello(RestRequest req) {
+			<jk>return</jk> req.getConfig().getString(<js>"MyHelloResource/greeting"</js>);
+		}
+
+		<jd>/** Hello message in users language. */</jd>
+		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/localized/{person}"</js>)
+		<jk>public</jk> String sayLocalizedHello(RestRequest req) {
+			<jk>return</jk> req.getConfig().getString(<js>"MyHelloResource/localizedGreeting"</js>);
+		}
+	}		
+		</p>
+		<p class='bcode w800'>
+	<cc>#---------------------------------------</cc>
+	<cc># Contents of nls/Messages_en.properties </cc>
+	<cc>#---------------------------------------</cc>
+	<ck>MyHelloResource.HelloMessage</ck> = <cv>Hello {0}!</cv> 
+		</p>
+		<p>
+			Additional user-defined variables can be defined at this level by overriding the 
+			{@link oajr.RestContextBuilder#vars(Class...)} method.
+		</p>
+</ul>
+<p>
+	That <l>sayLocalizedHello()</l> example might need some explanation since there's a lot going on there.
+	<br>Here's what happens when an HTTP call is made to <l>GET /hello/localized/Bob</l>:
+</p>
+<ol class='spaced-list'>
+	<li>
+		The HTTP call matches the <l>/hello</l> path on the <l>MyHelloResource</l> class.
+	<li>
+		The HTTP call matches the <l>/localized/{person}</l> path on the <l>sayLocalizedHello()</l> method.
+	<li>
+		The request attribute <l>person</l> gets assigned the value <l>"Bob"</l>.
+	<li>
+		The call to <l>req.getConfig().getString("MyHelloResource/localizedGreeting")</l> 
+		finds the value <l>"$L{HelloMessage,$RP{person}}"</l>.
+	<li>
+		The arguments in the <l>$L{}</l> variable get resolved, resulting in <l>"$L{HelloMessage,Bob}"</l>.
+	<li>
+		The <l>$L{}</l> variable gets resolved to the message <l>"Hello {0}!"</l> in the localized properties 
+		file of the servlet based on the <l>Accept-Language</l> header on the request.
+	<li>
+		The arguments get replaced in the message resulting in <l>"Hello Bob!"</l>. 
+	<li>
+		The resulting message <l>"Hello Bob!"</l> is returned as a POJO to be serialized to whatever content 
+		type was specified on the <l>Accept</l> header on the request.
+</ol>
+<p>
+	This particular example is needlessly complex, but it gives an idea of how variables can be used 
+	recursively to produce sophisticated results
+</p>
+
+<h5 class='section'>See Also:</h5>
+<ul class='doctree'>
+	<li class='link'>{@doc juneau-config}
+</ul>
+
diff --git a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/06.JettyXml.html b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/06.JettyXml.html
new file mode 100644
index 0000000..fd23bdc
--- /dev/null
+++ b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/06.JettyXml.html
@@ -0,0 +1,99 @@
+<!--
+/***************************************************************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *  
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations under the License.
+ ***************************************************************************************************************************/
+ -->
+
+{new} Jetty.xml file
+
+<p>
+	The Jetty microservice comes with a bare-bones <code>jetty.xml</code> file which can be modified to suite any needs. 
+</p>	
+<p>
+	The <code>jetty.xml</code> can be located in either the <js>"."</js> or <js>"files"</js> working directory or classpath.
+	It can also be specified in any of the following ways:
+</p>
+<ul class='spaced-list'>
+	<li>
+		Using the {@link oaj.microservice.jetty.JettyMicroserviceBuilder#jettyXml(Object,boolean)} method to specify the location or contents
+		of the file.
+	<li>
+		Specifying the location using a <code>Jetty-Config</code> value in the <code>MANIFEST.MF</code> file.
+		<p class='bcode w800'>
+	<mk>Jetty-Config:</mk> <mv>files/jetty.xml</mv>
+		</p>
+	<li>
+		Specifying the location using the <js>"Jetty/jettyXml"</js> configuration value.
+		<p class='bcode w800'>
+	<cc>#=======================================================================================================================
+	# Jetty settings
+	#=======================================================================================================================</cc>
+	<cs>[Jetty]</cs>
+	
+	<cc># Path of the jetty.xml file used to configure the Jetty server.</cc>
+	<ck>config</ck> = <cv>files/jetty.xml</cv>
+		</p>
+</ul>
+<p>
+	SVL variables in the <code>jetty.xml</code> file are automatically resolved by the microservice.
+	This allows you to reference values in your configuration file from the <code>jetty.xml</code> file.
+</p>
+<p>
+	The HTTP port used is controlled via the following:
+</p>
+<ul class='spaced-list'>
+	<li>
+		The {@link oaj.microservice.jetty.JettyMicroserviceBuilder#ports(int...)} method.
+		<p class='bcode w800'>
+	JettyMicroservice
+		.<jsm>create</jsm>() 
+		.args(args)  
+		.servlets(RootResource.<jk>class</jk>)
+		.port(1000,2000,0,0,0)  <jc>// Try port 1000, then 2000, then 3 random ports.</jc>
+		.build()  
+		.start()
+		</p>
+	<li>
+		The <js>"Jetty/ports"</js> configuration property.
+		<p class='bcode w800'>
+	<cc>#=======================================================================================================================
+	# Jetty settings
+	#=======================================================================================================================</cc>
+	<cs>[Jetty]</cs>
+	
+	<cc># Port to use for the jetty server.
+	# You can specify multiple ports.  The first available will be used.  '0' indicates to try a random port.
+	<ck>port</ck> = <cv>1000,2000,0,0,0</cv>
+		</p>
+</ul>
+<p>
+	The first available port is then made available through the system property <js>"availablePort"</js> so that it
+	can be referenced in our <code>jetty.xml</code> file.
+</p>
+<p class='bpcode w800'>
+	<xt>&lt;Set</xt> <xa>name</xa>=<xs>"connectors"</xs><xt>&gt;</xt>
+		<xt>&lt;Array</xt> <xa>type</xa>=<xs>"org.eclipse.jetty.server.Connector"</xs><xt>&gt;</xt>
+			<xt>&lt;Item&gt;</xt>
+				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.ServerConnector"</xs><xt>&gt;</xt>
+					<xt>&lt;Arg&gt;</xt>
+						<xt>&lt;Ref</xt> <xa>refid</xa>=<xs>"ExampleServer"</xs> <xt>/&gt;</xt>
+					<xt>&lt;/Arg&gt;</xt>
+					<xt>&lt;Set</xt> <xa>name</xa>=<xs>"port"</xs><xt>&gt;</xt>$S{availablePort,8080}<xt>&lt;/Set&gt;</xt>
+				<xt>&lt;/New&gt;</xt>
+			<xt>&lt;/Item&gt;</xt>
+		<xt>&lt;/Array&gt;</xt>
+	<xt>&lt;/Set&gt;</xt>
+</p>
+<p>
+	The {@link oaj.microservice.jetty.JettyMicroserviceBuilder#jettyServerFactory(JettyServerFactory)} method is also provided
+	to use your own customized Jetty server.
+</p>
diff --git a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/07.Extending.html b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/07.Extending.html
deleted file mode 100644
index 5ceef27..0000000
--- a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/07.Extending.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!--
-/***************************************************************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *  
- *  http://www.apache.org/licenses/LICENSE-2.0
- *  
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations under the License.
- ***************************************************************************************************************************/
- -->
-
-Extending RestMicroservice
-
-<p>
-	This example shows how the {@link oaj.microservice.RestMicroservice} class
-	can be extended to implement lifecycle listener methods or override existing methods.
-	<br>We'll create a new class <l>com.foo.SampleCustomRestMicroservice</l>.
-</p>
-<p>
-	First, the manifest file needs to be modified to point to our new microservice:
-</p>
-<p class='bpcode w800'>
-	<mk>Main-Class:</mk> com.foo.SampleCustomRestMicroservice
-</p>
-<p>
-	Then we define the following class:
-</p>
-<p class='bpcode w800'>
-	<jd>/**
-	 * Sample subclass of a RestMicroservice that provides customized behavior.
-	 * This class must be specified in the Main-Class entry in the manifest file and optionally
-	 * 	a Main-ConfigFile entry.
-	 */</jd>
-	<jk>public class</jk> SampleCustomRestMicroservice <jk>extends</jk> RestMicroservice {
-	
-		<jd>/**
-		 * Must implement a main method and call start()!
-		 */</jd>
-		<jk>public static void</jk> main(String[] args) <jk>throws</jk> Exception {
-			<jk>new</jk> SampleCustomRestMicroservice(args).start().join();
-		}
-	
-		<jd>/**
-		 * Must implement a constructor!
-		 * 
-		 * <ja>@param</ja> args Command line arguments. 
-		 * <ja>@throws</ja> Exception 
-		 */</jd>
-		<jk>public</jk> SampleCustomRestMicroservice(String[] args) <jk>throws</jk> Exception {
-			<jk>super</jk>(args);
-		}
-</p>
-<p>
-	The microservice APIs provide several useful methods that can be used or extended.
-</p>
-<h5 class='section'>See Also:</h5>
-<ul class='doctree'>
-	<li class='jac'>{@link oaj.microservice.Microservice}
-	<li class='jc'>{@link oaj.microservice.RestMicroservice}
-</ul>
diff --git a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/06.UiCustomization.html b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/07.UiCustomization.html
similarity index 97%
rename from juneau-doc/docs/Topics/12.juneau-microservice-jetty/06.UiCustomization.html
rename to juneau-doc/docs/Topics/12.juneau-microservice-jetty/07.UiCustomization.html
index f31d2be..acf5ba4 100644
--- a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/06.UiCustomization.html
+++ b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/07.UiCustomization.html
@@ -13,10 +13,10 @@
  ***************************************************************************************************************************/
  -->
 
-{todo} UI Customization
+{new} UI Customization
 
 <p>
-	The Microservice project contains a <code>files/htdocs</code> working directly folder with predefined stylesheets and
+	The Microservice project contains a <code>files/htdocs</code> folder with predefined stylesheets and
 	images.
 </p>
 <img style='width:200px' src='doc-files/juneau-microservice.UiCustomization.1.png'>
diff --git a/juneau-doc/docs/Topics/12.juneau-microservice-jetty/08.Extending.html b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/08.Extending.html
new file mode 100644
index 0000000..711acd5
--- /dev/null
+++ b/juneau-doc/docs/Topics/12.juneau-microservice-jetty/08.Extending.html
@@ -0,0 +1,90 @@
+<!--
+/***************************************************************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *  
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations under the License.
+ ***************************************************************************************************************************/
+ -->
+
+{new} Extending JettyMicroservice
+
+<p>
+	This example shows how the {@link oaj.microservice.jetty.JettyMicroservice} class
+	can be extended to implement lifecycle listener methods or override existing methods.
+	<br>We'll create a new class <l>com.foo.MyJettyMicroservice</l>.
+</p>
+<p class='bpcode w800'>
+	<jd>/**
+	 * Sample subclass of a JettyMicroservice that provides customized behavior.
+	 */</jd>
+	<jk>public class</jk> MyJettyMicroservice <jk>extends</jk> JettyMicroservice {
+	
+		<jk>public static void</jk> main(String[] args) <jk>throws</jk> Exception {
+			JettyMicroserviceBuilder builder = JettyMicroservice.<jsm>create</jsm>();
+			<jk>new</jk> MyJettyMicroservice(builder).start().join();
+		}
+	
+		<jk>public</jk> MyJettyMicroservice(JettyMicroserviceBuilder builder) <jk>throws</jk> Exception {
+			<jk>super</jk>(builder);
+		}
+		
+		<jc>// Customized code here.</jc>
+</p>
+<p>
+	Optionally, you can extend the {@link oaj.microservice.jetty.JettyMicroserviceBuilder} class as well:
+</p>
+<p class='bpcode w800'>
+	<jk>public class</jk> MyJettyMicroserviceBuilder <jk>extends</jk> JettyMicroserviceBuilder {
+	
+		<jk>int</jk> <jf>extraField</jf>;
+
+		<jd>/**
+		 * Constructor (required).
+		 */</jd>
+		<jk>protected</jk> MyJettyMicroserviceBuilder() {}
+	
+		<jd>/**
+		 * Copy constructor (required).
+		 *
+		 * <ja>@param</ja> copyFrom The builder to copy settings from.
+		 */</jd>
+		<jk>protected</jk> MyJettyMicroserviceBuilder(MyJettyMicroserviceBuilder copyFrom) {
+			<jk>super</jk>(copyFrom);
+		}
+	
+		<jc>// Additional setters</jc>
+	
+		<jk>public</jk> MyJettyMicroserviceBuilder extraField(<jk>int</jk> extraField) {
+			<jk>this</jk>.<jf>extraField</jf> = extraField;
+			<jk>return this</jk>;
+		}
+	
+		<jc>// Overridden methods</jc>
+	
+		<ja>@Override</ja> <jc>/* JettyMicroserviceBuilder */</jc>
+		<jk>public</jk> MyJettyMicroserviceBuilder copy() {
+			<jk>return new</jk> MyJettyMicroserviceBuilder(<jk>this</jk>);
+		}
+	
+		<ja>@Override</ja> <jc>/* JettyMicroserviceBuilder */</jc>
+		<jk>public</jk> MyJettyMicroserviceBuilder ports(<jk>int</jk>...ports) {
+			<jk>super</jk>.ports(ports);
+			<jk>return this</jk>;
+		}
+	
+		<ja>@Override</ja> <jc>/* JettyMicroserviceBuilder */</jc>
+		<jk>public</jk> MyJettyMicroserviceBuilder servlet(Class&lt;? <jk>extends</jk> RestServlet&gt; c) <jk>throws</jk> InstantiationException, IllegalAccessException {
+			<jk>super</jk>.servlet(c);
+			<jk>return this</jk>;
+		}
+	
+		...
+	}
+</p>
diff --git a/juneau-doc/docs/Topics/14.juneau-examples-core/01.Examples.html b/juneau-doc/docs/Topics/14.juneau-examples-core/01.Examples.html
index 5a421d5..2709848 100644
--- a/juneau-doc/docs/Topics/14.juneau-examples-core/01.Examples.html
+++ b/juneau-doc/docs/Topics/14.juneau-examples-core/01.Examples.html
@@ -37,7 +37,7 @@
 	</ul>
 	<li class='jp'><code>org.apache.juneau.examples.core.html</code>
 		<ul>
-			<li class='jc'>{@link oaj.examples.core.core.HtmlSimpleExample} - Htmlerializer usage on serialize simple Pojo bean.
-			<li class='jc'>{@link oaj.examples.core.core.HtmlCompexExample} - HtmlSerializer usage on serialize complex Pojo bean.
+			<li class='jc'>{@link oaj.examples.core.html.HtmlSimpleExample} - HtmlSerializer usage on serialize simple Pojo bean.
+			<li class='jc'>{@link oaj.examples.core.html.HtmlComplexExample} - HtmlSerializer usage on serialize complex Pojo bean.
 		</ul>
 </ul>
diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index ffddc04..ba7f7bb 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -410,11 +410,12 @@
 	<ol>
 		<li><p class='new'><a class='doclink' href='#juneau-microservice-jetty.Overview'>Overview</a></p>
 		<li><p class='new'><a class='doclink' href='#juneau-microservice-jetty.LifecycleMethods'>Lifecycle Methods</a></p>
-		<li><p class='todo'><a class='doclink' href='#juneau-microservice-jetty.Config'>Config</a></p>
-		<li><p class='todo'><a class='doclink' href='#juneau-microservice-jetty.ResourceClasses'>Resource Classes</a></p>
-		<li><p class='todo'><a class='doclink' href='#juneau-microservice-jetty.PredefinedResourceClasses'>Predefined Resource Classes</a></p>
-		<li><p class='todo'><a class='doclink' href='#juneau-microservice-jetty.UiCustomization'>UI Customization</a></p>
-		<li><p class=''><a class='doclink' href='#juneau-microservice-jetty.Extending'>Extending RestMicroservice</a></p>
+		<li><p class='new'><a class='doclink' href='#juneau-microservice-jetty.ResourceClasses'>Resource Classes</a></p>
+		<li><p class='new'><a class='doclink' href='#juneau-microservice-jetty.PredefinedResourceClasses'>Predefined Resource Classes</a></p>
+		<li><p class='new'><a class='doclink' href='#juneau-microservice-jetty.Config'>Config</a></p>
+		<li><p class='new'><a class='doclink' href='#juneau-microservice-jetty.JettyXml'>Jetty.xml file</a></p>
+		<li><p class='new'><a class='doclink' href='#juneau-microservice-jetty.UiCustomization'>UI Customization</a></p>
+		<li><p class='new'><a class='doclink' href='#juneau-microservice-jetty.Extending'>Extending JettyMicroservice</a></p>
 	</ol>
 	<li><p class='toc2 todo'><a class='doclink' href='#juneau-microservice-jetty-template'>juneau-microservice-jetty-template</a></p>
 	<ol>
@@ -24460,65 +24461,304 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic todo' onclick='toggle(this)'><a href='#juneau-microservice-jetty.Config' id='juneau-microservice-jetty.Config'>12.3 - Config</a></h3>
-<div class='topic'><!-- START: 12.3 - juneau-microservice-jetty.Config -->
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-microservice-jetty.ResourceClasses' id='juneau-microservice-jetty.ResourceClasses'>12.3 - Resource Classes</a></h3>
+<div class='topic'><!-- START: 12.3 - juneau-microservice-jetty.ResourceClasses -->
 <p>
-	The microservice config file is an external INI-style configuration file that is used to configure
-	your microservice.
+	This section describes how to define a top-level REST resource page and deploy it in our microservice.
+	The example is a router page that serves as a jumping off page to child resources.
+</p>
+<p class='bpcode w800'>
+	<ja>@RestResource</ja>(
+		path=<js>"/*"</js>,
+		title=<js>"My Microservice"</js>,
+		description=<js>"Top-level resources page"</js>,
+		htmldoc=<ja>@HtmlDoc</ja>(
+			navlinks={
+				<js>"options: servlet:/?method=OPTIONS"</js>
+			}
+		),
+		children={
+			HelloWorldResource.<jk>class</jk>,
+			ConfigResource.<jk>class</jk>,
+			LogsResource.<jk>class</jk>
+		}
+	)
+	<jk>public class</jk> RootResources <jk>extends</jk> BasicRestServletJenaGroup {
+		<jc>// No code! </jc>
+	}
+</p>
+<p>
+	When deployed, it looks like this in a browser:
+</p>
+<p class='bpcode w800'>
+	http://localhost:10000
+</p>			
+<img class='bordered w800' src='doc-files/juneau-microservice-server.Running.1.png'>
+<ul class='spaced-list'>
+	<li>
+		The </l>title</l> and <l>description</l> annotations define the titles on the page.
+		<br>These can be globalized using <l>$L{...}</l> variables, or by defining specially-named properties in the 
+		properties file for the resource.
+	<li>
+		In this case, the <l>path</l> annotation defines the context root of your application since it was 
+		not specified in the manifest or config file.
+		<br>Therefore, this resource is mapped to <l>http://localhost:10000</l>.
+	<li>
+		The <l>children</l> annotation make up the list of child resources.
+		<br>These child resources can be anything that extends from <l>Servlet</l>, although usually
+		they will be subclasses of {@link org.apache.juneau.rest.BasicRestServlet} or other resource groups.
+</ul>
+<p>
+	If you click the <l>helloWorld</l> link in your application, you'll get a simple hello world message:
+</p>
+<p class='bpcode w800'>
+	http://localhost:10000/helloWorld
+</p>			
+<img class='bordered w800' src='doc-files/juneau-microservice-server.ResourceClasses.1.png'>
+<p>
+	...which is generated by this class...
+</p>
+<p class='bpcode w800'>
+	<ja>@RestResource</ja>(
+		path=<js>"/helloWorld"</js>,
+		title=<js>"Hello World example"</js>,
+		description=<js>"Simplest possible REST resource"</js>
+	)
+	<jk>public class</jk> HelloWorldResource <jk>extends</jk> BasicRestServlet {
+	
+		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>)
+		<jk>public</jk> String sayHello() {
+			<jk>return</jk> <js>"Hello world!"</js>;
+		}
+	}		
+</p>
+<p>
+	The most-common case for deploying the top-level resource is to use the {@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder#servlet(Class)} method:
+</p>	
+<p class='bpcode w800'>
+	<jk>public class</jk> App {
+		<jk>public static void</jk> main(String[] args) {
+			JettyMicroservice
+				.<jsm>create</jsm>() 
+				.args(args)
+				.servlet(RootResources.<jk>class</jk>) <jc>// Our root resource.</jc>
+				.build() 
+				.start()
+			;
+		}
+	}
+</p>
+<p>
+	However, there are multiple ways of deploying top-level resources:
+</p>
+<ul class='spaced-list'>
+	<li>
+		{@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder#servlet(Class)} - Using the builder.  Several methods provided.
+	<li>
+		{@link org.apache.juneau.microservice.jetty.JettyMicroservice#addServlet(Servlet,String)} - After the Jetty container has been started.
+	<li>
+		As a configuration variable <js>"Jetty/servlets"</js>.
+		<p class='bcode w800'>
+	<cc>#=======================================================================================================================
+	# Jetty settings
+	#=======================================================================================================================</cc>
+	<cs>[Jetty]</cs>
+
+	<cc># Subclasses of RestServlet</cc>	
+	<ck>servlets</ck> = <cv>org.apache.juneau.examples.rest.RootResources</cv>	
+		</p>
+	<li>
+		As a configuration variable <js>"Jetty/servletMap"</js>.
+		<p class='bcode w800'>
+	<cc>#=======================================================================================================================
+	# Jetty settings
+	#=======================================================================================================================</cc>
+	<cs>[Jetty]</cs>
+
+	<cc># Any servlets and their path specs</cc>	
+	<ck>servletMap</ck> = 
+		<cv>{
+			'/*': 'org.apache.juneau.examples.rest.RootResources'
+		}</cv>
+	</cv>	
+	<li>
+		Directly in the <code>jetty.xml</code> file.
+		<p class='bcode w800'>
+	<xt>&lt;Configure</xt> <xa>id</xa>=<xs>"ExampleServer"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.server.Server"</xs><xt>&gt;</xt>
+		...
+		<xt>&lt;New</xt> <xa>id</xa>=<xs>"context"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.servlet.ServletContextHandler"</xs><xt>&gt;</xt>
+			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"contextPath"</xs><xt>&gt;/&lt;/Set&gt;</xt>
+			<xt>&lt;Call</xt> <xa>name</xa>=<xs>"addServlet"</xs><xt>&gt;</xt>
+				<xt>&lt;Arg&gt;</xt>org.apache.juneau.rest.test.Root<xt>&lt;/Arg&gt;</xt>
+				<xt>&lt;Arg&gt;</xt>/*<xt>&lt;/Arg&gt;</xt>
+			<xt>&lt;/Call&gt;</xt>
+			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"sessionHandler"</xs><xt>&gt;</xt>
+				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.session.SessionHandler"</xs> <xt>/&gt;</xt>
+			<xt>&lt;/Set&gt;</xt>
+		<xt>&lt;/New&gt;</xt>
+		...
+		</p>
+</ul>
+</div><!-- END: 12.3 - juneau-microservice-jetty.ResourceClasses -->
+
+<!-- ==================================================================================================== -->
+
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-microservice-jetty.PredefinedResourceClasses' id='juneau-microservice-jetty.PredefinedResourceClasses'>12.4 - Predefined Resource Classes</a></h3>
+<div class='topic'><!-- START: 12.4 - juneau-microservice-jetty.PredefinedResourceClasses -->
+<p>
+	The following predefined resource classes are also provided for easy inclusion into your microservice:
 </p>
-<h5 class='section'>See Also:</h5>
 <ul class='doctree'>
-	<li class='link'>{@doc juneau-config}
+	<li class='jc'>{@link org.apache.juneau.microservice.resources.ConfigResource}
+		- View and modify the external INI config file.
+	<li class='jc'>{@link org.apache.juneau.microservice.resources.DirectoryResource}
+		- View and modify file system directories.
+	<li class='jc'>{@link org.apache.juneau.microservice.resources.LogsResource}
+		- View and control generated log files.
+	<li class='jc'>{@link org.apache.juneau.microservice.resources.SampleRootResource}
+		- A sample root resource class to get started from.
+	<li class='jc'>{@link org.apache.juneau.microservice.resources.ShutdownResource}
+		- Shutdown and/or restart the JVM.
 </ul>
+</div><!-- END: 12.4 - juneau-microservice-jetty.PredefinedResourceClasses -->
 
+<!-- ==================================================================================================== -->
 
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-microservice-jetty.Config' id='juneau-microservice-jetty.Config'>12.5 - Config</a></h3>
+<div class='topic'><!-- START: 12.5 - juneau-microservice-jetty.Config -->
 <p>
-	There are 3 primary ways of getting access to the config file.
+	In {@doc juneau-microservice-core.Config}, we described how to associate a configuration file with your
+	microservice.
+	In this section we describe how that configuration can be used to customize the behavior or your REST resource
+	classes.
+</p>	
+<p>
+	The most common usage for the configuration file is to reference values using the {@link org.apache.juneau.config.vars.ConfigVar $C} variable in annotations.
+	For example, the {@link org.apache.juneau.rest.BasicRestConfig} interface that defines the annotations that control the look-and-feel of
+	classes that extend from {@link org.apache.juneau.rest.BasicRestServlet} use several <code>$C</code> variables to externalize values:
+</p>
+<p class='bpcode w800'>
+	<ja>@RestResource</ja>(
+		...
+			
+		<jc>// HTML-page specific settings</jc>
+		htmldoc=<ja>@HtmlDoc</ja>(
+	
+			<jc>// Default page header contents.</jc>
+			header={
+				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,  <jc>// Use @RestResource(title)</jc>
+				<js>"&lt;h2&gt;$R{methodSummary,resourceDescription}&lt;/h2&gt;"</js>, <jc>// Use either @RestMethod(summary) or @RestResource(description)</jc>
+				<js>"$C{REST/header}"</js>  <jc>// Extra header HTML defined in external config file.</jc>
+			},
+	
+			<jc>// Default stylesheet to use for the page.
+			// Can be overridden from external config file.
+			// Default is DevOps look-and-feel (aka Depression look-and-feel).</jc>
+			stylesheet=<js>"$C{REST/theme,servlet:/htdocs/themes/devops.css}"</js>,
+	
+			<jc>// Default contents to add to the &lt;head&gt; section of the HTML page.
+			// Use it to add a favicon link to the page.</jc>
+			head={
+				<js>"&lt;link rel='icon' href='$U{$C{REST/favicon}}'/&gt;"</js>
+			},
+	
+			<jc>// No default page footer contents.
+			// Can be overridden from external config file.</jc>
+			footer=<js>"$C{REST/footer}"</js>,
+			...
+		),
+
+		<jc>// These are static files that are served up by the servlet under the specified sub-paths.
+		// For example, "/servletPath/htdocs/javadoc.css" resolves to the file "[servlet-package]/htdocs/javadoc.css"
+		// By default, we define static files through the external configuration file.</jc>
+		staticFiles=<js>"$C{REST/staticFiles}"</js>
+	)
+	<jk>public interface</jk> BasicRestConfig {}
+</p>
+<p>
+	These values in turn are pulled from the external configuration file shown below.
+	Note that the configuration file can also contain <code>$C</code> variables.
+</p>
+<p class='bpcode w800'>
+	<cc>#=======================================================================================================================
+	# REST settings
+	#=======================================================================================================================</cc>
+	<cs>[REST]</cs>
+	
+	<cc># Mappings to folders containing static files.</cc>
+	<cc># Can be in the working directory or in the classpath.</cc>
+	<ck>staticFiles</ck> = <cv>htdocs:files/htdocs</cv>
+	
+	<cc># Stylesheet to use for HTML views.</cc>
+	<ck>theme</ck> = <cv>servlet:/htdocs/themes/devops.css</cv>
+	
+	<ck>headerIcon</ck> = <cv>servlet:/htdocs/images/juneau.png</cv>
+	<ck>headerLink</ck> = <cv>http://juneau.apache.org</cv>
+	<ck>footerIcon</ck> = <cv>servlet:/htdocs/images/asf.png</cv>
+	<ck>footerLink</ck> = <cv>http://www.apache.org</cv>
+	
+	<ck>favicon</ck> = <cv>$C{REST/headerIcon}</cv>
+	<ck>header</ck> = 
+		<cv>&lt;a href='$U{$C{REST/headerLink}}'&gt;</cv>
+			<cv>&lt;img src='$U{$C{REST/headerIcon}}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;</cv>
+		<cv>&lt;/a&gt;</cv>
+	<ck>footer</ck> = 
+		<cv>&lt;a href='$U{$C{REST/footerLink}}'&gt;</cv>
+			<cv>&lt;img src='$U{$C{REST/footerIcon}}' style='float:right;padding-right:20px;height:32px'/&gt;</cv>
+		<cv>&lt;/a&gt;</cv>
+</p>
+
+<p>
+	Configuration files can also be accessed programmatically.
+	There are 3 primary ways of getting access to the config file:
 </p>
 <ul class='doctree'>
 	<li class='jm'>{@link org.apache.juneau.microservice.Microservice#getConfig()} 
-		<br>Any {@doc DefaultRestSvlVariables initialization-time variables} can be used.
+		<p>Any {@doc DefaultRestSvlVariables initialization-time variables} can be used.</p>
 	<li class='jm'>{@link org.apache.juneau.rest.RestContext#getConfig()} 
-		<br>Any {@doc DefaultRestSvlVariables initialization-time variables} can be used.
+		<p>Any {@doc DefaultRestSvlVariables initialization-time variables} can be used.</p>
 		<h5 class='figure'>Example usage:</h5>
 		<p class='bcode w800'>
-	<cc>#-------------------------------</cc>
-	<cc># Properties for MyHelloResource </cc>
-	<cc>#-------------------------------</cc>
+	<cc>#----------------------------------</cc>
+	<cc># Configuration for MyHelloResource </cc>
+	<cc>#----------------------------------</cc>
 	<cs>[MyHelloResource]</cs>
 	<ck>greeting</ck> = <cv>Hello world!</cv> 
 				</p>
 				<p class='bcode w800'>
+	<cc>#---------------------------------</cc>
+	<cc># Contents of MyHelloResource.java </cc>
+	<cc>#---------------------------------</cc>
 	<ja>@RestResource</ja>(...)
 	<jk>public class</jk> MyHelloResource <jk>extends</jk> BasicRestServlet {
-		<jc>// Access config file when initializing fields.</jc>
-		<jk>private</jk> String greeting = getConfig().getString(<js>"MyHelloResource/greeting"</js>); 
+		<jk>private</jk> String <jf>greeting</jf>; 
 		
 		<jc>// Or access config file in servlet init method.</jc>
 		<ja>@Override</ja> <jc>/* Servlet */</jc>
 		<jk>public void</jk> init() {
-			String greeting = getConfig().getString(<js>"MyHelloResource/greeting"</js>); 
+			Config c = getContext().getConfig();
+			<jk>this</jk>.<jf>greeting</jf> = c.getString(<js>"MyHelloResource/greeting"</js>); 
 		}
 	}		
 		</p>
 		<p>
-			Additional user-defined variables can be defined at this level by adding a  
+			Additional user-defined variables at the servlet level can be defined by adding a  
 			{@link org.apache.juneau.rest.annotation.HookEvent#INIT} hook method
 			and using the {@link org.apache.juneau.rest.RestContextBuilder#vars(Class...)} method.
 		</p>
 	<li class='jm'>
 		{@link org.apache.juneau.rest.RestRequest#getConfig()} 
 		- An instance method to access it from inside a REST method.
-		<br>Any {@doc DefaultRestSvlVariables initialization-time or request-time variables} can be used.
+		<p>Any {@doc DefaultRestSvlVariables initialization-time or request-time variables} can be used.</p>
 		
 		<h5 class='figure'>Example usage:</h5>
 		<p class='bcode w800'>
-	<cc>#-----------------------------</cc>
-	<cc># Contents of microservice.cfg </cc>
-	<cc>#-----------------------------</cc>
+	<cc>#----------------------------------</cc>
+	<cc># Configuration for MyHelloResource</cc>
+	<cc>#----------------------------------</cc>
 	<cs>[MyHelloResource]</cs>
-	<ck>greeting</ck> = <cv>Hello $RP{person}!</cv> 
-	<ck>localizedGreeting</ck> = <cv>$L{HelloMessage,$RP{person}}</cv> 
+	<ck>greeting</ck> = <cv>Hello $RP{person}!</cv> <cc>// $RP is RequestPathVar</cc>
+	<ck>localizedGreeting</ck> = <cv>$L{HelloMessage,$RP{person}}</cv> <cc>// $L is LocalizationVar with args</cc>
 				</p>
 				<p class='bcode w800'>
 	<cc>#---------------------------------</cc>
@@ -24584,109 +24824,107 @@
 	This particular example is needlessly complex, but it gives an idea of how variables can be used 
 	recursively to produce sophisticated results
 </p>
-</div><!-- END: 12.3 - juneau-microservice-jetty.Config -->
+
+<h5 class='section'>See Also:</h5>
+<ul class='doctree'>
+	<li class='link'>{@doc juneau-config}
+</ul>
+</div><!-- END: 12.5 - juneau-microservice-jetty.Config -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic todo' onclick='toggle(this)'><a href='#juneau-microservice-jetty.ResourceClasses' id='juneau-microservice-jetty.ResourceClasses'>12.4 - Resource Classes</a></h3>
-<div class='topic'><!-- START: 12.4 - juneau-microservice-jetty.ResourceClasses -->
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-microservice-jetty.JettyXml' id='juneau-microservice-jetty.JettyXml'>12.6 - Jetty.xml file</a></h3>
+<div class='topic'><!-- START: 12.6 - juneau-microservice-jetty.JettyXml -->
 <p>
-	Now let's take a look at the resource classes themselves.  
-	<br>The top-level page...
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000
-</p>			
-<img class='bordered w800' src='doc-files/juneau-microservice-server.Running.1.png'>
+	The Jetty microservice comes with a bare-bones <code>jetty.xml</code> file which can be modified to suite any needs. 
+</p>	
 <p>
-	...is generated by this class...
-<p class='bpcode w800'>
-	<ja>@RestResource</ja>(
-		path=<js>"/"</js>,
-		title=<js>"My Microservice"</js>,
-		description=<js>"Top-level resources page"</js>,
-		htmldoc=<ja>@HtmlDoc</ja>(
-			navlinks={
-				<js>"options: servlet:/?method=OPTIONS"</js>
-			}
-		),
-		children={
-			HelloWorldResource.<jk>class</jk>,
-			ConfigResource.<jk>class</jk>,
-			LogsResource.<jk>class</jk>
-		}
-	)
-	<jk>public class</jk> RootResources <jk>extends</jk> BasicRestServletJenaGroup {
-		<jc>// No code! </jc>
-	}
+	The <code>jetty.xml</code> can be located in either the <js>"."</js> or <js>"files"</js> working directory or classpath.
+	It can also be specified in any of the following ways:
 </p>
 <ul class='spaced-list'>
 	<li>
-		The </l>title</l> and <l>description</l> annotations define the titles on the page.
-		<br>These can be globalized using <l>$L{...}</l> variables, or by defining specially-named properties in the 
-		properties file for the resource.
+		Using the {@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder#jettyXml(Object,boolean)} method to specify the location or contents
+		of the file.
 	<li>
-		In this case, the <l>path</l> annotation defines the context root of your application since it was 
-		not specified in the manifest or config file.
-		<br>Therefore, this resource is mapped to <l>http://localhost:10000</l>.
+		Specifying the location using a <code>Jetty-Config</code> value in the <code>MANIFEST.MF</code> file.
+		<p class='bcode w800'>
+	<mk>Jetty-Config:</mk> <mv>files/jetty.xml</mv>
+		</p>
 	<li>
-		The <l>children</l> annotation make up the list of child resources.
-		<br>These child resources can be anything that extends from <l>Servlet</l>, although usually
-		they will be subclasses of {@link org.apache.juneau.rest.BasicRestServlet} or other resource groups.
+		Specifying the location using the <js>"Jetty/jettyXml"</js> configuration value.
+		<p class='bcode w800'>
+	<cc>#=======================================================================================================================
+	# Jetty settings
+	#=======================================================================================================================</cc>
+	<cs>[Jetty]</cs>
+	
+	<cc># Path of the jetty.xml file used to configure the Jetty server.</cc>
+	<ck>config</ck> = <cv>files/jetty.xml</cv>
+		</p>
 </ul>
 <p>
-	If you click the <l>helloWorld</l> link in your application, you'll get a simple hello world message:
+	SVL variables in the <code>jetty.xml</code> file are automatically resolved by the microservice.
+	This allows you to reference values in your configuration file from the <code>jetty.xml</code> file.
 </p>
-<p class='bpcode w800'>
-	http://localhost:10000/helloWorld
-</p>			
-<img class='bordered w800' src='doc-files/juneau-microservice-server.ResourceClasses.1.png'>
 <p>
-	...which is generated by this class...
+	The HTTP port used is controlled via the following:
 </p>
-<p class='bpcode w800'>
-	<ja>@RestResource</ja>(
-		path=<js>"/helloWorld"</js>,
-		title=<js>"Hello World example"</js>,
-		description=<js>"Simplest possible REST resource"</js>
-	)
-	<jk>public class</jk> HelloWorldResource <jk>extends</jk> BasicRestServlet {
+<ul class='spaced-list'>
+	<li>
+		The {@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder#ports(int...)} method.
+		<p class='bcode w800'>
+	JettyMicroservice
+		.<jsm>create</jsm>() 
+		.args(args)  
+		.servlets(RootResource.<jk>class</jk>)
+		.port(1000,2000,0,0,0)  <jc>// Try port 1000, then 2000, then 3 random ports.</jc>
+		.build()  
+		.start()
+		</p>
+	<li>
+		The <js>"Jetty/ports"</js> configuration property.
+		<p class='bcode w800'>
+	<cc>#=======================================================================================================================
+	# Jetty settings
+	#=======================================================================================================================</cc>
+	<cs>[Jetty]</cs>
 	
-		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>)
-		<jk>public</jk> String sayHello() {
-			<jk>return</jk> <js>"Hello world!"</js>;
-		}
-	}		
+	<cc># Port to use for the jetty server.
+	# You can specify multiple ports.  The first available will be used.  '0' indicates to try a random port.
+	<ck>port</ck> = <cv>1000,2000,0,0,0</cv>
+		</p>
+</ul>
+<p>
+	The first available port is then made available through the system property <js>"availablePort"</js> so that it
+	can be referenced in our <code>jetty.xml</code> file.
+</p>
+<p class='bpcode w800'>
+	<xt>&lt;Set</xt> <xa>name</xa>=<xs>"connectors"</xs><xt>&gt;</xt>
+		<xt>&lt;Array</xt> <xa>type</xa>=<xs>"org.eclipse.jetty.server.Connector"</xs><xt>&gt;</xt>
+			<xt>&lt;Item&gt;</xt>
+				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.ServerConnector"</xs><xt>&gt;</xt>
+					<xt>&lt;Arg&gt;</xt>
+						<xt>&lt;Ref</xt> <xa>refid</xa>=<xs>"ExampleServer"</xs> <xt>/&gt;</xt>
+					<xt>&lt;/Arg&gt;</xt>
+					<xt>&lt;Set</xt> <xa>name</xa>=<xs>"port"</xs><xt>&gt;</xt>$S{availablePort,8080}<xt>&lt;/Set&gt;</xt>
+				<xt>&lt;/New&gt;</xt>
+			<xt>&lt;/Item&gt;</xt>
+		<xt>&lt;/Array&gt;</xt>
+	<xt>&lt;/Set&gt;</xt>
 </p>
-</div><!-- END: 12.4 - juneau-microservice-jetty.ResourceClasses -->
-
-<!-- ==================================================================================================== -->
-
-<h3 class='topic todo' onclick='toggle(this)'><a href='#juneau-microservice-jetty.PredefinedResourceClasses' id='juneau-microservice-jetty.PredefinedResourceClasses'>12.5 - Predefined Resource Classes</a></h3>
-<div class='topic'><!-- START: 12.5 - juneau-microservice-jetty.PredefinedResourceClasses -->
 <p>
-	The following predefined resource classes are also provided for easy inclusion into your microservice:
+	The {@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder#jettyServerFactory(JettyServerFactory)} method is also provided
+	to use your own customized Jetty server.
 </p>
-<ul class='doctree'>
-	<li class='jc'>{@link org.apache.juneau.microservice.resources.ConfigResource}
-		- View and modify the external INI config file.
-	<li class='jc'>{@link org.apache.juneau.microservice.resources.DirectoryResource}
-		- View and modify file system directories.
-	<li class='jc'>{@link org.apache.juneau.microservice.resources.LogsResource}
-		- View and control generated log files.
-	<li class='jc'>{@link org.apache.juneau.microservice.resources.SampleRootResource}
-		- A sample root resource class to get started from.
-	<li class='jc'>{@link org.apache.juneau.microservice.resources.ShutdownResource}
-		- Shutdown and/or restart the JVM.
-</ul>
-</div><!-- END: 12.5 - juneau-microservice-jetty.PredefinedResourceClasses -->
+</div><!-- END: 12.6 - juneau-microservice-jetty.JettyXml -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic todo' onclick='toggle(this)'><a href='#juneau-microservice-jetty.UiCustomization' id='juneau-microservice-jetty.UiCustomization'>12.6 - UI Customization</a></h3>
-<div class='topic'><!-- START: 12.6 - juneau-microservice-jetty.UiCustomization -->
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-microservice-jetty.UiCustomization' id='juneau-microservice-jetty.UiCustomization'>12.7 - UI Customization</a></h3>
+<div class='topic'><!-- START: 12.7 - juneau-microservice-jetty.UiCustomization -->
 <p>
-	The Microservice project contains a <code>files/htdocs</code> working directly folder with predefined stylesheets and
+	The Microservice project contains a <code>files/htdocs</code> folder with predefined stylesheets and
 	images.
 </p>
 <img style='width:200px' src='doc-files/juneau-microservice.UiCustomization.1.png'>
@@ -24794,60 +25032,86 @@
 	<ck>RestContext.useClasspathResourceCaching.b</ck> = <cv>false</cv>
 
 </p>
-</div><!-- END: 12.6 - juneau-microservice-jetty.UiCustomization -->
+</div><!-- END: 12.7 - juneau-microservice-jetty.UiCustomization -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-microservice-jetty.Extending' id='juneau-microservice-jetty.Extending'>12.7 - Extending RestMicroservice</a></h3>
-<div class='topic'><!-- START: 12.7 - juneau-microservice-jetty.Extending -->
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-microservice-jetty.Extending' id='juneau-microservice-jetty.Extending'>12.8 - Extending JettyMicroservice</a></h3>
+<div class='topic'><!-- START: 12.8 - juneau-microservice-jetty.Extending -->
 <p>
-	This example shows how the {@link org.apache.juneau.microservice.RestMicroservice} class
+	This example shows how the {@link org.apache.juneau.microservice.jetty.JettyMicroservice} class
 	can be extended to implement lifecycle listener methods or override existing methods.
-	<br>We'll create a new class <l>com.foo.SampleCustomRestMicroservice</l>.
-</p>
-<p>
-	First, the manifest file needs to be modified to point to our new microservice:
+	<br>We'll create a new class <l>com.foo.MyJettyMicroservice</l>.
 </p>
 <p class='bpcode w800'>
-	<mk>Main-Class:</mk> com.foo.SampleCustomRestMicroservice
+	<jd>/**
+	 * Sample subclass of a JettyMicroservice that provides customized behavior.
+	 */</jd>
+	<jk>public class</jk> MyJettyMicroservice <jk>extends</jk> JettyMicroservice {
+	
+		<jk>public static void</jk> main(String[] args) <jk>throws</jk> Exception {
+			JettyMicroserviceBuilder builder = JettyMicroservice.<jsm>create</jsm>();
+			<jk>new</jk> MyJettyMicroservice(builder).start().join();
+		}
+	
+		<jk>public</jk> MyJettyMicroservice(JettyMicroserviceBuilder builder) <jk>throws</jk> Exception {
+			<jk>super</jk>(builder);
+		}
+		
+		<jc>// Customized code here.</jc>
 </p>
 <p>
-	Then we define the following class:
+	Optionally, you can extend the {@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder} class as well:
 </p>
 <p class='bpcode w800'>
-	<jd>/**
-	 * Sample subclass of a RestMicroservice that provides customized behavior.
-	 * This class must be specified in the Main-Class entry in the manifest file and optionally
-	 * 	a Main-ConfigFile entry.
-	 */</jd>
-	<jk>public class</jk> SampleCustomRestMicroservice <jk>extends</jk> RestMicroservice {
+	<jk>public class</jk> MyJettyMicroserviceBuilder <jk>extends</jk> JettyMicroserviceBuilder {
 	
+		<jk>int</jk> <jf>extraField</jf>;
+
 		<jd>/**
-		 * Must implement a main method and call start()!
+		 * Constructor (required).
 		 */</jd>
-		<jk>public static void</jk> main(String[] args) <jk>throws</jk> Exception {
-			<jk>new</jk> SampleCustomRestMicroservice(args).start().join();
-		}
+		<jk>protected</jk> MyJettyMicroserviceBuilder() {}
 	
 		<jd>/**
-		 * Must implement a constructor!
-		 * 
-		 * <ja>@param</ja> args Command line arguments. 
-		 * <ja>@throws</ja> Exception 
+		 * Copy constructor (required).
+		 *
+		 * <ja>@param</ja> copyFrom The builder to copy settings from.
 		 */</jd>
-		<jk>public</jk> SampleCustomRestMicroservice(String[] args) <jk>throws</jk> Exception {
-			<jk>super</jk>(args);
+		<jk>protected</jk> MyJettyMicroserviceBuilder(MyJettyMicroserviceBuilder copyFrom) {
+			<jk>super</jk>(copyFrom);
 		}
+	
+		<jc>// Additional setters</jc>
+	
+		<jk>public</jk> MyJettyMicroserviceBuilder extraField(<jk>int</jk> extraField) {
+			<jk>this</jk>.<jf>extraField</jf> = extraField;
+			<jk>return this</jk>;
+		}
+	
+		<jc>// Overridden methods</jc>
+	
+		<ja>@Override</ja> <jc>/* JettyMicroserviceBuilder */</jc>
+		<jk>public</jk> MyJettyMicroserviceBuilder copy() {
+			<jk>return new</jk> MyJettyMicroserviceBuilder(<jk>this</jk>);
+		}
+	
+		<ja>@Override</ja> <jc>/* JettyMicroserviceBuilder */</jc>
+		<jk>public</jk> MyJettyMicroserviceBuilder ports(<jk>int</jk>...ports) {
+			<jk>super</jk>.ports(ports);
+			<jk>return this</jk>;
+		}
+	
+		<ja>@Override</ja> <jc>/* JettyMicroserviceBuilder */</jc>
+		<jk>public</jk> MyJettyMicroserviceBuilder servlet(Class&lt;? <jk>extends</jk> RestServlet&gt; c) <jk>throws</jk> InstantiationException, IllegalAccessException {
+			<jk>super</jk>.servlet(c);
+			<jk>return this</jk>;
+		}
+	
+		...
+	}
 </p>
-<p>
-	The microservice APIs provide several useful methods that can be used or extended.
-</p>
-<h5 class='section'>See Also:</h5>
-<ul class='doctree'>
-	<li class='jac'>{@link org.apache.juneau.microservice.Microservice}
-	<li class='jc'>{@link org.apache.juneau.microservice.RestMicroservice}
-</ul>
-</div><!-- END: 12.7 - juneau-microservice-jetty.Extending -->
+</div><!-- END: 12.8 - juneau-microservice-jetty.Extending -->
 </div><!-- END: 12 - juneau-microservice-jetty -->
 
 <!-- ==================================================================================================== -->
@@ -25769,6 +26033,11 @@
 		<li class='jc'>{@link org.apache.juneau.examples.core.rdf.RdfExample} - RdfXmlSerializer usage on serialize simple Pojo bean.
 		<li class='jc'>{@link org.apache.juneau.examples.core.rdf.RdfComplexExample} - RdfXmlSerializer usage on serialize complex Pojo bean.
 	</ul>
+	<li class='jp'><code>org.apache.juneau.examples.core.html</code>
+		<ul>
+			<li class='jc'>{@link org.apache.juneau.examples.core.html.HtmlSimpleExample} - HtmlSerializer usage on serialize simple Pojo bean.
+			<li class='jc'>{@link org.apache.juneau.examples.core.html.HtmlComplexExample} - HtmlSerializer usage on serialize complex Pojo bean.
+		</ul>
 </ul>
 </div><!-- END: 14.1 - juneau-examples-core.Examples -->
 </div><!-- END: 14 - juneau-examples-core -->
diff --git a/juneau-doc/src/main/javadoc/resources/docs.txt b/juneau-doc/src/main/javadoc/resources/docs.txt
index c219c17..ace5c1d 100644
--- a/juneau-doc/src/main/javadoc/resources/docs.txt
+++ b/juneau-doc/src/main/javadoc/resources/docs.txt
@@ -231,7 +231,8 @@ juneau-microservice-jetty-template.RestMicroservice = #juneau-microservice-jetty
 juneau-microservice-jetty-template.RestMicroservice.Extending = #juneau-microservice-jetty-template.RestMicroservice.Extending, Overview > juneau-microservice-jetty-template > RestMicroservice > Extending RestMicroservice
 juneau-microservice-jetty-template.UiCustomization = #juneau-microservice-jetty-template.UiCustomization, Overview > juneau-microservice-jetty-template > UI Customization
 juneau-microservice-jetty.Config = #juneau-microservice-jetty.Config, Overview > juneau-microservice-jetty > Config
-juneau-microservice-jetty.Extending = #juneau-microservice-jetty.Extending, Overview > juneau-microservice-jetty > Extending RestMicroservice
+juneau-microservice-jetty.Extending = #juneau-microservice-jetty.Extending, Overview > juneau-microservice-jetty > Extending JettyMicroservice
+juneau-microservice-jetty.JettyXml = #juneau-microservice-jetty.JettyXml, Overview > juneau-microservice-jetty > Jetty.xml file
 juneau-microservice-jetty.LifecycleMethods = #juneau-microservice-jetty.LifecycleMethods, Overview > juneau-microservice-jetty > Lifecycle Methods
 juneau-microservice-jetty.Overview = #juneau-microservice-jetty.Overview, Overview > juneau-microservice-jetty > Overview
 juneau-microservice-jetty.PredefinedResourceClasses = #juneau-microservice-jetty.PredefinedResourceClasses, Overview > juneau-microservice-jetty > Predefined Resource Classes
diff --git a/juneau-doc/src/main/javadoc/resources/fragments/toc.html b/juneau-doc/src/main/javadoc/resources/fragments/toc.html
index a76bd18..7ecbb7a 100644
--- a/juneau-doc/src/main/javadoc/resources/fragments/toc.html
+++ b/juneau-doc/src/main/javadoc/resources/fragments/toc.html
@@ -353,11 +353,12 @@
 	<ol>
 		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.Overview'>Overview</a></p>
 		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.LifecycleMethods'>Lifecycle Methods</a></p>
-		<li><p class='todo'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.Config'>Config</a></p>
-		<li><p class='todo'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.ResourceClasses'>Resource Classes</a></p>
-		<li><p class='todo'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.PredefinedResourceClasses'>Predefined Resource Classes</a></p>
-		<li><p class='todo'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.UiCustomization'>UI Customization</a></p>
-		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.Extending'>Extending RestMicroservice</a></p>
+		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.ResourceClasses'>Resource Classes</a></p>
+		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.PredefinedResourceClasses'>Predefined Resource Classes</a></p>
+		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.Config'>Config</a></p>
+		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.JettyXml'>Jetty.xml file</a></p>
+		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.UiCustomization'>UI Customization</a></p>
+		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty.Extending'>Extending JettyMicroservice</a></p>
 	</ol>
 	<li><p class='toc2 todo'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-jetty-template'>juneau-microservice-jetty-template</a></p>
 	<ol>


Mime
View raw message