Servlet之ServletContext

Servlet之ServletContext


ServletContext是什么

在web容器启动的时候,它会为每个web项目都创建一个对应的ServletContext对象,即每个web项目都会有且仅有一个ServletContext对象,通过GenericServlet的getServletContext方法可以获取当前项目的ServletContext对象,其主要的作用如下:

  • 共享数据
  • 获取初始化参数
  • 请求转发
  • 读取配置文件

共享数据

我们可以通过ServletContext对象的setAttributegetAttribute方法,使不同的Servlet间共享一些数据

例如在Demo1中,向ServletContext添加一个name=张三,代码如下:

public class Demo1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String name = "张三";  // 需要共享的数据
        servletContext.setAttribute("name", name);
    }
}

Demo2中,可以获取name属性,代码如下:

public class Demo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String name = (String) context.getAttribute("name");// 获取共享的数据
        resp.setContentType("text/html;charset=utf-8");//  设置内容类型与字符编码
        resp.getWriter().print(name);
    }
}

启动后,先访问Demo1访问Demo2,页面将显示“张三”。

若先访问Demo2,则会显示null,因为在访问Demo1前,ServletContext中没有name属性。


获取初始化参数

我们可以web.xml中设置一些公用的参数,通过ServletContext来获取这些参数,如下

<!--设置初始化参数-->
<context-param>
  <param-name>user</param-name>
  <param-value>admin</param-value>
</context-param>
String user = context.getInitParameter("user");//  获取初始化参数

请求转发

通过ServletContext对象可以获取请求转发对象,可以进行请求转发操作,例如:

ServletContext context = this.getServletContext();
String path = "/3";// 需要转发到的路径
RequestDispatcher requestDispatcher = context.getRequestDispatcher(path);// 获取转发对象
requestDispatcher.forward(req, resp);// 进行转发

请求转发和重定向都可以使用户访问一个页面时返回另一个页面,其主要区别为:

  • 请求转发返回200;重定向返回30x
  • 请求转发的地址栏不会变;重定向会变
  • 请求转发是将另一个页面的结果直接返回;而重定向需要用户请求两次,当浏览器获取30x后,会再去请求另一个页面

读取配置文件

InputStream stream = context.getResourceAsStream("/WEB-INF/classes/db.properties");// 将资源文件转为流
Properties prop = new Properties();
prop.load(stream);// 加载配置文件
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print(prop.getProperty("username"));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值