原视频地址:https://www.bilibili.com/video/BV1vb41187jH?p=26
javax.servlet.ServletContext接口,Servlet规范
Tomcat服务器对ServletContext接口的实现类的完整类名:
org.apache.catalina.core.ApplicationContextFacade
javaweb程序员还是只需要面向ServletContext接口调用方法即可,不需要关心具体的实现类。
ServletContext到底是什么?什么时候被创建?什么时候被销毁?创建几个?
- ServletContext被翻译为:Servlet上下文
- 一个webapp只有一个web.xml文件,web.xml文件服务器启动时被解析
- 一个webapp只有一个ServletContext对象,ServletContext在服务器启动阶段被实例化
- ServletContext在服务器关闭时会被销毁
- ServletContext对应的是web.xml文件,是web.xml文件的代表
- ServletContext是所有Servlet对象四周环境的代表【在同一个webapp中,所有的Servlet对象共享一个”四周环境“,即ServletContext】
- 所有的用户若想共享同一个数据,可以将这个数据放到ServletContext对象中。
- 一般放到ServletContext对象中的数据是不建议涉及到修改操作的,因为ServletContext是多线程共享的一个对象,修改的时候存在线程安全问题。
ServletContext接口中有哪些常用的方法
void setAttribute(String name, Object object)
:向ServletContext范围中添加数据(map.put(k, v))Object getAttribute(String name)
:向ServletContext范围中获取数据map.get(k)void removeAttribute(String name)
:向ServletContext范围中删除数据map.remove(k)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// AServlet.java文件------>向ServletContext范围中添加数据
public void service(ServletRequest request, ServletResponse response) {
ServletConfig config = getServletConfig();
ServletContext application = config.getServletContext();
// 创建User对象
User user = new User();
user.setUsercode("1234");
user.setUsername("haha");
// 向ServletContext范围中存储user
application.setAttributes("userObj", user);
}
1
2
3
4
5
6
7class user {
private String usercode;
private String username;
//setter&getter&&toString......
}
1 | // BServlet.java文件------>从ServletContext范围中获取数据 |
String getInitParameter(String name)
Enumeration getInitParameterNames()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// .java文件
public void service(ServletRequest request, ServletResponse response) {
// 输出到浏览器页面上
response.setContentType("text/html;charset = UTF-8");
PrintWriter out = response.getWriter();
ServletConfig config = getServletConfig();
ServletContext application = config.getServletContext();
// 获取所有初始化参数的name
Enumeration<String> names = application.getInitParameterNames();
while(names.hasMoreElements()) {
String name = names.nextElement();
String value = application.getInitParameter(name);
out.print(name + "=" + value);
out.print("<br>");
}
}
String getRealPath(String path)
: 获取文件绝对路径【IO流需要路径】1
2
3
4
5
6
7
8
9
10// .java文件
public void service(ServletRequest request, ServletResponse response) {
ServletConfig config = getServletConfig();
ServletContext application = config.getServletContext();
// 获取文件绝对路径
String realPath = application.getRealPath("index.html");
System.out.println(realPath);
}
web.xml文件
1 | <context-param> |
Servlet、ServletConfig、ServletContext之间的关系
- 一个Servlet对应一个ServletConfig;100个Servlet对应100个ServletConfig
- 所有的一个Servlet共享一个ServletContext对象
ServletContext范围可以跨用户传递数据
路径总结:
超链接(有项目名)
<a href = "/webappname/doSome"></a>>
web.xml中的url-pattern(无项目名)
<url-pattern>/doSome</url-pattern>
form表单的action属性
<form action = "/webappname/doSome"></form>
String realPath = application.getRealPath(“/WEB_INF/resource/db.xml”);