Cookie&Session&JSP

目录

Cookie概述

Cookie常见的属性

Cookie细节

Cookie案例

Session

Session概述

Session方法

Session案例

JSP页面

JSP概述

JSP语法

JSP指令

JSP四大域对象

MVC模型

JSP的演变

MVC介绍


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日 HH:mm:ss】

分析思路:
    1) 获取所有的Cookie对象
        Cookie[] req.getCookies(); //获取所有的Cookie对象
    
    2) 查找lasttime名称的Cookie是否存在
        如果不存在:说明是第一次访问,使用Cookie记录这一次访问的时间
                  Cookie名称:"lasttime"
                  Cookie值:当前时间的毫秒值
        
        如果存在:说明不是第一次访问,
                1. 获取"lasttime"名称Cookie对应的毫秒值
                2. 将毫秒值转换为"yyyy-MM-dd HH:mm:ss"格式的字符串,响应给浏览器
                3. 修改Cookie的时间为当前时间,再重新写回浏览器
                    cookie对象.setValue("新的值") //设置cookie的值
                    resp.addCookie(cookie对象)
@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");
​
        //获取所有的Cookie
        Cookie[] cookies = req.getCookies();
        //判断是否有lasttime名称的cookie
        int index = -1; //规定-1表示没有
​
        if (cookies != null) {
            for (int i = 0; i < cookies.length; i++) {
                if (cookies[i] != null) {
                    if (cookies[i].getName().equals("lasttime")) {
                        index = i;
                        break;
                    }
                }
            }
        }
​
        //如果没有lasttime名称的cookie,就说明是第一次访问,记录访问的时间
        if (index == -1) {
            Cookie cookie = new Cookie("lasttime", System.currentTimeMillis() + "");
            cookie.setMaxAge(30);
            resp.addCookie(cookie);
            resp.getWriter().write("欢迎光临,第一次访问本网站");
        }
​
        //如果有lasttime名称的cookie,就说明不是第一次访问,获取访问时间,重新记录当前时间
        if (index != -1) {
            //获取值
            String value = cookies[index].getValue();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String time = sdf.format(new Date(Long.parseLong(value)));
            resp.getWriter().write("欢迎回来,上一次访问的时间:" + time); 
​
            //重新记录新的时间
            cookies[index].setValue(System.currentTimeMillis() + "");
            resp.addCookie(cookies[index]);
        }
    }
​
    @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
    注意:如果加上参数false,没有Session的话,不会自动创建。
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;%>
​
<%--定义成员方法--%>
<%! 
    public void show(){
        System.out.println("helloWorld");
    }
%>
<%--调用show方法--%>
<% show() %>
​
<%--定义局部变量--%>
<% int num=20; %>
​
<%--输出语句,往浏览器输出--%>
<%="成员变量:"+this.num%>
<%="局部变量:"+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(视图层):视图层用于展示数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值