1.Servlet和ServletConfig的关系,这里GenericServlet实现了ServletConfig接口,却引用了一个对应ServletConfig类型实例,这里用到了代理模式.通过init(ServletConfig config)方法初始化类引用.
1 public abstract class GenericServlet implements Servlet, ServletConfig,
2 java.io.Serializable {
3
4 private static final long serialVersionUID = 1L;
5
6 private transient ServletConfig config;
7
8 /**
9 * Does nothing. All of the servlet initialization is done by one of the
10 * <code>init</code> methods.
11 */
12 public GenericServlet() {
13 // NOOP
14 }
15
16 /**
17 * Called by the servlet container to indicate to a servlet that the servlet
18 * is being taken out of service. See {@link Servlet#destroy}.
19 */
20 @Override
21 public void destroy() {
22 // NOOP by default
23 }
24
25 /**
26 * Returns a <code>String</code> containing the value of the named
27 * initialization parameter, or <code>null</code> if the parameter does not
28 * exist. See {@link ServletConfig#getInitParameter}.
29 * <p>
30 * This method is supplied for convenience. It gets the value of the named
31 * parameter from the servlet's <code>ServletConfig</code> object.
32 *
33 * @param name
34 * a <code>String</code> specifying the name of the
35 * initialization parameter
36 * @return String a <code>String</code> containing the value of the
37 * initialization parameter
38 */
39 @Override
40 public String getInitParameter(String name) {
41 return getServletConfig().getInitParameter(name);
42 }
43
44 /**
45 * Returns the names of the servlet's initialization parameters as an
46 * <code>Enumeration</code> of <code>String</code> objects, or an empty
47 * <code>Enumeration</code> if the servlet has no initialization parameters.
48 * See {@link ServletConfig#getInitParameterNames}.
49 * <p>
50 * This method is supplied for convenience. It gets the parameter names from
51 * the servlet's <code>ServletConfig</code> object.
52 *
53 * @return Enumeration an enumeration of <code>String</code> objects
54 * containing the names of the servlet's initialization parameters
55 */
56 @Override
57 public Enumeration<String> getInitParameterNames() {
58 return getServletConfig().getInitParameterNames();
59 }
60
61 /**
62 * Returns this servlet's {@link ServletConfig} object.
63 *
64 * @return ServletConfig the <code>ServletConfig</code> object that
65 * initialized this servlet
66 */
67 @Override
68 public ServletConfig getServletConfig() {
69 return config;
70 }
71
72 /**
73 * Returns a reference to the {@link ServletContext} in which this servlet
74 * is running. See {@link ServletConfig#getServletContext}.
75 * <p>
76 * This method is supplied for convenience. It gets the context from the
77 * servlet's <code>ServletConfig</code> object.
78 *
79 * @return ServletContext the <code>ServletContext</code> object passed to
80 * this servlet by the <code>init</code> method
81 */
82 @Override
83 public ServletContext getServletContext() {
84 return getServletConfig().getServletContext();
85 }
86
87 /**
88 * Returns information about the servlet, such as author, version, and
89 * copyright. By default, this method returns an empty string. Override this
90 * method to have it return a meaningful value. See
91 * {@link Servlet#getServletInfo}.
92 *
93 * @return String information about this servlet, by default an empty string
94 */
95 @Override
96 public String getServletInfo() {
97 return "";
98 }
99
100 /**
101 * Called by the servlet container to indicate to a servlet that the servlet
102 * is being placed into service. See {@link Servlet#init}.
103 * <p>
104 * This implementation stores the {@link ServletConfig} object it receives
105 * from the servlet container for later use. When overriding this form of
106 * the method, call <code>super.init(config)</code>.
107 *
108 * @param config
109 * the <code>ServletConfig</code> object that contains
110 * configuration information for this servlet
111 * @exception ServletException
112 * if an exception occurs that interrupts the servlet's
113 * normal operation
114 * @see UnavailableException
115 */
116 @Override
117 public void init(ServletConfig config) throws ServletException {
118 this.config = config;
119 this.init();
120 }
121
122 /**
123 * A convenience method which can be overridden so that there's no need to
124 * call <code>super.init(config)</code>.
125 * <p>
126 * Instead of overriding {@link #init(ServletConfig)}, simply override this
127 * method and it will be called by
128 * <code>GenericServlet.init(ServletConfig config)</code>. The
129 * <code>ServletConfig</code> object can still be retrieved via
130 * {@link #getServletConfig}.
131 *
132 * @exception ServletException
133 * if an exception occurs that interrupts the servlet's
134 * normal operation
135 */
136 public void init() throws ServletException {
137 // NOOP by default
138 }
139
140 /**
141 * Writes the specified message to a servlet log file, prepended by the
142 * servlet's name. See {@link ServletContext#log(String)}.
143 *
144 * @param msg
145 * a <code>String</code> specifying the message to be written to
146 * the log file
147 */
148 public void log(String msg) {
149 getServletContext().log(getServletName() + ": " + msg);
150 }
151
152 /**
153 * Writes an explanatory message and a stack trace for a given
154 * <code>Throwable</code> exception to the servlet log file, prepended by
155 * the servlet's name. See {@link ServletContext#log(String, Throwable)}.
156 *
157 * @param message
158 * a <code>String</code> that describes the error or exception
159 * @param t
160 * the <code>java.lang.Throwable</code> error or exception
161 */
162 public void log(String message, Throwable t) {
163 getServletContext().log(getServletName() + ": " + message, t);
164 }
165
166 /**
167 * Called by the servlet container to allow the servlet to respond to a
168 * request. See {@link Servlet#service}.
169 * <p>
170 * This method is declared abstract so subclasses, such as
171 * <code>HttpServlet</code>, must override it.
172 *
173 * @param req
174 * the <code>ServletRequest</code> object that contains the
175 * client's request
176 * @param res
177 * the <code>ServletResponse</code> object that will contain the
178 * servlet's response
179 * @exception ServletException
180 * if an exception occurs that interferes with the servlet's
181 * normal operation occurred
182 * @exception IOException
183 * if an input or output exception occurs
184 */
185 @Override
186 public abstract void service(ServletRequest req, ServletResponse res)
187 throws ServletException, IOException;
188
189 /**
190 * Returns the name of this servlet instance. See
191 * {@link ServletConfig#getServletName}.
192 *
193 * @return the name of this servlet instance
194 */
195 @Override
196 public String getServletName() {
197 return config.getServletName();
198 }
199 }