网页左边,向下滑有目录索引,可以根据标题跳转到你想看的内容 |
一、Cookie
会话 |
浏览器第一次给服务器发请求时,会话建立,直到某一方断开,会话结束 |
一次会话中包含多次请求和响应 |
作用:一次会话的生命周期范围内,共享数据 |
会话方式 |
客户端会话技术:Cookie |
服务器端会话技术:Session |
使用步骤 |
1、创建Cookie对象,绑定数据,new Cookie(String name,String value) |
2、服务器发送Cookie对象给前端,response.addCookie(Cookie cookie) |
浏览器获取Cookie,之后生命周期内发送请求会携带Cookie信息 |
3、获取Cookie,拿数据 |
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是dome1Get");
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("name", "value");
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是dome2Post");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是dome2Get");
Cookie[] cookies = req.getCookies();
if(cookies != null){
for(Cookie cookie : cookies){
String name = cookie.getName();
String value = coo kie.getValue();
System.out.println("Cookie信息"+name+" "+value);
}
}
}
细节 |
1、可以同时发送多个cookie对象,创建多个然后多次调用response.addCookie()方法发送cookie |
2、默认情况下Cookie存在浏览器内存中,浏览器关闭,cookie失效清空 |
3、cookie可以存储中文,tomcat8之前不能直接存储中文,需要将中文数据转码,一般采用URL编码,tomcat8之后,支持直接存储中文数据 |
4、默认情况下,多个web项目不能共享cookie,可以通过setPath(String path)设置cookie的获取范围,默认情况下,设置当前的虚拟目录 |
特点 |
cookie数据存储在客户端 |
浏览器对单个cookie的大小(一般最大4kb左右)和同域名下cookie总数量(一般最大20个)有限制 |
设置cookie失效时间,持久化存储 |
setMaxAge(int seconds):seconds是正数表示将cookie数据写到硬盘文件中,数据可以存活的时间,30就是30秒。负数就是默认值。零表示删除cookie信息 |
案例 |
访问一个servlet,如果是第一次访问,提示您好,欢迎首次访问 |
如果不是第一次访问,提示,欢迎回来,您上次访问时间是:… |
做法很简单,在客户端存储一个cookie信息,保存访问时间,当用户访问servlet时,我们获取cookie没有就提示首次访问,并保存cookie,有就获取cookie信息,显示上次访问时间,并替换cookie信息为用户这次访问时间 |
package com.yzpnb.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/dome1")
public class Dome1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是dome1Get");
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
String format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());
format = URLEncoder.encode(format, "utf-8");
Cookie info = new Cookie("info", format);
info.setMaxAge(60*60*24*30);
boolean flag = true;
Cookie[] cookies = req.getCookies();
if(cookies!=null && cookies.length > 0){
for (Cookie cookie:cookies) {
if("info".equals(cookie.getName())){
String value = cookie.getValue();
value = URLDecoder.decode(value,"utf-8");
resp.getWriter().write("欢迎回来,您上次访问时间是"+value);
flag = false;
}
}
}
if(flag){
resp.getWriter().write("您好,欢迎首次访问:首次访问时间"+URLDecoder.decode(format,"utf-8"));
}
resp.addCookie(info);
}
}
二、JSP快速入门
jsp就是一个Servlet,它为了简化代码书写,让我们可以像写html一样编写jsp文件,最终它会将jsp页面转换为java代码
jsp脚本 |
<% 代码 %>:在这里的代码,最终会转到service方法中,也就是service中可以写什么,这里就可以写什么 |
<%! 代码 %>:在这里的代码,是用来定义成员的,最终会直接转到Servlet中,比如定义成员变量,成员方法 |
<%= 代码 %>:这里的代码,是用来输出的,最终会直接转到Servlet中,用来动态输出数据 |
jsp内置对象 |
因为jsp是一个Servlet,所以我们在类中定义的方法对象,可以在jsp中直接使用,比如其中定义了一个out对象,此对象封装着response的输出对象,这就是一个内置对象,可以直接在jsp中使用,一共9个,这里简单介绍3个 |
response:就是Servlet的响应体对象 |
request:Servlet的请求体对象 |
out:将数据输出到页面上,字符输出流对象,和response.getWriter()类似,out写在哪里,就会在哪里输出,但是因为response响应优先级高,所以response的响应都会优先,会打乱我们页面元素顺序,所以使用out来输出数据到页面 |
三、Session
Session |
服务器端的会话技术,在一次会话的多次请求间共享数据,将数据保存到服务器的对象HttpSession 中 |
上面的set-cookie信息第一次是在响应头中的,之后不会存到客户端,而是在请求头中继续存在
特点 |
存储一次会话,存在与服务端 |
可存储任意类型,任意大小数据 |
session存储到服务端,cookie存到客户端 |
session没有数据大小限制,cookie有 |
session数据安全,cookie相对不安全 |
细节 |
客户端关闭后,服务端不关闭,两次获取的session不是同一个(默认情况下不是),如果想要相同,可以创建名为JSESSIONID 值为session对象id(session.getId() ;)的cookie对象,然后设置失效时间,添加到响应体中,这样就可以两次请求到相同session对象了 |
客户端不关闭,服务端关闭,两次获取的session对象不是同一个,因为服务端关闭,内存被释放,session就销毁了,解决办法就是session对象不同,但是数据不可丢失 ,这就涉及到session的钝化(服务端正常关闭之前将session数据保存到硬盘) 和session的活化(服务端启动之后将保存的session转化为内存中的session对象) ,这两件事tomcat自动帮我们完成(注意,使用开发工具正常关闭tomcat不管用,必须打war包等方法部署,tomcat才做这件事) |
session的销毁,服务器关闭全部销毁,session对象调用invalidate()方法自动销毁,session默认失效时间是30分钟,可以改web.xml配置修改模式时间(< session-config>标签中修改即可) |
HttpSession |
和request域一样,session域也有以下方法 |
object getAttribute(String name):域中获取指定键对应的值 |
void setAttribute(String name,Object value):域中添加键值对 |
void removeAttribute(String name):域中移除指定键 |
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.setAttribute("sessionMsg","oneSession");
resp.sendRedirect("dome2");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是dome2Get");
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
Object sessionMsg = session.getAttribute("sessionMsg");
resp.getWriter().write("session数据为"+sessionMsg);
}