储存——域对象

在JavaWeb的开发中,数据的储存是必不可少的。原因就不用说了
那么,常见的,或者说原生的储存方式有哪些,接下来就整理一下

  1. 持久化储存——DB
    数据库首当其冲,但本篇不讲这个。

  2. 域即域对象,简单来说就是可以储存数据的对象。

ServletContext

中文是Servlet上下文对象

作用空间:整个web应用
生命周期:在服务器一启动的时候就会创建。在服务器关闭的时候销毁。(所以不要随便用,不然“土豆”会炸)

  ServletContext context = this.getServletContext ();
//返回当前类(当然这个类就是一个Servlet)的上下文

在这里要注意一下,getServletContext ()这个方法本质是调用父类的config.getServletContext()

在当前HttpServlet类中:

   public ServletContext  getServletContext (){
       return getServletConfig().getServletContext ();
   }

在父类Servlet中:

   public ServletConfig getServletConfig() {
       return config;
   }

config字段接收于init()方法中,所以要用servletContext必须调用一次父类的init()方法
默认状况是会调用的,但是当子类重写init()方法后,就不会调用父类的了,所以要主动调用一下

在当前(子类)HTTPServlet中:

   public void init(ServletConfig config) {
       super.init(config);//为确保子类能得到上下文,必须调用把参数config传给父类
       servletContext context = config.getServletConfig();//得到上下文的本质方法
       syso("重写init方法,获取了servletContext "+context);
   }
*servletContext 使用:

可以在web.xml中配置一些全局变量:

  
      name
      EZeta
  
  • 取出全局变量
String value = context.getInitParameter("键名");
//对了,ServletContext是键值对储存
  • 获取web应用的某个资源绝对路径
context.getRealPath(String str);

上述方法返回web项目根目录绝对地址,返回的字符串会拼接上参数里面的内容,所以参数一般写文件名,就可以拿到web项目根目录下文件绝对地址。
注:web项目指的是已经部署好的(如eclipse的wtpwebapps/项目名,或者idea的out/项目名)

域对象三大方法

  • 写入
context.setAttribute(String name,Object value);
  • 取出
context.getAttribute(String name);
  • 删除
Context.removeAttribute(String name);

以上三个方法也适用于其他所有域对象

request域对象

作用空间:一次请求(一次Servlet调用)中
生命周期:也是一次请求

  • 获取请求行(学会)

    1. 获取请求方法
      String getMethod()

    2. 获取请求资源
      String getRequestURL()
      URL:获取该Javaweb项目的URL地址,这种方式比较安全、稳定。
      例:172.0.0.1:8080/项目/RequestServlet
      String getRequestURI()
      URI:只是获取该Javaweb项目的相对路径。
      例:项目/RequestServlet

    3. 获取应用名称(项目名称)
      String getContextPath()

    4. 获取get查询参数
      get查询参数:172.0.0.1:8080/项目/RequestServlet?name=ezeta&pwd=666
      指的就是‘?’后面的一串字符串
      String getQueryString()

  • 获取请求头(理解)

//1.获取所有的请求头名称
      Enumeration headerNames = request.getHeaderNames();
      while(headerNames.hasMoreElements()) {
          System.out.println("name = "+headerNames.nextElement());
      }
      //2.根据名称获取指定的头信息
      String header = request.getHeader("referer");
      System.out.println("referer  = "+ header);
              
      //3.打印所有的请求头和请求头内容
      Enumeration headerNames2 = request.getHeaderNames();
      while(headerNames2.hasMoreElements()) {
          //获取请求名称
          String name = headerNames2.nextElement();
          String value = request.getHeader(name);
          System.out.println(name +":"+value);
      }   
  • 获取请求体(重点)
//1.获取一个值
      String name =  request.getParameter("username");
      System.out.println(name);
      //2.获取多个值
      String[] parameterValues = request.getParameterValues("hobby");
      System.out.println(Arrays.toString(parameterValues));
      //3.获取所有请求参数名称
      Enumeration parameterNames = request.getParameterNames();
      while(parameterNames.hasMoreElements()) {
          System.out.println("name="+parameterNames.nextElement());
      }       
      //4.获取所有请求参数
      Map parameterMap = request.getParameterMap();
      //遍历所有请求参数名称与值
      for (Map.Entry entry: parameterMap.entrySet()) {
          System.out.println(entry.getKey());
          System.out.println(Arrays.toString(entry.getValue()));
      }

ps:response不是域对象

总结

  • JAVA有四大域对象:application(ServletContext)、request、session、page(pageContext)
  • 本篇已经讲了前两个,page在我写的(JSP-9大隐式对象中https://www.jianshu.com/p/5944a806750b
    )介绍过,session在(我写的会话技术https://www.jianshu.com/p/1333fb28baad
    )介绍过。
  • 这四个只所以是域对象,因为他们都定义了map字段并且支持(setAttribute()、getAttribute()、removeAttribute())方法。

你可能感兴趣的:(储存——域对象)