在JavaWeb的开发中,数据的储存是必不可少的。原因就不用说了
那么,常见的,或者说原生的储存方式有哪些,接下来就整理一下
- 持久化储存——DB
数据库首当其冲,但本篇不讲这个。 - 域
域即域对象,简单来说就是可以储存数据的对象。
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中配置一些全局变量:
<context-param>
<param-name>name</param-name>
<param-value>EZeta</param-value>
</context-param>
- 取出全局变量
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调用)中
生命周期:也是一次请求
获取请求行(学会)
获取请求方法
String getMethod()获取请求资源
String getRequestURL()
URL:获取该Javaweb项目的URL地址,这种方式比较安全、稳定。
例:172.0.0.1:8080/项目/RequestServlet
String getRequestURI()
URI:只是获取该Javaweb项目的相对路径。
例:项目/RequestServlet获取应用名称(项目名称)
String getContextPath()获取get查询参数
get查询参数:172.0.0.1:8080/项目/RequestServlet?name=ezeta&pwd=666
指的就是‘?’后面的一串字符串
String getQueryString()获取请求头(理解)
//1.获取所有的请求头名称 Enumeration<String> 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<String> 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<String> parameterNames = request.getParameterNames(); while(parameterNames.hasMoreElements()) { System.out.println("name="+parameterNames.nextElement()); } //4.获取所有请求参数 Map<String, String[]> parameterMap = request.getParameterMap(); //遍历所有请求参数名称与值 for (Map.Entry<String, String[]> 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大隐式对象中//www.greatytc.com/p/5944a806750b
)介绍过,session在(我写的会话技术//www.greatytc.com/p/1333fb28baad
)介绍过。 - 这四个只所以是域对象,因为他们都定义了map字段并且支持(setAttribute()、getAttribute()、removeAttribute())方法。