ServletConfig对象和ServletContext对象

  ServletConfig对象是servlet配置对象,(web.xml中的)servlet信息封装在ServletConfig对象中,因此在一个web应用可存在多个ServletConfig。ServletContext对象是servlet上下文对象,而整个web.xml信息封装在ServletContext对象中,因此 一个web应用中只有一个servletcontext对象,可能存在多个servletconfig对象。

ServletConfig

创建:在创建完servlet对象之后,在调用init方法之前创建直接从有参数的init方法中得到。

API:

1 java.lang.String getInitParameter(java.lang.String name)  根据参数名获取参数值
2 java.util.Enumeration getInitParameterNames()    获取所有参数
3 ServletContext getServletContext()     得到servlet上下文对象
4 java.lang.String getServletName()       得到servlet的名称

注意:servlet的参数只能由当前的这个sevlet获取。

如下,我想访问e盘下的某个文件,想通过web.xml中配置,在提交请求到服务器时访问。

web.xml

1  <servlet>
2     <servlet-name>ConfigDemo</servlet-name>
3     <servlet-class>gz.itcast.f_config.ConfigDemo</servlet-class>
4     <!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
5     <init-param>
6         <param-name>path</param-name>
7         <param-value>e:/b.txt</param-value>
8     </init-param>
9   </servlet>

ConfigDemo.java

public class ConfigDemo extends HttpServlet {
    /**
     * 以下两段代码GenericServlet已经写了,我们无需编写!!
     */
    /*private ServletConfig config;*/
    
    /**
     *  1)tomcat服务器把这些参数会在加载web应用的时候,封装到ServletConfig对象中 
     *  2)tomcat服务器调用init方法传入ServletConfig对象
     */
    /*@Override
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
    }*/
    
    

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 读取servlet的初始参数
         */
        String path = this.getServletConfig().getInitParameter("path");

        File file = new File(path);
        //读取内容
        BufferedReader br = new BufferedReader(new FileReader(file));
        String str = null;
        while( (str=br.readLine())!=null ){
            System.out.println(str);
        }
}

ServletContext对象

核心API

java.lang.String getContextPath()   --得到当前web应用的路径

java.lang.String getInitParameter(java.lang.String name)  --得到web应用的初始化参数
java.util.Enumeration getInitParameterNames()  

void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
java.lang.Object getAttribute(java.lang.String name)  
void removeAttribute(java.lang.String name)  

RequestDispatcher getRequestDispatcher(java.lang.String path)   --转发(类似于重定向)

java.lang.String getRealPath(java.lang.String path)     --得到web应用的资源文件
java.io.InputStream getResourceAsStream(java.lang.String path)  

在web.xml配置web应用参数,如下:

<context-param>
        <param-name>AAA</param-name>
        <param-value>AAA's value</param-value>
</context-param>

在web.xml中配置了上述的参数,就相当于给整个web添加了一个新属性,那么可以通过ServletContext访问。而上边的在servlet中添加一个<init-param>,相当于某个web应用的某个特定的servlet添加了一个属性,所以只能通过该servlet的ServletConfig访问。下面的例子描述ServletContext如何访问:

public class ContextDemo2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //得到SErvletContext对象
        ServletContext context = this.getServletContext();
        
        System.out.println("参数"+context.getInitParameter("AAA"));
        
        Enumeration<String> enums = context.getInitParameterNames();
        while(enums.hasMoreElements()){
            String paramName = enums.nextElement();
            String paramValue  =context.getInitParameter(paramName);
            System.out.println(paramName+"="+paramValue);
        }
        
        //尝试得到ConfigDemo中的servlet参数
        String path = this.getServletConfig().getInitParameter("path");
        System.out.println("path="+path);
    }

}
原文地址:https://www.cnblogs.com/K-artorias/p/7469640.html