Cookie和Session,JSP,JSP和EL表达式
会话
**会话:**用户打开了一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器的过程
有状态会话:带着用户身份进行会话
网站怎么标识用户的身份?
- 服务端给客户端一个cookie,客户端下次访问服务端带上cookie
- 服务器登记cookie,下次cookie来匹配用户
保存会话的两种技术
Cookie
-
客户端技术(响应和请求)
源码分析
public class Cookie implements Cloneable, Serializable { //这个类可以被克隆 private final String name; private String value; //设置键值对 private int maxAge = -1; //cookie保存的时间 private String domain; //cookie的作用域
应用:返回用户上一次访问的时间
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//保存用户上一次访问的时间
PrintWriter out = resp.getWriter();
//可能存在多个cookie
Cookie[] cookies = req.getCookies();
/* 判断cookie是否存在
如果cookie存在获取cookie的名字,并与名字比对,返回value
*/
if (cookies!=null)
{
out.write("你上一次访问的时间是:");
for (int i = 0; i <cookies.length; i++)
{
Cookie cookie=cookies[i];
if ("lastLoginTime".equals(cookie.getName()))
{
//时间戳转换
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(String.valueOf(date));
}
}
}
else
{
out.write("这是你第一次访问");
}
//响应的cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
resp.addCookie(cookie);
}
cookie.setMaxAge(24*60*60);//cookie有效期为一天
- 从请求中拿到cookie信息
- 服务器响应cookie信息
cookie一般会保存在本地用户目录下的Appdata文件夹下
cookie是否存在上限?
- 一个Cookie只能保存一个信息
- 一个web站点可以给浏览器访问多个cookie,最多存放20个cookie
- 浏览器上限大概三百个
- Cookie大小最大为4kb
删除cookie
- 不设置有效期,自动失效
- 设置有效期时间为0,响应后立刻删除
中文数据传递
URLDecode.decode编码
URLEncoder.encode解码
Session
- 服务器保存用户的会话信息,给每一个用户创建一个Session对象
- 把用户的信息和数据放在Session中
- 一个Session独占一个浏览器,浏览器没有关闭,Session就存在
使用场景
- 网站登录后,第二次访问不需登录
- 用户登录后,整个其他网站都可以访问对应权限
- 购物车信息
- 在整个网站中经常会使用的数据,放进Session中
Session源码分析
public interface HttpSession { //接口
long getCreationTime(); //得到Session创建的时间
long getLastAccessedTime();
String getId(); //获得唯一的标识符
ServletContext getServletContext(); //获得全局Servlet对象
void setMaxInactiveInterval(int var1);
int getMaxInactiveInterval();
void setAttribute(String var1, Object var2);//设置一个键值对
boolean isNew(); //判断是否最新的session
void invalidate(); //Session的注销
//得到SESSION
HttpSession session = req.getSession();
session.setAttribute("lyc","6666");
//获取Session的ID
String id = session.getId();
//判断Session是不是新创建的
if (session.isNew()){
resp.getWriter().write("Session创建成功");
}
//手动注销Session
session.invalidate();
//实质上,Session创建的时候做了什么事情:
Cookie cookie = new Cookie("JSESESSIONID",id);
resp.addCookie(cookie);
<!--web.xml中可以配置Session的过期时间,会话自动过期-->
<session-config>
<!--以分钟作为单位-->
<session-timeout>1</session-timeout>
</session-config>
Session和Cookie的区别
- Session的键值对更加强大,可以存放对象
- 可以用于共享数据,避免ServletContext爆炸
- Cookie是把用户的数据写给用户的浏览器,是用户浏览器保存
- Session把用户的数据写到用户独占Session中,服务端保存,只保存重要的信息
- Session对象由服务创建,失效一个Session,服务器会自动生成一个新的Session
JSP
是什么
Java Server Pages:java服务器端页面,用于开发动态web
最大特点
写jsp像在写html,jsp可以嵌入java代码,为用户提供动态数据
JSP原理
-
tomcat服务器内部work文件夹中
idea使用Tomcat会在IDEA的文件夹中产生tomcat目录
-
jsp本质上是一个servlet
-
继承Http
-
源码分析
-
访问jsp页面,web容器将jsp页面转换为java文件,然后编译成class文件返回web容器
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage //本质是一个sevlet public void _jspInit() //jsp初始化 public void _jspDestory() //jsp销毁 public void _jspService(HttpServletRequest request,HttpServletResponse response) throws java.io.IOException,javax.Servlet.ServletException //jsp服务
JSP功能
-
判断请求
-
内置对象(可以在jsp页面直接使用,不需要从servlet中获得)
pageContext //页面上下文对象 Session =null //session对象 applicaitonContext//应用对象 config //配置 out //输出对象 page //代表当前页 request //请求 response //响应
-
在jsp页面中:java代码会原封不动的输出,html代码会被转为out.write输出
JSP基础语法
JSP表达式
<%--
jsp表达式,输出到客户端
格式:<%=变量或表达式> 或 ${i} el表达式
--%>
<%=new java.util.Date()%> = ${new java.util.Date()}
<%--
jsp脚本片段
格式:<%%>
--%>
<%
for (int i = 0; i <10 ; i++) {
i++;
}
%>
脚本代码的再实现,嵌入html元素
<%--
在代码中嵌入HTML元素
--%>
<%
for (int i = 0; i <10 ; i++) {
%>
<h1>helloworld</h1>
<%
}
%>
JSP声明
会被编译到JSP生成的java类中,并不是编译到_jspservice()方法中
<%!
%>
JSP的注释不会出现在html源文件中
JSP指令
<%@ page errorPage="error.jsp" %>
<%@page import="Cookiedemo1" %>
<%@page isErrorPage="true" %> <%-- 显式声明为错误页面--%>
<%@include file="error.jsp"%> 引用为公用头部 头部可以是不完整的jsp文件
<%--jsp 标签--%>
<jsp:include page="error.jsp"/>
include标签会把内容都取出来,放在要访问的jsp文件中
jsp标签会新建一个页面拼接,以请求的方式放在访问的jsp文件中
JSP内置对象和作用域
pageContext //页面上下文对象 存东西
Session =null //session对象 存东西
applicaitonContext//应用对象 存东西
config //配置 =ServletConfig
out //输出对象
page //代表当前页
request //请求 存东西
response //响应
- 它们的作用域不一样
- PageContext 保存的数据只在一个页面中有效
- request 保存的数据只在一次请求中有效,请求转发会携带这个数据
- session 保存的数据只在同一个session有校
- application 保存的数据只在服务器中有效,从打开服务器到关闭服务器
<%
pageContext.setAttribute();
request.setAttribute();
session.setAttribute();
application.setAttribute();
%>
<%--通过寻找的方式来查找数据--%>
<%
//寻找的方式是从底层到高层(作用域)
//先找page,再找request,再找session,找不到就找application
String name1 = (String) pageContext.findAttribute("name1");
%>
源码分析
public abstract class PageContext extends JspContext {
public static final int PAGE_SCOPE = 1;
public static final int REQUEST_SCOPE = 2;
public static final int SESSION_SCOPE = 3;
public static final int APPLICATION_SCOPE = 4;
public abstract void setAttribute(String var1, Object var2, int var3);
pageContext实现转发
pageContext.forward("/index.jsp");
一般作用
request:客户端向服务器发送请求产生的数据,用户看完就没用的
Session:用户用完一会还有用:比如购物车;
application:用户用完,其他用户还能用
JSP标签,JSTL标签,EL表达式
EL表达式
${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
jsp标签
<jsp:include page="error.jsp"/>
<jsp:forward page="error.jsp">
<jsp:param name="name" value="lyc"/>
</jsp:forward>
JSTL标签
不学了,太多了,生气了。