java基础学习:JavaWeb之ServletConfig与ServletContext

924 阅读3分钟

其他更多java基础文章: java基础学习(目录)


Servlet规范核心类图

  

image

接下来我们要说的是Servlet的四个类:

  ServletConfig对象,ServletContext对象、下一节讲request对象,response对象

从图中我们可以知道这几个对象之间的联系!

ServletConfig对象

获取ServletConfig对象
  1. 通过继承父类(HttpServlet或GenericServlet)的方法得到一个ServletConfig对象
ServletConfig config = this.getServletConfig();
ServletConfig对象的作用

image.png

  1. getServletName() :获取servlet的名称,也就是我们在web.xml中配置的servlet-name
  2. getServletContext():获取ServletContext对象,该对象的作用看下面讲解
  3. getInitParameter(String):获取在servlet中初始化参数的值。这里注意与全局初始化参数的区分。这个获取的只是在该servlet下的初始化参数
 <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.hiway.servlet.Myservlet</servlet-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>123456</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/Myservlet</url-pattern>
    </servlet-mapping>
  1. getInitParameterNames():获取在Servlet中所有初始化参数的名字,也就是key值,可以通过key值,来找到各个初始化参数的value值。注意返回的是枚举类型
Enumeration<String> initParameterNames = this.getInitParameterNames();
while(initParameterNames.hasMoreElements()){
   String name = initParameterNames.nextElement();
   String value = this.getInitParameter(name);
}

ServletContext对象

获取ServletContext对象
  1. 通过ServletConfig获取,如果继承父类(HttpServlet或GenericServlet),则可直接调用方法获取
getServletContext();
//或
getServletConfig().getServletContext();
  1. 还有一种在web应用中,通过HttpServletRequest获取
request.getSession().getServletContext()
ServletContext对象的作用

tomcat为每个web项目都创建一个ServletContext实例,tomcat在启动时创建,服务器关闭时销毁,在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等,通俗点讲,就是一个web项目,就存在一个ServletContext实例,每个Servlet读可以访问到它。
1. web项目中共享数据 在一定范围内(当前应用),使多个Servlet共享数据getAttribute(String name)、setAttribute(String name, Object obj)、removeAttribute(String name)

    

image

1.1 setAttribute(String name, Object obj) 在web项目范围内存放内容,以便让在web项目中所有的servlet读能访问到
1.2 getAttribute(String name) 通过指定名称获得内容
1.3 removeAttribute(String name) 通过指定名称移除内容

2. 获取全局配置信息
整个web项目初始化参数 (这个就是全局初始化参数,每个Servlet中都能获取到该初始化值)
2.1)getInitPatameter(String name)  //通过指定名称获取初始化值 2.2)getInitParameterNames()  //获得枚举类型

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext.xml
        </param-value>
    </context-param>

3. 获取web项目资源
3.1)获取web项目下指定资源的路径 :
String getRealPath(String path);//根据资源名称得到资源的绝对路径

        ServletContext servletContext = this.getServletContext();
        String path = servletContext.getRealPath("/WEB-INF/web.xml");
        System.out.println(path);

F:\myworkspace\ServletTest\out\artifacts\ServletTest_war_exploded\WEB-INF\web.xml

3.2)获取web项目下指定资源的内容,返回的是字节输入流。InputStream getResourceAsStream(java.lang.String path)

InputStream in  = servletContext.getResourceAsStream("/WEB-INF/web.xml");
        InputStreamReader isr = new InputStreamReader(in,"UTF-8");
        BufferedReader br = new BufferedReader(isr);
        String s = null;
        while((s =br.readLine())!=null){
            System.out.println(s);
        }

image.png

3.3)getResourcePaths(java.lang.String path) 指定路径下的所有内容。

        Set set = servletContext.getResourcePaths("/WEB-INF");
        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

image.png

3.4)实现servlet的转发
RequestDispatcher getRequestDispatcher(String path) ;//参数表示要跳转到哪去

        RequestDispatcher rd = servletContext.getRequestDispatcher("/Servlet1");
        rd.forward(req,resp);