JavaWeb

1、基本概念

1.1、前言

web开发:

  • web,网页的意思,www.baidu.com
  • 静态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应用由多部门组成(静态web,动态web)
    -html,css,js
    • jsp,servlet
    • Java程序
    • jar包
    • 配置文件(Properties)
      web程序编写完毕后,若想提供给外界访问:需要一个服务器来统一管理;

1.3、静态web

  • .htm,.html,这些都是网页的后缀,如果服务器上一直存在这些东西,我们就可以进行读取。在这里插入图片描述

  • 静态web存在的缺点

    • web页面无法动态更新,所有用户看到的都是同一个页面
    • 它无法跟数据库交互(数据无法持久化,用户无法交互)

1.4、动态web

页面会动态展示:web的页面展示的效果因人而异
在这里插入图片描述
缺点

  • 加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,冲洗发布;
    • List item 停机维护
    • 优点:
      • web页面可以动态更新,所有用户看到的都不是同一个页面
      • 它可以跟数据库交互(数据持久化:注册,商品信息)
        在这里插入图片描述

2、web服务器

2.1、技术讲解

ASP:

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

PHP

  • PHP开发速度很快,功能很强大,跨平台,代码很简单(70%,PHP)
  • 无法承载大访问量的情况(局限性)
    JSP/Servlet:
    B/S:浏览器和服务器
    C/S:客户端和服务器
  • sun公司主推的B/S架构
  • 基于Java语言的(所有的大公司,或者一些开源的组件,都是用Java写的)
  • 可以承载三高问题带来的影响;
  • 语法像ASP,ASP–>jsp,加强市场强度;

2.2、web服务器

服务器是一种被动的操作,用来处理用户的一些请求和给用户一些相应信息;
IIS:
微软的;ASP…,Windows中自带的
Tomcat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说。对于一个Java初学web的人来说,他是最佳的选择
Tomcat 实际上运行JSP 页面和Servlet。Tomcat最新版本为10.0.5。

工作3-5年之后,可以尝试手写Tomcat服务器;
下载Tomcat

  1. 安装or解压
  2. 了解配置文件及目录结构
  3. 这个东西的作用

3、Tomcat


3.1、安装Tomcat

Tomcat官网:https://tomcat.apache.org/
在这里插入图片描述

在这里插入图片描述
解压压缩包

3.2、Tomcat启动和配置

文件夹作用
在这里插入图片描述
启动.Tomcat
在这里插入图片描述
访问测试:http://localhost:8080/
可能遇到的问题:
1.Java环境变量没有配置
2.闪退问题:需要配置兼容性
3.乱码问题:配置文件设置
在这里插入图片描述
乱码问题不用处理,可能改了之后Idea中就无法使用了。
可以配置启动的端口号

  • tomcat的默认端口号是:8080
  • MySQL:3306
  • Http:80
  • https:443
    可以配置主机的名称
  • 默认的主机名为:localost->127.0.0.1
  • 默认网站存放的位置:webapps
    高难度面试题:网站是怎么访问的
  • 输入一个域名:回车
  • 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射;
    • 有:直接返回对应的ip地址,这个地址中,有我们需要的web程序,可以直接访问
    • 没有:去DNS服务器找,找到的话返回,找不到就返回找不到
      在这里插入图片描述
      4.可以配置一下环境变量(可选项)

3.4、web网站

网站应有的结构

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

4、Http

4.1、什么是HTTP

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。

  • 文本:html,字符串,~…
  • 超文本:图片,音乐,视频,定位,地图…
  • 默认端口:80
    HTTPS:安全的
  • 443

4.2、两个时代

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

4.3、Http请求

  • 客户端—发请求(Request)—服务器
    百度:
    在这里插入图片描述
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9    语言
Cache-Control: max-age=0
Connection: keep-alive

1、请求行

  • 请求行中的请求方式:GET
  • 请求方式:Get/Post ,HEAD,DELETE,PUT,TRACT…
    • get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效。
    • 请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效。

2、消息头

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

4.4、Http响应

  • 服务器—响应—客户端

百度:

Cache-Control: private    缓存控制
Connection: keep-alive    连接:
Content-Encoding: gzip    
X-Frame-Options: sameorigin
X-Ua-Compatible: IE=Edge,chrome=1

1.响应体

Accept: 告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式  GBK   UTF-8  GB2312   ISO8859-1
Accept-Language:告诉浏览器,它的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机..../
Refresh:告诉客户端,多久刷新一次
Location:让网页重新定位;

2、响应状态码

200:请求响应成功
3xx:请求重定向

  • 重定向:你重新到我给你的新位置去

4xx:找不到资源 404

  • 资源不存在
    5xx:服务器代码错误 500 502:网关错误

常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能展示回来,经历了什么?

5、Maven

  • 在Java web开发中,需要使用大量的jar包,我们需要手动去导入 ;
  • 如何能够让一个东西自动帮我导入配置这个jar包。
    由此,maven诞生了!

5.1Maven项目架构管理工具

我们目前用来就是方便导入jar包的!
Maven的核心思想:约定大于配置

  • 有约束,不要去违法
  • Maven会规定好你该如何去编写我们的Java代码,必须要按照这个规范来
    Maven官网:https://maven.apache.org/download.cgi

在这里插入图片描述
下载完成后,解压即可;
温馨提示:电脑上所有的环境都放在一个文件夹下,方便管理;

5.3 配置环境变量

在我们的系统环境变量中
配置如下配置

  • M2_HOME maven目录下的bin目录
  • MAVEN_HOME maven的目录
  • 在系统的path中配置MAVEN_HOME%\bin在这里插入图片描述
    测试Maven是否安装成功,保证必须配置完毕!

5.4阿里云镜像

  • 镜像:mirrors

    • 作用:加速我们的下载
  • 国内建议使用阿里云的

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

5.5 本地仓库

在本地的仓库,远程仓库;
建立一个仓库:

<localRepository>D:\web\apache-maven-3.8.3-bin\apache-maven-3.8.3\maven-repo</localRepository>

一定要是你们自己的maven-repo的地址才行

5.6、在IDEA中使用Maven

  1. 启动IDEA
  2. 创建一个MavenWeb项目在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
3. 等待项目初始化成功在这里插入图片描述
4. 观察maven仓库中多了什么东西?
5. IDEA中的maven设置
IDEA项目构建成功后,看一眼Maven的配置
在这里插入图片描述
6. 到这里,Maven在IDEA的配置和使用就ok了

5.7、创建一个普通的Maven项目在这里插入图片描述

一个干净的maven项目
在这里插入图片描述
这个只有在web文件夹下才有
在这里插入图片描述

5.8、标记文件夹功能在这里插入图片描述

5.9 、在IDEA中配置Tomcat

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
决警告问题
为什么会有这个问题:我们访问一个网站,需要指定一个文件夹名字在这里插入图片描述
在这里插入图片描述
配置后点击运行即可
会在你默认的浏览器中打开HelloWorld界面
在这里插入图片描述
在这里插入图片描述

5.10 pom文件

在这里插入图片描述

pom.xml是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.chen</groupId>
  <artifactId>javaaweb-01-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
<!--  Package:项目的打包方式
jar:Java应用
war:javaweb应用
-->
  <packaging>war</packaging>

  <name>javaaweb-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>
    <!--项目依赖-->
    <dependency>
<!-- 具体以来的jar包配置文件-->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>

    </dependency>
  </dependencies>
<!--项目构建用的东西-->
  <build>
    <finalName>javaaweb-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由于他的约定大于配置,我们之后可能会遇到我们写的配置文件,无法被导出或者无法生效的问题。

6、Servlet

6.1、Servlet简介

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

6.2、HelloServlet

Servlet接口在sun公司有两个默认实现类:HttpServlet,GenericServlet

  1. 构建一个普通maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建立Model;这个空的工程就是Maven的主工程;
  2. 关于Maven父子工程的理解:
    父项目中会有
<modules>
        <module>servlet-01</module>
    </modules>

子项目会有

  <parent>
    <artifactId>javaweb-02-servlet</artifactId>
    <groupId>org.example</groupId>
   
    <version>1.0-SNAPSHOT</version>
  </parent>

父项目中的Java子项目可以直接使用
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>
  1. Maven环境优化
  2. 修改web.xml为最新的
  3. 将maven的结构搭建完整
  4. 编写一个Servlet程序
    1. 编写一个普通类
    2. 实现Servlet接口,这里我们直接继承HttpServlet
      在这里插入图片描述
package com.chen.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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 {
        //ServletOutputStream outputStream = resp.getOutputStream();
        PrintWriter writer = resp.getWriter();//响应流
         writer.print("Hello,Servlet");
    }

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

  1. 编写Servlet的映射
    为什么需要映射:我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;
<!-- 注册Servlet-->
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.chen.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>


  1. 配置Tomcat注意:配置项目发布的路径就可以了
  2. 启动测试! ok!

6.3、Servlet运行原理

Servlet是由Web服务器调用,web服务器在收到浏览器在收到浏览器请求之后,会:
在这里插入图片描述
在这里插入图片描述

6.4、Mapping问题

  1. 一个Servlet可以指定一个映射路径
   <servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/hello1/</url-pattern>
   </servlet-mapping>
  1. 一个Servlet可以指定多个映射路径
  <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>
  1. 一个Servlet可以指定通用映射路径
    <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello/*</url-pattern>
</servlet-mapping>
  1. 默认请求路径
    <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
  1. 指定一些后缀或者前缀等等…`
    </servlet>
<!--  可以自定义后缀实现请求映射 
        注意点:*前面不能加映射的路径-->
    <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>*.czf</url-pattern>
</servlet-mapping>

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

<!-- 404 -->
    <servlet>
        <servlet-name>error</servlet-name>
        <servlet-class>com.chen.servlet.ErrorServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>error</servlet-name>
        <url-pattern>/*</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 {
        //this.getInitParameter()    初始化参数
        //this.getServletConfig();    Servlet配置
        //this.getServletContext()    Servlet上下文
        ServletContext context = this.getServletContext();
        String usetname="秦疆";  //数据
        context.setAttribute("username",usetname);//将一个数据保存在了ServletContext中,名字为username,值username
        System.out.println("Hello");
    }
    }
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);
    }
    }
<?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.chen.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.chen.Servlet.GetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getc</servlet-name>
        <url-pattern>/getc</url-pattern>
    </servlet-mapping>
 </web-app>

测试访问结果:

2、获取初始化参数

<!-- 配置一些web应用初始话参数   -->
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybaits</param-value>
    </context-param>
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        resp.getWriter().print(url);
    }

3、请求转发

图片理解什么是请求转发
当A想要拿到C的资源时,但A只能访问到B,所以B从C拿到资源后,再传递给A,传递时请求的路径不会发生改变,这就是请求转发。与重定向有本质意义上的区别。
在这里插入图片描述

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        System.out.println("进入了ServletDemo04");
//        RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/gp");
//        requestDispatcher.forward(req,resp);
        servletContext.getRequestDispatcher("/gp").forward(req,resp);
    }

读取资源文件

properties

  • 在Java目录下新建properties
  • 在resource目录下新建properties
    发现:都被打包在了同一路径下:classes,我们俗称这个路径为classpath
    思路:需要一个文件流;
public class ServletDemo05 extends HttpServlet {
    @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
            Properties prop =new Properties();
            prop.load(is);
            String user = prop.getProperty("username");
            String pwd = prop.getProperty("password");
            resp.getWriter().print(user+":"+pwd);
        }

访问测试即可ok;

6.6、HttpServletResponse

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

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

1、简单分类

负责向浏览器发送数据的方法

     ServletOutputStream getOutputStream() throws IOException;
     PrintWriter getWriter() throws IOException;`

负责向浏览器发送响应头的方法

 	void setCharacterEncoding(String var1);

    void setContentLength(int var1);

    void setContentLengthLong(long var1);

    void setContentType(String var1);
    
     void setDateHeader(String var1, long var2);

    void addDateHeader(String var1, long var2);

    void setHeader(String var1, String var2);

    void addHeader(String var1, String var2);

    void setIntHeader(String var1, int var2);

    void addIntHeader(String var1, int var2);

响应状态码

    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;

2、常见应用

  • 向浏览器输出消息
  • 下载文件
    1. 要获取下载文件的路径
    2. 下载的文件名是啥?
    3. 设置想办法让浏览器能够支持下载我们需要的东西
    4. 获取下载文件的输入流
    5. 创建缓冲区
    6. 获取OutputStream对象
    7. 将FIleOutputStream流写到缓冲区
    8. 使用OutputStream将缓冲区中的数据输出到客户端!
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 要获取下载文件的路径
        String realPath = "D:\\sy\\javaweb-02-servlet\\response\\target\\classes\\1.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流写到缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
        while((in.read(buffer))>0){
            out.write(buffer,0,len);
        }
//8.
        in.close();
        out.close();
    }

3、验证码功能

验证码怎么来的

  • 前端实现
  • 后端实现,需要用到Java的图片类,生成一个图片
package com.chen.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如何让浏览器五秒刷新一次
        resp.setHeader("refresh","3");
        //在内存中创建一个图片
        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.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","no-cache");

        //把图片写给浏览器
            ImageIO.write(Image,"jpg",resp.getOutputStream());
    }
        //生成随机数
    private String makeNum(){
        Random random=new Random();
        String s = random.nextInt(9999999) + "";
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i <7-s.length() ; i++) {
            sb.append(0);
        }
         s = sb.toString()+s;
        return s;
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

4、实现重定向

在这里插入图片描述
一个web资源收到客户端请求后,他会通知客户端去访问另外一个web资源,这个过程叫重定向。
常见场景:

  • 用户登录
void sendRedirect(String var1) throws IOException;

测试

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        resp.setHeader("Location","/r/img");
        resp.setStatus(302);
         */

        resp.sendRedirect("/r/img");//重定向
    }

面试题:请你聊一聊重定向和转发的区别?
相同点:

  • 页面都会实现跳转

不同点:

  • 请求转发的时候,url不会发生变化
  • 重定向的时候,url地址会发生变化
<html>
<body>
<%@page contentType="text/html;charset=utf-8" %>
<h2>Hello World!</h2>

<%--这里提交的路径,需要寻找到项目的路径--%>
<%--${pageContext.request.getContextPath}代表当前项目--%>
<form action="${pageContext.request.contextPath}/login" method="get">
    用户名:<input type="text" name="username"> <br>
    密码: <input type="password" name="password"><br>
    <input type="submit">
</form>
</body>
</html>
 public class RequestTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //处理请求
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(username + ":" + password);
        //重定向的时候一定要注意路径问题,否则404
        resp.sendRedirect("/r/success.jsp");

    }

6.7、HttpServletRequest

HttpServletRequest代表客户端的请求,用户通过http协议访问服务器,Http请求中的所有信息被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息
在这里插入图片描述
在这里插入图片描述

1、获取前端传递的函数,请求转发

在这里插入图片描述

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbys = req.getParameterValues("hobbys");
        System.out.println("=====================================");
        //后台接收中文乱码问题
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbys));
        System.out.println("=====================================");
        System.out.println(req.getContextPath());
        //通过请求转发
        //这里的/代表当前的web应用
        req.getRequestDispatcher(req.getContextPath()+"/"+"success.jsp").forward(req,resp);

    }

2、请求转发

面试题:请你聊一聊重定向和转发的区别?
相同点:

  • 页面都会实现跳转

不同点:

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

7、Cookie、Session

7.1、会话

会话:用户打开了一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话;
你怎么证明你是你所在学校的学生?
你 你的学校

  • 发票 学校给你发票
  • 学校登记 标记你来过了
    一个网站,怎么证明你来过?
    客户端 服务端
  • 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了;cookie
  • 服务器登记你来过了,下次你来的时候我来匹配你;session

7.2、保存会话的两种技术

cookie

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

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

  • 常见情景:网站登陆后,下次登录就可以直接登录了

7.3、Cookie

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

cookie:一般会保存在本地的 用户目录下 appdata;
一个网站cookie是否存在上限!聊聊细节问题

  • 一个Cookie只能保存一个信息;
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
  • Cookie大小有限制4kb
  • 300个cookie浏览器上限
    删除Cookie;
  • 不设置有效期,关闭浏览器,自动失效;
  • 设置有效期时间为0;

7.4、Session(重点)

什么是Session

  • 服务器会给每一个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
  • 用户登录之后,整个网站它都可以访问啦!–>保存用户的信息
    Session和Cookie的区别:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值