day04——Cookie和Session

Cookie

Cookie概述

Cookie是由服务端创建,由若干个键值对组成的数据,并且随着响应以文件的形式将Cookie数据保存在客户端本地。当浏览器再次访问服务器时会携带Cookie数据,从而实现多次请求的数据共享。

在这里插入图片描述

Cookie常见的属性

属性名作用
nameCookie名称
valueCookie的值
pathCooke的路径
domainCookie的域名
maxAgeCookie的存活时间
versionCookie的版本号
commentCookie的描述信息

Cookie细节

1. 一次可不可以发送多个cookie?  
    答:可以,使用response调用多次addCookie方法发送即可。

2. cookie在浏览器中保存多长时间?
    答:默认情况下,当浏览器关闭后,Cookie数据被销毁。
    如果需要持久化存储:
        setMaxAge(int seconds)
        	正数:指定cookie存活时间,时间到后,cookie文件自动失效
            负数:默认值
            零:删除cookie信息

3. Cookie能不能存储中文?
    答:可以存中文,但是需要采用URL编码进行存储
    //"中文" URL编码---> %E4%B8%AD%E6%96%87
    String encode = URLEncoder.encode("中文","utf-8");
    //"%E4%B8%AD%E6%96%87" URL编码---> "中文"
    String decode = URLDecoder.decode(encode, "utf-8");

4. Cookie共享问题
    1. 同一个Tomcat容器中部署多个Web项目,Cookie能在多个Web项目中共享吗?
        答: 默认情况下cookie不能共享。
        但是可以通过setPath(String path) 设置Cookie的访问范围,默认情况下,设置当前的虚拟目录。
        * 如果需要共享,可以将path设置为"/" 

    2. 不同的tomcat服务器间cookie能共享吗?
        答:也是可以的,但是需要设置访问域名。
        setDomain(String path)
            如果设置一级域名相同,那么多个服务器之间cookie可以共享
        setDomain(".baidu.com")
            那么tieba.baidu.com和news.baidu.com中cookie可以共享

Cookie案例

在浏览器中访问http://localshot/day04_servlet/cookieDemo3,要求如下

  • 如果是第一次访问,显示 【欢迎光临,第一次访问此页】
  • 如果是第二次访问,显示 【欢迎回来,上一次的访问时间为 yyyy年MM月dd日 xx:mm:ss】
@WebServlet("/cookieDemo3")
public class CookieDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应编码
        resp.setContentType("text/html;charset=utf-8");
        //设置请求编码
        req.setCharacterEncoding("utf-8");

        //获取当前系统时间,并格式化
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String lasttime = sdf.format(new Date());

        //获取Cookie数据
        Cookie[] cookies = req.getCookies();

        //获取指定名称的cookie
        Cookie cookie = getCookie(cookies, "lasttime");

        if (cookie == null) {
            resp.getWriter().println("第一次访问本网站,当前访问时间:" + lasttime);
            cookie = new Cookie("lasttime", URLEncoder.encode(lasttime));
            cookie.setMaxAge(30); //设置存活时间为30秒
            resp.addCookie(cookie);
        } else {
            //获取上一次访问的时间
            resp.getWriter().println("欢迎回来,上一次访问的时间:" + URLDecoder.decode(cookie.getValue()));
            cookie.setValue(URLEncoder.encode(lasttime));
            resp.addCookie(cookie);
        }
    }



    //查找指定名称的Cookie
    private Cookie getCookie(Cookie[] cookies, String name) {
        //查找是否有名称lasttime的Cookie
        Cookie cookie = null;
        if (cookies != null) {
            for (int i = 0; i < cookies.length; i++) {
                if (name.equals(cookies[i].getName())) {
                    cookie = cookies[i];
                    break;
                }
            }
        }
        return cookie;
    }


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

Session

Session概述

Session是依赖于Cookie的,如图所示当客户端第一次请求服务端时没有Cookie,会在内存中创建一个Session对象并把sessionid通过Cookie存起来发给客户端;当客户端再次请求服务器时,会携带者sessionid到服务端找到对应的Session对象,以此来实现多次请求在服务端的数据共享。

Session方法

public HttpSession getSession();
	获取HttpSession
public Object getAttribute(String name)  
    获取Session值
public void setAttribute(String name, Object value)
    设置Session值
public void removeAttribute(String name)
	移除Session值

Session案例

在SessionDemo1中使用Session存储数据,在SessionDemo2中获取数据

@WebServlet("/sessionDemo1")
public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Session对象
        HttpSession session = req.getSession();
        //把用户名存入Session对象中
        Object username = session.getAttribute("username");
        session.setAttribute("username","zhangsan");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
@WebServlet("/sessionDemo2")
public class SessionDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Session对象
        HttpSession session = req.getSession();
        //获取Session值
        String username = (String) session.getAttribute("username");
        resp.getWriter().println("<h1>"+username+"</h1>");
    }

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

JSP页面

JSP概述

JSP(全称Java Server Pages),是一种动态网页开发技术。它既可以使用HTML标签来写页面,也可以写Java代码。其本质就是一个Servlet。

  • 下面是一个jsp页面的访问过程
1. 当客户端发送请求访问服务端的`index.jsp`页面
2. 服务器内部会把`.jsp`文件翻译成`.java`文件
3. 再编译`.java`文件生成`.class`文件,
4. 由字节码完成请求与响应的操作(其实这个字节码就是Servlet)

在这里插入图片描述

JSP语法

  • JSP注释
<%--这是注释--%>
  • JSP语法

因为JSP本质上就是一个Servlet类,而我们使用Servlet的时候,其实就是对Servlet的service方法进行复写然后对请求和响应作出处理。

<%--定义成员变量--%>
<%! int num=10;%>

<%--定义局部变量--%>
<% int num=20; %>

<%--输出语句,往浏览器输出--%>
<%="成员变量:"+this.num%>
<%="<br>"%>
<%="局部变量:"+num%>

JSP指令

JSP指令是用来设置与整个JSP页面相关的属性。主要关注3个指令page、include、tablib

page指令:用来设置jsp页面的字符集、MIME响应类型、导入Java包等
include指令:用于在当前jsp页面中引入静态或动态资源
tablib指令:引入第三方标签库,也可以是自定义标签(先了解,后面讲)
  • page指令
<%--设置响应MIME类型,以及编码--%>
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<%--导入Java包--%>
<%@ page import="java.util.ArrayList" %>
<%--设置jsp页面编码--%>
<%@ page pageEncoding="utf-8"%>
<%--当页面发生错误时跳转到指定的error.jsp错误页面--%>
<%@ page errorPage="error.jsp"%>

下面我们创建一个JSPDemo2.jsp页面,但是因为该页面有异常,需要跳转到一个错误页面error.jsp

定义JSPDemo2.jsp页面,使用ArrayList集合获取元素时产生一个异常

<%--设置响应MIME类型,以及编码--%>
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<%--导入Java包--%>
<%@ page import="java.util.ArrayList" %>
<%--设置jsp页面编码--%>
<%@ page pageEncoding="utf-8"%>
<%--当页面发生错误时跳转到指定的error.jsp错误页面--%>
<%@ page errorPage="error.jsp"%>
<html>
<head>
    <title>JSP脚本</title>
</head>
<body>
    <%
        ArrayList list=new ArrayList();
        list.get(0);
    %>
</body>
</html>

定义error.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--表示该页面为异常页面,并且在页面中可以使用exception对象--%>
<%@ page isErrorPage="true" %>
<html>
<head>
    <title>异常页面</title>
</head>
<body>
    <h1>页面走丢了...关爱留守儿童</h1>
    <img src="img/error.jpg" width="800" height="500">
</body>
</html>
  • include指令

include 指令用于引入其他文件中的内容,使其合并到当前 JSP 页面,这些引入的文件可以是 JSP 页面、HTML 页面、文本文件或是一段 Java 代码。

下面我们把date.jsp页面引入到include.jsp页面中

定义定义date.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日--HH时mm分ss秒");
        Date date = new Date();
        out.println(simpleDateFormat.format(date));
    %>
</body>
</html>

定义include.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP指令</title>

</head>

<body>
    <h1>include指令引入 动态date.jsp资源</h1>
    当前时间为:<%@include file="date.jsp"%>
</body>
</html>
  • JSP内置对象

在jsp页面中有9个内置对象,这些对象不需要创建可以直接使用,与Servlet中使用到的相关对象对象。

变量名真实类型作用
pageContextPageContext当前页面共享数据,获取其他8个内置对象
requestHttpServletRequest一次请求访问的多个资源共享数据(请求转发)
reponseHttpServletReponse响应对象
sessionHttpSession一次会话的多个请求间共享数据
applicationServletContext所有用户间共享数据
pageObject当前Servlet对象(this)
outJspWriter输出对象把数据输出到页面上
configServletConfigServlet的配置对象
exceptionThrowable异常对象
重点掌握个对象
    request:  请求对象
    response: 响应对象
    out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似

response.getWriter()和out.write()的区别:
    * 在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
    * response.getWriter()数据输出永远在out.write()之前

JSP四大域对象

域对象名称作用范围备注
PageContext只在当前页面共享数据用的较少
ServletRequest在同一条请求链中共享数据用的较多
HttpSession在同一次会话的多次请求中共享数据用的较多
ServletContext在整个应用中共享数据用的较少

MVC模型

JSP的演变

  • 在早期JavaEE开发是没有JSP技术的,只有使用Servlet往浏览器输出HTML标签和内容数据。在Java代码中拼接HTML代码非常痛苦。
  • 后来有了JSP技术,简化了Servlet的开发。可是又延伸出另一个问题,在HTML页面中嵌套了过多的Java代码,不利于阅读和维护。
  • 为了解决Java代码和HTML代码耦合性强的问题,JavaWeb项目开发引入了MVC开发模式,从而把页面展示和业务逻辑分离。采用MVC模式让程序设计更加合理。

MVC介绍

MVC它只是一种开发设计原则,并不是新的技术。MVC只是用来指导我们改善应用程序的结构,从而得到更好的开发和维护效率。

MVC是Module、View、Controller三个单词的缩写,也叫MVC三层模型,每一层负责完成不同的工作。

Module(模型层): 模型层用于封装数据(JavaBean对象),和一些业务逻辑处理。
Controller(控制层): 它控制着数据的流向
    1.先接受用户的请求数据
    2.将数据交给模型层处理
    3.将处理后的数据交给视图层
View(视图层):视图层用于展示数据

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值