入门JavaWeb之 ServletContext 篇

Serlvet 是基于 Java 技术的 Web 组件

ServletContext:

web 容器在启动时,它会为每个 web 程序都创建一个对应的 ServletContext 对象,代表当前的 web 应用

1.共享数据:

在一个 Servlet 中保存的数据,可以在另一个 Servlet 中拿到

this.getServletContext(),即 Servlet 上下文

通过 setAttribute() 方法设置属性节点,将数据保存在 ServletContext 中

package com.demo.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Set extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String username = "张三"; //数据
        //将数据保存在ServletContext中,名字为username,值为username
        servletContext.setAttribute("username",username);
    }

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

创建另一个 java 文件

this.getServletContext();

通过 getAttribute() 方法获取值(数据),默认 Object 类型,修改成 String 类型要强制转换

package com.demo.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Get extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String attribute = (String) servletContext.getAttribute("username");

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().println(attribute);
    }

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

注册 Servlet

web.xml 文件如下:

  <servlet>
    <servlet-name>get</servlet-name>
    <servlet-class>com.demo.servlet.Get</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>get</servlet-name>
    <url-pattern>/get</url-pattern>
  </servlet-mapping>

运行,地址栏加后缀即可

2.获取初始化参数

设置初始值:

  <context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
  </context-param>

getInitParameter 获取初始化参数

package com.demo.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Param extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String initParameter = servletContext.getInitParameter("url");
        resp.getWriter().println(initParameter);
    }

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

注册: 

  <servlet>
    <servlet-name>param</servlet-name>
    <servlet-class>com.demo.servlet.Param</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>param</servlet-name>
    <url-pattern>/param</url-pattern>
  </servlet-mapping>

运行即可,就能看到设置的初始值

3.请求转发

getRequestDispatcher 转发的请求路径

调用 forward 实现请求转发

package com.demo.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Req extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        //getRequestDispatcher转发的请求路径
        //调用forward实现请求转发
        servletContext.getRequestDispatcher("/param").forward(req,resp);
    }

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

比如路径设置了之前的 <url-pattern>,执行后添加其他后缀

( <servlet-class> 任然要写),依然显示之前路径下的页面

意思是 A 想拿到 C 的资源,但 A 无法直接调用 C,A 只能找到 B

所以 B 去找 C 拿,C 把东西返回给 B,B 再转发给 A

A 只面临了 B,没看到 C,路径没有变化,即转发的概念

4.读取资源文件

在 resources 目录下新建文件

在 Java 目录下新建类

getResourceAsStream 里放 resources 目录下的新建文件路径(路径前加 /),把资源变成一个流

new Properties();

load 拿到文件的流

getProperty 获取 resources 目录下新建文件的属性

package com.demo.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Prop1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");//把资源变成一个流
        Properties properties = new Properties();
        properties.load(resourceAsStream); //拿到文件的流
        String username = properties.getProperty("username"); //获取属性
        String password = properties.getProperty("password");
        resp.getWriter().println(username+password);
    }

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

pom.xml 文件:

<!--    在build中配置resources , 来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

运行后被打包到同一个路径下,classes,称为类路径 classpath

resources 资源都是放在类路径下

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值