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>");
    }

}
原文地址:https://www.cnblogs.com/flei/p/6642480.html