Cookie&&Session&&JSP

1.会话技术
就是浏览器和服务器的多次请求和响应
打开浏览器------>>访问------->>关闭 称之为一次会话
2.Cookie
是什么?
就是一个普通类
是客户端的会话管理技术
每次请求时,把会话信息带到服务器,从而实现多次请求的数据共享
作用:
客户端访问浏览器相关内容,保证每次从本地缓存取,提高效率
属性:
name cookie名称
Value cookie的值(不支持中文)
Path cookie路径
Domain cookie的域名
maxAge cookid存活时间
方法;
Cookie(String name,String value) 构造方法
属性对应的get和set方法 赋值和获取值
添加和获取:
添加: HTTPServletResponse
方法名 addCookie() 向客户端添加cookie 返回值为void
获取: HTTPServletRequest
方法名 getCookie() 获取所有cookie 返回值为cookie[]
Cookie使用细节
每个网站最多有20个cookie,大小不能超过4kb,所有网站不能超过300个
名称不能有字母,数字字符,逗号,分号,空格和$,不支持中文
存活时间限制 负整数: 当前会话有效
0: 立即清除
以秒为单位设置存活时间
访问路径限制
取自第一访问的资源路径前缀,只要以这个路径开头就能访问到,
设置路径:setPath()方法设置指定路径
3.Session
HTTPSession
服务端的会话技术
本质也采用客户端会话技术,是基于Cookie的
常用方法:
Getid() 获取唯一标识名称
Invalidate() 让session立即失效
基本使用:
getSession() 获取HTTPSession对象
getSession(boolean create) 获取HTTPSession对象,未获取到是否自动
4.Cookie和Session原理分析
(1)Cookie:当客户端发送一个请求,不会携带cookie,请求到达服务器,服务器可以给客户端设置一个Cookie,而共享数据保存在客户端,当下次再发请求会携带服务端设置给客户端的cookie
图解:
在这里插入图片描述
(2)Session:是基于Cookie的,会在客户端保存一个JSESSIONID特殊标识,而共享数据保存在服务器内存对象中,每次请求会将特殊标识带到服务器端,根据这个特殊标识,来找到内存空间,从而实现数据共享
图解:
在这里插入图片描述
5.Cookie和Session的区别
Session是基于Cookie的
Cookie可以理解为小甜点,它是在客户端保存共享数据的,保存共享的是不重要数据
Session可以理解为正餐,它是在服务器端保存共享数据的,保存共享重要数据
Cookie代码:

			  @WebServlet("/Cookie_Text")
public class Cookie_Text extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应乱码
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter pw = resp.getWriter();
        //获取所有Cookie
        Cookie[] cookies = req.getCookies();
        boolean isIFrst = true;
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                if ("lastTime".equalsIgnoreCase(cookie.getName())) {
                    //获取Cookie中为key为"lastTime"对应的value
                    String value = cookie.getValue();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String format = sdf.format(new Date(Long.parseLong(value)));
                    pw.write("欢迎访问本网站,您的最后访问时间为:<br>");
                    pw.write(format);
                    isIFrst = false;


                }
            }
        }
        if (isIFrst) {
            pw.write("欢迎访问本网站...");

        }
        //创建cookie对象,记录最后访问时间
        Cookie cookie = new Cookie("lastTime", System.currentTimeMillis() + "");
        //设置最大存活时间最大为秒
        cookie.setMaxAge(30);
        //响应cookie
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
第一次请求服务器不会携带cookie,第二次请求会有Cookie
		Session代码:
	@WebServlet("/SessionDemo01")
public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求用户名
        String username = req.getParameter("username");
        //获取Session对象
        HttpSession session = req.getSession();
        System.out.println(session.getId());
        //将用户名添加到session
        session.setAttribute("username",username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

		@WebServlet("/SessionDemo01bak")
public class SessionDemo01bak extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取session对象
        HttpSession session = req.getSession();
        System.out.println(session.getId());
        //获取共享数据
        Object username = session.getAttribute("username");
        resp.getWriter().write("username:"+username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

Demo01发起请求拿到username,并设置在Session域中,当Demo01bak发起请求时,会拿JSESSIONID特殊标识,去服务器端找到内存空间,从而拿到共享数据
6.HTTPSession的钝化和活化
钝化:在服务器正常关闭之前,将session对象系列化到硬盘上
活化:在服务器启动后,将session文件转化为内存中的session对象即可。
7.JSP动态网页技术标准(了解就行,企业级开发不用)
是一个特殊的Servlet,展示动态数据
执行流程分析如图:
在这里插入图片描述
基本语法:

	<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP基本语法</title>
</head>
<body>
<%--JSP注释--%>
<!--HTML注释-->

<%--java代码块--%>
<%
out.println("这是java代码块<br>");
    System.out.println("java控制台输出");
%>
<%--java表达式--%>
<%="这是JSP表达式"%>
<hr/>

<%--定义全局变量--%>
<%! String name = "张三";
static int num = 20;
public static void getNum(){}
%>

<% name = "李四";%>
<%=name%>
<%=num%>>
</body>
</html>
			
		
	

JSP的九大隐式对象
在这里插入图片描述
其中pageContext对象是jsp独有的对象,本身也是一个域对象,它还可以操作其他三个域对象的属性,还可以获取其他八个隐式对象,
声明周期:是一个局部变量,会随着JSP创建诞生,随着JSP消失而消失,每一个页面都有一个pageContext
8.四大域对象
(1)PageContext 页面范围的 最小只能在当前页面用
(2)ServletRequest 请求范围的 一次请求或当期请求转发用
(3)HTTPSession 会话范围 多次请求数据共享用
(4)ServletContext 应用范围 最大,整个应用都可以使用
四大域范围排序 (4)-------->>(3)--------->>(2)--------->>(1)
9.MVC模型
M:封装数据,数据模型
V:展示数据,动态JSP静态HTML页面
C:处理请求响应
浏览器-------发起请求----->>Servlet-----------处理请求,(转发,重定向)最后响应-------->>JSP------------处理好结果--------->>展示浏览器
10.结合以上知识 综合案例
流程分析:
index.jsp(用JSP技术判断域中有无用户登录信息,有可以跳转首页,没有,跳转登录页面)------------------->>login.jsp(登录表单,提交到Servlet功能类)----------->>LoginStudentServlet(没登录,重定向到登录页面,登录将用户信息保存在Session域中,并在indx.jsp中做判断)----------->>已登录(可选择添加和查看学生超链接)--------->>AddStudentServlet添加学生(跳转功能类)--------->>获取数据,保存到本地文件--------->>响应跳转到首页------->>ListStudentServlet查看学生(跳转功能类)------->>读取本地文件中的数据,封装对象,添加到集合中,再将集合对象设置在Session域中------------listStudent.jsp(重定向到JSP前端页面)---------->>从域中拿数据,解析,展示给客户端浏览器
代码如下:
(1)

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/2/1
  Time: 22:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>学生信息管理</title>
</head>
<body>
<% Object username = session.getAttribute("username");
    if (username == null) {
%>
<a href="<%pageContext.getServletContext();%>/qqq/login.jsp">请登录</a>
<%} else {%>
<a href="<%pageContext.getServletContext().getContextPath();%>/qqq/addStudent.jsp">添加学生</a>
<a href="<%pageContext.getServletContext().getContextPath();%>/qqq/listStudent">查看学生</a>
<%}%>
</body>
</html>

(2)

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/2/1
  Time: 22:13
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>学生登录</title>
</head>
<body>
<form action="/qqq/loginStudentServlet" method="post" autocomplete="off">
    账号:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <button type="submit">登录</button>
</form>

</body>
</html>

(3)

@WebServlet("/loginStudentServlet")
public class LoginStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取用户名密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //判断用户名是否为空
        if(username==null||"".equals(username)){
            //为空 重定向到登录页面
            resp.sendRedirect(req.getContextPath()+"/login.jsp");
        }else {
            //不为空,将数据保存到会话域中
            req.getSession().setAttribute("username",username);
        }
        //重定向到首页
        resp.sendRedirect(req.getContextPath()+"/index.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

(4)第二段代码
(5)添加学生

	@WebServlet("/addStudentServlet")
public class AddStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取参数信息
        String username = req.getParameter("username");
        String age = req.getParameter("age");
        String score = req.getParameter("score");
        //创建学生对象并赋值
        Student stu = new Student();
        stu.setUsername(username);
        stu.setAge(Integer.parseInt(age));
        stu.setScore(Integer.parseInt(score));
        //将学生对象保存到d:\\stu.txt文件中
        BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\stu.txt", true));
        //通过定时刷新响应给浏览器
        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write("添加成功,两秒后跳转首页...");
        resp.setHeader("Refresh","2;URL=/qqq/index.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

(6)查看学生

	@WebServlet("/listStudent")
public class ListStudent extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //关联要读取的文件
        BufferedReader br = new BufferedReader(new FileReader("d:\\stu.txt"));
        //创建集合对象保存Studnet对象
        ArrayList<Student> list = new ArrayList<>();
        //循环读取文件中的数据,将数据封装到Student对象中,再把多个学生对象添加到集合中
        String line;
        while ((line = br.readLine()) != null) {
            Student stu = new Student();
            String[] arr = line.split(",");
            stu.setUsername(arr[0]);
            stu.setAge(Integer.parseInt(arr[1]));
            stu.setScore(Integer.parseInt(arr[2]));
            list.add(stu);
        }
        //将集合对象保存到会话域中
        req.getSession().setAttribute("students",list);
        //重定向到学生列表页面
        resp.sendRedirect(req.getContextPath()+"/listStudent.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

(7)

<%@ page import="java.util.ArrayList" %>
<%@ page import="com.itheima.bean.Student" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/2/1
  Time: 23:13
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>查看学生</title>
</head>
<body>
<table width="600px" border="1px">
    <tr>
        <th>学生姓名</th>
        <th>学生年龄</th>
        <th>学生成绩</th>
    </tr>
    <% ArrayList<Student> students = (ArrayList<Student>) session.getAttribute("students");
        for (Student student : students) {
    %>
    <tr align="center">
        <td><%=student.getUsername()%>
        </td>
        <td><%=student.getAge()%>
        </td>
        <td><%=student.getScore()%>
        </td>
    </tr>
    <%}%>
</table>
</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值