1.servletContext作用
在web容器启动时,会为每一个servlet都创建一个servletContext对象,他代表了当前的web 对象。可以实现不同的servlet之间的数据共享、消息转发、获取初始化参数和读取资源文件等。
2.servletContext实现
2.1 servlet之间数据共享
1)在webapp文件夹下新建一个html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>servlet数据共享页面</title>
</head>
<body>
<form method="get" action="s1">
<p>
用户名:<input name="name" type="text">
</p>
<p>
密码:<input name="password" type="password">
</p>
<input type="submit">
</form>
</body>
</html>
2)新建两个servlet,以便实现数据共享
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet1 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
String name=req.getParameter("name");
String password=req.getParameter("password");
res.getWriter().println(name);
res.getWriter().println(password);
ServletContext context=this.getServletContext();
context.setAttribute("name",name);
context.setAttribute("password",password);
}
}
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet2 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
ServletContext context=this.getServletContext();
res.getWriter().println(context.getAttribute("name"));
res.getWriter().println(context.getAttribute("password"));
}
}
servlet1负责从html中获得name和password两个参数,并且将其设置在ServletContext中,并将其显示在页面中。
servlet2负责从ServletContext中获取name和password两个参数,并显示在页面中。
3)在web.xml中设置访问路径
<servlet>
<servlet-name>s1</servlet-name>
<servlet-class>Servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>s2</servlet-name>
<servlet-class>Servlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s2</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
4)在浏览器中先访问html,填写用户名和密码并提交,
之后跳转到s1页面上输出name和password的值,
此时将路径直接跳转到s2,s2页面也会输出name和password的值
2.2 获取初始化参数
1) 在web.xml中添加初始化参数,在webapp标签中添加如下代码
<context-param>
<param-name>name</param-name>
<param-value>19960112</param-value>
</context-param>
2)添加一个servlet,在servlet中利用ServletContext获取初始化参数,并显示在页面中,代码如下。
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletContextDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
ServletContext context=this.getServletContext();
String password=(String)context.getInitParameter("name");
response.getWriter().println("password");
response.getWriter().println(password);
}
}
3)在web.xml中设置servlet
<servlet>
<servlet-name>getPassword</servlet-name>
<servlet-class>ServletContextDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getPassword</servlet-name>
<url-pattern>/getPassword</url-pattern>
</servlet-mapping>
4)访问效果如下
2.3 消息转发
1)利用2.2的servlet实现消息转发,新建一个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;
public class ServletDispatcher extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
ServletContext sc=this.getServletContext();
sc.getRequestDispatcher("/getPassword").forward(req,res);
}
}
2)在web.xml中添加新建servlet的访问路径
<servlet>
<servlet-name>servletDispatcher</servlet-name>
<servlet-class>ServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletDispatcher</servlet-name>
<url-pattern>/sd</url-pattern>
</servlet-mapping>
3)在浏览器地址栏中输入http://localhost:8080/sd,发现页面显示的和2.2中相同,现实的是获取的初始化参数。
2.4 读取资源文件
1)在java文件夹下新建一个properties文件,new->Resource Bundle,填写properties文件名,在properties中添加如下代码
username=baize
password=19960112
user.properties会被打包到classes文件夹下。
2)新建servlet获取资源文件内容
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;
public class PropertiesGet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("123");
InputStream is = this.getServletContext().getResourceAsStream("WEB-INF/classes/user.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(user + ":" + pwd);
}
}
3)在web.xml中添加servlet
<servlet>
<servlet-name>pg</servlet-name>
<servlet-class>PropertiesGet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pg</servlet-name>
<url-pattern>/pg</url-pattern>
</servlet-mapping>
4)访问效果如下,页面中显示了资源文件的内容。