javaweb技术笔记

1. 基本概念

1.1 前言

web开发:

  • web,网页的意思
  • 静态web
    • html,css
    • 数据不会变化
  • 动态web
    • 现在网站几乎都是动态的
    • 数据会变化
    • 技术栈:servlet/JSp,ASP,PHP

在java中,动态web资源开发统称为javaweb

1.2 web应用程序

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

  • a.html,b.html…多个web资源,对外界提供服务
  • URL
  • web资源统一放在一个文件夹下,web应用程序->Tomcat:服务器
  • 一个web应用由多部分组成
    • html,css,js
    • jsp,servlet
    • java程序
    • jar包
    • 配置文件

web应用程序编写完毕后,若想提供给外接访问,需要一个服务器统一管理

1.3 静态web

*.html,服务器存在这些,可以直接访问

  • 静态web缺点
    • 无法动态更新,所有用户看到的都一样
      • 轮播图,点击特效:伪动态
      • JavaScript
      • VBScript
    • 无法与数据库交互(数据无法持久化,用户无法交互)

1.4 动态web

页面会动态展示:web的页面样子因人而异

  • 动态web缺点
    • 动态资源出现错误没需要重新编写后台程序(停机维护)

2. web服务器

2.1 技术讲解

  • ASP

    • 微软:国内最早流行的就是ASP
    • 在HTML中嵌入VB脚本 ASP+COM
    • 维护成本高
    • C#
  • PHP

    • 开发速度快,跨平台,代码简单
    • 无法承载大访问量的情况(局限性)
  • JSP/Servlet

    • B/S
    • C/S
    • sun公司主推B/S
    • 基于java语言的(所有大公司或者开源组件,都是用java写的)
    • 可以承载三高问题(高可用,高性能,高并发)带来的影响

2.2 web服务器

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

  • Tomcat
    • 开源,免费,简单好用
  • IIS
    • 微软的,ASP。windows自带
  • 其他

下载Tomcat

  • 安装或者解压
  • 了解配置文件和目录结构
  • 这个东西的作用

3. Tomcat

3.1 安装

Tomcat官网:https://tomcat.apache.org

  • 下载Tomcat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-grZ29A97-1610288368360)(image-20210106223955501.png)]

  • 解压Tomcat压缩包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-prCSPWmg-1610288368364)(image-20210106224609100.png)]

3.2 启动关闭Tomcat

bin文件夹下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8KhdF1oP-1610288368366)(image-20210106224905003.png)]

访问测试:localhost:8080

可能遇到的问题

  1. java环境变量没有配置
  2. 闪退问题
  3. 乱码

3.3 配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oKH6aMlY-1610288368367)(image-20210108005952166.png)]

3.4 发布web网站

  • 把网站放在webapps文件夹下,就可以访问了

网页结构

–webapps

​ --自己的网站文件夹

​ --WEB-INF

​ --classes :java程序

​ --lib :web依赖的jar包

​ --web.xml

​ --index.html

4. HTTP

4.1 什么是HTTP

HTTP默认端口:80

Https默认端口:443

5. Maven

maven核心思想:约定大于配置

  • 有约束,不要去违反

Maven会规定好如何编写java代码,必须按照规范来

5.1 下载安装

5.2 环境变量

  • MAVEN_HOME
  • M2_HOME
  • path中加**%MAVEN_HOME%\bin**

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pf1ZCZuC-1610288368369)(image-20210108013525564.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uv3dCGRz-1610288368371)(image-20210108013635219.png)]

5.3 阿里云镜像

      <mirror>
          <id>nexus-aliyun</id>
          <mirrorOf>*</mirrorOf>
          <name>Nexus aliyun</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public</url>
      </mirror>

5.4 本地仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bZcPdiQM-1610288368373)(image-20210108015833202.png)]

5.5 在idea中使用maven

  • 使用maven的模板创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fxvVS0t2-1610288368375)(image-20210108020333045.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vj7JYdtX-1610288368376)(image-20210108020545665.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0JIEY5kf-1610288368377)(image-20210108020715970.png)]

  • 创建一个普通的maven项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mCxzpOpa-1610288368378)(image-20210108021423592.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JMb1s1QI-1610288368379)(image-20210108021804852.png)]

5.6标记文件夹

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccciPaZo-1610288368381)(image-20210108022307201.png)]

5.7 在idea中配置tomcat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U8d5xcvw-1610288368382)(image-20210108023026267.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5BdW7F2M-1610288368384)(image-20210108023053258.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3KWgdYsW-1610288368385)(image-20210108023207559.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yLaFiYyI-1610288368387)(image-20210108023456778.png[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XmeltaWI-1610288369737)(image-20210108023924612.png)]]


解决警告问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z0I1eRgA-1610288368388)(image-20210108024040452.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3cWldgC-1610288368389)(image-20210108024100244.png)]

为什么会有这个问题:我们访问一个网站,需要指定一个文件夹的名字

启动

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJMdYmOt-1610288368391)(image-20210108024616545.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFrJtY0D-1610288368392)(image-20210108024837068.png)]


6. Servlet

6.1 Servlet简介

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

6.2 HelloServlet

  1. 删掉IDEA中的src目录,以后学习就在这个项目里面建立Moudel,这个空的工程就是maven的主工程.

  2. 关于maven父子工程的理解:

    • 在父项目中会有
    <modules>
        <module>servlet子项目1</module>
    </modules>
    
    • 子项目中会有
    <parent>
        <artifactId>Servlet学习01</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

父项目的java子项目可以直接使用


1. 主工程添加依赖

    <dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
    </dependency>
</dependencies>

2. 在主工程文件夹中创建moudel子工程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MYvNS5in-1610288368394)(image-20210108150926355.png)]

3. 将子工程中的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>

4. 在main中创建java和resources文件夹

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDekiAEx-1610288368396)(image-20210108151332963.png)]

5. 创建一个Servlet类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ltbGlv9r-1610288368398)(image-20210108151749287.png)]

6. 实现Servlet接口,可以直接继承HttpServlet(sun公司实现好接口了)

package com.tgk.servlet;

import javax.servlet.http.HttpServlet;

public class HelloServlet extends HttpServlet {
}

继承树如下(子到父):

自己编写的Servlet类->HttpServlet->GenericServlet->Servlet接口

7. 重写父类方法

idea快捷键,alt+insert或者在class内单击右键-Generate

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ashJ4D0U-1610288368399)(image-20210108165310875.png)]

重写doGet和doPost方法

package com.tgk.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.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 {

        PrintWriter writer = resp.getWriter(); //响应流
        writer.print("Hello Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);  // 这里改了
    }
}

8. 编写Servlet的映射

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

    <!--注册Servlet-->
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.tgk.servlet.HelloServlet</servlet-class>
    </servlet>
<!--    servlet的请求路径-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

9. 配置Tomcat

10. 启动测试

6.3 运行原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Ttw9f1Q-1610288368400)(image-20210108202329884.png)]

6.4 mapping问题

  1. 一个Servlet可以指定一个映射路径
<!--    servlet的请求路径-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

  1. 一个Servlet可以指定多个映射路径
<!--    servlet的请求路径-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello3</url-pattern>
    </servlet-mapping>
  1. 一个Servlet可以指定通用映射路径
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
  1. 指定一些后缀或者前缀等等。。。。
<!--*前面不能加任何路径-->
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>*.jsp</url-pattern>
</servlet-mapping>

6.5 ServletContext

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

1 共享数据

  • 我在这个Servlet保存的数据,可以在另一个Servlet拿到

  • public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext servletContext = this.getServletContext();
            String name = "tgk";
            servletContext.setAttribute("name",name);
    
            System.out.println("Hello");
        }
    }
    
  • public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext servletContext = this.getServletContext();
            String name = "tgk";
            servletContext.setAttribute("name",name);
    
            System.out.println("Hello");
        }
    }
    
  • <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.tgk.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
    <servlet>
        <servlet-name>getc</servlet-name>
        <servlet-class>com.tgk.servlet.GetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getc</servlet-name>
        <url-pattern>/getc</url-pattern>
    </servlet-mapping>
    

2 获取初始化参数

<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext servletContext = this.getServletContext();

    String url = servletContext.getInitParameter("url");
    resp.getWriter().print(url);
    

}

3 请求转发

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext servletContext = this.getServletContext();
    RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/getp");//转发的请求路径
    requestDispatcher.forward(req,resp);// 调用forward实现请求抓发
    System.out.println("进来了demo01");

4 读取资源文件

properties类

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eCvWR9JH-1610288368401)(image-20210109180012607.png)]

获取资源:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); //第一个斜杠代表当前web工程
    Properties properties = new Properties();
    properties.load(inputStream);
    String username = properties.getProperty("username");
    String password = properties.getProperty("password");
    resp.getWriter().print(username+password);

}

6.6 HttpServletRequest

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

6.6.1 获取前端传递的参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-20sGTV8S-1610288368403)(image-20210110041611444.png)]

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf-8");
    resp.setCharacterEncoding("utf-8");
    String name = req.getParameter("name");
    String ps = req.getParameter("ps");
    String[] parameterValues = req.getParameterValues("hobbys");
    System.out.println(name);
    System.out.println(ps);
    System.out.println(Arrays.toString(parameterValues));
    //通过请求转发
    req.getRequestDispatcher("/success.jsp").forward(req,resp);
}

6.7HttpServletResponse

6.7.1常见状态码

int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;

6.7.2**. 常见应用**

  • 向浏览器输出消息
  • 下载文件
    1. 获取下载文件的路径
    2. 下载的文件名
    3. 设置想办法让浏览器支持下载需要的下载的东西
    4. 获取下载文件的输入流
    5. 创建缓冲区
    6. 获取OutputStream对象
    7. 将FileOutputStream流写入buffer缓冲区
    8. 使用OutputStream将缓冲区的数据输出到客户端
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1. 获取下载文件的路径
        String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/image.png");
        System.out.println("下载文件的路径:"+realPath);
//        2. 下载的文件名
        String filename = realPath.substring(realPath.lastIndexOf("\\") +1);
//        3. 设置想办法让浏览器支持下载需要的下载的东西
        resp.setHeader("Content-Disposition","attachment;filename="+filename);
//        4. 获取下载文件的输入流
        FileInputStream fileInputStream = new FileInputStream(realPath);
//        5. 创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
//        6. 获取OutputStream对象
        ServletOutputStream outputStream = resp.getOutputStream();
//        7. 将FileOutputStream流写入buffer缓冲区,使用OutputStream将缓冲区的数据输出到客户端
        while ((len=fileInputStream.read(buffer))>0){
            outputStream.write(buffer,0,len);
        }

        fileInputStream.close();
        outputStream.close();

    }

6.7.3验证码功能

验证怎么来的?

  • 前端实现
  • 后端实现,需要用到java的图片类,生成一个图片
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 浏览器3秒自动刷新一次
    resp.setHeader("refresh","3");

    //在内存中创建一个图片
    BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
    //得到图片
    Graphics2D g = (Graphics2D)bufferedImage.getGraphics(); //笔
    g.setColor(Color.WHITE);
    g.fillRect(0,0,80,20);
    //给图片写数据
    g.setColor(Color.BLUE);
    g.setFont(new Font(null,Font.BOLD,20));
    g.drawString(makeNum(),0,20);
    //告诉浏览器这个请求用图片打开
    resp.setContentType("image/jpeg");
    // 网站存在缓存,不让浏览器缓存
    resp.setDateHeader("expires",-1);
    resp.setHeader("Cache-control","no-cache");
    resp.setHeader("Pragma","np-cache");
    //把图片写给浏览器
    ImageIO.write(bufferedImage,"jpg",resp.getOutputStream());

}
 private String makeNum(){
     Random random = new Random();
     String num = random.nextInt(9999)+"";
     StringBuffer stringBuffer = new StringBuffer();
     for (int i = 0; i < 5-num.length(); i++) {
         stringBuffer.append(0);
     }
     String s = stringBuffer.toString()+num;
     return s;
 }

6.7.4 重定向

什么是重定向:

​ 一个web资源受到客户端的请求后,它会通知客户端访问另一个web资源。

常见常见:

  • 用户登录
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  // 一定要注意路径问题,否则出现404问题  
    resp.sendRedirect("/response_learn_war/img");
}

7. Cookie、Session

7.1 会话

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

**有状态会话:**一个同学来过教室,下次再来教室,我们知道这个同学曾经来过,称之为有状态会话

怎么证明你是大学生?

你 学校

  1. 学费缴费单 学校给的
  2. 学校登记 学校标记你来过了

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

客户端 服务端

  1. 服务端给客户端一个cookie,客户端下次访问服务端带上cookie就行了;cookie
  2. 服务器登记你来过了,下次你来的时候我来匹配你;session

7.2 保存会话的两种技术

cookie

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

session

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

常见场景:网站登录之后,你下次不用再登录了。

7.3 Cookie

  1. 从请求中拿到cookie信息
  2. 服务器响应给客户端cookie
Cookie[] cookies = req.getCookies(); //获得cookie,返回数组,说明可能存在多个cookie
String name = cookie.getName();//获得cookie的key
cookie.getValue(); //获得cookie的值
Cookie cookie = new Cookie("LoginTime", System.currentTimeMillis()+"");// 新建一个cookie
cookie.setMaxAge(5); // 设置有效期
resp.addCookie(cookie);  //响应给客户端

cookie一般保存在本地的用户目录下的appData里面

一个网站cookie是否存在上限?(聊聊细节)

  • 一个cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,每个站点最多存放20个cookie
  • 浏览器的cookie上限大概为300个

删除cookie

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

编码解码,网络传输防止中文乱码的常用方法

String encode = URLEncoder.encode("中文字符", "utf-8"); // 编码,防止中文乱码
String decode = URLDecoder.decode(encode, "utf-8");  // 解码

7.4 Session(重点)

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
  • 用户登录之后,整个网站都可以访问–>保存用户信息;保存购物车信息。。。

Session和cookie的区别

  • cookie是把用户的数据写给用户的浏览器。浏览器保存
  • Session是吧用户的数据写到用户独占的Session中,服务器保存(保存重要的信息,减少服务器资源浪费)

使用场景:

  • 保存一个用户的信息;
  • 购物车信息
  • 在整个网站中经常会使用的数据,保存在Session中

使用Session:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 解决乱码
    req.setCharacterEncoding("UTF-8");
    resp.setCharacterEncoding("UTF-8");
    resp.setContentType("text/html;charset=utf-8");

    //得到Session
    HttpSession session = req.getSession();
    //给Session存东西
    Person xms = new Person("小魔兽", 21);
    session.setAttribute("name",xms);
    //获取Session的id
    String id = session.getId();
    //判断Session是不是新创建
    if (session.isNew()){
        resp.getWriter().write("Session创建成功,id为:"+id);

    }
    else {
        resp.getWriter().write("Session已经存在,id为:"+id);
    }
}

手动注销Session

session.removeAttribute("name");
session.invalidate();

自动注销

web.xml配置

<session-config>
    <!--1分钟后Session自动失效-->
    <session-timeout>1</session-timeout>
</session-config>

8. JSP

Response resp) throws ServletException, IOException {
// 解决乱码
req.setCharacterEncoding(“UTF-8”);
resp.setCharacterEncoding(“UTF-8”);
resp.setContentType(“text/html;charset=utf-8”);

//得到Session
HttpSession session = req.getSession();
//给Session存东西
Person xms = new Person("小魔兽", 21);
session.setAttribute("name",xms);
//获取Session的id
String id = session.getId();
//判断Session是不是新创建
if (session.isNew()){
    resp.getWriter().write("Session创建成功,id为:"+id);

}
else {
    resp.getWriter().write("Session已经存在,id为:"+id);
}

}


**手动注销Session**

```java
session.removeAttribute("name");
session.invalidate();

自动注销

web.xml配置

<session-config>
    <!--1分钟后Session自动失效-->
    <session-timeout>1</session-timeout>
</session-config>

8. JSP

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值