context: 作用域
作用域是在服务器运行阶段时在内存中开辟的空间, 用于存储当前的信息(数据)!
Request 请求作用域
- 生命周期 短暂
创建: 当客户端发出请求时服务器会为当前的请求开辟一块存储空间!
销毁: 当服务器返回响应时, 立即从服务器端销毁请求作用域!
- 常用方法
package com.javakc.web1.context;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(
name = "UserServlet",
urlPatterns = "/user.do",
loadOnStartup = 0
)
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从作用域中获取属性值
Object username1 = request.getAttribute("username");
System.out.println("第一次从请求作用于获取属性:" + username1);
//向作用域中写入属性值
request.setAttribute("username", "admin");
//从作用域中获取属性值
Object username2 = request.getAttribute("username");
System.out.println("第二次从请求作用于获取属性:" + username2);
//从作用域中移除属性
request.removeAttribute("username");
//从作用域中获取属性值
Object username3 = request.getAttribute("username");
System.out.println("第三次从请求作用于获取属性:" + username3);
}
}
运行结果:
第一次从请求作用于获取属性:null
第二次从请求作用于获取属性:admin
第三次从请求作用于获取属性:null
- 使用场景
涉及到数据量较为庞大
临时性数据
ServletContext 应用作用域
- 生命周期
创建: 在服务器启动阶段时, 创建一个全新的应用作用域空间, 用于该应用中数据共享!
销毁: 在服务器关闭阶段时, 销毁应用作用域!
- 常用方法
package com.javakc.web1.context;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(
name = "UserServlet",
urlPatterns = "/user.do",
loadOnStartup = 0
)
public class UserServlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取应用作用域
ServletContext context = request.getServletContext();
//从应用作用域获取属性
Object username1 = context.getAttribute("username");
System.out.println("第一次从请求作用于获取属性:" + username1);
//向应用作用域中写入属性
context.setAttribute("username", "admin");
//从应用作用域获取属性
Object username2 = context.getAttribute("username");
System.out.println("第二次从请求作用于获取属性:" + username2);
//从应用作用域中移除属性
context.removeAttribute("username");
//从作用域中获取属性值
Object username3 = context.getAttribute("username");
System.out.println("第三次从请求作用于获取属性:" + username3);
}
}
运行结果:
第一次从请求作用于获取属性:null
第二次从请求作用于获取属性:admin
第三次从请求作用于获取属性:null
- 应用场景
适合共享的数据
不适合临时性数据,隐私性数据
Session 会话作用域
- 生命周期
创建: 在用户需要存储查询隐私性的内容时候, 动态创建会话作用域!
package com.javakc.web1.context;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(
name = "UserServlet",
urlPatterns = "/user.do",
loadOnStartup = 0
)
//会话作用域创建
public class UserServlet3 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.假如客户端没有携带凭证(cookie), 服务器会创建全新的会话作用域
//2.假如客户端携带了凭证(cookie), 服务器会获取之前创建过会话作用域
HttpSession session1 = request.getSession();
HttpSession session2 = request.getSession(true);
//1.假如客户端没有携带凭证(cookie), 服务器会返回null
//2.假如客户端携带了凭证(cookie), 服务器会获取之前创建过会话作用域
HttpSession session3 = request.getSession(false);
//判断会话作用域是否是新创建的
HttpSession session4 = request.getSession();
System.out.println(session4.isNew());
System.out.println(session4.getId());
}
}
销毁
- 全局会话销毁方式 保证服务器不会出现内存溢出
web.xml
<session-config>
<!--单位: 分钟,一般取值: 30-60-->
<session-timeout>30</session-timeout>
</session-config>
- 单独销毁 立即销毁
package com.javakc.web1.context;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(
name = "LogoutServlet",
urlPatterns = "/logout.do",
loadOnStartup = 0
)
//会话作用域销毁
public class UserServlet4 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
//单独销毁,立即销毁
if (null != session) {
//立即销毁
session.invalidate();
}
}
}
- 单独销毁 计时销毁
package com.javakc.web1.context;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(
name = "LogoutServlet",
urlPatterns = "/logout.do",
loadOnStartup = 0
)
//会话作用域销毁
public class UserServlet4 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
//单独销毁,计时销毁
if (null != session) {
//倒计时十分钟后销毁
session.setMaxInactiveInterval(60 * 10);
}
}
}