Javaweb域对象
域对象
定义与概念
通过前面的文章,我们已经对Java web中的request,response已经很熟悉了,这两个对象也包含在我们的域对象。JavaWeb中常用的域对象有session,request,servletcontext,cookie,response。所有的域对象都有一个共同的实现的目的保存传递数据,所有的域对象存储的数据都是以key-value形式存储。正式通过域对象的这种目的,才架起来JavaWeb前后端数据交互的桥梁。
seesion与cookie
session域:用来在服务器端进行数据存储,通过session域可以轻松的实现浏览器与服务端的数据交流。session域因为存储在服务端,所以安全性较高。
session的作用范围是一个会话。session具有一个失效时间默认是30分钟,session一旦失效意味着一次浏览器与服务器会话的结束,session失
效发生的时机是一个会话长时间不存在任何交互(请求响应)。
cookie域:用于在浏览器端存储数据,数据安全性比较低。
session和cookie常作为以组组合来出现,通过seesion和cookie轻松的实现了一次会话的绑定。seesion拥有一个属性为sessionId,通过把sessionId存储到浏览器的cookie中就实现了会话的绑定机制,这种绑定机制浏览器与服务器已经帮我们完成实现,所以我们不需要手动去实现这种绑定。
seesion与cookie的使用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session对象(session对象只能通过HttpServletRequest 类获取,不能通过ServletRequest 获取)
HttpSession session = req.getSession();
//向 session域中存放数据
session.setAttribute("username", "stack");
//从session域中取数据
String username = (String) session.getAttribute("username");
//设置session会话时长 默认为三十分钟
session.setMaxInactiveInterval(60*30);
//session立即失效 - 退出登录
session.invalidate();
//获取cookie
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
//获取cookie值
String value = cookie.getValue();
}
//创建和设置cookie
Cookie cookie=new Cookie("username", "stack");
resp.addCookie(cookie);
}
上面我写出了几个常用的cookie和session的API,它们的api元远不这些,比如设置cookie 的domain域,是否只读,有效时间...
request和response
request: request请求域作用在浏览器向服务器的一次请求,作用域也就是一次请求,这次请求处理完成,request域也就随之失效。request最常见的作用就是用来进行参数传递和获取浏览器的信息。
response: response响应域作用在服务器对客户端的一次响应,作用域也就是一次响应过程,响应完成,response域也就完成了使命。response最常见的作用就是向浏览器响应数据。
说到了请求与响应,我在稍微提下请求和响应往下可以细分为请求头(浏览器一些信息),请求体(数据),响应头(响应的一些信息描述),响应体(数据或者视图)。我们在JavaWeb中用来通信的协议是无状态的http和https协议。
request与response的使用(常用api)
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求参数
String user = req.getParameter("user");
//获取请求域中数据
String username = (String) req.getAttribute("username");
//向请求域中写数据
req.setAttribute("username", "stack");
//获取请求头信息
String charset = req.getHeader("charset");
//获取cookie
Cookie[] cookies = req.getCookies();
//得到应用的web的上下文路径(http://localhost:8080/app->获取的就是/app):web项目的根路径
String contextPath = req.getContextPath();
//设置请求头
resp.setHeader("charset", "utf-8");
//设置返回json响应
PrintWriter writer = resp.getWriter();
writer.println("{'username','stack'}");
}
servletcontext
servletcontext对象被我们称之为web应用的上下文对象,听这名字我们也能很容易联想到他是保证我们整个web应用的练习,所以它的作用范围也就是整个web应用,我们可以利用他来做一些在线人数,web应用管理之类的功能
servletcontext的使用
//获取应用上下文对象
ServletContext servletContext = servletRequest.getServletContext();
//向域对象中存储数据
servletContext.setAttribute("personNum", 10);
//从域对象中获取数据
int personNum = (int) servletContext.getAttribute("personNum");
//得到应用的web的上下文路径(http://localhost:8080/app->获取的就是/app):web项目的根路径
String contextPath = servletContext.getContextPath();
图解域对象的作用范围
![](https://i-blog.csdnimg.cn/blog_migrate/cbc84113a5d278a2570cfaae8ac33c05.png)
在用域对象进行数据存储与传输时我们要选择满足要求情况下作用范围小的域。默认不指定访问域由小到大 request -> session -> servletContext
推荐阅读:(前端存储数据的可选方案)https://juejin.im/post/6844904193694646280