View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package com.acme;
20  import java.io.IOException;
21  import java.io.OutputStream;
22  import java.io.PrintWriter;
23  
24  import javax.servlet.RequestDispatcher;
25  import javax.servlet.ServletContext;
26  import javax.servlet.ServletException;
27  import javax.servlet.ServletOutputStream;
28  import javax.servlet.http.HttpServlet;
29  import javax.servlet.http.HttpServletRequest;
30  import javax.servlet.http.HttpServletRequestWrapper;
31  import javax.servlet.http.HttpServletResponse;
32  import javax.servlet.http.HttpServletResponseWrapper;
33  
34  import org.eclipse.jetty.util.log.Log;
35  import org.eclipse.jetty.util.log.Logger;
36  
37  
38  /* ------------------------------------------------------------ */
39  /** Test Servlet RequestDispatcher.
40   * 
41   * 
42   */
43  public class DispatchServlet extends HttpServlet
44  {
45      private static final Logger LOG = Log.getLogger(DispatchServlet.class);
46  
47      /* ------------------------------------------------------------ */
48      String pageType;
49  
50      /* ------------------------------------------------------------ */
51      @Override
52      public void doPost(HttpServletRequest sreq, HttpServletResponse sres) throws ServletException, IOException
53      {
54          doGet(sreq, sres);
55      }
56  
57      /* ------------------------------------------------------------ */
58      @Override
59      public void doGet(HttpServletRequest sreq, HttpServletResponse sres) throws ServletException, IOException
60      {
61          if (sreq.getParameter("wrap") != null)
62          {
63              sreq= new HttpServletRequestWrapper(sreq);
64              sres= new HttpServletResponseWrapper(sres);
65          }
66          
67          if (sreq.getParameter("session") != null)
68              sreq.getSession(true);
69  
70          String prefix=
71              sreq.getContextPath() != null ? sreq.getContextPath() + sreq.getServletPath() : sreq.getServletPath();
72              
73          String info;
74          
75          if (sreq.getAttribute("javax.servlet.include.servlet_path") != null)
76              info= (String)sreq.getAttribute("javax.servlet.include.path_info");
77          else
78              info= sreq.getPathInfo();
79          
80          if (info == null)
81              info= "NULL";
82  
83          if (info.indexOf(sreq.getServletPath()) > 0)
84          {
85              sres.sendError(403,"Nested " + sreq.getServletPath() + " forbidden.");
86              return;
87          }
88          
89          if(info.indexOf(getServletName()) > 0)
90          {
91              sres.sendError(403,"Nested " + getServletName() + " forbidden.");
92              return;
93          }
94  
95          if (info.startsWith("/includeW/"))
96          {
97              sres.setContentType("text/html");
98              info= info.substring(9);
99              if (info.indexOf('?') < 0)
100                 info += "?Dispatch=include";
101             else
102                 info += "&Dispatch=include";
103             
104             PrintWriter pout= null;
105             pout= sres.getWriter();
106             pout.write("<H1>Include (writer): " + info + "</H1><HR>");
107             
108             RequestDispatcher dispatch= getServletContext().getRequestDispatcher(info);
109             if (dispatch == null)
110             {
111                 pout= sres.getWriter();
112                 pout.write("<H1>Null dispatcher</H1>");
113             }
114             else
115                 dispatch.include(sreq, sres);
116             
117             pout.write("<HR><H1>-- Included (writer)</H1>");
118         }
119         else if (info.startsWith("/includeS/"))
120         {
121             sres.setContentType("text/html");
122             info= info.substring(9);
123             if (info.indexOf('?') < 0)
124                 info += "?Dispatch=include";
125             else
126                 info += "&Dispatch=include";
127             
128             OutputStream out= null;
129             out= sres.getOutputStream();
130             out.write(("<H1>Include (outputstream): " + info + "</H1><HR>").getBytes());
131             
132             RequestDispatcher dispatch= getServletContext().getRequestDispatcher(info);
133             if (dispatch == null)
134             {
135                 out= sres.getOutputStream();
136                 out.write("<H1>Null dispatcher</H1>".getBytes());
137             }
138             else
139                 dispatch.include(sreq, sres);
140             
141             out.write("<HR><H1>-- Included (outputstream)</H1>".getBytes());
142             
143         }
144         else if (info.startsWith("/forward/"))
145         {
146             info= info.substring(8);
147             if (info.indexOf('?') < 0)
148                 info += "?Dispatch=forward";
149             else
150                 info += "&Dispatch=forward";
151             
152             RequestDispatcher dispatch= getServletContext().getRequestDispatcher(info);
153             if (dispatch != null)
154             {
155                 ServletOutputStream out =sres.getOutputStream();
156                 out.print("Can't see this");
157                 dispatch.forward(sreq, sres);
158                 try
159                 {
160                     // should be closed
161                     out.println("IOException");
162                     // should not get here
163                     throw new IllegalStateException();
164                 }
165                 catch(IOException e)
166                 {
167                     LOG.ignore(e);
168                 }
169             }
170             else
171             {
172                 sres.setContentType("text/html");
173                 PrintWriter pout= sres.getWriter();
174                 pout.write("<H1>No dispatcher for: " + info + "</H1><HR>");
175                 pout.flush();
176             }
177         }
178         else if (info.startsWith("/forwardC/"))
179         {
180             info= info.substring(9);
181             if (info.indexOf('?') < 0)
182                 info += "?Dispatch=forward";
183             else
184                 info += "&Dispatch=forward";
185             
186             String cpath= info.substring(0, info.indexOf('/', 1));
187             info= info.substring(cpath.length());
188             
189             ServletContext context= getServletContext().getContext(cpath);
190             RequestDispatcher dispatch= context.getRequestDispatcher(info);
191             
192             if (dispatch != null)
193             {
194                 dispatch.forward(sreq, sres);
195             }
196             else
197             {
198                 sres.setContentType("text/html");
199                 PrintWriter pout= sres.getWriter();
200                 pout.write("<H1>No dispatcher for: " + cpath + "/" + info + "</H1><HR>");
201                 pout.flush();
202             }
203         }
204         else if (info.startsWith("/includeN/"))
205         {
206             sres.setContentType("text/html");
207             info= info.substring(10);
208             if (info.indexOf("/") >= 0)
209                 info= info.substring(0, info.indexOf("/"));
210             
211             PrintWriter pout;
212             if (info.startsWith("/null"))
213                 info= info.substring(5);
214             else
215             {
216                 pout= sres.getWriter();
217                 pout.write("<H1>Include named: " + info + "</H1><HR>");
218             }
219             
220             RequestDispatcher dispatch= getServletContext().getNamedDispatcher(info);
221             if (dispatch != null)
222                 dispatch.include(sreq, sres);
223             else
224             {
225                 pout= sres.getWriter();
226                 pout.write("<H1>No servlet named: " + info + "</H1>");
227             }
228             
229             pout= sres.getWriter();
230             pout.write("<HR><H1>Included ");
231         }
232         else if (info.startsWith("/forwardN/"))
233         {
234             info= info.substring(10);
235             if (info.indexOf("/") >= 0)
236                 info= info.substring(0, info.indexOf("/"));
237             RequestDispatcher dispatch= getServletContext().getNamedDispatcher(info);
238             if (dispatch != null)
239                 dispatch.forward(sreq, sres);
240             else
241             {
242                 sres.setContentType("text/html");
243                 PrintWriter pout= sres.getWriter();
244                 pout.write("<H1>No servlet named: " + info + "</H1>");
245                 pout.flush();
246             }
247         }
248         else
249         {
250             sres.setContentType("text/html");
251             PrintWriter pout= sres.getWriter();
252             pout.write(
253                     "<H1>Dispatch URL must be of the form: </H1>"
254                     + "<PRE>"
255                     + prefix
256                     + "/includeW/path\n"
257                     + prefix
258                     + "/includeS/path\n"
259                     + prefix
260                     + "/forward/path\n"
261                     + prefix
262                     + "/includeN/name\n"
263                     + prefix
264                     + "/forwardC/_context/path\n</PRE>");
265         }
266         
267     }
268 
269     /* ------------------------------------------------------------ */
270     @Override
271     public String getServletInfo()
272     {
273         return "Include Servlet";
274     }
275 
276     /* ------------------------------------------------------------ */
277     @Override
278     public synchronized void destroy()
279     {
280     }
281 
282 }