View Javadoc

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