Tags:黑马Java->JavaWeb->Session
JSP入门
概念:
Java Server Pages: java服务器端页面
- 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
- 用于简化书写!!!
原理
- JSP本质上就是一个Servlet(一个Java类要想被外界访问到必须是一个Servlet)
比如在jsp中写如下代码
对应的java中文件会做如下操作
JSP的脚本:JSP定义Java代码的方式
-
<% 代码 %>
:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。 -
<%! 代码 %>
:定义的java代码,在jsp转换后的java类的成员位置。(这种用的比较少,因为Servlet里尽量不要定义成员变量以避免引发线程安全问题) -
<%= 代码 %>
:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
JSP的内置对象:
- 在jsp页面中不需要获取和创建,可以直接使用的对象
- jsp一共有9个内置对象。
- 这里先列举3个:
- request
- response
- out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
- response.getWriter()和out.write()的区别:
在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
-
response.getWriter()数据输出永远在out.write()之前
- response.getWriter()和out.write()的区别:
案例:用JSP写记录访问时间
<%@ page import="java.net.URLDecoder" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
主页
<%
//1.获取所有Cookie
Cookie[] cookies = request.getCookies();
boolean flag = false;//没有cookie为lastTime
//2.遍历cookie数组
if(cookies != null && cookies.length > 0){
for (Cookie cookie : cookies) {
//3.获取cookie的名称
String name = cookie.getName();
//4.判断名称是否是:lastTime
if("lastTime".equals(name)){
//有该Cookie,不是第一次访问
flag = true;//有lastTime的cookie
//响应数据
//获取Cookie的value,时间
String value = cookie.getValue();
// System.out.println("解码前:"+value);
//URL解码:
value = URLDecoder.decode(value,"utf-8");
// System.out.println("解码后:"+value);
%>
欢迎回来,您上次访问时间为:<%=value %>
<%
//设置Cookie的value
//获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
System.out.println("编码前:"+str_date);
//URL编码
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date);
cookie.setValue(str_date);
//设置cookie的存活时间
cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
response.addCookie(cookie);
break;
}
}
}
if(cookies == null || cookies.length == 0 || flag == false){
//没有,第一次访问
//设置Cookie的value
//获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
System.out.println("编码前:"+str_date);
//URL编码
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date);
Cookie cookie = new Cookie("lastTime",str_date);
//设置cookie的存活时间
cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
response.addCookie(cookie);
%>
您好,欢迎您首次访问
<%
}
%>
Session
概念
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
快速入门:
- 获取HttpSession对象:
HttpSession session = request.getSession();
- 使用HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
原理
-
Session的实现是依赖于Cookie的
细节
当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
- 默认情况下。不是。
- 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
@WebServlet("/sessionDemo3") public class SessionDemo3 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取session,像下面那样借助Cookie保存后,会根据id自动寻找id相同的session HttpSession session = request.getSession(); System.out.println(session); //期望客户端关闭后,session也能相同 Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60); response.addCookie(c); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
- 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作:
- session的钝化(保存):
- 在服务器正常关闭之前,将session对象系列化到硬盘上
- session的活化(读取):
- 在服务器启动后,将session文件转化为内存中的session对象即可。
这两项工作Tomcat帮我们自动完成了,IDEA只是钝化了,活化会失败,但是没有关系,因为我们将来部署项目不会在IDEA本地部署,都是在Tomcat服务器里边
session什么时候被销毁?
- 服务器关闭
- session对象调用invalidate() 。
- session默认失效时间 30分钟
30
session的特点
- session用于存储一次会话的多次请求的数据,存在服务器端(比如重定向的共享数据)
- session可以存储任意类型,任意大小的数据
session与cookie的区别:
- session存储数据在服务器端,cookie在客户端
- session没有数据大小限制,cookie有;session能存任意类型,cookie只能存字符串
- session数据安全,cookie相对于不安全