Return-Path: Delivered-To: apmail-geronimo-scm-archive@www.apache.org Received: (qmail 98560 invoked from network); 12 May 2008 14:00:41 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 12 May 2008 14:00:41 -0000 Received: (qmail 83833 invoked by uid 500); 12 May 2008 14:00:43 -0000 Delivered-To: apmail-geronimo-scm-archive@geronimo.apache.org Received: (qmail 83819 invoked by uid 500); 12 May 2008 14:00:43 -0000 Mailing-List: contact scm-help@geronimo.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: dev@geronimo.apache.org List-Id: Delivered-To: mailing list scm@geronimo.apache.org Received: (qmail 83808 invoked by uid 99); 12 May 2008 14:00:43 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 12 May 2008 07:00:43 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 12 May 2008 13:59:55 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id C33462388A09; Mon, 12 May 2008 07:00:15 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r655505 - in /geronimo/samples/trunk/samples/async-http: http-local-app/src/main/java/org/apache/geronimo/ http-local-app/src/main/webapp/WEB-INF/ http-remote-app/src/main/java/org/apache/geronimo/ Date: Mon, 12 May 2008 14:00:15 -0000 To: scm@geronimo.apache.org From: jawarner@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080512140015.C33462388A09@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jawarner Date: Mon May 12 07:00:15 2008 New Revision: 655505 URL: http://svn.apache.org/viewvc?rev=655505&view=rev Log: GERONIMO-4007 : Fixes for errors when under heavy stress Modified: geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/AsyncServlet.java geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/BlockingServlet.java geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/Callback.java geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/Utils.java geronimo/samples/trunk/samples/async-http/http-local-app/src/main/webapp/WEB-INF/web.xml geronimo/samples/trunk/samples/async-http/http-remote-app/src/main/java/org/apache/geronimo/PageServlet.java Modified: geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/AsyncServlet.java URL: http://svn.apache.org/viewvc/geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/AsyncServlet.java?rev=655505&r1=655504&r2=655505&view=diff ============================================================================== --- geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/AsyncServlet.java (original) +++ geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/AsyncServlet.java Mon May 12 07:00:15 2008 @@ -17,6 +17,7 @@ package org.apache.geronimo; import java.io.IOException; +import java.io.OutputStream; import java.io.PrintWriter; import java.net.URL; import java.util.concurrent.ExecutorService; @@ -30,6 +31,7 @@ import org.apache.ahc.AsyncHttpClient; import org.apache.ahc.codec.HttpRequestMessage; +import org.apache.ahc.codec.HttpResponseMessage; import org.apache.ahc.codec.SessionCache; import org.apache.ahc.util.MonitoringEvent; import org.apache.ahc.util.TimeMonitor; @@ -65,6 +67,7 @@ threadPool = Executors.newCachedThreadPool(); sessionCache = new SessionCache(); + ahc = new AsyncHttpClient(threadPool, null); // enable connection reuse ahc.setSessionCache(sessionCache); @@ -84,84 +87,107 @@ * @throws ServletException */ public void event(CometEvent event) throws IOException, ServletException { + + HttpServletResponse eventResponse = event.getHttpServletResponse(); HttpServletRequest request = event.getHttpServletRequest(); - - String cometId = request.getSession(true).getId(); - System.out.println(""); - System.out.println("sessionId: " + cometId + " " - + event.getEventType().toString()); - + boolean debug = Boolean.parseBoolean(request.getParameter("debug")); + boolean shortCircuit = Boolean.parseBoolean(request.getParameter("shortCircuit")); + String cometId = null; + if (event.getEventType() == CometEvent.EventType.BEGIN) { - boolean dumpStats = request.getParameter("dump") != null; - if (dumpStats) { - dumpStats(event.getHttpServletResponse()); - return; - } - - event.getHttpServletRequest().setAttribute( - "org.apache.tomcat.comet.timeout", new Integer(5 * 1000)); - event.setTimeout(5 * 1000); - - // TODO this doesn't look thread safe... - if (request.getParameter("remoteUrl") != null) { - remoteUrl = request.getParameter("remoteUrl"); - } - - String remoteUri = request.getParameter("remoteUri"); - if (remoteUri == null) { - remoteUri = "/remoteApp/page"; - } - - URL url_connect = new URL(remoteUrl + remoteUri); - HttpServletResponse eventResponse = event.getHttpServletResponse(); - eventResponse.flushBuffer(); - Callback callback = new Callback(eventResponse, cometId); - HttpRequestMessage msgRequest = new HttpRequestMessage(url_connect, callback); - - // If the file being served has other URIs in it, like say images, - // subsequent calls are made to the remote app to retrieve those. - // We don't want to set new delay times and status codes then. - if (remoteUri.endsWith("page")) { - msgRequest.setParameter("sessionId", cometId); + if (!shortCircuit) { + + cometId = request.getSession(true).getId(); + if(debug) { + System.out.println(); + System.out.println("Event type: " + event.getEventType().toString() + " Session ID: " + cometId + "\n Request:" + request + " Response: " + eventResponse); + } + boolean dumpStats = request.getParameter("dump") != null; + if (dumpStats) { + dumpStats(event.getHttpServletResponse()); + return; + } - int delayInt = 0; - String delay = request.getParameter("delay"); - if (delay != null) { - delayInt = Integer.parseInt(delay); - } else { - delayInt = Utils.generateRandomDelay(); - delay = String.valueOf(delayInt); + event.getHttpServletRequest().setAttribute( + "org.apache.tomcat.comet.timeout", new Integer(15 * 1000)); + + // TODO this doesn't look thread safe... + if (request.getParameter("remoteUrl") != null) { + remoteUrl = request.getParameter("remoteUrl"); + } + + String remoteUri = request.getParameter("remoteUri"); + if (remoteUri == null) { + remoteUri = "/remoteApp/page"; } - String code = request.getParameter("code") == null ? - String.valueOf(Utils.generateRandomCode()) : - request.getParameter("code"); + URL url_connect = new URL(remoteUrl + remoteUri); + eventResponse.flushBuffer(); + Callback callback = new Callback(eventResponse, cometId, debug); + //Callback callback = new Callback(event, cometId); + HttpRequestMessage msgRequest = new HttpRequestMessage(url_connect, callback); + + // If the file being served has other URIs in it, like say images, + // subsequent calls are made to the remote app to retrieve those. + // We don't want to set new delay times and status codes then. + if (remoteUri.endsWith("page")) { + msgRequest.setParameter("sessionId", cometId); + + int delayInt = 0; + String delay = request.getParameter("delay"); + if (delay != null) { + delayInt = Integer.parseInt(delay); + } else { + delayInt = Utils.generateRandomDelay(); + delay = String.valueOf(delayInt); + } + + String code = request.getParameter("code") == null ? + String.valueOf(Utils.generateRandomCode()) : + request.getParameter("code"); + + msgRequest.setParameter("delay", delay); + msgRequest.setParameter("code", code); + msgRequest.setTimeOut(delayInt + 15000); + if (debug) { + System.out.println("sessionId: " + cometId + "; delay: " + + delay + "; code: " + code); + } + } else { + System.out.println("msg request is " + msgRequest.getPath()); + } + + msgRequest.setRequestMethod(HttpRequestMessage.REQUEST_GET); - msgRequest.setParameter("delay", delay); - msgRequest.setParameter("code", code); - msgRequest.setTimeOut(delayInt + 1000); - - System.out.println("sessionId: " + cometId + "; delay: " - + delay + "; code: " + code); - } else { - System.out.println("msg request is " + msgRequest.getPath()); + try { + callback.setTime(System.nanoTime()); + ahc.sendRequest(msgRequest); + //System.out.println("sessionId: " + cometId + " with request " + msgRequest + " sent"); + } catch (Exception e) { + e.printStackTrace(); + // send an error response using the callback + callback.onException(e); + event.close(); + } + } else { + synchronized(eventResponse) { + event.close(); + } } - - msgRequest.setRequestMethod(HttpRequestMessage.REQUEST_GET); - - try { - callback.setTime(System.nanoTime()); - ahc.sendRequest(msgRequest); - } catch (Exception e) { - e.printStackTrace(); - // send an error response using the callback - callback.onException(e); + } else if (event.getEventType() == CometEvent.EventType.ERROR) { + if (debug) { + System.out.println("Event type: " + event.getEventType().toString() + " Session ID: " + cometId + "\n Request:" + request + " Response: " + eventResponse); + } + synchronized(eventResponse) { event.close(); } - } else if (event.getEventType() == CometEvent.EventType.ERROR) { - event.close(); } else if (event.getEventType() == CometEvent.EventType.END) { - event.close(); + if (debug) { + System.out.println("Event type: " + event.getEventType().toString() + " Session ID: " + cometId + "\n Request:" + request + " Response: " + eventResponse); + } + synchronized(eventResponse) { + event.close(); + } } } @@ -179,5 +205,5 @@ out.println("response time: " + monitor.getAverageResponseTime()); out.println("connect time: " + monitor.getAverageConnectTime()); out.close(); - } + } } Modified: geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/BlockingServlet.java URL: http://svn.apache.org/viewvc/geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/BlockingServlet.java?rev=655505&r1=655504&r2=655505&view=diff ============================================================================== --- geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/BlockingServlet.java (original) +++ geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/BlockingServlet.java Mon May 12 07:00:15 2008 @@ -19,6 +19,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.PrintWriter; import java.net.URL; @@ -56,52 +57,62 @@ */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - - System.out.println(""); - System.out.println("Inside BlockingServlet.doGet()"); - - String sessionId = request.getSession(true).getId(); - - if (request.getParameter("remoteUrl") != null) { - remoteUrl = request.getParameter("remoteUrl"); + + boolean debug = Boolean.parseBoolean(request.getParameter("debug")); + boolean shortCircuit = Boolean.parseBoolean(request.getParameter("shortCircuit")); + if (debug) { + System.out.println(""); + System.out.println("Inside BlockingServlet.doGet()"); } - - String remoteUri = request.getParameter("remoteUri"); - if (remoteUri == null) { - remoteUri = "/remoteApp/page"; - } - - String delay = request.getParameter("delay") == null ? - String.valueOf(Utils.generateRandomDelay()) : - request.getParameter("delay"); - String code = request.getParameter("code") == null ? - String.valueOf(Utils.generateRandomCode()) : - request.getParameter("code"); - System.out.println("sessionId: " + sessionId + "; delay: " + delay + "; code: " + code); + String sessionId = request.getSession(true).getId(); - String url_string = remoteUrl + remoteUri + "?sessionId=" + sessionId + "&delay=" + delay + "&code=" + code; - URL url_connect = new URL(url_string); - - try { - BufferedReader input = new BufferedReader(new InputStreamReader(url_connect.openStream())); - String line = ""; - response.setContentType("text/html"); - PrintWriter out = response.getWriter(); - while ((line = input.readLine()) != null) { - out.println(line); + + if (!shortCircuit) { + if (request.getParameter("remoteUrl") != null) { + remoteUrl = request.getParameter("remoteUrl"); } - out.flush(); - out.close(); - input.close(); - } - catch(IOException ex) { - response.sendError(Integer.parseInt(code)); + + String remoteUri = request.getParameter("remoteUri"); + if (remoteUri == null) { + remoteUri = "/remoteApp/page"; + } + + String delay = request.getParameter("delay") == null ? + String.valueOf(Utils.generateRandomDelay()) : + request.getParameter("delay"); + + String code = request.getParameter("code") == null ? + String.valueOf(Utils.generateRandomCode()) : + request.getParameter("code"); + if (debug) { + System.out.println("sessionId:" + sessionId + "; delay:" + delay + "; code:" + code); + } + + String url_string = remoteUrl + remoteUri + "?sessionId=" + sessionId + "&delay=" + delay + "&code=" + code; + URL url_connect = new URL(url_string); + + try { + BufferedReader input = new BufferedReader(new InputStreamReader(url_connect.openStream())); + String line = ""; + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + while ((line = input.readLine()) != null) { + out.println(line); + } + out.flush(); + out.close(); + input.close(); + } + catch(IOException ex) { + response.sendError(Integer.parseInt(code)); + } + } else { + return; } - - System.out.println("doGet processed"); + if (debug) { + System.out.println("doGet processed"); + } } - - -} +} \ No newline at end of file Modified: geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/Callback.java URL: http://svn.apache.org/viewvc/geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/Callback.java?rev=655505&r1=655504&r2=655505&view=diff ============================================================================== --- geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/Callback.java (original) +++ geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/Callback.java Mon May 12 07:00:15 2008 @@ -18,7 +18,6 @@ import java.io.IOException; import java.io.OutputStream; -import java.io.PrintWriter; import java.util.Date; import java.util.concurrent.atomic.AtomicBoolean; @@ -30,6 +29,7 @@ public class Callback implements AsyncHttpClientCallback { private final HttpServletResponse response; private final String sessionId; + private final boolean debug; private final AtomicBoolean handled = new AtomicBoolean(false); @@ -39,9 +39,10 @@ // in nanoseconds private volatile long time; - public Callback(HttpServletResponse response, String sessionId) { + public Callback(HttpServletResponse response, String sessionId, boolean debug) { this.response = response; this.sessionId = sessionId; + this.debug = debug; clear(); } @@ -56,33 +57,38 @@ /* (non-Javadoc) * @see org.apache.ahc.AsyncHttpClientCallback#onResponse(org.apache.ahc.codec.HttpResponseMessage) */ - public void onResponse(HttpResponseMessage msg) { - System.out.println(" onResponse()" + " - Status:" + msg.getStatusCode() + " - Length:" + msg.getContentLength() + " " + sessionId); - + public synchronized void onResponse(HttpResponseMessage msg) { + if (debug) { + System.out.println(" onResponse()" + " - Status:" + msg.getStatusCode() + " - Length:" + msg.getContentLength() + " " + sessionId); + } if (!handled.compareAndSet(false, true)) { System.out.println("already responded to another callback method " + sessionId); return; } - response.setStatus(msg.getStatusCode()); - response.setContentType(msg.getContentType()); - if (msg.getContentLength() > 0) { - response.setContentLength(msg.getContentLength()); - OutputStream out = null; - try { - out = response.getOutputStream(); - out.write(msg.getContent()); - out.flush(); - out.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + synchronized(response) { + response.setStatus(msg.getStatusCode()); + response.setContentType(msg.getContentType()); + if (msg.getContentLength() > 0) { + response.setContentLength(msg.getContentLength()); + OutputStream out = null; + try { + out = response.getOutputStream(); + out.write(msg.getContent()); + out.flush(); + out.close(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } } - System.out.println(" Responded to " + sessionId + " in " + (System.nanoTime() - this.time)/1000000); + if (debug) { + System.out.println(" Responded to " + sessionId + " in " + (System.nanoTime() - this.time)/1000000); + } } - public void onException(Throwable cause) { + public synchronized void onException(Throwable cause) { throwable = cause; System.out.println(" Exception by " + sessionId + " in " + (System.nanoTime() - this.time)/1000000); cause.printStackTrace(); @@ -94,7 +100,7 @@ sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "exception occurred"); } - public void onClosed() { + public synchronized void onClosed() { // if the response has not been received, this is an error: need to write a response if (!handled.get()) { sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Connection to the remote URL unexpectedly closed"); @@ -102,7 +108,7 @@ } } - public void onTimeout() { + public synchronized void onTimeout() { System.out.println(" Timed out " + sessionId + " in " + (System.nanoTime() - this.time)/1000000); if (!handled.compareAndSet(false, true)) { System.out.println("already responded to another callback method " + sessionId); @@ -112,15 +118,22 @@ sendError(HttpServletResponse.SC_REQUEST_TIMEOUT, "Request Timed out!\n" + new Date().toString()); } - private void sendError(int status, String msg) { - try { - response.setContentType("text/plain"); - response.setStatus(status); - PrintWriter out = response.getWriter(); - out.println(msg); - out.close(); - } catch (IOException e) { - e.printStackTrace(); + private synchronized void sendError(int status, String msg) { + synchronized(response) { + try { + if (response.isCommitted()) { + System.out.println("already responded to another callback method " + sessionId); + return; + } + response.setContentType("text/plain"); + response.setStatus(status); + OutputStream out = response.getOutputStream(); + out.write(msg.getBytes()); + out.flush(); + out.close(); + } catch (Exception e) { + e.printStackTrace(); + } } } Modified: geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/Utils.java URL: http://svn.apache.org/viewvc/geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/Utils.java?rev=655505&r1=655504&r2=655505&view=diff ============================================================================== --- geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/Utils.java (original) +++ geronimo/samples/trunk/samples/async-http/http-local-app/src/main/java/org/apache/geronimo/Utils.java Mon May 12 07:00:15 2008 @@ -1,5 +1,5 @@ /** - * Licensed to the Apache Software Foundation (ASF) under one or more + * 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 Modified: geronimo/samples/trunk/samples/async-http/http-local-app/src/main/webapp/WEB-INF/web.xml URL: http://svn.apache.org/viewvc/geronimo/samples/trunk/samples/async-http/http-local-app/src/main/webapp/WEB-INF/web.xml?rev=655505&r1=655504&r2=655505&view=diff ============================================================================== --- geronimo/samples/trunk/samples/async-http/http-local-app/src/main/webapp/WEB-INF/web.xml (original) +++ geronimo/samples/trunk/samples/async-http/http-local-app/src/main/webapp/WEB-INF/web.xml Mon May 12 07:00:15 2008 @@ -1,55 +1,55 @@ - ServerApp - - - - AsyncServlet - AsyncServlet - org.apache.geronimo.AsyncServlet + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" + version="2.4"> + ServerApp + + + + AsyncServlet + AsyncServlet + org.apache.geronimo.AsyncServlet - remoteUrl - http://festivus:8080 - - - - - AsyncServlet - /async - + remoteUrl + http://festivus:8080 + + + + + AsyncServlet + /async + - BlockingServlet - BlockingServlet - org.apache.geronimo.BlockingServlet + BlockingServlet + BlockingServlet + org.apache.geronimo.BlockingServlet - remoteUrl - http://festivus:8080 - - - - - BlockingServlet - /sync - + remoteUrl + http://festivus:8080 + + + + + BlockingServlet + /sync + - NIOServlet - NIOServlet - org.apache.geronimo.NIOServlet + NIOServlet + NIOServlet + org.apache.geronimo.NIOServlet - remoteUrl - festivus - - - - - NIOServlet - /nio - + remoteUrl + festivus + + + + + NIOServlet + /nio + Modified: geronimo/samples/trunk/samples/async-http/http-remote-app/src/main/java/org/apache/geronimo/PageServlet.java URL: http://svn.apache.org/viewvc/geronimo/samples/trunk/samples/async-http/http-remote-app/src/main/java/org/apache/geronimo/PageServlet.java?rev=655505&r1=655504&r2=655505&view=diff ============================================================================== --- geronimo/samples/trunk/samples/async-http/http-remote-app/src/main/java/org/apache/geronimo/PageServlet.java (original) +++ geronimo/samples/trunk/samples/async-http/http-remote-app/src/main/java/org/apache/geronimo/PageServlet.java Mon May 12 07:00:15 2008 @@ -16,53 +16,54 @@ * */ public class PageServlet extends HttpServlet { - static final long serialVersionUID = 1L; + static final long serialVersionUID = 1L; - /* (non-Javadoc) - * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) - */ - protected void doGet(HttpServletRequest request, - HttpServletResponse response) throws ServletException, IOException { - - String cometId = request.getParameter("sessionId"); - String delay = request.getParameter("delay"); - String codeStr = request.getParameter("code"); - System.out.println("sessionId:" + cometId + "; delay:" + delay + "; code:" + codeStr); - - try { - Thread.sleep(Integer.parseInt(delay)); - } catch (NumberFormatException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - - String uri = "dummy.html"; - - int code = Integer.parseInt(codeStr); - switch (code) { - case 200: request.getRequestDispatcher(uri).forward(request, response); break; - - case 302: + /* (non-Javadoc) + * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + protected void doGet(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + + String cometId = request.getParameter("sessionId"); + String delay = request.getParameter("delay"); + String codeStr = request.getParameter("code"); + //Uncomment the following line to help with debugging + //System.out.println("sessionId:" + cometId + "; delay:" + delay + "; code:" + codeStr); + + try { + Thread.sleep(Integer.parseInt(delay)); + } catch (NumberFormatException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + String uri = "dummy.html"; + + int code = Integer.parseInt(codeStr); + switch (code) { + case 200: request.getRequestDispatcher(uri).forward(request, response); break; + + case 302: response.sendRedirect("http://" + request.getServerName() + ":" + request.getLocalPort() + request.getContextPath() + "/" + uri); - break; - - case 403: - case 404: - case 500: response.sendError(code, codeStr); - /*try { - int test = 1/0; - } - catch (Exception e) { - throw new ServletException("Servlet caught a ServletException: " + e.getMessage()); - }*/ - break; - } - - return; - } + break; + + case 403: + case 404: + case 500: response.sendError(code, codeStr); + /*try { + int test = 1/0; + } + catch (Exception e) { + throw new ServletException("Servlet caught a ServletException: " + e.getMessage()); + }*/ + break; + } + + return; + } } \ No newline at end of file