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&Session&JSP_第1张图片

Cookie常见的属性

属性名 作用
name Cookie名称
value Cookie的值
path Cooke的路径
domain Cookie的域名
maxAge Cookie的存活时间
version Cookie的版本号
comment Cookie的描述信息

Cookie细节

Cookie&Session&JSP_第2张图片

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对象,以此来实现多次请求在服务端的数据共享。

Cookie&Session&JSP_第3张图片

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("

"+username+"

");   } ​    @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)

Cookie&Session&JSP_第4张图片

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"%>


    JSP脚本


    <%
        ArrayList list=new ArrayList();
        list.get(0);
    %>

定义error.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--表示该页面为异常页面,并且在页面中可以使用exception对象--%>
<%@ page isErrorPage="true" %>


    异常页面


    

页面走丢了...关爱留守儿童

   

  • include指令

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

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

定义定义date.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


    <%
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日--HH时mm分ss秒");
        Date date = new Date();
        out.println(simpleDateFormat.format(date));
    %>

定义include.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    JSP指令
​

​

    

include指令引入 动态date.jsp资源

  当前时间为:<%@include file="date.jsp"%>
  • JSP内置对象

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

变量名 真实类型 作用
pageContext PageContext 当前页面共享数据,获取其他8个内置对象
request HttpServletRequest 一次请求访问的多个资源共享数据(请求转发)
reponse HttpServletReponse 响应对象
session HttpSession 一次会话的多个请求间共享数据
application ServletContext 所有用户间共享数据
page Object 当前Servlet对象(this)
out JspWriter 输出对象把数据输出到页面上
config ServletConfig Servlet的配置对象
exception Throwable 异常对象
重点掌握个对象
    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(视图层):视图层用于展示数据

Cookie&Session&JSP_第5张图片

你可能感兴趣的:(java)