百度百科:
ServletContext接口是Servlet中最大的一个接口,呈现了web应用的Servlet视图
我的理解:
ServletContext是一个容器,可以存放你在网页中,你的项目里你你所浏览过的,编写过的东西。可利用这个容器调出来使用。
以下均用代码展示:
1. 共享数据
web.xml配置:
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>top.klxy.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>get</servlet-name>
<servlet-class>top.klxy.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>get</servlet-name>
<url-pattern>/get</url-pattern>
</servlet-mapping>
HelloServlet.java
package top.klxy.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @Author: SmallWang
* @Date: 2020/7/19 0019 21:54
* @Version: 1.0
*/
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
System.out.println("hello"); //控制台打印
PrintWriter writer = resp.getWriter();
writer.print("hello"); //网页里面打印 hello
ServletContext context = this.getServletContext();
String name = "王驰";
context.setAttribute("username",name); //将一个数据保存在servlet中 名为:usersname 值为: name
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
GetServlet.java
package top.klxy.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @Author: SmallWang
* @Date: 2020/7/19 0019 22:33
* @Version: 1.0
*/
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
PrintWriter writer = resp.getWriter();
writer.print("名字:"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
启动服务器,浏览器先输入:http://localhost:8081/s1/hello 在输入:http://localhost:8081/s2/get
可以获得在HelloServlet中保存的姓名:
注意:如果启动项目直接输入http://localhost:8081/s2/get地址会得的空值 名字:null
2. 获取初始化参数
在web.xml中定义个初始化参数
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
web.xml中定义路径
<servlet>
<servlet-name>demo03</servlet-name>
<servlet-class>top.klxy.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo03</servlet-name>
<url-pattern>/demo03</url-pattern>
</servlet-mapping>
ServletDemo.java
package top.klxy.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @Author: SmallWang
* @Date: 2020/7/19 0019 22:43
* @Version: 1.0
*/
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
启动服务器,浏览器输入地址:http://localhost:8081/s2/demo03
3. 请求转发(重定向)
web.xml配置:
<servlet>
<servlet-name>demo03</servlet-name>
<servlet-class>top.klxy.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo03</servlet-name>
<url-pattern>/demo03</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>demo04</servlet-name>
<servlet-class>top.klxy.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo04</servlet-name>
<url-pattern>/demo04</url-pattern>
</servlet-mapping>
ServletDemo04.java
package top.klxy.servlet;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: SmallWang
* @Date: 2020/7/19 0019 22:50
* @Version: 1.0
*/
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
ServletContext context = this.getServletContext();
System.out.println("ServletDemo04");
/*
RequestDispatcher dispatcher = context.getRequestDispatcher("/demo03");//转发的请求路径
dispatcher.forward(req,resp); //调用forward实现请求转发
*/
context.getRequestDispatcher("/demo03").forward(req,resp); //等价于上面两句注释
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
启动服务器,浏览器输入地址:http://localhost:8081/s2/demo04
4.读取资源文件
要知道,在javaweb项目中,我们的资源文件和src下的源码文件在打包后都在一个classes路径下,俗称:类路径
资源文件:
web.xml配置:
<servlet>
<servlet-name>demo05</servlet-name>
<servlet-class>top.klxy.servlet.ServletDemo05</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo05</servlet-name>
<url-pattern>/demo05</url-pattern>
</servlet-mapping>
ServletDemo05.java
package top.klxy.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* @Author: SmallWang
* @Date: 2020/7/19 0019 23:06
* @Version: 1.0
*/
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
ServletContext context = this.getServletContext();
InputStream is = context.getResourceAsStream("/WEB-INF/classes/db.properties");
Properties pro = new Properties();
pro.load(is);
String uer = pro.getProperty("username");
String pwd = pro.getProperty("password");
resp.getWriter().println("姓名:" + uer +"\n密码:"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
启动服务器,浏览器输入地址:http://localhost:8081/s2/demo05