文章目录
声明:本文是通过学习自B站的视频所写的笔记,便于今后回顾,视频地址:https://www.bilibili.com/video/BV12J411M7Sj?p=10
一、是ServletContext
Web容器在启动的时候,它会为每个Web程序都创建一个ServletContext对象,它代表了当前的Web应用
二、ServletContext的作用
1.共享数据
在这个Servlet中保存的数据,可在另一个Servlet中拿到
实例测试:
1)主要代码
用于存入Servlet上下文中数据的类:
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
// this.getInitParameter() 初始化参数
// this.getServletConfig() Servlet配置
// this.getServletContext() Servlet上下文
/**
* Web容器在启动的时候,它会为每个Web程序都创建一个ServletContext对象,
* 它代表了当前的Web应用
*
* 作用:
* 1.共享数据:在这个Servlet中保存的数据,可在另一个Servlet中拿到
*/
ServletContext servletContext = this.getServletContext();
String username = "zlc";
//将一个数据属性及值保存在了Servlet上下文中
servletContext.setAttribute("username", username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
}
用于取出Servlet上下文中数据的类:
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//在Servlet上下文(此Web应用中所有Servlet实现类都是一个Servlet上下文)中获取此属性值
ServletContext servletContext = this.getServletContext();
String username = (String) servletContext.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字:" + username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml主要内容:
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.zlc.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/h</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.zlc.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/g</url-pattern>
</servlet-mapping>
2)测试效果
测试直接请求/g,发现可以,但由于没有存入数据,因此为null
请求/h,使HelloServlet类中存入Servlet上下文中数据的部分生效
再次请求/g,发现可以取出数据,因此ServletContext共享数据的特性得以验证
2.获取初始化参数
实例测试:
1)主要代码
在web.xml中配置一些Web应用的初始化参数
<!-- 配置一些Web应用的初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
<servlet>
<servlet-name>param</servlet-name>
<servlet-class>com.zlc.servlet.TestParam</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>param</servlet-name>
<url-pattern>/p</url-pattern>
</servlet-mapping>
在TestParam类中获取之前配置的初始化参数
public class TestParam extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String url = servletContext.getInitParameter("url");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2)测试效果
3.请求转发
实例测试:
1)主要代码
web.xml
<servlet>
<servlet-name>rd</servlet-name>
<servlet-class>com.zlc.servlet.TestRequestDispatch</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>rd</servlet-name>
<url-pattern>/rd</url-pattern>
</servlet-mapping>
用于请求转发的TestRequestDispatcher类,将对于此类的映射的/rd,转发为请求/p
public class TestRequestDispatcher extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
//转发的请求路径
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/p");
//传递请求和响应,实现请求转发
requestDispatcher.forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2)测试效果
4.读取资源文件
实例测试:
1)主要代码
resources目录下:db.properties
username=root
password=123456
用于读取资源文件的类:
public class TestReadSource extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(in);
String username = prop.getProperty("username");
String password = prop.getProperty("password");
resp.getWriter().print(username + ":" + password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml
<servlet>
<servlet-name>rs</servlet-name>
<servlet-class>com.zlc.servlet.TestReadSource</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>rs</servlet-name>
<url-pattern>/rs</url-pattern>
</servlet-mapping>
2)测试效果
注:对于资源文件存放位置有特殊需求时,可参照本人之前文章进行相应配置:Maven中特殊需求下:自选目录(非resources目录)中配置文件资源导出问题