美文网首页
Servlet、ServletConfig、ServletCon

Servlet、ServletConfig、ServletCon

作者: pilipalaboompow | 来源:发表于2016-05-15 19:58 被阅读0次
    每一个Servlet都必须由web容器读取了该Servlet的配置信息(web部署描述符中或@WebServlet中配置的信息)并初始化,才算是一个Servlet。
    对于每个Servlet的配置信息,web容器都会为其生成一个ServletConfig对象,你可以从ServletConfig对象中取得Servlet的初始参数以及代表整个web应用程序的ServletContext对象
    

    GenericServlet

    在Servlet接口中,定义了init()、service()、destroy()管理Servlet生命周期的方法
    
    1. web容器启动后,会读取Servlet配置信息,将Servlet加载并实例化,为每一个Servlet生成一个对应的ServletConfig对象,用于维护对应Servlet的初始化参数
    2. 调用init()方法,将ServletConfig对象传入,这一步由GenericServlet帮我们实现了,GenericServlet主要的作用就是封装ServletConfig对象,GenericServlet中init()方法如下:
    
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }
    
    public void init() throws ServletException {
    }
    
    3. GenericServlet在实现顶层接口Servlet的init()方法,还调用了一个无参的init()方法;在编写Servlet时候,如果有一些在初始化需要额外运行的动作,可以重新定义这个无参数的init()方法,而不是直接重新定义带参数的init()方法
    4. 有一点需要注意,一般对象想在初始化的时候就定义额外运行的动作,会在构造器中进行,而在Servlet却不行,因为Servlet在初始化的时候还没有调用init()方法,所以定义Servlet构造器是获取不到ServletConfig对象,只能重新定义init()方法
    5. GenericServlet中也有一些操作ServletConfig对象的方法,如下:
    
    public String getInitParameter(String name) {
        return this.getServletConfig().getInitParameter(name);
    }
    
    public Enumeration<String> getInitParameterNames() {
        return this.getServletConfig().getInitParameterNames();
    }
    
    public ServletConfig getServletConfig() {
        return this.config;
    }
    
    public String getServletName() {
        return this.config.getServletName();
    }
    
    public ServletContext getServletContext() {
        return this.getServletConfig().getServletContext();
    }
    
    6. GenericServlet还定义一些log方法,用于打印日志,一般很少用这些方法,因为功能简单
    

    使用ServletConfig

    /**
     * 每个Servlet对象都会有对应的ServletConfig对象,
     * 该对象维护了每个Servlet的初始化参数信息和表示整个web容器环境的ServletContext
     */
    @WebServlet(name = "ServletConfigServlet",
            urlPatterns = "/useServletConfig",
            initParams = {
                    @WebInitParam(name = "key", value = "每个Servlet的初始参数"),
                    @WebInitParam(name = "say", value = "我是一个没什么卵用的初始化参数")
            })
    public class ServletConfigServlet extends HttpServlet {
    
        /**
         * 自定义init()初始化方法,用于操作ServletConfig对象
         */
        public void init() throws ServletException {
            // 在Servlet实例化后调用初始化方法,维护ServletConfig信息,此时需要注意的就是引用需要定义成全局变量
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 1、获取ServletConfig对象
            ServletConfig config = getServletConfig();
    
            // 2、获取自身Servlet的初始化参数
            Enumeration<String> initParams = config.getInitParameterNames();
    
            // 3、获取具体的初始化参数,值:我是一个没什么卵用的初始化参数
            String initValue = config.getInitParameter("say");
    
            // 4、获取当前Servlet的名称,值:ServletConfigServlet
            String servletName = config.getServletName();
    
            // 5、获取表示整个web容器的ServletContext
            ServletContext context = config.getServletContext();
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        }
    }
    
    可以在Servlet初始化的时候就获取初始化参数,不过需要自定义init()方法,也可以直接获取ServletConfig对象,GenericServlet已经帮我们初始化了ServletConfig对象;自定义init()比较麻烦但十分灵活
    初始化参数也可以在web部署描述符中定义,如下:
    
    <servlet>
        <servlet-name>ServletConfigServlet</servlet-name>
        <servlet-class>ServletConfigServlet</servlet-class>
        <init-param>
            <param-name>key</param-name>
            <param-value>每个Servlet的初始参数</param-value>
        </init-param>
        <init-param>
            <param-name>say</param-name>
            <param-value>我是一个没什么卵用的初始化参数</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletConfigServlet</servlet-name>
        <url-pattern>/useServletConfig</url-pattern>
    </servlet-mapping>
    

    使用ServletContext

    ServletContext维护了web容器环境的数据,web容器每次启动只会实例化一个ServletContext对象,ServletConfig提供了获取ServletContext示例的接口方法,由GenericServlet实现了。
    
    /**
     * ServletContext中的一些方法
     */
    @WebServlet(name = "ServletContextServlet", urlPatterns = "/context")
    public class ServletContextServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            // 1、获取ServletContext实例
            ServletContext context = getServletContext();
    
            // 2、获取RequestDispatcher示例,此时的URL的开头必须包含ContextPath,
            // 如果没有设置ContextPath就是“/”,此时的ContextPath为“/web”
            // 以“/”开头的URL称为环境相对路径,context.getRequestDispatcher()通过环境实例获取
            // 没有则称为请求相对路径,request.getRequestDispatcher()通过请求实例获取
            context.getRequestDispatcher("/web/xxx");
    
            // 3、获取应用程序中某个目录中的资源文件,可以使用getResourcePaths()
            // 此时获取WEB-INF目录中所有资源路径的路径
            Set<String> ress = context.getResourcePaths("/WEB-INF");
            ress.forEach(System.out::println);
    
            // 4、如果想在应用程序中读取某个文件的内容,则可以使用getResourceAsStream()方法,
            // 使用时必须以ContextPath开头,或者相对/WEB-INF目录的路径
            InputStream in = context.getResourceAsStream("/WEB-INF/pdf/dsaj.pdf");
    
        }
    }
    

    相关文章

      网友评论

          本文标题:Servlet、ServletConfig、ServletCon

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