1.Session、Cookie
会话:用户通过浏览器,访问web资源,关闭浏览器,此过程称之为会话。
为什么需要使用会话技术?
因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器 记住客户端状态(区分客户端)
会话技术有两种:Cookie和Session
Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端 可以清除cookie
Session:将数据存储到服务器端,安全性相对好,增加服务器的压力
cookie简单实例,在一个Servlet的doGet方法中
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 服务器
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
// 创建文本输出流打印对象
PrintWriter writer = resp.getWriter();
// 从客户端获取cookie
Cookie[] cookies = req.getCookies();
writer.write("您上一次的访问时间是:");
// 判断客户端是否有cookie
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
//获取客户端传递的cookie对象数组
Cookie cookie = cookies[i];
//获取自己想要的cookie对象
if (cookie.getName().equals("lastLoginTime")) {
long lan = Long.parseLong(cookie.getValue());
Date date = new Date(lan);
writer.write(date.toString());
}
}
} else {
// 首次访问
writer.write("欢迎您");
}
// 服务器给客户端分配一个cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
// 自定义cookie的有效期
//cookie.setMaxAge(24 * 60 * 60);
resp.addCookie(cookie);
}
一个网站是否存在上限:
一个cookie只能保存一个信息
一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
Cookie大小有限制4kb
300个cookie是浏览器上限
删除cookie
不设置有效期,关闭浏览器时自动删除
有效期设置为0,相当于删除cookie
Cookie常用的方法:
//创建cookie
Cookie cookie = new Cookie("name", URLEncoder.encode("星仔", "utf-8"));
//获取客户端的cookie
Cookie[] cookies = req.getCookies();
//设置cookie的有效期
cookie.setMaxAge(24 * 60 * 60);
//设置cookie的携带路径
cookie.setPath(String path);
//向客户端发送cookie
resp.addCookie(Cookie cookie);
2.Session回话
Session技术是将数据存储在服务器端的技术,会为每一个客户端都创建一个内存空间存储客户端的数据,但是客户端需要每次携带一个标识去服务器寻找自己的内存空间,所以Session是基于Cookie实现的,Session需要借助Cookie存储客户端唯一标示JSESSIONID
session主要的问题:
1.怎样获得属于本客户端的session对象(内存区域)?
2.怎样向session中存取数据(session也是一个域对象)?
3.session对象的生命周期?
session的简单使用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
// 创建session
HttpSession session = req.getSession();
// geiSession中存储东西
session.setAttribute("name", "星仔");
// 获取Session的ID
String id = session.getId();
// 判断session是不是新创建的
if (session.isNew()) {
resp.getWriter().write("session成功创建" + id);
} else {
resp.getWriter().write("session:" + id);
}
}
http包中的信息:
session与cookie的区别
1.Cookie是把用户数据写给用户的浏览器,客户端保存数据
2.Session把用户数据写到独占的Session中,服务器端保存
3.Session对象由服务器创建
Session使用场景:
保存一个登录用户的信息、购物车信息
常用的方法
// 创建session
HttpSession session = req.getSession();
// geiSession中存储自定义的数据
Person person = new Person("星仔", 25);
session.setAttribute("name", person);
// 获取Session的ID
String id = session.getId();
//获取session
HttpSession session = req.getSession();
//将自定义的数据放在session域中,使用session进行获取
Person person = (Person) session.getAttribute("name");
System.out.println(person.getName() + person.getAge());
//删除session域中的数据信息
session.removeAttribute(String name);
// session注销
session.invalidate();
常见面试题:
Session的生命周期:
创建:第一次执行request.getSession()时创建
销毁:
1.服务器关闭时销毁
2.设置session的过期时间
3.手动销毁session session.invalidate();
session的作用范围:
默认在一次会话中,一次会话中任何资源公用一个Session对象
<session-config>
<session-timeout>30</session-timeout>
</session-config>
前面的问题已经可以回答了:
问题1.怎样获得属于本客户端的session对象(内存区域)?
HttpSession session = req.getSession();
问题2.怎样向session中存取数据(session也是一个域对象)?
// geiSession中存储自定义的数据
Person person = new Person(“星仔”, 25);
session.setAttribute(“name”, person);//获取信息
erson person = (Person) session.getAttribute(“name”);
//删除数据
session.removeAttribute(String name);
问题3.session对象的生命周期? 见上面(何时创建?何时销毁?作用范围?)
3.JSP技术
java Server pages:java服务端页面,和Servlet一样,用于动态web技术
jsp脚本:
<%java代码%> 内部的java代码翻译到service方法内部
<%=java变量或表达式%> 会被翻译到service方法内部out.print();
<%!java代码%> 会被翻译成servlet的成员的内容
jsp注释:不同的注释可见范围是不同的
1.使用html的注释:<!–注释–> 可见范围jsp源码、翻译后servlet、页面html源码
2.使用java的注释://注释 /*多行注释*/ 可见范围jsp 翻译后的servlet
3.jsp注释:<%–注释–%> 可见范围 jsp源码可见
jsp的本质就是servlet (jsp运行原理)
jsp在第一次被访问时会被Web容器翻译成servlet。
第一次访问—->helloServlet.jsp—->helloServlet_jsp.java—->编译运行
Eclipse查看自己项目编译后的jsp文件转换成的java源码,其放置路径
\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\自己的项目名\org\apache\jsp
idea只不过jsp源码位置
C:\Users\Administrator\.IntelliJIdea2018.2\system\tomcat\Unnamed_ideaproject\work\Catalina\localhost\JavaWeb\org\apache\jsp
例如:index.jsp被翻译成一个Servlet
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
//逻辑代码
}
jsp被翻译为Servlet后其中的方法有:
//jsp的初始化方法
public void _jspInit() ;
//jsp的service方法
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response);
//jsp的Destory方法
public void _jspDestroy() ;
jsp被翻译后,内置的对象有:(9大内置对象)
final javax.servlet.jsp.PageContext pageContext;//上下文对象
javax.servlet.http.HttpSession session = null;//session
final javax.servlet.ServletContext application;//applicationContext
final javax.servlet.ServletConfig config;//config
javax.servlet.jsp.JspWriter out = null;//out
final java.lang.Object page = this;//page
//还有service方法传入的request对象和response对象
//HttpServletRequest request;HttpServletResponse response;
jsp被翻译后,输出页面的增加的代码有:
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
在jsp中的java代码和html代码进行分开输出
jstl、EL表达式:导入maven的依赖
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
导入jstl便签库的头:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
引入是如果出错为JSTL解析错误,将jstl的包和stand的jar包放在tomcat中的lib中。
javaBean:java的实体类,便于与关系型数据库做映射
有特定的写法:
必须有无参构造函数
属性必须私有化
必须有对象的get/set方法