博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ServlertContext
阅读量:5893 次
发布时间:2019-06-19

本文共 9738 字,大约阅读时间需要 32 分钟。

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获取!!!

AAA
AAA's value
BBB
BBB's value
CCC
CCC's value

代码:

/** * 得到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
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("超链接");                /**         * 4.html页面中的form提交地址         */        response.getWriter().write("
"); }}

 

转载于:https://www.cnblogs.com/flei/p/6642480.html

你可能感兴趣的文章
TS学习一
查看>>
正则表达式
查看>>
springboot(三)——application.properties和application.yml是何时解析的
查看>>
iOS 一个比较完美的 Growing TextView
查看>>
dubbo+zookeeper+springmvc+mybatis分布式大型互联网企业架构
查看>>
关于 异步 的一些思考
查看>>
密码学基础(二)算法和密钥
查看>>
Android内存泄漏场景
查看>>
你觉得程序员最大的悲哀是什么?
查看>>
公众号是怎么赚钱的
查看>>
前端开发学习Day16
查看>>
云服务器都是有哪些特点? 云服务器有更高的性价比
查看>>
Effective Objective-C 2.0 第一章学习
查看>>
微服务分布式企业框架 Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa
查看>>
技术专栏丨从原理到应用,Elasticsearch详解(下)
查看>>
Python数据分析入门(三)
查看>>
JavaScript面向对象详解(原理)
查看>>
一个用Git交互可视化教学的项目
查看>>
LSM存储引擎基本原理
查看>>
webstrom编辑器scss环境以及ES6环境配置
查看>>