1
2
3
4
5
6
7
8
9
10
11
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
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 }