blob: 69e110089fbb0ae377cf9690ae7726134df17181 [file] [log] [blame]
//
// ========================================================================
// Copyright (c) 1995-2017 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;
/* ------------------------------------------------------------ */
/** Test Servlet RequestDispatcher.
*
*
*/
@SuppressWarnings("serial")
public class DispatchServlet extends HttpServlet
{
/* ------------------------------------------------------------ */
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)
{
// getServletContext().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()
{
}
}