// ======================================================================== // Copyright (c) 1996-2009 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // You may elect to redistribute this code under either of these licenses. // ======================================================================== package com.acme; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; /* ------------------------------------------------------------ */ /** Test Servlet RequestDispatcher. * * */ public class DispatchServlet extends HttpServlet { private static final Logger LOG = Log.getLogger(DispatchServlet.class); /* ------------------------------------------------------------ */ String pageType; /* ------------------------------------------------------------ */ @Override public void doPost(HttpServletRequest sreq, HttpServletResponse sres) throws ServletException, IOException { doGet(sreq, sres); } /* ------------------------------------------------------------ */ @Override public void doGet(HttpServletRequest sreq, HttpServletResponse sres) throws ServletException, IOException { if (sreq.getParameter("wrap") != null) { sreq= new HttpServletRequestWrapper(sreq); sres= new HttpServletResponseWrapper(sres); } if (sreq.getParameter("session") != null) sreq.getSession(true); String prefix= sreq.getContextPath() != null ? sreq.getContextPath() + sreq.getServletPath() : sreq.getServletPath(); String info; if (sreq.getAttribute("javax.servlet.include.servlet_path") != null) info= (String)sreq.getAttribute("javax.servlet.include.path_info"); else info= sreq.getPathInfo(); if (info == null) info= "NULL"; if (info.indexOf(sreq.getServletPath()) > 0) { sres.sendError(403,"Nested " + sreq.getServletPath() + " forbidden."); return; } if(info.indexOf(getServletName()) > 0) { sres.sendError(403,"Nested " + getServletName() + " forbidden."); return; } if (info.startsWith("/includeW/")) { sres.setContentType("text/html"); info= info.substring(9); if (info.indexOf('?') < 0) info += "?Dispatch=include"; else info += "&Dispatch=include"; PrintWriter pout= null; pout= sres.getWriter(); pout.write("<H1>Include (writer): " + info + "</H1><HR>"); RequestDispatcher dispatch= getServletContext().getRequestDispatcher(info); if (dispatch == null) { pout= sres.getWriter(); pout.write("<H1>Null dispatcher</H1>"); } else dispatch.include(sreq, sres); pout.write("<HR><H1>-- Included (writer)</H1>"); } else if (info.startsWith("/includeS/")) { sres.setContentType("text/html"); info= info.substring(9); if (info.indexOf('?') < 0) info += "?Dispatch=include"; else info += "&Dispatch=include"; OutputStream out= null; out= sres.getOutputStream(); out.write(("<H1>Include (outputstream): " + info + "</H1><HR>").getBytes()); RequestDispatcher dispatch= getServletContext().getRequestDispatcher(info); if (dispatch == null) { out= sres.getOutputStream(); out.write("<H1>Null dispatcher</H1>".getBytes()); } else dispatch.include(sreq, sres); out.write("<HR><H1>-- Included (outputstream)</H1>".getBytes()); } else if (info.startsWith("/forward/")) { info= info.substring(8); if (info.indexOf('?') < 0) info += "?Dispatch=forward"; else info += "&Dispatch=forward"; RequestDispatcher dispatch= getServletContext().getRequestDispatcher(info); if (dispatch != null) { ServletOutputStream out =sres.getOutputStream(); out.print("Can't see this"); dispatch.forward(sreq, sres); try { // should be closed out.println("IOException"); // should not get here throw new IllegalStateException(); } catch(IOException e) { LOG.ignore(e); } } else { sres.setContentType("text/html"); PrintWriter pout= sres.getWriter(); pout.write("<H1>No dispatcher for: " + info + "</H1><HR>"); pout.flush(); } } else if (info.startsWith("/forwardC/")) { info= info.substring(9); if (info.indexOf('?') < 0) info += "?Dispatch=forward"; else info += "&Dispatch=forward"; String cpath= info.substring(0, info.indexOf('/', 1)); info= info.substring(cpath.length()); ServletContext context= getServletContext().getContext(cpath); RequestDispatcher dispatch= context.getRequestDispatcher(info); if (dispatch != null) { dispatch.forward(sreq, sres); } else { sres.setContentType("text/html"); PrintWriter pout= sres.getWriter(); pout.write("<H1>No dispatcher for: " + cpath + "/" + info + "</H1><HR>"); pout.flush(); } } else if (info.startsWith("/includeN/")) { sres.setContentType("text/html"); info= info.substring(10); if (info.indexOf("/") >= 0) info= info.substring(0, info.indexOf("/")); PrintWriter pout; if (info.startsWith("/null")) info= info.substring(5); else { pout= sres.getWriter(); pout.write("<H1>Include named: " + info + "</H1><HR>"); } RequestDispatcher dispatch= getServletContext().getNamedDispatcher(info); if (dispatch != null) dispatch.include(sreq, sres); else { pout= sres.getWriter(); pout.write("<H1>No servlet named: " + info + "</H1>"); } pout= sres.getWriter(); pout.write("<HR><H1>Included "); } else if (info.startsWith("/forwardN/")) { info= info.substring(10); if (info.indexOf("/") >= 0) info= info.substring(0, info.indexOf("/")); RequestDispatcher dispatch= getServletContext().getNamedDispatcher(info); if (dispatch != null) dispatch.forward(sreq, sres); else { sres.setContentType("text/html"); PrintWriter pout= sres.getWriter(); pout.write("<H1>No servlet named: " + info + "</H1>"); pout.flush(); } } else { sres.setContentType("text/html"); PrintWriter pout= sres.getWriter(); pout.write( "<H1>Dispatch URL must be of the form: </H1>" + "<PRE>" + prefix + "/includeW/path\n" + prefix + "/includeS/path\n" + prefix + "/forward/path\n" + prefix + "/includeN/name\n" + prefix + "/forwardC/_context/path\n</PRE>"); } } /* ------------------------------------------------------------ */ @Override public String getServletInfo() { return "Include Servlet"; } /* ------------------------------------------------------------ */ @Override public synchronized void destroy() { } }