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