1.ServletContext接口
ServletContext接口:
-
Tomcat服务器对ServletContext接口的实现类的完整类名:org.apache.catalina.core.ApplicationContextFacade
javaweb程序员只需要面向ServletContext接口调用方法即可,不需要关心Tomcat具体的实现 -
ServletContext到底是什么?什么时候被创建?什么时候被销毁?创建几个?
Servlet被翻译为:Servlet上下文
一个webapp只有一个web.xml对象,web.xml在文件启动阶段被解析
一个webapp只有一个ServletContext对象,ServletContext在服务器启动时被实例化
ServletContext在服务器关闭的时候被销毁
ServletContext对应的是web.xml文件,是web.xml文件的代表
ServletContext是Servlet对象四周环境的代表
在同一个webapp中,所有Servlet对象共享同一个四周环境,该对象就是ServletContext
所有的用户如果想共享同一个数据,可以将数据放到ServletContext对象中
一般放到ServletContext对象中的数据是不建议修改的,因为ServletContext对象式多线程共享的一个对象,存在线程安全问题。 -
ServletContext接口中有哪些常用的方法?
向ServletContext范围内添加数据(map.put(key,value)):
void setAttribute(String name, Object object)
从Servletcontext范围内拿出数据(map.get(key)):
Object getAttribute(String name)
移除ServletContext范围呃逆的数据(map.remove(key)):
void removeAttribute(String name)
取出ServletContext中的name:
String getInitParameter(String name)
取出ServletContext中的所有name:
Enumeration getInitParameterNames()
取出文件的绝对路径:
String getRealPath(String path)
-
Servlet,ServletConfig,ServletContext之间的关系?
一个Servlet对象对应一个ServletConfig对象
所有的Servlet共享一个ServletContext对象 -
ServletContext范围可以完成跨用户传递
html文件:
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/26_ServletContext/a">AServlet</a>
<a href="/26_ServletContext/b">BServlet</a>
</body>
</html>
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_4_0.xsd"
version="4.0">
<!--web,xml文件中配置上下文参数,这些信息自动封装到ServletContext对象中-->
<context-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123</param-value>
</context-param>
<servlet>
<servlet-name>a</servlet-name>
<servlet-class>ServletContext.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>a</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>b</servlet-name>
<servlet-class>ServletContext.BServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>b</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
</web-app>
package domain;
public class User {
private String username;
private String usercode;
public String getUsername() {
return username;
}
public String getUsercode() {
return usercode;
}
public void setUsername(String username) {
this.username = username;
}
public void setUsercode(String usercode) {
this.usercode = usercode;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", usercode='" + usercode + '\'' +
'}';
}
}
AServlet文件:
package ServletContext;
import domain.User;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Enumeration;
public class AServlet implements Servlet {
//实例变量
private ServletConfig config;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("AServlet="+servletConfig.toString());
this.config=servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//获取ServletConfig
ServletConfig servletConfig = getServletConfig();
//获取ServletContext对象
ServletContext servletContext = servletConfig.getServletContext();
/*
//获取所有上下文参数的name
Enumeration<String> names = servletContext.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value = servletContext.getInitParameter(name);
System.out.println(name+":"+value);
}
*/
/*
//获取文件的绝对路径
String realPath = servletContext.getRealPath("/index.html");
System.out.println(realPath);
String realPath1 = servletContext.getRealPath("/WEB-INF/resource/db.properties");
System.out.println(realPath1);
*/
//创建user对象
User user = new User();
user.setUsername("hh");
user.setUsercode("123");
//向ServletContext范围中存储数据
servletContext.setAttribute("userobj",user);
servletContext.setAttribute("time",new Date());
//从ServletContext范围内一处数据
servletContext.removeAttribute("time");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
BServlet文件:
package ServletContext;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class BServlet implements Servlet {
//实例变量
private ServletConfig config;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("AServlet="+servletConfig.toString());
this.config=servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//获取ServletConfig
ServletConfig servletConfig = getServletConfig();
//获取ServletContext对象
ServletContext servletContext = servletConfig.getServletContext();
//从ServletContext对象中获取数据
Object userobj = servletContext.getAttribute("userobj");
Object time = servletContext.getAttribute("time");
//将从ServletContext中获取到的数据打印输出到浏览器
servletResponse.getWriter().print(userobj);
servletResponse.getWriter().print(time);
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2.欢迎页面
- 欢迎页面怎么设置:
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
- 为什么设置欢迎页面?
为了访问方便,提高用户的体验
直接在浏览器地址栏上访问该webapp即可,自动定位到欢迎页面login.html:http://localhost/27/
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
欢迎页面
</form>
</body>
</html>
<?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_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
<welcome-file-list>
<welcome-file>html/welcome.html</welcome-file>
</welcome-file-list>
</web-app>
- 欢迎页面可以设置多个,越往上,优先级越高
<welcome-file-list>
<welcome-file>login.html</welcome-file>
<welcome-file>html/welcome.html</welcome-file>
</welcome-file-list>
- yige webapp的欢迎页面不一定是一个html资源,可以时任意一种类型的web资源,欢迎页面可以是servlet
- 欢迎页面设置的时候,路径不需要以
/
开始 - 欢迎页面包括全局配置和局部配置
全局配置:CATALINA_HOME/conf/web.xml
局部配置:CATALINA_HOMEwebapps/webapp/WEB-INF/web.xml
尊重就近原则
下面是默认的欢迎页面:
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>