<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3256718942160532638</id><updated>2026-02-20T08:18:01.380-08:00</updated><category term="Jetty"/><category term="async servlets"/><category term="continuations"/><category term="custom classloader"/><category term="fileupload"/><category term="multipart config"/><category term="servlet 3.0"/><title type='text'>Ramesh PVK</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rameshpvk.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3256718942160532638/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://rameshpvk.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ramesh PVK</name><uri>http://www.blogger.com/profile/17930531372192042561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3256718942160532638.post-8957113880774593072</id><published>2013-04-03T11:54:00.000-07:00</published><updated>2013-04-04T00:20:07.246-07:00</updated><title type='text'>Pramati Nex Gen LB</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pramati NexGen LB is a software web load balancer which comes with greatest features compared to any typical LB.&amp;nbsp;&amp;nbsp; Pramati NexGen LB can be put in front of any Web Container which can support standard Proxy headers.&lt;br /&gt;
&lt;br /&gt;
Some of the salient features of Pramati NexGen LB are:&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;color: #45818e;&quot;&gt;Protocols Support&amp;nbsp; &lt;/span&gt;&amp;nbsp;&lt;/h4&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Supports HTTP, HTTPS and AJP protocol.&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;color: #45818e;&quot;&gt;Better Configuration Support&lt;/span&gt; &lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Allows sourcing entire LB configuration from Custom source. For Ex, the LB configuration can be provided form Database using DBConfiguration. &amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Allows dynamically configuring and reloading LB Configuration without requiring any downtime.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;color: #45818e;&quot;&gt;Effective Handling of Slow Clients&lt;/span&gt; &lt;/h4&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Sometimes clients with slower I/O can hold the backend server resources for long time making the server less available. This is effectively handled in NexGen LB using the byte sink. Before dispatching the request to the actual backend node, the request body is first read to local file sink. Once the entire request body is read to sink, the request is dispatched to backend node by serving the request body from the file sink. Similarly, the response from the backend node is first written to file sink and later written to the actual client.&lt;/blockquote&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;color: #45818e;&quot;&gt;Advanced SSL&lt;/span&gt; &lt;/h4&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Supports the following advanced SSL features such as:&lt;/blockquote&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;
&lt;li&gt;Configuring separate certificate for&amp;nbsp; each virtual host.&lt;/li&gt;
&lt;li&gt;Dynamically reloading certificate without restarting the LB. &lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;color: #45818e;&quot;&gt;Advanced Node Selection mechanisms&lt;/span&gt; &lt;/h4&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Comes with wide range of pre-defined Node selection algorithms. Some of them are:&lt;/blockquote&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;


&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;Round Robin :&lt;/span&gt; Uses round robin strategy for selecting the backend node&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ea9999;&quot;&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;Weighted Round Robin:&lt;/span&gt; &lt;/span&gt;Same as round robin but gives weightage to nodes based on the weights assigned to nodes. For ex, the weights can be assigned based on the number of CPU&#39;s each node has.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;Fastest: &lt;/span&gt;Selects the node which has the fastest request processing time.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;Min-Requests:&lt;/span&gt; Selects the node which has processed the minimum number of requests.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;Max-Requests:&lt;/span&gt; Selects the node which has processed the maximum number of requests.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;color: #45818e;&quot;&gt;Supports wide range of Stickiness Mechanisms&lt;/span&gt; &lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Provides stickiness while node selection using the following stickiness mechanisms:&lt;/blockquote&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;Servlet Session:&lt;/span&gt; Node which has previously processed the same JSESSION id.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;User Name:&lt;/span&gt; Node which has previously processed the same user. This is supported for BASIC authentication only which send the user name encoded in Authentication header. &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;Cookie :&lt;/span&gt; Node which has previously processed the same cookie and value.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;Client Address :&lt;/span&gt; Node which has processed the same client address previously.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;HTTP Header:&lt;/span&gt; Node which has previously processed the same header and value.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;HTTP Parameter:&lt;/span&gt; Node which has previously processed the same http parameter and value.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;Query Parameter: &lt;/span&gt;Node which has previously processed the same query parameter and value.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #e06666;&quot;&gt;Cookie Affinity: &lt;/span&gt;The node name which processes the request is sent as Cookie to the client. All the further requests are dispatched to the node based on the Cookie value.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;color: #45818e;&quot;&gt;Supports Custom Node Selection&lt;/span&gt; &lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Allows writing custom node selection mechanism in Java or JavaScript. The JavaScript node selector&#39;s can be modified at runtime which will be applied automatically.&lt;/blockquote&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;color: #45818e;&quot;&gt;Serving Content from Other Sources&lt;/span&gt; &lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&amp;nbsp;Content Handlers helps us serving the content from other locations such as:&lt;/blockquote&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;Static content from the LB local file system&lt;/li&gt;
&lt;li&gt;Content from any remote location.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;color: #45818e;&quot;&gt;Rewriting headers&lt;/span&gt; &lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Allows rewriting upstream headers while forwarding the requests to backend. Similarly does rewriting downstream headers. The following operations can be performed on the upstream/downstream header:&lt;/blockquote&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;
&lt;li&gt;Add&lt;/li&gt;
&lt;li&gt;Modify&lt;/li&gt;
&lt;li&gt;Delete &lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rameshpvk.blogspot.com/feeds/8957113880774593072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rameshpvk.blogspot.com/2013/04/pramati-nex-gen-lb.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3256718942160532638/posts/default/8957113880774593072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3256718942160532638/posts/default/8957113880774593072'/><link rel='alternate' type='text/html' href='http://rameshpvk.blogspot.com/2013/04/pramati-nex-gen-lb.html' title='Pramati Nex Gen LB'/><author><name>Ramesh PVK</name><uri>http://www.blogger.com/profile/17930531372192042561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3256718942160532638.post-5911491117193272981</id><published>2012-11-27T05:59:00.005-08:00</published><updated>2012-11-29T21:59:23.770-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="async servlets"/><category scheme="http://www.blogger.com/atom/ns#" term="continuations"/><category scheme="http://www.blogger.com/atom/ns#" term="Jetty"/><title type='text'>Comparing Servlet 3.0 Asynchronous Servlets with Jetty Continuations</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Why do we need Asynchronous Servlets?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Asynchronous Servlets are useful when a Servlet needs to wait for resources or events. For example, a Servlet may need to wait for:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Response from Remote Web Resource&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;A JDBC connection&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;A JMS message&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;An application event&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
Because, waiting is an inefficient operation which consumes resources such threads, database connections, buffers etc.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Containers implementing Asynchronous Servlets:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Jetty 6 supporting Continuations&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Containers implementing Servlet 3.0&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Jetty 7( onwards supports both Jetty Continuations and Servlet 3.0 Asynchronous Servlets &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;How does Asynchronous Servlets Work:&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Servlet/Filter can begin asynchronous processing&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Thread will return to the container after the asynchronous processing of the request has started. The Servlet response will not be committed like default Servlet Life cycle.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Another thread may either&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;generate the response and call complete&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;or dispatch the request to run in container context.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Servlet 3.0 introducing new features compared to Jetty 6 &amp;nbsp; &lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
The Servlet 3.0 asynchronous API introduced some new asynchronous features not supported by jetty 6 continuations:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Ability to complete an asynchronous request without re-dispatching&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Listeners for asynchronous events&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Dispatching asynchronous requests to specific contexts and/or resource&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt; Support for wrapping requests and responses. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Applying Filters during dispatch mode.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
Later, Jetty started adopting above features&amp;nbsp; except &quot;Applying Filters during dispatch mode&quot; since Jetty 7.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Comparing API: Jetty Continuation Vs Servlet 3.0 Async Servlet&lt;/span&gt;&lt;/h2&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;Jetty Continuation&lt;/th&gt;&lt;th&gt;Servlet 3.0&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Suspend&lt;/td&gt;&lt;td&gt;Continuation.suspend(HttpServletResponse)&lt;/td&gt;&lt;td&gt;HttpServletRequest.startAsync()&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Resume&lt;/td&gt;&lt;td&gt;Continuation.resume()&lt;/td&gt;&lt;td&gt;AsyncContext.dispatch()&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Complete&lt;/td&gt;&lt;td&gt;Continuation.complete()&lt;/td&gt;&lt;td&gt;AsyncContext.complete()&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Understanding Asynchronous Servlets(Code):&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;div&gt;
Lets take an example where a Servlet blocks while waiting for Remote Web Service call to return and try to understand how the Servlets were written without the invent of Asynchronous Servlets , Jetty 6 Continuations and Servlet 3.0 Asynchronous Servlets.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;h3&gt;
Synchronous Servlets &lt;/h3&gt;
&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i style=&quot;color: #666666;&quot;&gt;public class RemoteWebServiceServlet extends HttpServlet {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void doGet(HttpServletRequest req, HttpServletResponse res) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object result&amp;nbsp; = makeRemoteWebService(...);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; writeResponse(result); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/i&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&amp;nbsp;Asynchronous Servlet using Servlet 3.0&lt;/h3&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i style=&quot;color: #444444;&quot;&gt;@WebServlet(async=“true”)&lt;br /&gt;public class AsyncServlet extends HttpServlet {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void doGet(HttpServletRequest req, HttpServletResponse res) {&lt;br /&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Check if request it is not async dispatch&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!req.isAsyncStarted()) {&lt;/i&gt; &lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AsyncContext ctx = req.startAsync(req, res);&lt;span style=&quot;color: #38761d;&quot;&gt; //Start Async Processing&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.start(new&amp;nbsp; RemoteServiceHandler() implements Runnable {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object result&amp;nbsp; = makeRemoteWebService(...);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.setAttribute(&quot;result&quot;, result);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.dispatch(); &lt;span style=&quot;color: #38761d;&quot;&gt;// Re-dispatch/ resume to generate response&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object result = request.getAttribute(&quot;result&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeResponse(result);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/i&gt;&lt;/blockquote&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;h3&gt;
&amp;nbsp;
Asynchronous Servlet using Jetty Continuations:&lt;/h3&gt;
&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div&gt;
&lt;i style=&quot;color: #444444;&quot;&gt;&amp;nbsp;public class AsyncServlet extends HttpServlet {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void doGet(HttpServletRequest req, HttpServletResponse res) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&lt;/i&gt;&lt;i style=&quot;color: #444444;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt; // Check if request it is not async dispatch&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Object result = request.getAttribute(&quot;result&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (result == null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Continuation continuation = ContinuationSupport.getContinuation(request);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; continuation.suspend(response);&lt;/i&gt;&lt;i style=&quot;color: #444444;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt; //Start Async Processing&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;threadpool.submit(new&amp;nbsp; RemoteServiceHandler() implements Runnable {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object result&amp;nbsp; = makeRemoteWebService(...);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.setAttribute(&quot;result&quot;, result);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continuation.resume(); &lt;/i&gt;&lt;i style=&quot;color: #444444;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;// Re-dispatch/ resume to generate response&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object result = request.getAttribute(&quot;result&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeResponse(result);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/i&gt; &lt;/div&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div&gt;
&lt;i style=&quot;color: #444444;&quot;&gt;} &lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
&amp;nbsp;Internals of Servlet 3.0 Async and Jetty 6 Continuations:&lt;/h2&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Now, we will try to understand how Servlet 3.0 Async and Jetty 6 Continuations work internally. Infact, both work in the same way.&amp;nbsp;&amp;nbsp; If you see below, there is a single implementation class for both Servlet 3.0 Async and Jetty 6 Contination:&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;i&gt;&lt;span style=&quot;color: #444444;&quot;&gt;public class AsyncContinuation implements AsyncContext, Continuation {&lt;/span&gt;&lt;/i&gt;&amp;nbsp;&lt;/blockquote&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...........&lt;br /&gt;
&lt;blockquote&gt;
&lt;i&gt;&lt;span style=&quot;color: #444444;&quot;&gt;}&lt;/span&gt;&lt;/i&gt; &lt;/blockquote&gt;
&amp;nbsp;And the below code shows that Jetty HttpServletRequest implementation internally uses Continuation API:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot; style=&quot;color: #444444;&quot;&gt;
&lt;i&gt;public class Request implements HttpServletRequest {&lt;/i&gt; &lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot; style=&quot;color: #444444;&quot;&gt;
&lt;i&gt;..............&lt;span style=&quot;color: #444444;&quot;&gt;&lt;/span&gt;&lt;/i&gt; &lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot; style=&quot;color: #444444;&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: #444444;&quot;&gt;public AsyncContext startAsync() throws IllegalStateException&lt;/span&gt;&lt;br style=&quot;color: #444444;&quot; /&gt;&lt;span style=&quot;color: #444444;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style=&quot;color: #444444;&quot; /&gt;&lt;span style=&quot;color: #444444;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!_asyncSupported)&lt;/span&gt;&lt;br style=&quot;color: #444444;&quot; /&gt;&lt;span style=&quot;color: #444444;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new IllegalStateException(&quot;!asyncSupported&quot;);&lt;/span&gt;&lt;br style=&quot;color: #444444;&quot; /&gt;&lt;span style=&quot;color: #444444;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _async.suspend();&lt;/span&gt;&lt;br style=&quot;color: #444444;&quot; /&gt;&lt;span style=&quot;color: #444444;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _async;&lt;/span&gt;&lt;br style=&quot;color: #444444;&quot; /&gt;&lt;span style=&quot;color: #444444;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;color: #444444;&quot; /&gt;&lt;span style=&quot;color: #444444;&quot;&gt;}&lt;/span&gt;&lt;/i&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&amp;nbsp;&amp;nbsp; &lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rameshpvk.blogspot.com/feeds/5911491117193272981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rameshpvk.blogspot.com/2012/11/comparing-servlet-30-asynchronous.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3256718942160532638/posts/default/5911491117193272981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3256718942160532638/posts/default/5911491117193272981'/><link rel='alternate' type='text/html' href='http://rameshpvk.blogspot.com/2012/11/comparing-servlet-30-asynchronous.html' title='Comparing Servlet 3.0 Asynchronous Servlets with Jetty Continuations'/><author><name>Ramesh PVK</name><uri>http://www.blogger.com/profile/17930531372192042561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3256718942160532638.post-4634060339277038591</id><published>2012-11-27T05:59:00.003-08:00</published><updated>2012-11-29T01:16:22.376-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="custom classloader"/><title type='text'>Why do you need a Custom Classloader?</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;votecell&quot;&gt;&lt;div class=&quot;vote&quot;&gt;
&lt;span class=&quot;vote-count-post&quot; style=&quot;cursor: pointer;&quot; title=&quot;View upvote and downvote totals&quot;&gt;&lt;/span&gt;&lt;span class=&quot;vote-accepted-on&quot; title=&quot;The question owner accepted this as the best answer Jun 3 at 14:31&quot;&gt;&lt;br /&gt;&lt;/span&gt; 
&lt;/div&gt;
&lt;/td&gt;


&lt;td class=&quot;answercell&quot;&gt;&lt;div class=&quot;post-text&quot;&gt;
Java Runtime loads the classes dynamically at runtime using class loaders. By default a JVM will consists of these three class loaders:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;BootStrap Class loader This is the classloader which is loads all the core classes required by the JVM. They are basically the Java classes from the packages like java.lang.*, java.io.*, java.util.* etc. One can append additional class locations to this class loader using &lt;i&gt;-Xbootclasspath/p:&lt;/i&gt; and &lt;i&gt;-Xbootclasspath/a:&lt;/i&gt; JVM options.&lt;/li&gt;
&lt;li&gt;Extension Class loader It is the classloader which is an alternative to the BootStrap class loader. One can drop the additional classes packaged in JAR file&amp;nbsp; in /lib/ext folder to get it picked by JVM.&lt;/li&gt;
&lt;li&gt;System Class loader It is the classloader&amp;nbsp; which loads the classes specified in the CLASSPATH. It is also called as application classloader.&lt;/li&gt;
&lt;/ul&gt;
JVM allows you&amp;nbsp; to create custom class loader which can address several problems. They are mostly useful in larger 
architectures consisting of several module/applications. Here are the 
advantages of the custom class loader:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Modular architecture&lt;/b&gt; They allow you to define multiple class loader allowing modular architecture. Each module can have their own classloader.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Isolation&lt;/b&gt; Clearly defines the scope of the class to within the class loader. It avoid conflicts if a class is present in two modules.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Support Versioning&lt;/b&gt; Supports different versions of class within same VM for different modules.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Memory Management&lt;/b&gt; Classes can be loaded and unloaded whenever required.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Load classes from anywhere&lt;/b&gt; Classes can be loaded from anywhere, &lt;b&gt;for ex, Database, Networks, or even define it on the fly&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Add resources or classes dynamically&lt;/b&gt; All the above features allows you add classes or resources dynamically.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Runtime Reloading Modified Classes&lt;/b&gt;  Allows you to 
reload a class or classes at runtime by creating a child class loader to 
the actual class loader, which contains the modified classes.&lt;/li&gt;
&lt;/ul&gt;
A good example of Custom class loader is JavaEE Application Server. Where each Web or Enterprise application will be class loader by itself. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rameshpvk.blogspot.com/feeds/4634060339277038591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rameshpvk.blogspot.com/2012/11/why-do-you-need-custom-classloader.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3256718942160532638/posts/default/4634060339277038591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3256718942160532638/posts/default/4634060339277038591'/><link rel='alternate' type='text/html' href='http://rameshpvk.blogspot.com/2012/11/why-do-you-need-custom-classloader.html' title='Why do you need a Custom Classloader?'/><author><name>Ramesh PVK</name><uri>http://www.blogger.com/profile/17930531372192042561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3256718942160532638.post-4047711716076584385</id><published>2012-06-27T22:12:00.003-07:00</published><updated>2013-04-04T02:33:41.646-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="fileupload"/><category scheme="http://www.blogger.com/atom/ns#" term="multipart config"/><category scheme="http://www.blogger.com/atom/ns#" term="servlet 3.0"/><title type='text'>FileUpload using Servlet 3.0</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;font-family: Verdana,sans-serif;&quot;&gt;
&lt;b&gt;Servlet 3.0 container&#39;s&lt;/b&gt; 
has standard support for multipart data. If a request Content-Type is multipart/form-data and the MultiPartConfig is configured on the servlet,&amp;nbsp; the HttpServletRequest makes the parts available using Servlet 3.0 newly added methods in HttpServletRequest.&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: Verdana,sans-serif;&quot;&gt;
First, lets see the new API available in Servlet 3.0 :&lt;/div&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;




javax.servlet.http.HttpServletRequest (&lt;a href=&quot;http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html&quot; target=&quot;_blank&quot;&gt;API Documentation)&lt;/a&gt;&lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;div style=&quot;text-align: left;&quot;&gt;
Collection&amp;lt;Part&amp;gt; getParts()&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style=&quot;text-align: left;&quot;&gt;
Part getPart(String partName)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;




javax.servelt.Part (&lt;a href=&quot;http://docs.oracle.com/javaee/6/api/javax/servlet/http/Part.html&quot; target=&quot;_blank&quot;&gt;API Documentation&lt;/a&gt;)&lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&amp;nbsp;void&amp;nbsp; delete()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&amp;nbsp;String&amp;nbsp; getContentType()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&amp;nbsp;String&amp;nbsp; getHeader(String name)&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Collection&amp;lt;String&amp;gt;&amp;nbsp; getHeaderNames()&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&amp;nbsp;Collection&amp;lt;String&amp;gt;&amp;nbsp; getHeaders(String name)&amp;nbsp;&lt;i&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;InputStream&amp;nbsp; getInputStream()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;i&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;String&amp;nbsp; getName()&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;long&amp;nbsp; getSize()&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;void&amp;nbsp; write(java.lang.String fileName)&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;font-family: Verdana,sans-serif;&quot;&gt;
Lets us try to understand the API by writing an example.&lt;/div&gt;
&lt;div style=&quot;font-family: Verdana,sans-serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Verdana,sans-serif;&quot;&gt;
The&amp;nbsp; first thing in this example is the upload page. This is how it looks:&lt;/div&gt;
&lt;div style=&quot;background-color: #cfe2f3; color: black;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #cfe2f3; color: black;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;&quot;&gt;&amp;lt;%@ page contentType=&quot;text/html;charset=UTF-8&quot; language=&quot;java&quot; %&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Upload &amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;form action=&quot;uploadservlet&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name :&amp;lt;input type=&quot;text&quot; name=&quot;name&quot;/&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Age :&amp;lt;input type=&quot;text&quot; name=&quot;age&quot;/&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Upload Photo:&amp;lt;input type=&quot;file&quot; name=&quot;photo&quot;/&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&quot;submit&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: Verdana,sans-serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;Next is implementing the Upload Servlet. Here is how it looks:&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #ea9999; color: black;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;&quot;&gt;@MultipartConfig(location = &quot;D:\\images&quot;, maxFileSize = 102400, maxRequestSize = 204800,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fileSizeThreshold = 1024)&lt;br /&gt;@WebServlet(name = &quot;UploadServlet&quot;,urlPatterns = &quot;/uploadservlet&quot;)public class UploadServlet extends HttpServlet&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void service(HttpServletRequest request,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpServletResponse response) throws ServletException, IOException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Collection&amp;lt;Part&amp;gt; parts = request.getParts();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (Part part : parts) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(&quot;&quot; + part.getName());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(parts.size());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (parts.size() != 3) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.sendError(500, &quot;All Fields are mandatory. &quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Part filePart = request.getPart(&quot;photo&quot;);&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #6aa84f; font-family: Verdana,sans-serif;&quot;&gt;//read imageInputStream if required&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InputStream imageStream = filePart.getInputStream();&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999; color: black;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6aa84f; font-family: Verdana,sans-serif;&quot;&gt;//can also write the photo to local storage&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;&quot;&gt;&lt;span style=&quot;color: #6aa84f; font-family: Verdana,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; filePart.write(&quot;users/photo.jpg&quot;); &lt;br style=&quot;color: black;&quot; /&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; filePart.delete(); //deletes the underlying storage if used&lt;/span&gt;&lt;br style=&quot;color: black;&quot; /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #6aa84f; font-family: Verdana,sans-serif;&quot;&gt;//Read name, String Type&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Part namePart = request.getPart(&quot;name&quot;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;&quot;&gt;&lt;span style=&quot;color: #6aa84f; font-family: Verdana,sans-serif;&quot;&gt;//Part.getSize() returns the length of the individual part&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (namePart.getSize() &amp;gt; 20) {&lt;br style=&quot;color: black;&quot; /&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6aa84f; font-family: Verdana,sans-serif;&quot;&gt;//write name cannot exceed 20 chars&lt;/span&gt;&lt;br style=&quot;color: black;&quot; /&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.sendError(500, &quot;Name cannot exceed 20 chars&quot;);&lt;/span&gt;&lt;br style=&quot;color: black;&quot; /&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;color: black;&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #6aa84f; font-family: Verdana,sans-serif;&quot;&gt;//name , String type can also obtained using Request parameter&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String nameParameter = request.getParameter(&quot;name&quot;);&lt;br style=&quot;color: black;&quot; /&gt;&lt;br style=&quot;color: black;&quot; /&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int ageParameter = Integer.parseInt(request.getParameter(&quot;age&quot;));&lt;/span&gt;&lt;br style=&quot;color: black;&quot; /&gt;&lt;br style=&quot;color: black;&quot; /&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.getWriter().print(&quot;Welcome, &quot; + nameParameter + &quot;!. Your age is &quot; + ageParameter);&lt;/span&gt;&lt;br style=&quot;color: black;&quot; /&gt;&lt;br style=&quot;color: black;&quot; /&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;color: black;&quot; /&gt;&lt;br style=&quot;color: black;&quot; /&gt;&lt;span style=&quot;color: black;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;background-color: #ea9999; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: Verdana,sans-serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;We will now discuss the above example in detail.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Verdana,sans-serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Verdana,sans-serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;The HttpServletRequest will make the parts available using the getPart(..) and getParts() methods only if the MultiPartConfig is defined for that Servlet. It can be done in two ways:&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;Using&lt;/span&gt; &lt;b&gt;@MultiPartConfig&lt;/b&gt; &lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;annotation&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-family: Verdana,sans-serif;&quot;&gt;In &lt;code&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;web.xml&lt;/b&gt;&lt;/span&gt;,&lt;/code&gt; by adding &lt;b&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;lt;multipart-config&amp;gt;&lt;/code&gt;&lt;/span&gt; &lt;/b&gt;entry inside&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt; &lt;/span&gt;&lt;b style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;code&gt;&amp;lt;servlet&amp;gt;&lt;/code&gt;&lt;/b&gt; definition. &lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ea9999; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;lt;servlet&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-name&amp;gt;UploadServlet&amp;lt;/servlet-name&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-class&amp;gt;com.fileupload.UploadServlet&amp;lt;/servlet-class&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;multipart-config&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;file-size-threshold&amp;gt;1024&amp;lt;/file-size-threshold&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;location&amp;gt;D:\\images&amp;lt;/location&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;max-file-size&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;102400&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;lt;/max-file-size&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;max-request-size&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;204800&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;lt;/max-request-size&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/multipart-config&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ea9999; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/servlet&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: Verdana,sans-serif;&quot;&gt;
Lets discuss the properties MultiPartConfig has in details. These properties can be defined both for Annotation and in web.ml.&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;file-size-threshold&lt;/span&gt;/&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;fileSizeThreshold &lt;/span&gt;&lt;/b&gt;: The size beyond which the file is written to temporary file in disk.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;location&lt;/span&gt; : &lt;/b&gt;The location where the parts written using Part.write() will be stored.&lt;/li&gt;
&lt;li&gt;&lt;b style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;max-file-size/maxFileSize&lt;/b&gt;: The maximum size allowed for uploaded file.&lt;/li&gt;
&lt;li&gt;&lt;b style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;max-request-size / maxRequestSize&lt;/b&gt; :&amp;nbsp; The maxim size allowed for multipart/form-data requests.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rameshpvk.blogspot.com/feeds/4047711716076584385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rameshpvk.blogspot.com/2012/06/fileuplod-using-servlet-30.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3256718942160532638/posts/default/4047711716076584385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3256718942160532638/posts/default/4047711716076584385'/><link rel='alternate' type='text/html' href='http://rameshpvk.blogspot.com/2012/06/fileuplod-using-servlet-30.html' title='FileUpload using Servlet 3.0'/><author><name>Ramesh PVK</name><uri>http://www.blogger.com/profile/17930531372192042561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>