天天看点

JavaWeb

目录

  • 一、基本概念
    • 1、前言
    • 2、web应用程序
    • 3、静态web
    • 4、动态web
  • 二、web服务器
    • 1、技术讲解
    • 2、web服务器
  • 三、Tomcat
    • 1、安装Tomcat
    • 2、Tomcat环境配置
    • 3、Tomcat启动和关闭
    • 4、配置文件
    • 5、在 IDEA中配置Tomcat
    • 6、发布一个简单的web网站
    • 7、解决Tomcat控制台出现乱码
  • 四、HTTP
    • 1、什么是HTTP
    • 2、HTTP的两个时代
    • 3、HTTP请求
      • 1、请求行
      • 2、请求头
    • 4、HTTP响应
      • 1、响应体
      • 2、响应状态码
  • 五、Maven
    • 1、Maven项目架构管理工具
    • 2、下载安装Maven
    • 3、配置环境变量
    • 4、修改镜像地址
    • 5、本地仓库
    • 6、在IDEA中使用Maven
    • 7、创建普通的Maven项目
    • 8、pom.xml文件
      • 1、详细介绍
      • 2、导入其它包
      • 3、可能出现的问题
  • 六、Servlet
    • 1、Servlet简介
    • 2、HelloServlet
    • 3、Mapping问题
    • 4、ServletContext
      • 1、数据共享:
      • 2、获取初始化参数
      • 3、请求转发
    • 5、HttpServletResponse
      • 1、常见应用
      • 2、下载文件
      • 3、实现重定向
        • 重定向和转发的区别
    • 6、HttpServletRequest
      • 1、获取前端参数,以及请求转发
  • 七、Cookie、Session
    • 1、会话
    • 2、保存会话的两种技术
    • 3、Cookie

web开发:

web,网页的意思

web分为两种:

  • 静态web
    • html、css
    • 提供给所有人看,里面的数据始终不会发生改变
  • 动态web
    • 例如:淘宝,B站,几乎所有的网站都是动态的
    • 提供给所有人看,里面的数据会发生改变
    • 技术栈:Servlet/JSP、ASP、PHP

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

什么是web应用程序:

  • 多个 html 多个 web 资源组成,这些web资源可以被外界访问,对外界提供服务
  • 一个web应用由多部分组成(静态web、动态web)
    • html、css、js
    • jsp、servlet
    • java程序
    • jar包
    • 配置文件(Properties)

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

  • *.html的纯静态网页,从服务器中读取所有人看到的都是同一个页面,里面的东西都是写死的
  • 无法和数据库进行交互(数据无法持久化存储,用户无法进行交互)

  • 页面会动态展示,用户可以进行交互操作
  • 可以连接数据库进行持久化存储
  • 一旦服务器的动态web资源出现了错误或需要替换就需要重新编写后台程序,进行重新发布,也就是停机维护

PHP

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

JSP/Servlet

  • sun公司主推的B/S结构,基于Java语言
    • B/S:浏览器和服务器
    • C/S:客户端和服务端
  • 可以承载三高(高并发、高可用、高性能)问题带来的影响

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

Tomcat

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

Tomcat官网:点此进入

选择需要的Tomcat版本进行下载解压

JavaWeb

解压后获得Tomcat本体

JavaWeb

Tomcat目录介绍

  • bin:启动和关闭的脚本文件
  • conf:配置文件
  • lib:依赖的jar包
  • logs:日志文件
  • temp:临时文件
  • webapps:存放网站的目录

  1. 打开系统的环境变量设置页面
    JavaWeb
  2. 在系统变量中添加两个变量

    CATALINA_BASE

    CATALINA_HOME

    • CATALINA_BASE

      :(暂时不知道有什么用,好像不配置也行)
      JavaWeb
    • CATALINA_HOME

      :(必须配置)
      JavaWeb
  3. 在ClassPath的变量值中加入:

    %CATALINA_HOME%\lib\servlet-api.jar;

    (可以不用配置)
  4. 在Path的变量值中加入两个值:

    %CATALINA_HOME%\bin

    %CATALINA_HOME%\lib

    (必须配置)
    JavaWeb
  5. 测试,在cmd中使用输入

    startup

    命令启动Tomcat,能成功启动则环境配置完成
    JavaWeb

  • Tomcat运行出现问题优先检查Java环境配置

启动Tomcat服务:

  • 在bin包中找到
    JavaWeb
    文件并打开
  • 在浏览器中输入

    localhost:8080

    进入Tomcat
JavaWeb

关闭Tomcat服务:

  • JavaWeb
    文件并打开即可关闭
  • 也可以关闭

    cmd

    窗口进行关闭

Tomcat服务器核心配置文件:

conf

——>

server.xml

配置文件中可以修改端口号:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
           

常见的端口号:

  • Tomcat:8080
  • Mysql:3306
  • Http:80
  • Https:443

  1. 添加Tomcat
    JavaWeb
  2. 找到Tomcat
    JavaWeb
  3. 设置介绍
    JavaWeb
  4. 警告提示没有artifacts
    JavaWeb
    • 为什么会出现这个警告?
      • 不配置运行Tomcat会找不到页面
      • 访问网站时,需要指定一个文件夹名字才能访问,所以这个必须配置
        JavaWeb

将自己写的html文件,放到服务器(Tomcat)中指定的web应用的文件夹(webapps)下,就可以访问了

网站结构:

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

Tips:网站是如何访问的?

  1. 输入一个域名,回车访问
  2. 浏览器检查本机配置文件(C:\Windows\System32\drivers\etc\hosts)下是否有这个域名的映射
    • 有:直接返回对应的ip地址,这个地址有需要访问的web程序,则可以直接访问。
    • 没有:访问DNS服务器,找到匹配的就返回,找不到就返回找不到,报错。

把tomcat文件下的conf下的log.properties日志文件打开然后替换掉所有的UTF-8为GBK

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。

  • HTTP1.0
    • HTTP/1.0:客户端可以与web服务器连接后,只能获得一个web资源,然后就断开连接。
  • HTTP/2.0
    • HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。

客户端--->发请求(request)--->服务器

百度:

JavaWeb

  • 请求行中的请求方式:GET
  • 请求方式有很多种:
    • GET:请求能携带的参数较少,大小有限制,在浏览器的URL地址栏显示数据内容,不安全,但高效。
    • POST:请求能携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效。

JavaWeb
  • Accept:告诉浏览器,它所支持的数据类型
  • Accept-Encoding:告诉服务器,它支持哪种编码格式 例:GBK、UTF-8
  • Accept-Language:告诉浏览器,它的语言环境
  • Cache-Control:缓存控制
  • Connection:告诉浏览器,请求完成后是断开还是保持链接

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

JavaWeb

  • 跟请求头差不多,多了点东西
  • Refresh:告诉客户端,多久刷新一次
  • Location:让网页重新定位

  • 200:请求响应成功
  • 3xx:3打头的,都是请求重定向
    • 重定向:跳转到另一个位置
  • 4xx:4打头的,找不到资源,例:404
    • 资源不存在
  • 5xx:5打头的,服务器代码错误,例:500
    • 502:网关错误

为什么要学习Maven?

  1. 在JavaWeb开发中,需要使用大量的jar包,需要手动导入,十分繁琐。
  2. 有什么东西能一键自动协助我们导入和配置这个jar包?——Maven:正是在下

Maven的核心思想:约定大于配置

  • 有约束,不要违反。

Maven会规定好该如何编写Java代码,必须按照这个规范来;

Maven官网:点此进入

JavaWeb

配置的目录最好不要出现中文路径

配置MAVEN_HOME:

JavaWeb

在环境变量中添加:

JavaWeb

测试是否配置完成:

JavaWeb

由于Maven使用的镜像地址默认是国外的,又因为国内有结界保护导致访问很慢,可以把地址修改为阿里云的镜像地址,这样就能快速访问了

阿里官方教程:点此进入

  • 在Maven中找到配置文件
    JavaWeb
  • 打开 maven 的配置文件( windows 机器一般在 maven 安装目录的 conf/settings.xml ),在

    <mirrors></mirrors>

    标签中添加 mirror 子节点:
    <mirror>
      <id>aliyunmaven</id>
      <mirrorOf>*</mirrorOf>
      <name>阿里云公共仓库</name>
      <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
               
  • 老版配置:
    <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <!--<mirrorOf>central</mirrorOf> -->
        <mirrorOf>*</mirrorOf>
    </mirror>
               

在本地建立一个仓库不需要每次都去远程仓库下载

  • 打开Maven配置文件
    JavaWeb
  • 找到

    <localRepository>

    标签加入本地仓库的地址
    <!-- localRepository
       | The path to the local repository maven will use to store artifacts.
       |
       | Default: ${user.home}/.m2/repository
      <localRepository>/path/to/local/repo</localRepository>
      -->
    <!--本地仓库地址--> 
    <localRepository>F:/Code/Maven</localRepository>
               

Maven版本不同有可能和Idea冲突
  1. 创建MavenWeb项目
    JavaWeb
  2. 选择使用的Maven版本
    • IDEA自带了一个Maven
    • IDEA按测不到自己下载的Maven可能是Maven环境没配好
    JavaWeb
  3. 第一次使用Maven需要等包下好,下载完成控制台会有提示
    JavaWeb

  1. 选择新建一个Maven项目什么都不用选,一路下一步
    JavaWeb
  2. 目录介绍
    JavaWeb

<?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.wnaoii</groupId>
  <artifactId>javaweb-01-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--
  package:项目的打包方式
  jar:Java应用
  war:JavaWeb应用
  -->
  <packaging>war</packaging>

  <!--名称,不需要可以删除-->
  <name>javaweb-01-maven Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <!--配置-->
  <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>
    <!--具体依赖的jar包配置文件-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <!--项目构建用的东西,可以删不是硬性需求-->
  <build>
    <finalName>javaweb-01-maven</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>
           

  • 可以到Maven仓库中查找需要的jar包
  • 只需要在

    <dependencies>

    标签中添加即可
<dependencies>
    <!--具体依赖的jar包配置文件-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <!--Maven的高级之处在于,它会帮你导入这个jar包所依赖的其他jar包-->
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.10</version>
    </dependency>
</dependencies>
           

Maven资源导出问题:

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>
           

实现了Servlet接口的Java程序叫做,Servlet

  • Servlet是Sun公司开发动态Web的一门技术
  • Sun公司在这些API中提供了一个接口叫做

    Servlet

  • 开发一个Servlet程序,只需两步:
    • 编写一个实现类,实现Servlet接口
    • 把开发好的Java类部署到Web服务器中

Servlet有两个默认的实现类:HttpServlet,

  1. 构建一个Maven项目,把src目录删掉,方便之后学习中在这个项目中添加Model,这个空的工程就是Maven的主工程
  2. 关于Maven父子工程

    父项目会有:

    <modules>
        <module>servlet-01</module>
    </modules>
               
    子项目会有:
    <parent>
        <artifactId>javaweb-02-servlet</artifactId>
        <groupId>com.wnaoii</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
               
  3. Maven环境优化
    1. 修改web.xml文件为最新版(可以直接去Tomcat里copy)
    2. 将Maven的结构搭建完整
  4. 编写Servlet程序
    1. 新建一个普通类
    2. 实现Servlet接口,直接继承HttpServlet
      public class HelloServlet extends HttpServlet {
      
          // 由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              PrintWriter writer = resp.getWriter();  // 响应流
              writer.println("Hello,Servlet");
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
                 
  5. 配置Servlet映射

    为什么需要映射?

    之前编写的是 Java 程序,但是需要通过浏览器访问,而浏览器需要链接 Web 服务器,所以需要在 Web 服务器中注册之前写的 Servlet,还需要设置一个浏览器访问它的路径

    • 配置WEB-INF文件夹下的web配置文件
      <web-app>
        <!--注册Servlet-->
        <servlet>
          <servlet-name>hello</servlet-name>
          <servlet-class>com.wnaoii.servlet.HelloServlet</servlet-class>
        </servlet>
        <!--Servlet的请求路径-->
        <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello</url-pattern>
        </servlet-mapping>
      </web-app>
                 
  6. 配置Tomcat

    参考Tomcat小节

  7. 启动测试
    1. 使用版本为Tomcat10可能会出现 500错误
      JavaWeb
    2. 解决办法,把Tomcat10的版本降级到Tomcat9的版本即可成功运行
      JavaWeb

  1. 一个Servlet指定一个映射路径
    <!--Servlet的请求路径-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
               
  2. 一个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>/hello1</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
               
  3. 一个Servlet指定通用映射路径
    <!--Servlet的请求路径-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
               
  4. 默认请求路径(少用)

    这个路径会覆盖根路径,直接进这个页面

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
               
  5. 指定后缀路径
    <!--
    可以自定义后缀实现请求映射
    .*后面不能加项目映射的路径
    -->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.wnaoii</url-pattern>
    </servlet-mapping>
               

web容器在启动的时候,它会为每个web程序都创建一个对应的 ServletContext 对象且 ServletContext 全局唯一,它代表了当前的Web应用

在一个servlet类中保存数据,另一个servlet类能拿到那个数据

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

        ServletContext servletContext = this.getServletContext();
        String username = "小明"; // 数据
        servletContext.setAttribute("name", username);  // 将一个数据以键值对的方式保存在了ServletContext中,键:name,值:username
    }
           

另一个servlet类进行读取

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String name = (String) servletContext.getAttribute("name");
		
        // 设置编码类型防止出现中文乱码
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().println("名字:" + name);
    }

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

编写web.xml配置文件,注册刚刚写的servlet类

<?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>hello</servlet-name>
        <servlet-class>com.wnaoii.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.wnaoii.servlet.GetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getc</servlet-name>
        <url-pattern>/getc</url-pattern>
    </servlet-mapping>
</web-app>
           

  1. 在web配置文件中编写一个初始化的值(存在servletContext中?)
    <!--配置一个初始化参数-->
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    </context-param>
               
  2. 编写一个类,通过

    getInitParameter()

    方法读取web配置文件中初始化的值
    public class ServletDemo03 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext servletContext = this.getServletContext();
            String url = servletContext.getInitParameter("url");
            resp.getWriter().println(url);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
               
  3. 编写完读取类别忘了在web配置文件中注册
    <servlet>
        <servlet-name>getUrl</servlet-name>
        <servlet-class>com.wnaoii.servlet.ServletDemo03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getUrl</servlet-name>
        <url-pattern>/getUrl</url-pattern>
    </servlet-mapping>
               

调用getRequestDispatcher()方法实现请求转发

public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();

        // RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/getUrl");   // 请求转发的路径
        // requestDispatcher.forward(req,resp);    //调用forward()方法实现请求转发;
        servletContext.getRequestDispatcher("/getUrl").forward(req,resp);   // 整合成一句话
    }

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

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

HttpServletRequest

对象和一个代表响应的

HttpServletResponse

对象

  • 要获取客户端请求的参数:找HttpServletRequest
  • 要给客户端响应一些信息:找HttpServletResponse

  1. 向浏览器输出数据

  1. 获取下载文件的路径
  2. 选择需要下载的文件名
  3. 设置浏览器支持下载需要下载的文件(百度搜“web下载文件头信息”就能找到,参考)
  4. 获取下载文件的输入流
  5. 创建缓冲区
  6. 获取OutputStream对象
  7. 将FileOutputStream流写入到缓冲区(buffer)
  8. 使用OutPutStream将缓冲区中的数据输出到客户端
public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取下载文件的路径
        String realPath = "F:\\Code\\javaweb-01-maven\\javaweb-01-maven\\javaweb-02-servlet\\response\\target\\classes\\1.png";
        System.out.println("获取下载文件的路径为:" + realPath);

        // 获取下载文件的文件名
        realPath.substring(realPath.lastIndexOf("//") + 1);

        // 设置浏览器支持下载需要下载的文件
        resp.setHeader("Content-disposition","attachment;filename");

        // 获取下载文件的输入流
        FileInputStream fileInputStream = new FileInputStream(realPath);

        // 创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];

        // 获取OutPutStream对象
        ServletOutputStream outputStream = resp.getOutputStream();

        // 将FileOutPutStream流写入到buffer缓冲区
        while ((len = fileInputStream.read(buffer))>0) {
            outputStream.write(buffer,0,len);   // 使用OutPutStream将缓冲区中的数据输出到客户端
        }

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

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

什么是重定向?

客户端A 向 Web资源B 发送一个请求,Web资源B 收到请求后通知 客户端A 找另一个 Web资源C,这个过程叫重定向

使用

sendRedirect()

方法实现

public void sendRedirect(String location) throws IOException;
           

常见场景:

  • 用户登录:登陆成功后会跳转到另一个页面

测试:

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        重定向的本质
        resp.setHeader("location","/r/index.jsp");
        resp.setStatus(302);
        */
        resp.sendRedirect("/r/index.jsp");  // 重定向
    }

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

相同点:

  • 页面都会进行跳转

不同点:

  • 请求转发是在服务端
  • 请求转发时,URL地址栏不会发生变化 状态码:307
  • 重定向是在客户端
  • 重定向时,URL地址栏会发生变化 状态码:302

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest()的方法,获得客户端的所有信息

前端页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>

<h1>登录</h1>

<div style="text-align: center">
    <%--以post请求方式提交表单,提交到login请求--%>
    <form action="${pageContext.request.contextPath}/login" mathod="post">
        用户名:<input type="text" name="username"> <br>
        密码:<input type="password" name="password"> <br>
        爱好:
        <input type="checkbox" name="hobbies" value="唱歌">唱歌
        <input type="checkbox" name="hobbies" value="看书">看书
        <input type="checkbox" name="hobbies" value="看电影">看电影
        <br>
        <input type="submit">
    </form>
</div>
           

实现类:

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbies = req.getParameterValues("hobbies");
        System.out.println("====================");
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbies));
        System.out.println("====================");

        resp.setCharacterEncoding("utf-8");
        req.getRequestDispatcher("/success.jsp").forward(req,resp);

    }

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

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

有状态会话:一个用户登录了这个网站,下次再登录,服务器有记录,就能知道这个用户曾经登录过,称之为有状态会话

cookie

  • 客户端技术(通过响应拿到,通过请求上传)

session

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

  1. 从请求中拿到Cookie的信息
  2. 服务器响应给客户端Cookie
Cookie[] cookies = req.getCookies();	// 在请求中获得Cookie
cookie.getName()	// 获得Cookie中的key
cookie.getValue()	// 获得Cookie中的Value
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");	// 新建一个Cookie
cookie.setMaxAge(24*60*60);	// 设置Cookie的有效期
resp.addCookie(cookie);	// 响应给客户端一个Cookie
           
  • 浏览器Cookie上限为300个
  • 一个Web站点可以给浏览器发送多个Cookie,最多存放20个Cookie
  • 一个Cookie只能保存一个信息
  • Cookie的大小限制为

    4kb

  • 不设置Cookie的有效期,关闭浏览器,自动失效
  • 设置cookie有效期为0
上一篇: JavaWeb
下一篇: javaweb