View Javadoc

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