JavaWeb

一、基本概念

1、前言

web开发:

web,网页的意思

web分为两种:

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

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

2、web应用程序

什么是web应用程序:

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

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

3、静态web

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

4、动态web

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

二、web服务器

1、技术讲解

PHP

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

JSP/Servlet

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

2、web服务器

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

Tomcat

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

三、Tomcat

1、安装Tomcat

Tomcat官网:点此进入

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

image-20210919003626759

解压后获得Tomcat本体

image-20210919004537649

Tomcat目录介绍

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

2、Tomcat环境配置

  1. 打开系统的环境变量设置页面

    image-20210920002558949

  2. 在系统变量中添加两个变量CATALINA_BASECATALINA_HOME

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

      image-20210920002900218

    • CATALINA_HOME:(必须配置

      image-20210920003019571

  3. 在ClassPath的变量值中加入:%CATALINA_HOME%\lib\servlet-api.jar;可以不用配置

  4. 在Path的变量值中加入两个值:%CATALINA_HOME%\bin%CATALINA_HOME%\lib必须配置

    image-20210920003824322

  5. 测试,在cmd中使用输入startup命令启动Tomcat,能成功启动则环境配置完成

    image-20210920004611125

3、Tomcat启动和关闭

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

启动Tomcat服务:

  • 在bin包中找到image-20210919005018713文件并打开
  • 在浏览器中输入localhost:8080进入Tomcat

image-20210919005232100

关闭Tomcat服务:

  • 在bin包中找到image-20210919005350278文件并打开即可关闭
  • 也可以关闭cmd窗口进行关闭

4、配置文件

Tomcat服务器核心配置文件:conf——>server.xml

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

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

常见的端口号

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

5、在 IDEA中配置Tomcat

  1. 添加Tomcatimage-20210919235827701

  2. 找到Tomcat

    image-20210920000120397

  3. 设置介绍

    image-20210920005835186

  4. 警告提示没有artifacts

    image-20210920012610810

    • 为什么会出现这个警告?

      • 不配置运行Tomcat会找不到页面

      • 访问网站时,需要指定一个文件夹名字才能访问,所以这个必须配置

        image-20210920014221663

6、发布一个简单的web网站

将自己写的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服务器,找到匹配的就返回,找不到就返回找不到,报错。

7、解决Tomcat控制台出现乱码

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

四、HTTP

1、什么是HTTP

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

2、HTTP的两个时代

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

3、HTTP请求

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

百度:image-20210919160606748

1、请求行

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

2、请求头

image-20210919162807397

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

4、HTTP响应

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

百度:image-20210919161227271

1、响应体

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

2、响应状态码

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

五、Maven

为什么要学习Maven?

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

1、Maven项目架构管理工具

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

  • 有约束,不要违反。

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

2、下载安装Maven

Maven官网:点此进入

image-20210919174234572

3、配置环境变量

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

配置MAVEN_HOME

MAVEN_HOME

image-20210919223303898

在环境变量中添加

%MAVEN_HOME%\bin

image-20210919223332926

测试是否配置完成

mvn -version

image-20210919175955115

4、修改镜像地址

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

阿里官方教程:点此进入

  • 在Maven中找到配置文件image-20210919181327184

  • 打开 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>
    

5、本地仓库

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

  • 打开Maven配置文件image-20210919181327184

  • 找到<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>
    

6、在IDEA中使用Maven

Maven版本不同有可能和Idea冲突

  1. 创建MavenWeb项目

    image-20210919215955670

  2. 选择使用的Maven版本

    • IDEA自带了一个Maven
    • IDEA按测不到自己下载的Maven可能是Maven环境没配好

    image-20210919224111320

  3. 第一次使用Maven需要等包下好,下载完成控制台会有提示

    image-20210919222002095

7、创建普通的Maven项目

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

    image-20210919231108463

  2. 目录介绍

    image-20210919234652888

8、pom.xml文件

1、详细介绍

<?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>

2、导入其它包

  • 可以到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>

3、可能出现的问题

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

1、Servlet简介

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

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

2、HelloServlet

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错误

      image-20210923153648283

    2. 解决办法,把Tomcat10的版本降级到Tomcat9的版本即可成功运行

      image-20210923153915127

3、Mapping问题

  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>
    

4、ServletContext

web容器在启动的时候,它会为每个web程序都创建一个对应的 ServletContext 对象且 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 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>

2、获取初始化参数

  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>
    

3、请求转发

调用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);
    }
}

5、HttpServletResponse

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

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

1、常见应用

  1. 向浏览器输出数据

2、下载文件

  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);
    }
}

3、实现重定向

什么是重定向?

客户端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

6、HttpServletRequest

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

1、获取前端参数,以及请求转发

前端页面:

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

七、Cookie、Session

1、会话

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

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

2、保存会话的两种技术

cookie

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

session

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

常见场景:有些网站登录一次过后,下次再进这个网站就不需要再次登录了

3、Cookie

  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是否存在上限?

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

删除Cookie

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

4、Session(重点)

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个session对象
  • 一个Session独占一个浏览器,只要这个浏览器没有关闭,这个Session就存在,无论这个浏览器创建了多少个新窗口

使用场景:

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

Session和Cookie的区别:

  • Cookie是把用户数据写给用户的浏览器,由浏览器保存(存在本地可以保存多个)
  • Session把用户的数据写到用户独占Session中,由服务器保存(一般只保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务器创建

Session的使用:

public class SessionDemo01 extends HttpServlet {
    @Override
    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的ID
        String id = session.getId();

        // 在session中存东西
        session.setAttribute("name",new Person("小衣","16"));	// 创建一个对象尝试存入

        // 判断Session是不是新创建的
        if (session.isNew()) {
            resp.getWriter().write("session创建成功,ID为:" + id);
        }else {
            resp.getWriter().write("session已经存在服务器中,ID为:" + id);
        }
    }

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

另一个Servlet中调用数据

public class SessionDemo02 extends HttpServlet {
    @Override
    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();
        Person person = (Person) session.getAttribute("name");  // 通过名字拿到之前存入的对象
        System.out.println(person);
    }

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

手动注销session

public class SessionDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        // 移除属性
        session.removeAttribute("name");
        //  注销Session
        session.invalidate();
    }

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

在web.xml配置文件中设置session会话自动失效时间

<!--设置Session失效时间-->
<session-config>
    <!--10分钟后失效,以分钟为单位-->
    <session-timeout>10</session-timeout>
</session-config>

八、JSP(了解)

1、 什么是JSP

JSP(Java Server Pages):Java服务器端页面,也和Servlet一样,用于动态Web技术

特点:写JSP就像写HTML一样

区别:

  • HTML只能给用户提供静态的数据
  • JSP页面中则可以嵌入Java代码,为用户提供动态数据

2、JSP原理

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet

JSP最终会转换成一个Java类

JSP本质上就是一个Servlet

3、JSP基础语法

九、三层架构

什么是MVC:Model(模型)、View(视图)、Controller(控制器)、

经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。

1、三层架构分别的作用

Model

  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD(Dao)

View

  • 展示数据
  • 提供链接发起Servlet请求(a、form、img...)

Controller(Servlet)

  • 接收用户的请求:(req:请求参数、Session信息...)
  • 交给业务层处理对应的代码
  • 控制试图跳转

十、Filter(过滤器)

(待添加)

posted @ 2021-09-25 02:08  WNAOII  阅读(131)  评论(0)    收藏  举报