001 /* 002 * Copyright 2004 The Apache Software Foundation 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package javax.servlet; 017 018 import java.io.IOException; 019 import java.util.Enumeration; 020 021 /** 022 * 023 * Defines a generic, protocol-independent 024 * servlet. To write an HTTP servlet for use on the 025 * Web, extend {@link javax.servlet.http.HttpServlet} instead. 026 * 027 * <p><code>GenericServlet</code> implements the <code>Servlet</code> 028 * and <code>ServletConfig</code> interfaces. <code>GenericServlet</code> 029 * may be directly extended by a servlet, although it's more common to extend 030 * a protocol-specific subclass such as <code>HttpServlet</code>. 031 * 032 * <p><code>GenericServlet</code> makes writing servlets 033 * easier. It provides simple versions of the lifecycle methods 034 * <code>init</code> and <code>destroy</code> and of the methods 035 * in the <code>ServletConfig</code> interface. <code>GenericServlet</code> 036 * also implements the <code>log</code> method, declared in the 037 * <code>ServletContext</code> interface. 038 * 039 * <p>To write a generic servlet, you need only 040 * override the abstract <code>service</code> method. 041 * 042 * 043 * @author Various 044 * @version $Version$ 045 * 046 * 047 * 048 */ 049 050 051 public abstract class GenericServlet 052 implements Servlet, ServletConfig, java.io.Serializable 053 { 054 055 private transient ServletConfig config; 056 057 058 /** 059 * 060 * Does nothing. All of the servlet initialization 061 * is done by one of the <code>init</code> methods. 062 * 063 */ 064 065 public GenericServlet() { } 066 067 068 069 /** 070 * Called by the servlet container to indicate to a servlet that the 071 * servlet is being taken out of service. See {@link Servlet#destroy}. 072 * 073 * 074 */ 075 076 public void destroy() { 077 } 078 079 080 081 /** 082 * Returns a <code>String</code> containing the value of the named 083 * initialization parameter, or <code>null</code> if the parameter does 084 * not exist. See {@link ServletConfig#getInitParameter}. 085 * 086 * <p>This method is supplied for convenience. It gets the 087 * value of the named parameter from the servlet's 088 * <code>ServletConfig</code> object. 089 * 090 * @param name a <code>String</code> specifying the name 091 * of the initialization parameter 092 * 093 * @return String a <code>String</code> containing the value 094 * of the initialization parameter 095 * 096 */ 097 098 public String getInitParameter(String name) { 099 return getServletConfig().getInitParameter(name); 100 } 101 102 103 104 /** 105 * Returns the names of the servlet's initialization parameters 106 * as an <code>Enumeration</code> of <code>String</code> objects, 107 * or an empty <code>Enumeration</code> if the servlet has no 108 * initialization parameters. See {@link 109 * ServletConfig#getInitParameterNames}. 110 * 111 * <p>This method is supplied for convenience. It gets the 112 * parameter names from the servlet's <code>ServletConfig</code> object. 113 * 114 * 115 * @return Enumeration an enumeration of <code>String</code> 116 * objects containing the names of 117 * the servlet's initialization parameters 118 * 119 */ 120 121 public Enumeration getInitParameterNames() { 122 return getServletConfig().getInitParameterNames(); 123 } 124 125 126 127 128 129 /** 130 * Returns this servlet's {@link ServletConfig} object. 131 * 132 * @return ServletConfig the <code>ServletConfig</code> object 133 * that initialized this servlet 134 * 135 */ 136 137 public ServletConfig getServletConfig() { 138 return config; 139 } 140 141 142 143 144 /** 145 * Returns a reference to the {@link ServletContext} in which this servlet 146 * is running. See {@link ServletConfig#getServletContext}. 147 * 148 * <p>This method is supplied for convenience. It gets the 149 * context from the servlet's <code>ServletConfig</code> object. 150 * 151 * 152 * @return ServletContext the <code>ServletContext</code> object 153 * passed to this servlet by the <code>init</code> 154 * method 155 * 156 */ 157 158 public ServletContext getServletContext() { 159 return getServletConfig().getServletContext(); 160 } 161 162 163 164 165 166 /** 167 * Returns information about the servlet, such as 168 * author, version, and copyright. 169 * By default, this method returns an empty string. Override this method 170 * to have it return a meaningful value. See {@link 171 * Servlet#getServletInfo}. 172 * 173 * 174 * @return String information about this servlet, by default an 175 * empty string 176 * 177 */ 178 179 public String getServletInfo() { 180 return ""; 181 } 182 183 184 185 186 /** 187 * 188 * Called by the servlet container to indicate to a servlet that the 189 * servlet is being placed into service. See {@link Servlet#init}. 190 * 191 * <p>This implementation stores the {@link ServletConfig} 192 * object it receives from the servlet container for later use. 193 * When overriding this form of the method, call 194 * <code>super.init(config)</code>. 195 * 196 * @param config the <code>ServletConfig</code> object 197 * that contains configutation 198 * information for this servlet 199 * 200 * @exception ServletException if an exception occurs that 201 * interrupts the servlet's normal 202 * operation 203 * 204 * 205 * @see UnavailableException 206 * 207 */ 208 209 public void init(ServletConfig config) throws ServletException { 210 this.config = config; 211 this.init(); 212 } 213 214 215 216 217 218 /** 219 * 220 * A convenience method which can be overridden so that there's no need 221 * to call <code>super.init(config)</code>. 222 * 223 * <p>Instead of overriding {@link #init(ServletConfig)}, simply override 224 * this method and it will be called by 225 * <code>GenericServlet.init(ServletConfig config)</code>. 226 * The <code>ServletConfig</code> object can still be retrieved via {@link 227 * #getServletConfig}. 228 * 229 * @exception ServletException if an exception occurs that 230 * interrupts the servlet's 231 * normal operation 232 * 233 */ 234 235 public void init() throws ServletException { 236 237 } 238 239 240 241 242 /** 243 * 244 * Writes the specified message to a servlet log file, prepended by the 245 * servlet's name. See {@link ServletContext#log(String)}. 246 * 247 * @param msg a <code>String</code> specifying 248 * the message to be written to the log file 249 * 250 */ 251 252 public void log(String msg) { 253 getServletContext().log(getServletName() + ": "+ msg); 254 } 255 256 257 258 259 /** 260 * Writes an explanatory message and a stack trace 261 * for a given <code>Throwable</code> exception 262 * to the servlet log file, prepended by the servlet's name. 263 * See {@link ServletContext#log(String, Throwable)}. 264 * 265 * 266 * @param message a <code>String</code> that describes 267 * the error or exception 268 * 269 * @param t the <code>java.lang.Throwable</code> error 270 * or exception 271 * 272 * 273 */ 274 275 public void log(String message, Throwable t) { 276 getServletContext().log(getServletName() + ": " + message, t); 277 } 278 279 280 281 /** 282 * Called by the servlet container to allow the servlet to respond to 283 * a request. See {@link Servlet#service}. 284 * 285 * <p>This method is declared abstract so subclasses, such as 286 * <code>HttpServlet</code>, must override it. 287 * 288 * 289 * 290 * @param req the <code>ServletRequest</code> object 291 * that contains the client's request 292 * 293 * @param res the <code>ServletResponse</code> object 294 * that will contain the servlet's response 295 * 296 * @exception ServletException if an exception occurs that 297 * interferes with the servlet's 298 * normal operation occurred 299 * 300 * @exception IOException if an input or output 301 * exception occurs 302 * 303 */ 304 305 public abstract void service(ServletRequest req, ServletResponse res) 306 throws ServletException, IOException; 307 308 309 310 /** 311 * Returns the name of this servlet instance. 312 * See {@link ServletConfig#getServletName}. 313 * 314 * @return the name of this servlet instance 315 * 316 * 317 * 318 */ 319 320 public String getServletName() { 321 return config.getServletName(); 322 } 323 }