ServletContext

什么是ServletContext 

  • Web容器在启动时,会为其上部署的每个Web应用创建一个ServletContext对象。
  • ServletContext对象凌驾于该应用的所有Servlet之上,使用范围,整个Web应用。
  • Web容器启动时创建,关闭时销毁。

ServletContext的作用

1. 共享数据

        一个Web应用当中的不同Servlet之间可能会用到相同的数据,可以将其保存到ServletContext对象之中(key-value形式),其他Servlet可以根据key获取到。相当于一种通信方式,相比于将数据持久化到IO文件中,更加高效。注意:保存之后才能获取。

  • HelloServlet:保存数据到ServletContext对象中。先于获取数据的Web资源被访问
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 获取ServletContext对象
        ServletContext context = this.getServletContext();

        // 创建数据
        String username = "YuJing";

        // 保存数据到ServletContext对象,名字为username,值为YuJing
        context.setAttribute("username", username);

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("保存username数据到ServletContext对象");

    }
}
  • GetFromContext:获取数据
public class GetFromContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取ServletContext对象
        ServletContext context = this.getServletContext();
        // 根据键值取数据,前提是数据已经被保存到context中
        String username = (String) context.getAttribute("username");
        System.out.println("从ServletContext对象中获取数据: " + username);

        // 做出响应
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("名字:" + username);
    }
}
  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1"
         metadata-complete="true">


    <servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>com.jing.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/helloServlet</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>getFromContext</servlet-name>
        <servlet-class>com.jing.servlet.GetFromContext</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getFromContext</servlet-name>
        <url-pattern>/GFC</url-pattern>
    </servlet-mapping>
</web-app>

 2. 获取初始化参数

        在web.xml中可以配置两类初始化参数,<context-param>和<init-param>。初始化参数的作用是提前存放一些公用的数据,然后在程序中按需获取。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1"
         metadata-complete="true">


    <!--作用域:整个Web应用,所有Servlet都可以获取使用-->
    <context-param>
        <param-name>db-url</param-name>
        <param-value>jdbc:mysql://localhost:3306/test01</param-value>
    </context-param>
    
    <servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>com.jing.servlet.HelloServlet</servlet-class>
        <!--作用域:HelloServlet-->
        <init-param>
            <param-name>param1</param-name>
            <param-value>avalible in servlet init()</param-value>
        </init-param>
   
</web-app>
  • 获取<context-param>:ServletContext.getInitParameter(param-key);
public class GetParamServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取ServletContext对象
        ServletContext context = this.getServletContext();

        // 获取全局参数
        String initParameter = context.getInitParameter("db-url");

        // 前端展示
        resp.getWriter().print(initParameter);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}

  • 获取<init-param>:this.getInitParameter(key-param);
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String param1 = this.getInitParameter("param1");
        resp.getWriter().print(param1);

    }
}

         注:在Web.xml中注册并映射servlet

3. 请求转发

        请求转发:A访问B,B无法处理,B去访问C,B获取响应之后再返回给A

        请求重定向:A访问B,B无法处理,B告诉A去访问C,A去访问C,C响应A,地址栏的地址会发生改变

  • 目标Servlet:Error.java
public class Error extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("<h1>404</h1>");
    }
}
  • 源Servlet:RequestDispatcherServlet
public class RequestDispatcherServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取ServletContext对象
        ServletContext context = this.getServletContext();
        // 这行代码的作用是,获取请求转发器并设置目标资源访问路径
        RequestDispatcher requestDispatcher = context.getRequestDispatcher("/error");
        // 将请求转发给新的路径
        requestDispatcher.forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}
  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1"
         metadata-complete="true">

    <servlet>
        <servlet-name>error</servlet-name>
        <servlet-class>com.jing.servlet.Error</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>error</servlet-name>
        <url-pattern>/error</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>requestDispatcher</servlet-name>
        <servlet-class>com.jing.servlet.RequestDispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>requestDispatcher</servlet-name>
        <url-pattern>/RDS</url-pattern>
    </servlet-mapping>
</web-app>
  • 请求结果

4. 获取资源文件

        资源文件一般是指.properties或者.xml这些配置文件。

  • 资源文件所在目录:

  • /WEB-INF/classes/db.properties
    • 文件内容:
    • 资源访问
    • public class PropertiesServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      
              // 获取资源文件的额输入流
              InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
      
              // Properties类 里面维护一个HashTable,用于存储key-value
              Properties properties = new Properties();
      
              // 将属性文件的内容加载进properties
              properties.load(is);
      
              // 获取属性值
              String username = properties.getProperty("username");
              String password = properties.getProperty("password");
      
              resp.getWriter().print(username + ": " + password);
          }
      }

  • /WEB-INF/classes/com/jing/servlet/aa.properties
    • 文件内容:
    • 资源访问

 

ServletContextJava Web中的一个重要接口,它代表了Web应用程序在服务器中的上下文环境。在一个Web应用程序中,每个Servlet都可以访问同一个ServletContext对象,从而实现Servlet之间的数据共享和通信。 在Java中,可以使用ServletConfig对象的getServletContext()方法来获取ServletContext对象,然后使用该对象的方法来实现一系列操作,例如: 1. 获取Web应用程序的初始化参数:可以使用ServletContext对象的getInitParameter()方法来获取Web应用程序的初始化参数,例如数据库连接等配置信息。 ```java String username = context.getInitParameter("username"); ``` 2. 获取Web应用程序的真实路径:可以使用ServletContext对象的getRealPath()方法来获取Web应用程序的真实路径,例如获取Web应用程序中的一个文件的绝对路径。 ```java String path = context.getRealPath("/WEB-INF/config.properties"); ``` 3. 在ServletContext中保存数据:可以使用ServletContext对象的setAttribute()方法来在ServletContext中保存数据,从而实现Servlet之间的数据共享。 ```java context.setAttribute("key", value); ``` 4. 从ServletContext中获取数据:可以使用ServletContext对象的getAttribute()方法来从ServletContext中获取数据,例如获取其他Servlet保存的数据。 ```java Object value = context.getAttribute("key"); ``` 需要注意的是,ServletContext对象的作用域为整个Web应用程序,因此需要注意数据的安全性和可靠性。另外,ServletContext对象是在Web应用程序启动时创建的,因此可以在Servlet的init()方法中获取ServletContext对象并进行初始化操作,例如读取配置文件等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值