<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Smartkey - Java Software Consultancy</title>
	<atom:link href="http://blog.smartkey.co.uk/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.smartkey.co.uk</link>
	<description></description>
	<lastBuildDate>Fri, 06 Apr 2012 16:06:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Providing a default exception handling strategy in Java applications</title>
		<link>http://blog.smartkey.co.uk/2012/03/providing-a-default-exceptoin-strategy/</link>
		<comments>http://blog.smartkey.co.uk/2012/03/providing-a-default-exceptoin-strategy/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 13:58:41 +0000</pubDate>
		<dc:creator>Steve Neal</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java Programming]]></category>
		<category><![CDATA[Core Java]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaSE]]></category>

		<guid isPermaLink="false">http://blog.smartkey.co.uk/?p=978</guid>
		<description><![CDATA[When writing a Java application you may need to consider how that application should react when an uncaught exception is encountered. Generally, when an exception is not handled, the threads stack trace is printed to the error stream and the throwing thread dies; potentially causing the application to shut down if there are no other [...]]]></description>
			<content:encoded><![CDATA[<p>When writing a Java application you may need to consider how that application should react when an uncaught exception is encountered. Generally, when an exception is not handled, the threads stack trace is printed to the error stream and the throwing thread dies; potentially causing the application to shut down if there are no other active (or daemon) threads running.</p>
<p>If your application runs as a server, then there will likely be multiple threads (created by the IO libraries) which are used to respond to the incoming requests. This makes it hard to implement a consistent strategy that can handle all uncaught exceptions in a uniform way.</p>
<p>The following program illustrates how to register a default policy for handling uncaught exceptions:</p>
<pre class="brush: php">
public class TestMain {
  public static void main(String[] args) {
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
      @Override
      public void uncaughtException(Thread t, Throwable e) {
        if (e instanceof InvocationTargetException) {
          e = e.getCause();
        }
        //handle all uncaught exceptions here
        System.out.println(&quot;Got exception with message: &quot; + e.getMessage());
      }
    });
    throw new RuntimeException(&quot;Gonna die!&quot;);
  }
}
</pre>
<p>Setting the default exception handler (line 3) will alter the default behavior for handling uncaught exceptions in the JVM. The implementation of the uncaughtException method (lines 6-10) will now determine what should be done. In this case just the message from the exception will be printed to standard out. A more real-world application of this might be to send a warning message to an operations team, or to take some other remedial action.</p>
<p>The caveat to this approach is that the default exception handler will only be used in cases where neither the offending Thread, or the ThreadGroup that it belongs to, have had their uncaught exception handlers set. If your application manages its own threads, then this will likely not be a problem for you. If your application runs in an application server, then you might well find that the application server has set these handlers already.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smartkey.co.uk/2012/03/providing-a-default-exceptoin-strategy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Identifying which processes are using network ports on a Mac</title>
		<link>http://blog.smartkey.co.uk/2012/02/identifying-which-processes-are-using-network-ports-on-a-mac/</link>
		<comments>http://blog.smartkey.co.uk/2012/02/identifying-which-processes-are-using-network-ports-on-a-mac/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 11:16:54 +0000</pubDate>
		<dc:creator>Steve Neal</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[OS X]]></category>

		<guid isPermaLink="false">http://blog.smartkey.co.uk/?p=968</guid>
		<description><![CDATA[Typically I&#8217;d use netstat&#8217;s -o flag to identify the process ID when listing networking activity from a Linux/Unix machine. Unfortunately this option is not available with netstat on  Mac OS X.
I recently has a rogue process (I suspected a virus) on my Mac that was creating thousands of connections out to hosting providers. Luckily I [...]]]></description>
			<content:encoded><![CDATA[<p>Typically I&#8217;d use netstat&#8217;s -o flag to identify the process ID when listing networking activity from a Linux/Unix machine. Unfortunately this option is not available with netstat on  Mac OS X.</p>
<p>I recently has a rogue process (I suspected a virus) on my Mac that was creating thousands of connections out to hosting providers. Luckily I found this fix, which uses lsof to list the network files that are being held open instead. It works a treat:</p>
<pre>~$ lsof -i -P</pre>
<p>The -i flag restricts output to the networking files, the -P flag prevents well known port numbers from being converted from numbers to text (e.g. 80 -&gt; http). Try it without the -P flag to see the protocol short names.</p>
<p>Using this command, I identified which process was creating the unwanted connections and to dealt with it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smartkey.co.uk/2012/02/identifying-which-processes-are-using-network-ports-on-a-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding the application name to links in a Web application</title>
		<link>http://blog.smartkey.co.uk/2011/12/adding-the-application-name-to-links-in-a-web-application/</link>
		<comments>http://blog.smartkey.co.uk/2011/12/adding-the-application-name-to-links-in-a-web-application/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 15:03:46 +0000</pubDate>
		<dc:creator>Steve Neal</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.smartkey.co.uk/?p=958</guid>
		<description><![CDATA[Application servers can run a number of applications. A single Tomcat instance, for example, will create a separate web application for each WAR file it finds in its webapps directory. 
The applications will be named the same as their WAR files and can be accessed using URLs that start with that name. For example, to [...]]]></description>
			<content:encoded><![CDATA[<p>Application servers can run a number of applications. A single Tomcat instance, for example, will create a separate web application for each WAR file it finds in its webapps directory. </p>
<p>The applications will be named the same as their WAR files and can be accessed using URLs that start with that name. For example, to access index.jsp in the root directory of a WAR file called <code><strong>myapp.war</strong></code> running on Tomcat on the localhost you will need the following URL:</p>
<p><code>http://localhost:8080/<strong>myapp</strong>/index.jsp</code></p>
<p>When there are multiple applications running in the same Tomcat server, they must all have different names. </p>
<p>Any absolute URLs that you need to include in your application must include the applictions name at the start. For example, if in index.jsp we want to reference an image in &#8216;/images/banner.png&#8217; the absolute URL will be: &#8216;/myapp/images/banner.png&#8217;.</p>
<p>It is bad practice to hard code the application&#8217;s name in the URL as this may change for different deployments of the application. Instead, it may be added dynamically using the following scriptlet:</p>
<pre class="brush: php">
${pageContext.request.contextPath}
</pre>
<p>So, to add an img tag that refers to the banner image use:</p>
<pre class="brush: php">
&lt;img src=&quot;${pageContext.request.contextPath}/images/banner.png&quot;/&gt;
</pre>
<p>Alternatively, there are a number of custom tag libraries that will automatically do this for you. Spring MVC ships with such a tag:</p>
<pre class="brush: php">
&lt;spring:url value=&#039;/images/banner.png&#039;&gt;
</pre>
<p>this will achieve the same results as the scriptlet shown above but is simpler to remember when adding a number of links in your JSPs.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smartkey.co.uk/2011/12/adding-the-application-name-to-links-in-a-web-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Identifying number of account logins on Sybase</title>
		<link>http://blog.smartkey.co.uk/2011/11/identifying-number-of-account-logins-on-sybase/</link>
		<comments>http://blog.smartkey.co.uk/2011/11/identifying-number-of-account-logins-on-sybase/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 09:17:57 +0000</pubDate>
		<dc:creator>Steve Neal</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[sybase]]></category>

		<guid isPermaLink="false">http://blog.smartkey.co.uk/?p=955</guid>
		<description><![CDATA[If you quickly need to see how many logins there are for each account in sybase, you can use this query:

select dbname=db_name(dbid),login=suser_name(suid), #connections=count(suid)
from master..sysprocesses
--where  suser_name(suid) like &#039;%dblogin%&#039;
group by dbid, suid
order by count(suid)

]]></description>
			<content:encoded><![CDATA[<p>If you quickly need to see how many logins there are for each account in sybase, you can use this query:</p>
<pre class="brush: php">
select dbname=db_name(dbid),login=suser_name(suid), #connections=count(suid)
from master..sysprocesses
--where  suser_name(suid) like &#039;%dblogin%&#039;
group by dbid, suid
order by count(suid)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.smartkey.co.uk/2011/11/identifying-number-of-account-logins-on-sybase/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quick formatting of Date using a Java String format expression</title>
		<link>http://blog.smartkey.co.uk/2011/10/quick-formatting-of-date-using-a-java-string-format-expression/</link>
		<comments>http://blog.smartkey.co.uk/2011/10/quick-formatting-of-date-using-a-java-string-format-expression/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 12:00:59 +0000</pubDate>
		<dc:creator>Steve Neal</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java Date Format]]></category>

		<guid isPermaLink="false">http://blog.smartkey.co.uk/?p=950</guid>
		<description><![CDATA[For quick reference, this is how you can format a date as:
dd/mm/yyyy at hh:mm:ss
System.out.printf(&#34;Date: %1$te/%1$tm/%1$tY at %1$tH:%1$tM:%1$tS%n&#34;, new Date());
The % characters mark a placeholders for String content, the 1$ indicates that the first vararg should be used for each placeholder (there is only one varag value supplied), the letter &#8216;t&#8217; in each placeholder indicates a [...]]]></description>
			<content:encoded><![CDATA[<p>For quick reference, this is how you can format a date as:</p>
<p>dd/mm/yyyy at hh:mm:ss</p>
<pre class="brush: php">System.out.printf(&quot;Date: %1$te/%1$tm/%1$tY at %1$tH:%1$tM:%1$tS%n&quot;, new Date());</pre>
<p>The % characters mark a placeholders for String content, the 1$ indicates that the first vararg should be used for each placeholder (there is only one varag value supplied), the letter &#8216;t&#8217; in each placeholder indicates a time conversion and the e, m, Y, H, M, S characters indicate what value should be taken from the new Date object for that time conversion.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smartkey.co.uk/2011/10/quick-formatting-of-date-using-a-java-string-format-expression/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Searching for files in an Ant script</title>
		<link>http://blog.smartkey.co.uk/2011/09/searching-for-files-in-an-ant-script/</link>
		<comments>http://blog.smartkey.co.uk/2011/09/searching-for-files-in-an-ant-script/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 11:17:19 +0000</pubDate>
		<dc:creator>Steve Neal</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Tool support]]></category>
		<category><![CDATA[Ant]]></category>
		<category><![CDATA[Ivy]]></category>

		<guid isPermaLink="false">http://blog.smartkey.co.uk/?p=934</guid>
		<description><![CDATA[This is a simple technique for determining whether or not files matching a given pattern exist within your project. Unlike the available task, this does not require that you need to know the exact name of the file when creating the build file. It is therefore very useful for checking existence of generated/downloaded artefacts.
I&#8217;ll demonstrate [...]]]></description>
			<content:encoded><![CDATA[<p>This is a simple technique for determining whether or not files matching a given pattern exist within your project. Unlike the <code>available</code> task, this does not require that you need to know the exact name of the file when creating the build file. It is therefore very useful for checking existence of generated/downloaded artefacts.</p>
<p>I&#8217;ll demonstrate the technique with an Ant target that I wrote to check whether Ivy had downloaded any jars that had the pattern SNAPSHOT in their name:</p>
<pre class="brush: php">
&lt;target name=&quot;ivy-count-snapshot-jars&quot; depends=&quot;init&quot; if=&quot;ivy.present&quot;&gt;
    &lt;resourcecount property=&quot;ivy.snapshot.count&quot;&gt;
        &lt;fileset dir=&quot;${ivylib.dir}&quot; includes=&quot;**/*SNAPSHOT*.jar&quot;/&gt;
    &lt;/resourcecount&gt;
    &lt;condition property=&quot;ivy.snapshot.present&quot;&gt;
        &lt;not&gt;
            &lt;equals arg1=&quot;${ivy.snapshot.count}&quot; arg2=&quot;0&quot;/&gt;
        &lt;/not&gt;
    &lt;/condition&gt;
&lt;/target&gt;

&lt;target name=&quot;ivy-check-snapshot-jars&quot;
        depends=&quot;ivy-count-snapshot-jars&quot;
        if=&quot;ivy.snapshot.present&quot;&gt;
     &lt;echo&gt;WARNING: Project uses ${ivy.snapshot.count} SNAPSHOT jar(s).&lt;/echo&gt;
&lt;/target&gt;
</pre>
<p>The first target does most of the work and is used to count the number of jar files with &#8216;SNAPSHOT&#8217; in their name; it also sets a property if the count is not zero.</p>
<p>The second target is the main one that should be used to perform the check. It depends on the first target (ensuring that the count is done first) and will only then run if the first target sets the &#8216;ivy.snapshot.present&#8217; property. Thus the warning message will only get echoed if there are snapshot jars in the project.    </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smartkey.co.uk/2011/09/searching-for-files-in-an-ant-script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding a thread timeout to methods in Java</title>
		<link>http://blog.smartkey.co.uk/2011/09/adding-a-thread-timeout-to-methods-in-java/</link>
		<comments>http://blog.smartkey.co.uk/2011/09/adding-a-thread-timeout-to-methods-in-java/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 13:19:55 +0000</pubDate>
		<dc:creator>Steve Neal</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java Programming]]></category>
		<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[Concurrent]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Thread]]></category>

		<guid isPermaLink="false">http://blog.smartkey.co.uk/?p=924</guid>
		<description><![CDATA[When calling a method that could potentially take longer that you&#8217;d like to complete, it is possible to write code that will back out after a given time period. 
This can happen in numerous circumstances where you&#8217;d like an application to maintain a degree of liveness. I&#8217;ve used it recently in an application that needed [...]]]></description>
			<content:encoded><![CDATA[<p>When calling a method that could potentially take longer that you&#8217;d like to complete, it is possible to write code that will back out after a given time period. </p>
<p>This can happen in numerous circumstances where you&#8217;d like an application to maintain a degree of liveness. I&#8217;ve used it recently in an application that needed to run a number of external scripts; if the script does not complete, for whatever reason, the timeout ensures the the calling thread does not get blocked and the remaining scripts can be launched.</p>
<p>Here&#8217;s the basic idea:</p>
<pre class="brush: php">
public class TimeoutDemo {

    //maintains a thread for executing the doWork method
    private ExecutorService executor = Executors.newFixedThreadPool(1);

    public void doWork() {
        //perform some long running task here...
    }

    public void doWorkWithTimeout(int timeoutSecs) {

        //set the executor thread working
        final Future&lt;?&gt; future = executor.submit(new Runnable() {
            public void run() {
                try {
                    doWork();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        });

        //check the outcome of the executor thread and limit the time allowed for it to complete
        try {
            future.get(timeoutSecs, TimeUnit.SECONDS);
        } catch (Exception e) {
            //ExecutionException: deliverer threw exception
            //TimeoutException: didn&#039;t complete within downloadTimeoutSecs
            //InterruptedException: the executor thread was interrupted

            //interrupts the worker thread if necessary
            future.cancel(true);

            log.warn(&quot;encountered problem while doing some work&quot;, e);
        }
    }
}
</pre>
<p>The doWork method is the one that will actually do some potentially long running work. The doWorkWithTimeout illustrates how the java.util.concurrent classes can be used to prevent the method from taking too long to complete. When calling the latter method, just specify the timeout period in minutes.</p>
<p>The trick here is that the actual work will be done by a dedicated worker thread. The calling thread will handle the timeout management and also handle any exceptions thrown by the worker.</p>
<p>Variations of this pattern can be used for methods that accept parameters (just make them final) and for ones that return values too (just return the value from the future.get(&#8230;) call).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smartkey.co.uk/2011/09/adding-a-thread-timeout-to-methods-in-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Count the processors on a Linux server</title>
		<link>http://blog.smartkey.co.uk/2011/06/count-the-processors-on-a-linux-server/</link>
		<comments>http://blog.smartkey.co.uk/2011/06/count-the-processors-on-a-linux-server/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 14:46:16 +0000</pubDate>
		<dc:creator>Steve Neal</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Unix]]></category>

		<guid isPermaLink="false">http://blog.smartkey.co.uk/?p=918</guid>
		<description><![CDATA[If you need to see how many processors there are available on a Linu/Unix server, use the following command from your shell:
cat /proc/cpuinfo &#124; grep processor
each of the processors will be listed in the output. For example, on a server I use the output looks like this:

processor       : 0
processor [...]]]></description>
			<content:encoded><![CDATA[<p>If you need to see how many processors there are available on a Linu/Unix server, use the following command from your shell:</p>
<p><code>cat /proc/cpuinfo | grep processor</code></p>
<p>each of the processors will be listed in the output. For example, on a server I use the output looks like this:</p>
<p><code><br />
processor       : 0<br />
processor       : 1<br />
processor       : 2<br />
processor       : 3<br />
processor       : 4<br />
processor       : 5<br />
processor       : 6<br />
processor       : 7<br />
</code></p>
<p>So, on this server we can see there are 8 processors available.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smartkey.co.uk/2011/06/count-the-processors-on-a-linux-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deleting all files over a certain age on a Linux server</title>
		<link>http://blog.smartkey.co.uk/2011/05/deleting-files-over-a-certain-age-on-a-linux-server/</link>
		<comments>http://blog.smartkey.co.uk/2011/05/deleting-files-over-a-certain-age-on-a-linux-server/#comments</comments>
		<pubDate>Wed, 04 May 2011 15:38:58 +0000</pubDate>
		<dc:creator>Steve Neal</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Other]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.smartkey.co.uk/?p=913</guid>
		<description><![CDATA[To delete files on a Linux server that are all over 3 days old, use this:

find /log/ -type f -mtime -3 -exec rm {} \;

This command will find all files in /log over 3 days old and will run the rm command for each of them.
]]></description>
			<content:encoded><![CDATA[<p>To delete files on a Linux server that are all over 3 days old, use this:<br />
<code><br />
find /log/ -type f -mtime -3 -exec rm {} \;<br />
</code><br />
This command will find all files in /log over 3 days old and will run the rm command for each of them.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smartkey.co.uk/2011/05/deleting-files-over-a-certain-age-on-a-linux-server/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>What info can you get from an HttpServletRequest?</title>
		<link>http://blog.smartkey.co.uk/2011/02/httpservletrequestmethods/</link>
		<comments>http://blog.smartkey.co.uk/2011/02/httpservletrequestmethods/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 13:17:44 +0000</pubDate>
		<dc:creator>Steve Neal</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java Programming]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[servlet]]></category>

		<guid isPermaLink="false">http://blog.smartkey.co.uk/?p=883</guid>
		<description><![CDATA[There are many methods on an HttpServletRequest, and if you&#8217;re anything like me, you&#8217;ll forget exactly what each of them returns. Rather than a long winded investigation into them all, here&#8217;s a sample URL:

https://localhost:8443/test/welcome?a=1&#038;b=2

The &#8216;/test&#8217; in the URL will map to a servlet called test. The servlet will dispatch the request to a JSP for [...]]]></description>
			<content:encoded><![CDATA[<p>There are many methods on an HttpServletRequest, and if you&#8217;re anything like me, you&#8217;ll forget exactly what each of them returns. Rather than a long winded investigation into them all, here&#8217;s a sample URL:<br />
<code><br />
https://localhost:8443/test/welcome?a=1&#038;b=2<br />
</code></p>
<p>The &#8216;/test&#8217; in the URL will map to a servlet called test. The servlet will dispatch the request to a JSP for rendering that has the following scriplet code in it:</p>
<pre class="brush: php">
RequestURL: &lt;%= request.getRequestURL() %&gt; &lt;br&gt;
RequestURI: &lt;%= request.getRequestURI() %&gt; &lt;br&gt;
QueryString: &lt;%= request.getQueryString() %&gt; &lt;br&gt;
ServletPath: &lt;%= request.getServletPath() %&gt; &lt;br&gt;
PathInfo: &lt;%= request.getPathInfo() %&gt; &lt;br&gt;
PathTranslated: &lt;%= request.getPathTranslated() %&gt;&lt;br&gt;
AuthType: &lt;%= request.getAuthType() %&gt; &lt;br&gt;
LocalAddress: &lt;%= request.getLocalAddr() %&gt; &lt;br&gt;
Method: &lt;%= request.getMethod() %&gt; &lt;br&gt;
RemoteUser: &lt;%= request.getRemoteUser() %&gt; &lt;br&gt;
</pre>
<p>this is the output generated:</p>
<pre class="brush: php">
RequestURL: https://localhost:8443/test/welcome
RequestURI: /test/welcome
QueryString: a=1&amp;b=2
ServletPath: /test
PathInfo: /welcome
PathTranslated: C:\projects\testproj\out\artifacts\testapp_war_exploded\welcome
AuthType: CLIENT_CERT
LocalAddress: 127.0.0.1
Method: GET
RemoteUser: Steve
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.smartkey.co.uk/2011/02/httpservletrequestmethods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

