zoukankan      html  css  js  c++  java
  • Servlet 学习(七)

     ServletConfig

    1、定义

    • ServletConfig接口:servlet容器在初始化期间将信息传递给servlet的servlet配置对象
    • 代表当前Servlet在web.xml中的配置信息,用于描述一个Servlet 的配置信息

    2、常用方法

    • 获得当前Servlet 实例的名称

        String getServletName()

    • 获得当前Servlet 实例的初始化参数

        String getInitParameter(String name)根据name 获取指定的初始化参数的值,如果name 对应的初始化参数不存在,返回null
        Enumeration getInitParameterNames()返回当前Servlet 实例的所有的初始化参数的名称,注意返回类型是java.util.Enumeration

    • 获得当前Servlet 实例所依赖的应用

        ServletContext getServletContext()

    3、优点

    • 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
    • 如果将数据库信息、编码方式等配置信息放在web.xml中,如果以后数据库的用户名、密码改变了,则直接很方便地修改web.xml就行了,避免了直接修改源代码的麻烦。

    4、配置Servlet 的初始化参数

    • 在servlet 标签中使用init-param 子标签配置

        其中<param-name> 子标签用于设置初始化参数的名称
        <param-value> 子标签用于设置指定参数的值

    • 同一个servlet 中可以使用多个init-param 标签配置多个初始化参数

        使用config.getInitParameter( name ) 可以获取指定名称的参数对应的值
        使用config.getInitParameterNames() 可以获取所有的参数的名称

    测试案例:

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
        id="WebApp_ID" version="3.1">
    
        <!-- 注册 -->
        <servlet>
            <servlet-name>ConfigurationServlet</servlet-name>
            <servlet-class>ecut.lifecycle.ConfigurationServlet</servlet-class>
            <!-- 指定初始化参数 -->
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            <init-param>
                <param-name>content-type</param-name>
                <param-value>text/html</param-value>
            </init-param>
        </servlet>
    
        <!-- 映射(发布) -->
        <servlet-mapping>
            <servlet-name>ConfigurationServlet</servlet-name>
            <url-pattern>/config</url-pattern>
        </servlet-mapping>
        
    </web-app>
    复制代码
    复制代码
    package ecut.lifecycle;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Enumeration;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class ConfigurationServlet implements Servlet {
        
        @Override
        public String getServletInfo() {
            return this.config.getServletName() ;
        }
        
        @Override
        public ServletConfig getServletConfig() {
            return this.config ;
        }
        
        private ServletConfig config ;
        
        @Override
        public void init( ServletConfig config ) throws ServletException {
            this.config = config ;
            System.out.println( "初始化" );
            System.out.println( config ); 
            System.out.println( "ServletName : " + config.getServletName() );//web.xm配置文件中的servlet名称
            /*
            String encoding = config.getInitParameter( "encoding" );
            System.out.println( "encoding : " + encoding );
            */
            Enumeration<String> initParamNames = config.getInitParameterNames();
            while( initParamNames.hasMoreElements() ){
                String name = initParamNames.nextElement() ;
                String value = config.getInitParameter( name );
                System.out.println( name + " : " + value );
            } 
        }
    
        @Override
        public void service( ServletRequest req , ServletResponse resp ) throws ServletException, IOException {
            System.out.println( "对外提供服务" );
            
            String ct = config.getInitParameter( "content-type" ) ;
            String en = config.getInitParameter( "encoding" ) ;
            String contentType = ct + ";charset=" + en  ; //  "text/html;charset=UTF-8"
            resp.setContentType( contentType );
            PrintWriter w = resp.getWriter();
            w.println( "<h1 style='text-align:center;color:blue;'>欢迎 !</h1>" );
        } 
        
        @Override
        public void destroy() {
            System.out.println( "销毁" );
        }
    
    }
    复制代码

    运行结果如下:

    初始化
    org.apache.catalina.core.StandardWrapperFacade@4c12c6a
    ServletName : ConfigurationServlet
    content-type : text/html
    encoding : UTF-8
    对外提供服务

    ServletContext

    1、定义

    • Servlet容器的上下文环境对象,其类型是javax.servlet.ServletContext
    • Servlet 容器启动时会加载每个web 应用,并为每个web 应用创建一个惟一的ServletContext 对象
    • 可以理解成是一个web 应用的服务器端组件的共享内存,服务器端的所有组件都可以从该对象中获取或设置数据
    • 使用该对象可以实现跨Session 的数据共享
    • ServletContext对象通常也被称之为context域对象。
    • 域对象:在一个可以被看见的范围内共享数据用到对象
    • 作用范围:整个web应用范围内共享数据
    • 生命周期:当服务器启动web应用加载后创建出ServletContext对象后,域产生。当web应用被移除出容器或服务器关闭,随着web应用的销毁域销毁。

    2、常用方法

    • 用于操纵数据的方法包括:

        Object getAttribute(String name)
        Enumeration getAttributeNames()
        void removeAttribute(String name)
        void setAttribute(String name, Object object)

    • 获得当前的ServletContext 对象

        GenericServlet.getServletContext() (HttpServlet继承了GenericServlet)
        HttpSession.getServletContext()
        ServletConfig.getServletContext()

    • 获得指定uripath 对应的ServletContext 对象

        ServletContext getContext(String uripath)

    • 与路径有关的

        String getContextPath()
        String getRealPath(String path)

    • 获得RequestDispatcher 对象

        RequestDispatcher getNamedDispatcher(String name)
        RequestDispatcher getRequestDispatcher(String path)

    • 获得Servlet 的相关信息

        String getServerInfo()
        String getServletContextName()

    • 获得输入流

        InputStream getResourceAsStream(String path)Class 类的getResourceAsStream 需要用到类加载器,而该方法不需要

    3、被ServletContext 管理的数据

    • 可以被整个web 应用所使用
    • 可以实现跨会话的数据共享
    • 对应JSP 中的application 内置对象

    4、配置ServletContext

    • 配置ServletContext 初始化参数

        在web-app 标签中使用<context-param> 子标签来设置
          <param-name> 指定初始化参数的名称
          <param-value> 指定初始化参数的值
          可以使用设置多个初始化参数

    • 获得初始化参数

        String getInitParameter(String name)
        Enumeration getInitParameterNames()

    ServletContext测试案例一:

    package ecut.context.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    @WebServlet( "/web/counter" )
    public class CounterServlet extends HttpServlet {
    
        private static final long serialVersionUID = 1963063933334411177L;
    
        @Override
        protected void service( HttpServletRequest request , HttpServletResponse response  ) 
                throws ServletException, IOException {
            request.setCharacterEncoding( "UTF-8" );
            response.setCharacterEncoding( "UTF-8" );
            response.setContentType( "text/html;charset=UTF-8" );
            
            PrintWriter w = response.getWriter();
            
            HttpSession session = request.getSession();
            
            // 1、先尝试从 session 中获取一个名称是 counter 的属性值
            Integer sessionCounter = (Integer)session.getAttribute( "counter" );
            // 2、判断 sessionCounter 是否是不存在的
            if( sessionCounter == null ){
                sessionCounter = Integer.valueOf( 0 );
            }
            // 3、将数值增加后重新放回到 session 中,以备下次继续累加
            sessionCounter++ ;
            session.setAttribute( "counter" , sessionCounter );
            
            w.println( "<h3 align='center'>SessionCounter : " + sessionCounter + "</h3>" );
            
            ServletContext application = this.getServletContext() ;
            
            // 1、先尝试从 application 中获取一个名称是 counter 的属性值
            Integer applicationCounter = (Integer)application.getAttribute( "counter" );
            // 2、判断 applicationCounter 是否是不存在的
            if( applicationCounter == null ){
                applicationCounter = Integer.valueOf( 0 );
            }
            // 3、将数值增加后重新放回到 application 中,以备下次继续累加
            applicationCounter++ ;
            application.setAttribute( "counter" , applicationCounter );
            
            w.println( "<h3 align='center'>ApplicationCounter : " + applicationCounter + "</h3>" );
            
        }
        
    }

    运行结果如下:

    火狐浏览器

    谷歌浏览器

    ServletContext测试案例二:

    <?xml version="1.0" encoding="UTF-8"?>
    
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
        id="WebApp_ID" version="3.1">
      <!-- 为 ServletContext 指定的 初始化参数  -->
        <context-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </context-param>
    
        <servlet>
            <servlet-name>WebApplicationServlet</servlet-name>
            <servlet-class>ecut.context.servlet.WebApplicationServlet</servlet-class>
            <!--  这里的初始化参数是为  当前的 Servlet 提供的 (通过当前Servlet对应的 ServletConfig 可以获取这些参数值)
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            -->
        </servlet>
        
        <servlet-mapping>
            <servlet-name>WebApplicationServlet</servlet-name>
            <url-pattern>/web/application</url-pattern>
        </servlet-mapping>
    </web-app>
    package ecut.context.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Enumeration;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class WebApplicationServlet  extends HttpServlet {
    
        private static final long serialVersionUID = 312349126067371625L;
    
        @Override
        protected void service( HttpServletRequest request , HttpServletResponse response  ) 
                throws ServletException, IOException {
            
            request.setCharacterEncoding( "UTF-8" );
            response.setCharacterEncoding( "UTF-8" );
            response.setContentType( "text/html;charset=UTF-8" );
            
            // WebApplicationServlet 继承了 HttpServlet ,HttpServlet 继承了 GenericServlet ,
            // GenericServlet 实现了 ServletConfig , ServletConfig 接口中提供了 getServletContext()
            ServletContext application = this.getServletContext();
            
            // request.getServletContext(); // 从 Servlet 3.0 开始 可以通过 请求对象 获取 ServletContext
            
            // request.getSession().getServletContext(); // 从 Servlet 2.3 开始就支持用 session 来获取 ServletContext
            
            PrintWriter w = response.getWriter();
            
            w.println( "<h2>当前WEB应用的路径</h2>" );
            w.println( "<div>" );
            w.println( "context path : " +  application.getContextPath() );
            w.println( "</div>" );
            
            Enumeration<String> paramNames = application.getInitParameterNames();
            w.println( "<h2>初始化参数</h2>" );
            while( paramNames.hasMoreElements() ){
                String name = paramNames.nextElement();
                String value = application.getInitParameter( name );
                w.println( "<div>" );
                w.println( "init parameter : " +  name + " : " + value );
                w.println( "</div>" );
            }
            
            w.println( "<h2>获得真实路径 ( getRealPath )</h2>" );
            
            String realPath = application.getRealPath( "/WEB-INF" );
            w.println( "<div>" );
            w.println( realPath );
            w.println( "</div>" );
            
            w.println( "<h2>获得指定的 path 对应的 ServletContext 对象</h2>" );
            
        }
        
        
    
    }

    运行结果如下:

    转载请于明显处标明出处

    http://www.cnblogs.com/AmyZheng/p/9008353.html

  • 相关阅读:
    2017-2018-2 20179223《网络攻防技术》第七周作业
    2017-2018-2 20179223《网络攻防技术》第六周作业
    2017-2018-2 20179223《网络攻防技术》第五周作业
    2017-2018-2 20179223《密码与安全新技术》第二周作业
    2017-2018-2 20179223《网络攻防技术》第四周作业
    2017-2018-2 20179223《密码与安全新技术》第一周作业
    2017-2018-2 20179223《网络攻防技术》第三周作业
    2018-2018-2 《网络攻防》第二周作业
    51nod1270 数组的最大代价(简单dp)
    51nod1269 B君的圆锥
  • 原文地址:https://www.cnblogs.com/AmyZheng/p/9008353.html
Copyright © 2011-2022 走看看