问题1:在Servlet接口中定义的init方法是有参数的,它的参数类型是ServletConfig,而我们重写的init方法没有参数,为什么?
原因是:父类中已经将init(ServletConfig config)这个方法进行了重写,而我们在自己的servlet中就不要再重写了。我们重写的init()不是在接口中定义的,而是在父类中定义的。
细节:在GenericServlet中对Servlet接口中的init(ServletConfig config)进行了重写,并且调用了自己定义的一个init()方法。
我们在自己的servlet类中重写了init()方法,根据多态就会调用我们自己的init()方法。
/**
* Called by the servlet container to indicate to a servlet that the
* servlet is being placed into service. See {@link Servlet#init}.
*
* <p>This implementation stores the {@link ServletConfig}
* object it receives from the servlet container for later use.
* When overriding this form of the method, call
* <code>super.init(config)</code>.
*
* @param config the <code>ServletConfig</code> object
* that contains configutation
* information for this servlet
*
* @exception ServletException if an exception occurs that
* interrupts the servlet's normal
* operation
*
* @see UnavailableException
*/
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
/**
* A convenience method which can be overridden so that there's no need
* to call <code>super.init(config)</code>.
*
* <p>Instead of overriding {@link #init(ServletConfig)}, simply override
* this method and it will be called by
* <code>GenericServlet.init(ServletConfig config)</code>.
* The <code>ServletConfig</code> object can still be retrieved via {@link
* #getServletConfig}.
*
* @exception ServletException if an exception occurs that
* interrupts the servlet's
* normal operation
*/
public void init() throws ServletException {
}
问题2:ServletConfig是什么,它有什么作用?
A servlet configuration object used by a servlet container to pass information to a servlet during initialization.
在GenericServlet中将ServletConfig对象保存到了GenericServlet中。
ServletConfig对象:代表的是servlet的配置对象。servlet配置——web.xml,通过ServletConfig对象,就能得到web.xml配置的数据。
ServletConfig对象由Servlet容器Tomcat创建。
浏览器端访问服务器端,服务器端根据传输文件找路径,那么servlet对象会初始化。服务器做了很多事情,例如当去访问一个servlet时,就会实例化这个servlet对象,并且会创建一个 ServletConfig对象,将这个对象通过init方法传递到servlet中。那么我们就可以在自己的servlet中获得servlet的配置信息。
示例代码:
自己的servlet类中获取一个ServletConfig对象,通过这个对象可以获取当前的Servlet配置信息。
ServletConfig config = this.getServletConfig();
String name = config.getServletName();
问题3:ServletConfig对象介绍
- 在servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。这些初始化参数可以通过ServletConfig对象获取。
- 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数。
- ServletConfig配置参数相当于当前Servlet局部变量,无法被其它servlet访问。
ServletConfig对象
功能:
1. 可以获取servlet的name
2. 可以获取初始化参数:
我们可以再servlet的配置中通过<init-param>来进行配置,
对于这些配置,我们可以通过ServletConfig来获取。
代码:
<servlet>
<servlet-name>d2</servlet-name>
<servlet-class>com.it.servlet.Demo2Servlet</servlet-class>
<!--servlet的初始化配置参数-->
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</servlet>
ServletConfig config = this.getServletConfig();
String initParameterName = config.getInitParameter("encoding");
System.out.println(initParameterName);
init-param应用场景
如上为Struts配置。init-param相当于初始化配置信息。servlet跟随服务器启动而启动,当服务器启动时,在自己的init()方法里面可以得到ServletConfig,ServletConfig执行时就可以把init-param读到,这个是xml文件,配置文件,加载一些信息,写一些类名,通过反射的机制,让类实例化。这是让servlet完成初始化操作,加载一些预定义信息。可以通过init-param完成加载配置。
通过初始化参数,我们可以进行预定义信息的加载,这种操作一般情况是在框架中应用。
3. getInitParameterNames()方法
一个servlet有多个init-param标签。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//可以获取一个ServletConfig对象,通过这个对象可以获取当前的Servlet配置信息。
ServletConfig config = this.getServletConfig();
Enumeration<String> enums = config.getInitParameterNames();
while(enums.hasMoreElements()){
String s = enums.nextElement();
System.out.println(s);
}
}
常用API总结:
public String getServletName(); 用于获取servlet名称
public String get InitParameter(String name); 用于获取init-param中指定名称的value值
public Enumeration getInitParameterNames(); 用于获取所有的init-param中的name名称
梳理:
1. ServletConfig对象由服务器创建,通过init()方法传递到servlet中。在servlet中通过this.getServletConfig()获取ServletConfig对象。
2. ServletConfig对象是用于获取当前servlet的配置信息,包括servlet的名称,servlet的初始化参数。
重点:
每一个servlet都具有自己的ServletConfig对象。它们之间是不能共享的。类似于类的成员变量。