ServlertContext
1、ServletContext代表着整个JavaWeb应用,每个项目只有唯一的ServletContext的实例。
2、生命周期
服务器启动时创建
服务器关闭时销毁
3、获取ServletContext对象:从ServletConfig对象的getServletContext方法得到
方式1:通过ServletConfig来获取ServeltContext
//获取ServletContext的引用 public class ServletDemo1 extends HttpServlet { //获取ServletConfig private ServletConfig config; public void init(ServletConfig config) throws ServletException { this.config = config; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取servletContext ServletContext sc = config.getServletContext(); sc.setAttribute("p", "abc"); //获取全局参数 System.out.println(sc.getInitParameter("encoding")); System.out.println("Demo1:"+sc); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
方式2:直接获取,推荐
public class ServletDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取ServletContext ServletContext sc = this.getServletContext(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
4、ServletContext对象的核心API
java.lang.String getContextPath() --得到当前web应用的路径(就是运行的项目名称)
public class ContextDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.得到ServletContext对象 //ServletContext context = this.getServletConfig().getServletContext(); ServletContext context = this.getServletContext(); //(推荐使用) //2.得到web应用路径 /Demo /** * web应用路径:部署到tomcat服务器上运行的web应用名称 */ String contextPath = context.getContextPath(); System.out.println(contextPath); /** * 案例:应用到请求重定向 */ response.sendRedirect(contextPath+"/index.html"); } }
--得到web应用的初始化参数
java.lang.String getInitParameter(java.lang.String name) 根据初始化参数名字得到参数的值
java.util.Enumeration getInitParameterNames() 获取所有参数的值
注意:初始化参数配置在web.xml文件中。用<context-param>标签,web应用参数可以让当前web应用的所有servlet获取!!!
<!-- 配置web应用参数 --> <context-param> <param-name>AAA</param-name> <param-value>AAA's value</param-value> </context-param> <context-param> <param-name>BBB</param-name> <param-value>BBB's value</param-value> </context-param> <context-param> <param-name>CCC</param-name> <param-value>CCC's value</param-value> </context-param>
代码:
/** * 得到web应用参数 * * */ public class ContextDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //得到SErvletContext对象 ServletContext context = this.getServletContext(); //根据初始化参数的名字得到初始化参数的值:java.lang.String getInitParameter(java.lang.String name) String gp =sc.getInitParameter("AAA"); System.out.println(gp); //获取所有初始化参数 java.util.Enumeration getInitParameterNames() Enumeration<String > en =sc.getInitParameterNames(); //遍历 while(en.hasMoreElements()){ String paramterName = en.nextElement(); String paramterValue = sc.getInitParameter(paramterName); System.out.println(paramterName+":"+paramterValue); }
//尝试得到ConfigDemo中的servlet参数 String path = this.getServletConfig().getInitParameter("path"); System.out.println("path="+path); } }
域对象有关的方法
void setAttribute(java.lang.String name, java.lang.Object object) 保存数据
java.lang.Object getAttribute(java.lang.String name) 等到数据
void removeAttribute(java.lang.String name) 移除数据
域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据。
ServletContext就是一个域对象!!!!
ServletContext域对象:作用范围在整个web应用中有效!!!
/** * 保存数据 * * */ public class ContextDemo3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.得到域对象 ServletContext context = this.getServletContext(); //2.把数据保存到域对象中 //context.setAttribute("name", "eric"); context.setAttribute("student", new Student("jacky",20)); System.out.println("保存成功"); } } class Student{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Student [age=" + age + ", name=" + name + "]"; } } ============================================= /** * 获取数据 * * */ public class ContextDemo4 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.得到域对象 ServletContext context = this.getServletContext(); //2.从域对象中取出数据 //String name = (String)context.getAttribute("name"); Student student = (Student)context.getAttribute("student"); //System.out.println("name="+name); System.out.println(student); } }
转发
RequestDispatcher getRequestDispatcher(java.lang.String path) --转发(类似于重定向)
/** * 转发(效果:跳转页面) * * */ public class ForwardDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 保存数据到request域对象 */ request.setAttribute("name", "rose"); //转发 /** * 注意:不能转发当前web应用以外的资源。getRequsertDispatcher后面的路径必须以“/“开头,目标servlet的访问路径 */ /*RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/GetDataServlet"); rd.forward(request, response);*/ this.getServletContext().getRequestDispatcher("/GetDateServlet").forward(request, response); } } ================================= public class GetDataServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 从request域对象中获取数据 */ String name = (String)request.getAttribute("name"); System.out.println("name="+name); } }
===============================================================
public class RedirectDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 保存数据到request域对象
*/
request.setAttribute("name", "rose");
//重定向
/**
* 注意:可以跳转到web应用内,或其他web应用,甚至其他外部域名。
*/
//response.sendRedirect("/demo11/adv.html");
response.sendRedirect("/demo/GetDataServlet");
}
}
转发与重定向的区别:
1)转发
a)地址栏不会改变
b)转发只能转发到当前web应用内的资源
c)可以在转发过程中,可以把数据保存到request域对象中
2)重定向
a)地址栏会改变,变成重定向到地址。
b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。
c)不能再重定向的过程,把数据保存到request中。
结论: 如果要使用request域对象进行数据共享,只能用转发技术!!!
得到web应用的资源文件
java.lang.String getRealPath(java.lang.String path) 返回资源文件的绝对路径
java.io.InputStream getResourceAsStream(java.lang.String path) 得到资源文件,返回的是输入流
/** * 读取web应用下的资源文件(例如properties) * @author APPle */ public class ResourceDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * . 代表java命令运行目录。java运行命令在哪里?? 在tomcat/bin目录下 * 结论: 在web项目中, . 代表在tomcat/bin目录下开始,所以不能使用这种相对路径。 */ //读取文件。在web项目下不要这样读取。因为.表示在tomcat/bin目录下 /*File file = new File("./src/db.properties"); FileInputStream in = new FileInputStream(file);*/ /** * 使用web应用下加载资源文件的方法 */ /** * 1. getRealPath读取,返回资源文件的绝对路径 */ /*String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties"); System.out.println(path); File file = new File(path); FileInputStream in = new FileInputStream(file);*/ /** * 2. getResourceAsStream() 得到资源文件,返回的是输入流 */ InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); Properties prop = new Properties(); //读取资源文件 prop.load(in); String user = prop.getProperty("user"); String password = prop.getProperty("password"); System.out.println("user="+user); System.out.println("password="+password); } }
补充: web应用的路径问题
/** * web应用中路径问题 * * */ public class PathDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //目标资源: target.html /** * 思考: 目标资源是给谁使用的。 * 给服务器使用的: / 表示在当前web应用的根目录(webRoot下) * 给浏览器使用的: / 表示在webapps的根目录下 */ /** * 1.转发 */ //request.getRequestDispatcher("/target.html").forward(request, response); /** * 2.请求重定向 */ //response.sendRedirect("/demo/target.html"); /** * 3.html页面的超连接href */ response.getWriter().write("<html><body><a href='/demo/target.html'>超链接</a></body></html>"); /** * 4.html页面中的form提交地址 */ response.getWriter().write("<html><body><form action='/demo/target.html'><input type='submit'/></form></body></html>"); } }