ServletContext五大作用
- 获取web的上下文路径
- java.lang.String getContextPath()
- 获取全局参数
- 和域对象相关
- 请求转发
- 读取web项目的资源文件
1. 获取web的上下文路径介绍
/**
* java.lang.String getContextPath()
* 获取web上下文路径:项目在tomcat服务器中的运行路径
*/
//1.1 获取servletContext对象
ServletContext servletContext = this.getServletContext();
//1.2 获取路径
String path = servletContext.getContextPath();
//1.3 打印出路径
response.getWriter().write(path);
//结果是 :/day09(项目在tomcat服务器中的运行路径,不是项目开发时的路径)
//简单使用场景:避免硬编码,获取路径更加灵活,请求重定向:
//response.sendRedirect("/day09/index.jsp");
response.sendRedirect(servletContext.getContextPath()+"index.jsp");
2. 获取全局参数
首先在项目的WEB-INF的web.xml中配置全局参数
(是在servlet配置的外层,web-app的根目录下)
在该网站下所有的servlet都可以获得该参数,servletConfig则只能访问自己的,从参数配置的位置就可以看出来。
<!-- 全局参数配置 -->
<context-param>
<param-name>AAA</param-name>
<param-value>aaa</param-value>
</context-param>
<context-param>
<param-name>BBB</param-name>
<param-value>bbb</param-value>
</context-param>
参数加载过程:
- tomcat服务器会把整个web.xml文件信息封装到sevletContext中。
- 在init方法中会接收该对象
- 通过getServletContext()方法得到该对象
获取方法
//得到指定参数
String initParameter = getServletContext().getInitParameter("AAA");
System.out.println(initParameter);
//得到所有参数
Enumeration<String> initParameterNames = getServletContext().getInitParameterNames();
while(initParameterNames.hasMoreElements()){
String name = (String) initParameterNames.nextElement();
String value = getServletContext().getInitParameter(name);
System.out.println(name+"---"+value);
}
域对象
什么是域对象:
域对象是用来共享数据,保存数据,获取数据用的
ServletContext就是一个域对象。
(servlet有三个域对象 HttpServletRequest,HttpSession)
/**
* 把数据存到ServletContext域对象
*/
ServletContext context = this.getServletContext();
context.setAttribute("name", "yangqing");
/**
* 从ServletContext域对象中取出数据
*/
ServletContext context = this.getServletContext();
String name = (String) context.getAttribute("name");
}
4. 请求转发
ServletContext context = this.getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("/index.jsp");
dispatcher.forward(request, response);
Servlet中请求转发和重定向的区别:
* 请求转发 getRequestDispatcher("/index.jsp");
* 1 地址栏地址不会发生改变
* 2 只能转发到该项目的资源
* 3 浏览器向服务器发出一次请求,可以使用请求作为域对象来进行数据传递。
* 重定向 response.sendRedirect("/day09/index.jsp");
* 1 地址栏发生变化,变成重定向后的地址
* 2 可以跳转到其他项目的资源
* 3 浏览器想服务器发出两次请求,那么不能使用请求来作为域对象来传递数据。
Servlet中请求转发和重定向执行过程:
读取web项目的资源文件
第一种:
/**
* getRealPath 获取资源文件的真是路径
* 不能使用绝对路径
*/
String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/aa.properties");
System.out.println(realPath);
第二种:
/**
* getResourceAsStream 获取资源文件的输入流
*/
InputStream asStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/aa.properties");
第三种:
/**
* getResource(); 获取资源文件的URL
*/
URL url = this.getServletContext().getResource("/WEB-INF/classes/aa.properties");