美文网首页JavaWeb
JavaWeb-004-ServletConfig详解

JavaWeb-004-ServletConfig详解

作者: 53b3f4658edc | 来源:发表于2017-10-14 13:07 被阅读84次

概述

  • Servlet在有些情况下可能需要访问Servlet容器或借助Servlet容器访问外部的资源,所以,Serlvet引擎需要将表示Servlet容器的对象传递给Servlet。另外,在web.xml文件中为某个Servlet设置的友好名称和初始化参数等信息也需要传递给该Servlet
  • Servlet引擎将代表Servlet容器的对象(ServletContext)和Servlet的配置参数信息一并封装到一个称为ServletConfig的对象中,并在初始化Servlet实例对象时传递给该Servlet。ServletConfig接口则用于定义ServletConfig对象需要对外提供的方法,以便在Servlet程序中可以调用这些方法来获取有关信息。
  • Servlet引擎调用Servlet的实例对象的init(ServletConfig config)方法将ServletConfig对象传递给Servlet。Servlet.getServletConfig()方法必须返回init(ServletConfig config)方法传递进来的这个ServletConfig对象的引用。
  • ServletConfig接口的方法
    • getInitParameterNames
    • getInitParameter
    • getServletName
    • getServletContext

测试代码

package com.mac;

import java.io.IOException;

/*
 * ServletConfig对象:
 *  1.封装了Servlet的配置信息
 *  2.可以获得ServletContext
 *  3.方法:
 *          3.1.public String getInitParameter(String name):获取指定参数名的参数值(init-param节点下面)
 *          3.2.public java.util.Enumeration<E> getInitParameterNames():获取参数名组成的Enumeration对象
 *          3.3.public ServletContext getServletContext()
 *          3.4.public String getServletName():获取Servlet的配置名称
 */
public class HelloServlet implements Servlet{

    @Override
    public void destroy() {
        System.out.println("销毁Servlet对象~~~~");
    }

    @Override
    public ServletConfig getServletConfig() {
            System.out.println("获取Servlet配置~~~~");
        return null;
    }

    @Override
    public String getServletInfo() {
        System.out.println("获取Servlet信息~~~~");
        return null;
    }

    /*
     * public void  init(ServletConfig config) throws ServletException:
     *  由 servlet 容器调用,指示将该 servlet 放入服务。
     *  servlet 容器仅在实例化 servlet 之后调用 init 方法一次。在 servlet 可以接收任何请求之前,init 方法必须成功完成。
     *  servlet 容器无法将 servlet 放入服务,如果 init 方法:
     *          抛出 ServletException
     *          未在 Web 服务器定义的时间段内返回
     *  参数
     *      config      包含 servlet 的配置和初始化参数的 ServletConfig 对象
     * Throws   ServletException: 
     * 如果发生妨碍 servlet 正常操作的异常
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        /*
         * ServletConfig:
         *  servlet 容器使用的 servlet 配置对象,该对象在初始化期间将信息传递给 servlet。
         */
        
        /*
         * public String    getInitParameter(String name)
         * 返回包含指定初始化参数的值的 String,如果参数不存在,则返回 null。
         * name     指定初始化参数名称的 String
         * return   包含初始化参数值的 String
         */
        //1.获取web.xml中,指定参数名的参数值(init-param节点下面)
        String user = config.getInitParameter("user");      
        String password = config.getInitParameter("password");
        System.out.println("user: " + user);    
        System.out.println("password: " + password);
        System.out.println("-------------------------------------");
        
        /*
         * public java.util.Enumeration<E>  getInitParameterNames()
         * 以 String 对象的 Enumeration 的形式返回 servlet 的初始化参数的名称,如果 servlet 没有初
         * 始化参数,则返回一个空的 Enumeration。
         * return   包含 servlet 初始化参数名称的 String 对象的 Enumeration
         */
        //2.获取所有的param-name
        Enumeration<String> initParameterNames = config.getInitParameterNames();
        while( initParameterNames.hasMoreElements() ) {
            System.out.println("names: " + initParameterNames.nextElement());
        }
        System.out.println("-------------------------------------");
        
        /*
         * public String    getServletName()
         * 返回此 servlet 实例的名称。该名称可能是通过服务器管理提供的,在 Web 应用程序部署描述符中分配,或者对于未注册(和未命名)
         *  的 servlet 实例,该名称将是该 servlet 的类名称。
         * return   servlet 实例的名称
         */
        //3.获取Servlet的名称
        String servletName = config.getServletName();
        System.out.println("servletName: " + servletName);      //结果是web.xml中的servlet-name值
    }

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        System.out.println("Servlet服务~~~~");
    }
    
    public HelloServlet() {
        System.out.println("构造器~~~~");
    }

}
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" metadata-complete="true" version="3.0">
  <servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.mac.HelloServlet</servlet-class>
    <init-param>
      <param-name>user</param-name>
      <param-value>root</param-value>
    </init-param>
    <init-param>
      <param-name>password</param-name>
      <param-value>123456</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

运行结果

信息: Starting Servlet Engine: Apache Tomcat/7.0.81
构造器~~~~
user: root
password: 123456
-------------------------------------
names: password
names: user
-------------------------------------
servletName: helloServlet
十月 14, 2017 12:25:11 下午 org.apache.catalina.startup.TldConfig execute
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
构造器~~~~
Servlet初始化~~~~参数: org.apache.catalina.core.StandardWrapperFacade@70c3c787
十月 14, 2017 12:25:11 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-bio-8080"]
十月 14, 2017 12:25:11 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-bio-8009"]
十月 14, 2017 12:25:11 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 862 ms
Servlet服务~~~~

完整源码下载

完整源码下载:点击这里

欢迎加入交流群:451826376

更多信息:www.itcourse.top

完整教程PDF版本下载

相关文章

网友评论

    本文标题:JavaWeb-004-ServletConfig详解

    本文链接:https://www.haomeiwen.com/subject/tppxuxtx.html