ServletConfig是什么?
ServletConfig是Servlet规范中的一员,ServletConfig是个接口,打印一下ServletConfig对象。
org.apache.catalina.core.StandardWrapperFacade实现了Servlet接口,仅限Tomcat是这个名,别的服务器叫别的名字,但都遵守了Servlet规范。
再创建一个Servlet,测试,一个Servlet对象有一个对应的ServletConfig
ServletConfig对象都包含了的web.xml的配置信息,ServletConfig对象是Servlet对象的配置对象,可以获取比如name信息
打印结果
ServletConfig接口就这4个方法,其中初始化参数指的是web.xml的标签信息
测试一下
可以看到,拿到了初始化参数的信息
ServletContext
ServletContext是什么?
ServletContext是接口,是Servlet规范中的一员
获取ServletContext,注意:所有继承GenericServlet的类都可以,直接使用this调用相关的Servlet方法,因为内部都重载了
打印结果
ServletContext是谁实现的?
Web服务器实现了ServletContext接口
对于一个Webapp只有一个ServletContext对象
ServletContext是Servlet环境(上下文)对象
一个ServletContext对象通常对应的是一个web.xml文件
ServletContext接口常用方法
获取Context初始化参数
Context初始化参数是这个
getInitParameter(String name):通过传入name获取对应初始化参数的值
getInitParameterNames():返回字符串类型的枚举,获取所有初始化参数的name
使用方法和之前差不多
public class ContextServletText extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter writer = res.getWriter();
ServletContext servletContext = this.getServletContext();
//获取Context初始化参数
Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String name = initParameterNames.nextElement();
String value = servletContext.getInitParameter(name);
writer.print("<br>初始化参数名"+name);
writer.print("<br>初始化参数值"+value);
}
}
}
Context是全局信息,每一个Servlet都可以使用,Config是局部信息,只对指定的Servlet有用
获取应用的根--重要,项目在部署时,根路径是不确定的,就比如在Mac和Windows部署jar包中遇到的问题,所以需要动态获取根路径
在Servlet中动态获取路径使用这个方法:
getContextPath();
就如同文档说的,返回的是整个webapp的路径
public class ContextServletText extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter writer = res.getWriter();
ServletContext servletContext = this.getServletContext();
//获取Context初始化参数
Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String name = initParameterNames.nextElement();
String value = servletContext.getInitParameter(name);
writer.print("<br>初始化参数名"+name);
writer.print("<br>初始化参数值"+value);
}
// 获取Context path (获取上下文的根)
String contextPath = servletContext.getContextPath();
writer.print("<br>context的根:"+contextPath);
}
}
打印结果
动态获取文件的绝对路径:getRealPath(String path);
使用方法
默认从web目录查找
日志记录
ServletContext常用方法的基本使用
public class ContextServletText extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter writer = res.getWriter();
ServletContext servletContext = this.getServletContext();
//获取Context初始化参数
Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String name = initParameterNames.nextElement();
String value = servletContext.getInitParameter(name);
writer.print("<br>初始化参数名"+name);
writer.print("<br>初始化参数值"+value);
}
// 获取Context path (获取上下文的根)
String contextPath = servletContext.getContextPath();
writer.print("<br>context的根:"+contextPath);
// 动态获取文件绝对路径
String realPath = servletContext.getRealPath("/index.txt");
writer.print("<br>绝对路径:"+realPath);
//记录日志
servletContext.log("这是一段运行正常的日志记录");
}
}
idea创建的Tomcat会在这个路径,我是Mac的,idea是这个路径
查看日志文件
ServletContext对象也可以叫做应用域,如果所有用户共享一份数据,并且这个数据很少被修改,量还很小,可以放在ServletContext应用域中
如果数据量大会非常占堆内存,ServletContext生命周期比较长
修改,必然存在线程并发所带来的安全问题
ServletContext对数据的存、取、删
// servletContext存
servletContext.setAttribute("age", 17);
// servletContext取
Object age = servletContext.getAttribute("age");
writer.print("<br>数据:"+age);
// servletContext删
servletContext.removeAttribute("age");
Object age1 = servletContext.getAttribute("age");
writer.print("<br>数据:"+age1);
删除之后取的就是null了。