1、区别:
1.page指当前页面有效。只在当前这个jsp页面里有效
2.request 指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应的整个过程,存放在HttpServletRequest对象中。只要不进行下一个请求就都有效
3.Session是用户全局变量,在整个会话期间都有效。只要浏览器不关闭就一直有效(或者直到用户一直未活动导致会话过期,默认session过期时间为30分钟,或调用HttpSession的invalidate()方法)。存放在HttpSession对象中
4.application是程序全局变量,对每个用户每个页面都有效。存放在ServletContext对象中。它的存活时间是最长的,如果不进行手工删除,它们就一直可以使用
总结:当数据只需要在下一个forward(下一个跳转页面)有用时,用request就够了; 若数据不只是在下一个forward有用时,就用session。上下文,环境信息之类的,用application。
当EL表达式中的变量不给定范围时,则默认在page范围查找,然后依次在request、session、application范围查找。也可以用范围作为前缀表示属于哪个范围的变量,例如: p a g e S c o p e . u s e r i n f o 表 示 访 问 p a g e 范 围 中 的 u s e r i n f o 变 量 。 { pageScope. userinfo}表示访问page范围中的userinfo变量。 pageScope.userinfo表示访问page范围中的userinfo变量。{requestScope.userinfo}表示访问request范围中的userinfo变量
2 举例说明
1 page
page里的变量没法从index.jsp传递到test.jsp,只要页面跳转了,它们就不见了。
参考详解:https://jingyan.baidu.com/article/3aed632ed033d1701080910d.html
总之只在当前的页面有效,别的页面一律无效
2 request
request 指从http请求到服务器处理结束,返回响应的整个过程。在这个过程中使用forward方式跳转多个jsp。在这些页面里你都可以使用这个变量。
jsp如何将数据放在request作用域中?在jsp中把输入标签放到form标签里,然后体检form表单,自动就到request
后端如何将数据放在request域中呢
@RequestMapping("/hello1")
protected ModelAndView handleRequestInternal() {
ModelAndView mv = new ModelAndView();
mv.addObject("currentUser","admin");
mv.setViewName("hello");//设置要跳转的视图名也会通过视图解析器解析
return mv;
}
@RequestMapping("/hello2")
protected String hello2(HttpServletRequest request) {
request.setAttribute("currentUser","admin");
return "hello";//通过视图解析器调转到对应的hello.jsp页面
}
@RequestMapping("/hello3")
protected String hello3(Map<String,String> map) {
map.put("currentUser","admin");
return "hello";
}
前端页面如何取出放在request中的数据呢
1,el表达式:<% String test = request.getAttribute("test")%>
2,jstl:${test }或${requestScope.test}因为直接是默认先取request域中的数据,所以可以省略requestScope.
放在request中的值在后端中如何取出呢?
request.getAttribute("test");
3 session
session 有效范围当前会话,从浏览器打开到浏览器关闭这个过程。
session和application里的变量一直在累加,开始还看不出区别,只要关闭浏览器,再次重启浏览器访问这页,session里的变量就重新计算了。
可以直接在jsp页面中将我们要保留的值放入session域中
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method=POST action="Session.jsp">
请输入用户名: <input type=text name="name"> <input type=submit
value="提交信息">
</form>
<!-- session设置值 -->
<%
String name = request.getParameter("name");
session.setAttribute("name", name);
String names = (String) session.getAttribute("name");
%>
您的用户名是:<%=names%>
</body>
</html>
这时候这个name的值你就拿到了并放在了session中,便可以操作这个session回话了
后端如何将数据放入session中
public String login(String name,HttpServletRequest request,HttpServletResponse response,String remember)
{
request.getSession().setAttribute("name", name);
return ''login"
}
放在session中的值在前端中如何取出呢?
1,el表达式:<%String test = request.getSession().getAttribute("name") %>
2,jstl:${sessionScope.name }
放在session中的值在后端中如何取出呢?
request.getSession().getAttribute("name");
4 application
application的范围在服务器一开始执行服务,到服务器关闭为止。它的范围最大,生存周期最长。
如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。 整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。
application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。
cookie
cookie是存在浏览器文件中的数据,与浏览器相关
后端具体使用方法
//cookie的操作:
String str=genRandomString(4);
//写cookie(cookie的名称与值)
Cookie cookie=new Cookie("yanzhengma",str);
//过期时间
cookie.setMaxAge(10000);
//只允许服务端读取
cookie.setHttpOnly(true);
//保存cookie到客户端
response.addCookie(cookie);
// 设置生命周期为0,表示将要删除
cookie.setMaxAge(0);
// 执行添加后就从response里删除了
response.addCookie(cookie);
//读取cookie
Cookie[] cookies = request.getCookies();
for(Cookie ck:cookies){
System.out.println(ck.getName()+"="+ck.getValue());
}
前端如何取cookie中的数据