JavaWeb学习笔记第一天

JavaWeb学习笔记第一天

1.基本概念

1.1前言

web开发:

  • web 网页的意思

  • 静态web

    • html css
    • 提供给所有人看的数据始终不会发生变化
  • 动态web

    • 几乎所有的网站都是动态的;
      提供给所有人看的数据会发生变化, 每个人在不同的时间,地点看到的信息各不相同
    • 技术栈:Servlet/JSP,ASP,PHP

    在java中,动态web资源开发的技术统称为JavaWeb;

1.2web应用程序

web应用程序:可以提供浏览器的程序;

  • a.html、b.html… 多个web资源,这些资源可以被外界访问,对外界提供服务
  • 我们平时能访问到的任何一个页面或资源,都存在与这个世界上的某个角落的计算机上。
  • URL:
  • 这些统一的WEb资源会被放在同一个文件夹下,web应用程序–>Tomcat服务器
  • 一个web应用有多个部分组成(静态页面,动态页面 )
    • html,js,css
    • jsp,servlet
    • Java程序
    • jar包
    • 配置文件(properties)

web应用程序编写完毕后,弱项提供给外界访问,需要一个服务器来统一管理;

1.3静态web

  • .htm,.html,若果服务器上一直存在这些东西,我们就可以直接通过网络进行读取。
  • 静态web存在的缺点
    • web界面无法动态更新,所有用户看到的都是同一个页面
      • 轮播图,点击特效,伪动态
      • JavaScript【实际开发中用的最多】
      • VB
    • 它无法和数据库交互(数据无法持久化,用户无法交互)

1.4动态web

页面会动态展示 ,web的页面展示会因人而异,

缺点

  • 假如服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布;
    • 停机维护

优点

  • 可以动态更新,让不同用户看到不同的页面
  • 可以和数据库交互(数据持久化:注册,商品信息,用户信息…)

2.web服务器

2.1技术讲解

ASP:

  • 微软,国内最早流行的
  • 在html中嵌入了VB的脚本,ASP+COM;
  • 在ASP开发中,基本一个页面都有几千行的业务代码,页面极其混乱
  • 维护成本高
  • C#
  • IIS服务器

PHP

  • PHP开发速度很快,功能很强大,跨平台,代码很简单(70%,WP)
  • 无法承载大访问量的情况;

JSP/Servlet

B/S:浏览器和服务器

C/S:客户端和服务器

  • sum公司主推的B/S架构
  • 基于java语言(所有的大公司,或者一些开源的组件,都是用java写的)
  • 可以承载三高问题带来的影响;
  • 语法像ASP

2.2web服务器

服务器是一种被动的操作,用来处理用户的一些请求,和响应信息

IIS

微软的 ;ASP…windows中自带的

Tomcat

网站应有的结构

--webapps :Tomcat服务器的web目录
   -ROOT
   -love:网站的目录名
      -WEB-INF
         -classes  java程序
         -lib  jar包
         -web.xml  web配置文件
      -index.html  默认的首页
      -static
         - css
            - style.css
         - js
         - img
      -.......

3.http

3.1什么是http

  • http

超文本传输协议,一个简单地请求-响应协议

默认端口:80

  • https s:安全的

默认端口:443

3.2http的两个时代

  • http1.0
    • HTTP/1.0:客户端可以与web服务器连接后,只获得一个web资源
  • http2.0
    • HTTP/1.1客户端可以与web服务器连接后,可以获得多个web资源

3.3http请求

客户端 ----发送请求—服务器

百度:

Request URL: https://www.baidu.com/   //请求地址
Request Method: GET  //请求方法
Status Code: 200 OK  //状态码
Remote(远程) Address: 112.80.248.75:443
Accept:text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9   //语言
Cache-Control: max-age=0
Connection: keep-alive
  • 请求行

    • 请求行中的请求方式:GET
    • 请求方式:GET,POST,HEAD,DELETE,PUT,TRACT…
      • get:请求能携带的参数比较少,大小有限制,会在浏览器的URl栏显示数据内容,不安全但是高效
      • post:请求能携带的参数没有限制,大小没有有限制,不会在浏览器的URl栏显示数据内容,安全但是不高效
  • 消息头

    Accept:告诉浏览器,他所支持的数据类型
    Accept-Encoding:支持哪种编码格式  GBK  UTF-8  GB2312   IOS8859-1
    Accept-Language: 告诉浏览器他的语言环境
    Cache-Control: 缓存控制
    Connection: 告诉浏览器,请求完成还是断开连接
    Host: 表示主机
    

3.4http响应

服务器----响应----客户端

百度:

Cache-Control: private  //缓存控制
Connection: keep-alive   //连接,
Content-Encoding: gzip   //编码
Content-Type: text/html;charset=utf-8  //类型 
  • 响应体:
Accept:告诉浏览器,他所支持的数据类型
Accept-Encoding:支持哪种编码格式  GBK  UTF-8  GB2312   IOS8859-1
Accept-Language: 告诉浏览器他的语言环境
Cache-Control: 缓存控制
Connection: 告诉浏览器,请求完成还是断开连接
Host: 表示主机
Refrush:可以告诉客户端多久刷新
Location:让网页重新定位;
  • 响应状态码
    • 200:请求响应成功
    • 3**:请求重定向
    • 404:找不到资源
    • 5xx:服务器代码错误 502:网关错误

常见面试题:

当你的浏览器地址栏输入网址回车的一瞬间到页面能够展示回来,经历了什么?

4.Maven

为什么要学习Maven?

1.在javaweb开发中,需要使用大量的jar包,我们手动去导入;

2.如何能够让一个东西自动版我们导入和配置这个jar包.

由此Maven诞生了!

4.1Maven项目架构管理工具

我们目前用他就是方便导入jar包的!

核心思想:约定大于配置

  • 有约束不要违反

Maven回规定好我们如何去编写我们的代码,必须按照这个规范来

4.2下载安装Maven

一个干净的maven项目[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IABxsBKc-1649074850891)(D:\Desktop\MarkDown\图片/QQ截图20220402155715.png)]

4.3Pom文件(Maven的核心配置文件)

<?xml version="1.0" encoding="UTF-8"?>

<!--Maven版本和头文件-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
<!--创建项目时配置的GAV-->
  <groupId>com.cjp</groupId>
  <artifactId>JavaWeb02</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
<!--package:  项目的打包方式
jar :Java项目
war:javaWeb项目-->

<!--配置-->
  <properties>
<!--项目的默认构建编码-->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--    编译版本-->
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

<!--项目依赖-->
  <dependencies>
    <dependency>
<!--      具体依赖的项目jar包-->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <!--项目构建用的东西-->  
  <build>
    
  </build>
</project>

Maven由于约定大于配置,我们之后可能遇到我写的配置文件无法被导出或者 或者生效的问题,解决方案:

<!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>**/*.properties</exclude>
                    <exclude>**/*.xml</exclude>
                </excludes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

5.servlet

sun公司有两个servlet的实现类:HttpServlet,GenericServlet;

5.1什么是Servlet

  • servlet就是sun公司开发动态web的一门技术
  • sun公司在这些API中提供了一个接口叫做:Servlet,若果想开发一个Servlet程序,只需要完成两个小步骤:
    • 编写一个类实现Servlet接口
    • 把开发好的java类部署到web服务器中

把实现了servlet接口的java程序叫做Servlet

5.2HelloServlet

1.构建一个普通的Maven项目 ,删掉里面的src目录,需要什么就建立Moudel

2.关于Maven父子工程的理解

父项目中会有一个:

<modules>
        <module>servlet-01</module>
    </modules>

子项目中会有:

<parent>
        <artifactId>javaweb-02-servlet</artifactId>
        <groupId>com.cjp</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

父项目中的jar包子项目可以直接使用

3.Maven环境优化

  • 修改web.xml为最新的
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">
</web-app>
  • 将Mawen的结构搭建完整

4.编写一个Servlet程序

package com.cjp.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {

    //由于get或者post只是请求实现的不同方式,可以相互调用,业务逻辑都一样
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        ServletOutputStream outputStream = resp.getOutputStream();
        PrintWriter writer = resp.getWriter();//响应流
        writer.print("Hello Servlet!");
    }

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

5.编写Servlet的映射

​ 为什么需要映射:我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接服务器,所以我们需要在web服务器中注册我们写的Servlet,我们还需要给他一个浏览器能访问的路径

<servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>com.cjp.servlet.HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/cjp</url-pattern>
    </servlet-mapping>

5.3Servlet运行原理

Servlet是由web服务器调用,web服务器在收到浏览器请求之后,会:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M1MVjCZB-1649074850893)(/…/%E5%9B%BE%E7%89%87/1648971832438.png)]

5.4Mapping问题

1.一个Servlet对应一个映射路径

<servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/cjp</url-pattern>
    </servlet-mapping>

2.一个Servlet对应多个映射路径

<servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/cjp</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/cjp1</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/cjp2</url-pattern>
    </servlet-mapping>

3.一个Servlet对应通用个映射路径

<servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/cjp/*</url-pattern>
    </servlet-mapping>

4.默认请求路径

<servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

5.自定义后缀

<!--注意:*前面不能加项目映射的路径-->
<servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>*.cjp</url-pattern>
    </servlet-mapping>

6.优先级问题

指定了固有的映射路径优先级最高,如果找不到就会走默认的请求处理

<!--    找不到资源的映射-->
    <servlet>
        <servlet-name>error</servlet-name>
        <servlet-class>com.cjp.servlet.ErrorServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>error</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

5.5ServletContext

1.共享数据

web容器再启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;

  • 共享数据

    在一个servlet中保存的数据可以在另外一个servlet中拿到;

放置数据的类:

package com.cjp.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//        this.getInitParameter()   初始化参数
//        this.getServletConfig()  servlet配置
//        this.getServletContext()  servlet上下文
        ServletContext context = this.getServletContext();
        String username = "cjp";
        context.setAttribute("username",username);  //将一个数据保存在了ServletContext中,名字为:username 值为:定义的字符串username
        System.out.println("sadsadha");
    }

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

读取数据的类:

package com.cjp.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username = (String) context.getAttribute("username");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("用户名为:" + username);
    }

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

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">
  
  <servlet>
    <servlet-name>hello1</servlet-name>
    <servlet-class>com.cjp.servlet.HelloServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>hello1</servlet-name>
    <url-pattern>/hello1</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>getName</servlet-name>
    <servlet-class>com.cjp.servlet.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>getName</servlet-name>
    <url-pattern>/name</url-pattern>
  </servlet-mapping>
</web-app>

注意:

要先访问放置数据的Servlet,它才会把数据放入,不然读取的数据为空

2.获取初始化参数

1.在web.xml中配置参数

<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
  </context-param>

2.在servlet中获取

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        resp.getWriter().print(url);
    }
3.请求转发
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        context.getRequestDispatcher("/name").forward(req,resp);//转发的请求路径

    }

4.读取资源文件

properties

  • 在java目录下新建properties
  • 在resource目录下新建properties

发现: 都被打包到了同一个路径classes下,我们俗称这个路径为classpath;

通过ServletContext读取配置文件

思路:需要一个文件流

username = cjp
password = 1770364681
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        InputStream stream = context.getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties prop = new Properties();
        prop.load(stream);
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        resp.getWriter().println("username:"+username+"\npassword:"+password);
    }

5.6HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse对象;

  • 如果要获取客户端请求过来的参数:找HttpServletRequest
  • 如果要给客户端响应一些信息,找HttpServletResponse
1.简单分类
  • 负责向浏览器发送数据的方法
public PrintWriter getWriter() throws IOException;
public ServletOutputStream getOutputStream() throws IOException; 
  • 负责向浏览器 发送响应头的方法
void setCharacterEncoding(String charset);
void setContentLength(int len);
void setContentLengthLong(long len);
void setContentType(String type);
  • 响应状态码
2.下载文件
  • 要获取下载文件的路径
  • 下载的文件名是什么
  • 设法让浏览器能够支持我们要下载的东西
  • 获取下载文件的输入流
  • 创建缓冲区
  • 获取OutputStream对象
  • 将FileOutputStream流写入到buffer缓冲区
  • 使用OutputStream将缓冲区的数据输出到客户端!
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //  1.要获取下载文件的路径
        String realPath = "D:\\HTML\\javaweb-02-servlet\\servlet-02\\target\\classes\\壁纸.jpg";
        System.out.println("获取要下载的文件的路径:"+realPath);
        //  2.下载的文件名是什么
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
        //  3.设法让浏览器能够支持我们要下载的东西
        resp.setHeader("Content-disposition","attachment;filename="+URLEncoder.encode(fileName,"utf-8"));
        //  4.获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
        //  5.创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
        //  6.获取OutputStream对象
        ServletOutputStream out = resp.getOutputStream();
        //  7.将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区的数据输出到客户端!
        while ((len = in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        in.close();
        out.close();

    }
3.验证码功能

验证码怎么来的?

  • 前端实现
  • 后端实现,需要用到java的图片类,生产一个图片
public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如何让浏览器2秒刷新一次
        resp.setHeader("refresh", "2");
        //如何在内存中创建一个图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
        //得到画笔
        Graphics2D g = (Graphics2D) image.getGraphics();
        //设置图片的背景颜色
        g.setColor(Color.white);
        g.fillRect(0,0,80,20);
        //给图片写数据
        g.setColor(Color.CYAN);
        g.setFont(new Font(null, Font.BOLD,20));
        g.drawString(makeNum(),0,20);
        //告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("Image/jpeg");
        //网站存在缓存,不让浏览器缓存
        resp.setHeader("Cache-Control","no-cache");
        resp.setDateHeader("expires",-1);
        resp.setHeader("pragma","no-cache");
        //把图片写给浏览器
        ImageIO.write(image,"jpg",resp.getOutputStream());



    }
    //生成随机数
    public String makeNum(){
        Random random = new Random();
        String num = random.nextInt(111111) + "";
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i <6-num.length() ; i++) {
            sb.append("0");
        }
        num = sb.toString() + num;
        return num;

    }
4.实现重定向

一个web资源收到客户端请求,他会通知客户端去访问另一个web资源,这个过程叫重定向

常见场景:

  • 用户登录
//重定向的时候一定要注意路径问题,否则就会404
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                //实质等价于这两行代码
                // resp.setHeader("Location","/cjp/imag             e");
                // resp.setStatus(302);
                resp.sendRedirect("/cjp/image");  //重定向
    }

面试题:重定向和转发的区别?

相同点:

  • 页面都会实现跳转

不同点

  • 请求转发的时候,url栏不会发生变化 307
  • 重定向的时候,URL栏会发生变化 302

5.7HttpServletRequest

<form action="${pageContext.request.contextPath}/test" 

HttpServletRequest代表客户端的请求,用户通过http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest

1.获取前端传递的参数并请求转发
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("username");
        String psw = req.getParameter("password");
        String[] hobbys = req.getParameterValues("hobbys");
        System.out.print("用户名:"+name+"\n密码:"+psw+"\n爱好:");
        for (String hobby:hobbys
             ) {
            System.out.print(hobby+" ");
        }
        //请求转发
//        req.getRequestDispatcher("/success.jsp").forward(req,resp);
        //重定向
        resp.sendRedirect("/cjp/success.jsp");
    }

6.Cookie、Session

6.1会话

会话:用户打开一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程可以称之为会话

有状态会话

一个网站怎么证明你来过?

1.服务端给客户端一个“证明”,客户端下次访问服务器带上“证明”就行了;cookie

2.服务器登记你来过了,下次来的时候进行匹配;session

6.2保存会话 的两种技术

cookie

  • 客户端技术(响应,请求)

session

  • 服务器技术,利用这个技术可以保存用户的会话信息?我们可以把信息或者数据放在session中

常见场景:网站登录后,关闭浏览器,你下次进这个网站可能不需要登录,浏览器自动登录了

6.3Cookie

1.从请求中拿到cookie信息

2.服务器响应给客户端cookie

Cookie[] cookies = req.getCookies();//获得Cookie
cookie.getName()//获得cookie中的key
cookie.getValue()//获得cookie中的value
 new Cookie("LastTime",System.currentTimeMillis()+"");//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie的有效期
resp.addCookie(cookie);//响应给客户端
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决中文乱码
        req.setCharacterEncoding("utf-16");
        resp.setCharacterEncoding("utf-16");
        PrintWriter out = resp.getWriter();
        //服务器从客户端获取cookie
        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            out.write("您上一次访问的时间是:");
            //如果存在
//            for (Cookie cookie : cookies) { }
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获取cookie的名字
                if (cookie.getName().equals("LastTime")){
                    //获取cookie中的值
                    long l = Long.parseLong(cookie.getValue());
                    Date date = new Date(l);
                    out.write(date.toLocaleString());
                }

            }
        } else {
            out.write("您是第一次访问");
        }
        //服务器给客户端响应一个cookie
        Cookie cookie = new Cookie("LastTime",System.currentTimeMillis()+"");
        //设置cookie有效期为一天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);
    }

一个网站cookie是否存在上限

  • 一个cookie只能保存一个信息;
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个
  • cookie大小有限制4kb
  • 浏览器上限300个

删除cookie

  • 不设置有效期,关闭浏览器自动失效;
  • 设置有效期时间为0;

cookie怎么传递中文数据

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-16");
        resp.setCharacterEncoding("utf-16");
        Cookie[] cookies = req.getCookies();
        PrintWriter out = resp.getWriter();
        for (int i = 0; i < cookies.length; i++) {
            Cookie cookie = cookies[i];
            //获取cookie的名字
            if (cookie.getName().equals("name")) {
                //获取cookie中的值
                String name = URLDecoder.decode(cookie.getValue(), "utf-8");
                out.write(name);
            }

        }
        Cookie cookie = new Cookie("name", URLEncoder.encode("曹久平", "utf-8"));
        resp.addCookie(cookie);
    }

6.4session(重点)

什么是session:

  • 服务器会给每个用户(浏览器)创建一个session对象
  • 一个session独占一个浏览器,只要浏览器没关,session就存在
  • 用户登录之后,整个网站他都可以访问!---->session保存用户信息

**Session和Cookie的区别 **

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存
  • Session是把用户的数据写到用户的独占的Session中,在服务器端保存(保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务器创建;

使用场景:

  • 保存一个用户登录的信息
  • 购物车信息
  • 在整个网站中经常会使用的数据,我们将它保存到session中;

使用Session:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("utf-16");
        resp.setCharacterEncoding("utf-16");
        //得到session
        HttpSession session = req.getSession();
        //往session中存入东西
        session.setAttribute("name",new Person("曹久平",21));

        //获取session的ID
        String id = session.getId();

        //判断session是不是新创建的
        if (session.isNew()){
            resp.getWriter().write("session创建成功,ID:"+id);
        }else {
            resp.getWriter().write("session已经在服务器中存在了,ID:"+id);
        }
    }
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("utf-16");
        resp.setCharacterEncoding("utf-16");
        //得到session
        HttpSession session = req.getSession();
        //读取Session中保存的信息
        Person person = (Person) session.getAttribute("name");
        resp.getWriter().write(person.toString());
    }
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        //手动注销
        session.invalidate();
    }

配置Session失效时间:

<!-- 设置session默认失效时间-->
  <session-config>
<!--    15分钟后session默认失效,以分钟为单位-->
    <session-timeout>15</session-timeout>
  </session-config>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值