ServletConfig类的使用
ServletConfig类就是Servlet配置信息封装的类, 我们可以通过这个类来获取Servlet的配置信息
-
可以获取Servlet程序的别名Servlet-name的值
- getServletName();
- 就是获取web.xml文件中的Servlet标签的子标签Servlet-name中的值
- 这个别名, 也就是Servlet-name其实就是tomcat将要创建的Servlet对象的引用名, 也就是Servlet对象名
- getServletName();
-
获取初始化参数init-param
- getInitParameter(String name)
- 传输param-name标签中的值, 就可以获取到param-value标签中的值, 就是通过键获取到值
- getInitParameter(String name)
-
什么是初始化参数?
- 获取ServletContext对象
- getServletContext()
- 此时我们是使用ServletConfig接口的实现类对象来获取的ServletContext对象, 我们又知道ServletConfig对象是通过request对象获得的, 我们的request接口中也提供了直接获取ServletContext对象的方法, 方法名也是getServletContext()方法
- 但是注意: request接口中提供的getServletContext()方法底层执行的时候也是先调用getServletConfig()方法获取到ServletConfig接口实现类对象之后使用ServletConfig接口实现类对象调用getServletContext()方法获取的ServletContext接口实现类对象
注意: 一个Servlet类对应了一个ServletConfig对象, 因为我们每个Servlet类都要来临配置, 也就是每一个Servlet类都有一个Servlet的配置对象, 也就是一个Servlet对应着一个ServletConfig对象
补充:
GenericServlet抽象类中做了很多的空实现, 并持有一个ServletConfig类的引用, 在GenericServlet类中有一个getServletConfig()方法, 这个方法就会将我们的GenericServlet抽象类中的ServletConfig类的引用返回
-
所以如果我们是继承HttpServlet抽象类的方式创建的Servlet类, 那么我们HttpServlet抽象类中其实是没有重写GenericServlet抽象类中继承下来的getServletConfig()方法的, 所以其实我们如果是继承HttpServlet的方式创建的Servlet类中调用getServletConfig()方法的时候其实是调用的GenericServlet抽象类中声明的getServletConfig()方法
-
但是正是因为这种调用方式就会引发新的问题:
-
因为我们的GenericServlet抽象类中虽然维护了一个ServletConfig类型的引用, 但是由于我们的不同的Servlet对象的ServletConfig配置信息也不同, 所以我们的ServletConfig其实是在GenericServlet类的init()方法中实现的ServletConfig类型的引用的赋值操作, 所以前提就是我们一定要先执行了GenericServlet类中的init()方法
-
GenericServlet类中的init()方法声明如下:
@Override public void init(ServletConfig config)throws ServletException{ this.config = config; this.init(); }
- GenericServlet类中不仅仅继承了无参的init()方法, 并且重载了一个init(ServletConfig config)方法, 在有参的init方法中完成了对config引用的赋值操作, 并且调用了父类的初始化操作
-
如果我们是继承了HttpServlet的方式创建的Servlet类, 那么我们这个时候如果要重写从GenericServlet抽象类中继承的init()方法的时候我们就一定要显示的使用super语句调用父类GenericServlet抽象类中声明的init()方法, 执行了对ServletConfig引用的赋值之后我们才可以使用getServletConfig()方法去获取到ServletConfig()对象
-
-
-
-
Servlet接口中只声明了五个抽象方法, 并没有做出实现, 但是我们的Servlet接口中直接提供了一个抽象的getServletCoifig()方法, 调用这个方法的时候我们就会直接调用到我们实现类中的getServletConfig()方法, 因为我们如果实现Servlet接口的方式的时候就肯定是要重写其中所有的抽象方法的