javax.servlet.ServletConfig接口: 1、这是一个接口,是由Apache Tomcat服务器实现的Servlet规范之一, Tomcat专门写了一个ServletConfig接口的实现类,其完整的类名为: org.apache.catalina.core.StandardWrapperFacade。 而javax.servlet.Servlet也是一个接口,而我们就是实现该接口的人员。 这里主要的重点:--明白大家都是面向接口开发,面向接口调用的思想。 理解: 面向接口开发,就是实现接口,实现里面的方法,接口中的方法是公开的,固定的; 面向接口调用,不管你是怎么写里面的代码,有什么方法我只需要知道接口的就行了, 而且我都可以用接口类型定义的引用调用,因为接口是父类,无论有多少个实现类该引用去调都编译通过, 都可以调用,但运行时调用的具体方法由该引用具体的实例化的实现类对象决定。 2、javaweb程序员编程,面向ServletConfig接口完成调用,不需要关系实现类。 不同的webapp放到不同的Web容器所实现的类的类名是不同的,这里放进的是Tomcat服务器。 3、Tomcat服务器就是一个实现了Servlet规范和JSP规范的容器 4、ServletConfig接口中由哪些方法? --String getInitParameter(String name) 该方法表示通过名字name这个key来获取初始化参数value,ServletConfig对象保存的是web.xml文件中的, 所以获取的是该文件中初始化参数标签的value位置的值,具体获取如下测试 --Enumeration getInitParameterNames() 该方法是获取所有初始化参数的name,获取key,返回的是一个集合,测试如下 --ServletContext getServletContext() 该方法是获取一个ServletContext对象(Servlet对象的上下文),具体分析下章节 --String getServletName() 该方法是获取xml文件中<servlet-name>标签中的值,一般没啥用,测试如下 5、ServletConfig的作用 从字面以上上理解,ServletConfig就是一个Servlet对象的配置信息对象, 该对象里面封装的是Servlet对象的配置信息。 而Servlet对象的配置信息是放到web.xml文件中的,我们知道该文件中有个<servlet></servlet>标签, 每一个这种标签里的信息都被封装到ServletConfig对象里面了,就像下面的测试一样, xml文件中有两个servlet标签,Tomcat生成了两个信息配置对象来封装。 servlet标签的数量对应ServletConfig对象的数量。 当我们刷新浏览器,点击不同连接,这两个信息配置对象的输出都没动,原因是init方法只执行一次。 6、业务中可能需要信息配置对象或者如果我们希望在service方法中用ServletConfig对象。 可以在类中定义一个私有的ServletConfig类型的变量config, 然后在init方法中将接收的信息配置对象传进去。 --这样Servlet接口中返回ServletConfig类型对象的公开的方法getServletConfig() 就将其返回值设置为config,该方法的作用是为了如果以后这个实现类有子类, 子类可以通过该方法获取其ServletConfig对象。
我们在实现Servlet接口的时候,其中的init方法需要传入一个ServletConfig类型的对象参数,由于该方法是Web容器启动,该对象由容器提供,由该容器实现servlet规范中的ServletConfig接口,下面我们实现把参数输出一下。
创建web项目模块b-ServletConfig,配置号相应环境,编写两个Servlet实现类AServlet和BServlet,
两个实现类中的initial方法中这样写,其他方法先不写
@Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("AServlet's ServletConfig = "+servletConfig.toString()); //AServlet's ServletConfig = org.apache.catalina.core.StandardWrapperFacade@56238272 }
@Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("BServlet's ServletConfig = "+servletConfig.toString()); //BServlet's ServletConfig = org.apache.catalina.core.StandardWrapperFacade@47eaa5bb }
写一个index.html,里面分别是请求这两个实现类对象的超链接,启动Tomcat,分别点击两个连接输出如下:
AServlet's ServletConfig = org.apache.catalina.core.StandardWrapperFacade@56238272 BServlet's ServletConfig = org.apache.catalina.core.StandardWrapperFacade@47eaa5bb
将init方法中的局部变量赋值给一个Servlet实现类的私有ServletConfig类型的成员变量,利用该变量测试ServletConfig接口中每个方法的作用,这里先在AServlet的servlet标签xml文件中添加初始化参数标签以及相应信息
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--第一个Servlet对象--> <servlet> <servlet-name>AServlet</servlet-name> <servlet-class>com.servlet.servletconfig.Aservlet</servlet-class> <!--初始化参数:被封装到ServletConfig对象中--> <init-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </init-param> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/mysqlstudy?useSSH=false</param-value> </init-param> <init-param> <param-name>user</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>???</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>AServlet</servlet-name> <url-pattern>/a</url-pattern> </servlet-mapping> <!--第二个Servlet对象--> <servlet> <servlet-name>BServlet</servlet-name> <servlet-class>com.servlet.servletconfig.Bservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>BServlet</servlet-name> <url-pattern>/b</url-pattern> </servlet-mapping> </web-app>
然后AServlet类的service方法中测试 String getInitParameter(String name)方法,service方法中代码如下
@Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //更改输出格式类型 servletResponse.setContentType("text/html;charset=UTF-8"); //更改输出位置 PrintWriter out = servletResponse.getWriter(); //获取ServletConfig对象 ServletConfig config = getServletConfig(); //通过初始化参数的name获取value String driver = config.getInitParameter("driver"); String url = config.getInitParameter("url"); String user = config.getInitParameter("user"); String password = config.getInitParameter("password"); out.print("driver="+driver); out.print("<br>"); out.print("url="+url); out.print("<br>"); out.print("user="+user); out.print("<br>"); out.print("password="+password); }
点击运行Tomcat部署项目,输入请求显示结果如下
开始测试 Enumeration getInitParameterNames()方法,代码如下
@Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //更改输出格式类型 servletResponse.setContentType("text/html;charset=UTF-8"); //更改输出位置 PrintWriter out = servletResponse.getWriter(); //获取ServletConfig对象 ServletConfig config = getServletConfig(); //通过初始化参数的name获取value // String driver = config.getInitParameter("driver"); // String url = config.getInitParameter("url"); // String user = config.getInitParameter("user"); // String password = config.getInitParameter("password"); // out.print("driver="+driver); // out.print("<br>"); // out.print("url="+url); // out.print("<br>"); // out.print("user="+user); // out.print("<br>"); // out.print("password="+password); //获取初始化参数的name Enumeration<String> names = config.getInitParameterNames(); //遍历该集合,并通过name调用获取value,虽然该集合对象的遍历方法名字不一样,但底层还是一样的 while (names.hasMoreElements()){ String name = names.nextElement(); String value = config.getInitParameter(name); out.print(name+" = "+value); out.print("<br>"); } }
结果如下,可以知道存进集合中初始化参数name的顺序是随机的
开始测试没啥卵用的String getServletName()方法,这里只贴出代码,
//获取Servlet Name String servletName = config.getServletName(); out.print("<servlet-name>"+servletName+"</servlet-name>");//AServlet //获取Servlet上下文的方法 ServletContext application = config.getServletContext(); out.print(application);//org.apache.catalina.core.ApplicationContextFacade@6b2c87d6
最后一个获取ServletContext对象的方法,代码如上。结果如下