JavaWeb学习之旅【个人笔记/更新中】

跟着狂神学习 JavaWeb 啦!路很长,慢慢走。

一、基本概念

1.1 前言

Web分类

静态Web:提供给人看的数据始终不会发生变化。
动态Web:提供给人看的数据会发生变化,每个人在不同时间不同地点看到的信息各不相同。技术栈:Servlet/JSP,ASP,PHP。

1.2 web应用程序

web应用程序:可以提供浏览器访问的程序。
①通过URL(统一资源定位符)能访问到世界上任何一个角落的计算机。
②这个统一的 web 资源会被放在同一个文件夹下,就是 web 应用程序 -> Tomcat:服务器。
③一个 web 应用由多部分组成:html,css, js,jsp,Servlet,Java 程序,jar 包,配置文件(Properties)。

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

1.3 静态web

客户端 -> 服务器:请求(Request)
服务器 -> 客户端:响应(Response)

静态页面的缺点:
① web 页面无法动态更新,所有用户看到的都是同一个页面。
② 无法和数据库交互(数据无法持久化)。

1.4 动态 web

页面会动态展示:web 的展示效果会因人而异。

动态 web 的缺点:
①假如服务器的动态 web 资源出现了错误,需要重新编写后台程序,再重新发布。

动态 web 的优点:
① web 页面可以动态更新,所有用户看到的都不是同一个页面。
② 可以和数据库交互(数据持久化:注册)。

二、web服务器

2.1 技术讲解

ASP:
①微软,国内最早流行的。
②在 HTML 中嵌入了 VB 的脚本,使用 ASP + COM。
③在ASP开发中,基本一个页面都有几千行的业务代码,页面及其混乱。
④维护成本高。
⑤主要使用 C#。

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

JSP/Servlet:
B/S:浏览器/服务器
C/S:客户端/服务器
① sun 公司主推的 B/S 架构。
②基于 Java(所有大公司或一些开源的组件,都是 Java 写的)。
③可以承载三高(高并发、高可用、高性能)问题带来的影响。
④语法像 ASP

2.2 web服务器

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

**IIS:**微软,ASP,…,Windows 中自带的

Tomcat:

Tomcat 是 Apache 软件基金会(Apache Software Foundation)的Jakarta
项目中的一个核心项目。最新的 Servlet 和 JSP 规范总是能在 Tomcat 中得到体现。因为Tomcat
技术先进、性能稳定,而且免费,因而深受 Java 爱好者的喜爱,成为比较流行的 Web 应用服务器。 Tomcat
服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试
JSP 程序的首选。 Tomcat 实际上运行 JSP 页面和 Servlet。

三、Tomcat

3.1 Tomcat 作用

Tomcat 的作用是:
① 管理 Servlet 应用的生命周期。
② 把客户端请求的 URL 映射到对应的 Servlet。
③ 与 Servlet 程序合作处理 HTTP。

3.2 安装 Tomcat

官网下载地址:https://tomcat.apache.org/download-10.cgi

3.3 Tomcat启动和配置

文件夹作用:
bin:启动/关闭的脚本文件
conf:配置
lib:依赖的 jar 包
logs:日志
webapps:存放网站

启动Tomcat:
启动 bin 目录下的 startup.bat 文件,发现命令行窗口一闪而过,解决办法如下:
① 命令行窗口打开 startup.bat 查看错误原因,我的错误原因是“JRE_HOME”环境变量配置不正确。
JavaWeb学习之旅【个人笔记/更新中】_第1张图片
② 添加 JAVA_HOME 环境变量
JavaWeb学习之旅【个人笔记/更新中】_第2张图片
此处的变量值为我安装的 jdk 目录。

③ 再次点击 startup.bat 文件,打开成功
JavaWeb学习之旅【个人笔记/更新中】_第3张图片
关闭 Tomcat:
shutdown.bat 文件

3.4 配置

conf 目录下的 server.xml

可以配置启动的端口号
Tomcat 默认端口号:8080
MySQL:3306
http:80
https:443


可以配置主机的名称
默认的主机名为:localhost -> 127.0.0.1
默认网站应用存放的位置为:webapps

  

高难度面试题:

  • 请你谈谈网站是如何进行访问的?

① 输入一个域名;回车
② 检查本机的 C:\Windows\System32\drivers\etc\hosts 配置文件下有没有这个域名映射。若有,直接返回对应的 ip 地址,这个地址中有我们需要访问的 web 程序,可以直接访问;若没有,去 DNS 服务器(全世界的域名都在这里管理),找的的话就返回,找不到就返回找不到。

3.5 发布一个 web 网站

① 将自己写的网站,放到 Tomcat 服务器中指定的 web 应用的文件夹下 -> webapps,即可以访问。这里直接贴狂神老师画的图!
JavaWeb学习之旅【个人笔记/更新中】_第4张图片

四、HTTP

4.1 什么是 HTTP

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

  • 文本:html,字符串,…
  • 超文本:图片、音乐、视频、定位、地图,…
  • 端口号:80

HTTPS:安全的

  • 端口号:443

4.2 两个时代

(笔试题)
HTTP 1.0:HTTP/1.0 客户端可以与 web 服务器连接后,只获得一个 web 资源,断开连接。
HTTP 2.0:HTTP/1.1 客户端可以与 web服务器连接后,获得多个 web 资源。

4.3 HTTP 请求

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

百度:

Request URL: https://www.baidu.com/  	  请求地址
Request Method: GET 	  				  get方法/host方法
Status Code: 200 OK    					  状态码:200
Remote Address: 36.152.44.96:443		  远程地址
Referrer Policy: no-referrer-when-downgrade
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive

请求行:

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

消息头:

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

4.4 HTTP响应

服务器 --> 响应请求(Response) --> 客户端

百度:

Cache-Control: private						缓存控制
Connection: keep-alive						连接:保持连接
Content-Encoding: gzip						编码
Content-Type: text/html;charset=utf-8		类型

响应体:

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

响应状态码(重点):

200:请求响应成功
3XX:请求重定向(重定向:你重新到我给你的新位置去)
4XX:找不到资源
5XX:服务器代码错误(502:网关错误)

常见面试题:

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

五、Maven

我为什么要学习这个技术?
① 在 JavaWeb 开发中,需要使用大量的 jar 包,我们需要手动去导入。
② 如何能够让一个东西自动帮我导入和配置这些 jar 包,由此,Maven 诞生了。

5.1 Maven 项目架构管理工具

目前用处:方便导入 jar 包。
Maven 的核心思想:约定大于配置!(大白话:有约束,不要去违反!!!)
Maven 会规定好你该如何去编写 Java 代码,必须按照这个规范来!

5.2 下载按照 Maven

官网:https://maven.apache.org/

5.3 配置环境变量

① M2_HOME,Maven 目录下的 bin 目录
② MAVEN_HOME,Maven 的目录
③ PATH 目录下新建:%MAVEN_HOME%\bin

5.4 阿里云镜像

镜像:mirrors,加速下载。建议使用阿里云的镜像

5.5 本地仓库

本地仓库、远程仓库。
建立一个本地仓库:localRepository

在 Maven安装目录下新建文件夹 maven-repo,将路径复制于此:
JavaWeb学习之旅【个人笔记/更新中】_第5张图片

5.6 在 IDEA 中使用 Maven

① 创建一个 MavenWeb 项目
JavaWeb学习之旅【个人笔记/更新中】_第6张图片
GroupId:组id,我后续填了 com.GlassMaple,不知道可行不可行,如果有问题后续回来修改。
ArtifactId:项目名
JavaWeb学习之旅【个人笔记/更新中】_第7张图片
这么选择就好:
JavaWeb学习之旅【个人笔记/更新中】_第8张图片
② 等待项目初始化完毕,这就体现了镜像的重要性!等待ing…
JavaWeb学习之旅【个人笔记/更新中】_第9张图片
③ 项目搭建成功
在这里插入图片描述
④ IDEA 中的 Maven 设置
IDEA 项目创建成功后,观察 IDEA 的配置,MavenHome 可能会使用默认的 Maven。
JavaWeb学习之旅【个人笔记/更新中】_第10张图片
⑤ 构成(只有在 Web 应用下才会有)
WEB-INF(web.xml):Web 的配置
index.jsp:网页
JavaWeb学习之旅【个人笔记/更新中】_第11张图片

5.7 创建一个普通的 Maven 项目

不勾选模板,直接 NEXT。
JavaWeb学习之旅【个人笔记/更新中】_第12张图片
main-java(蓝包):放置 Java 源代码
resource:放置配置文件
java(绿包):测试
JavaWeb学习之旅【个人笔记/更新中】_第13张图片
初始 Maven 概览:
JavaWeb学习之旅【个人笔记/更新中】_第14张图片

5.8 标记文件夹

先前的 MavenWeb 项目~
main 中新建两个包,一个为 java,一个为 resource,此时的 java 包无法 new 一个 class。
这时就要用标记文件夹功能。

Sources Root:源码目录
Test Source Root:测试源码目录
Resources Root:资源目录
Test Resources Root:测试资源目录
JavaWeb学习之旅【个人笔记/更新中】_第15张图片

5.9 在 IDEA 中配置 Tomcat

① 点击这个框
JavaWeb学习之旅【个人笔记/更新中】_第16张图片
② 找到并选择 Tomcat
JavaWeb学习之旅【个人笔记/更新中】_第17张图片
③ 初始配置
Name:服务器启动名称,可以随意配置
After Launch:默认的浏览器配置
JRE:JDK 环境
HTTP port:Tomcat 启动的端口号配置
Warning:警告:没有一个 artifacts。解决办法:创建一个。
JavaWeb学习之旅【个人笔记/更新中】_第18张图片
④ 解决 Warning
JavaWeb学习之旅【个人笔记/更新中】_第19张图片
产生该问题的原因:我们访问一个网站,需要指定一个文件夹名字。必须!

Application context 可写可不写。
若不写,默认访问路径为 localhost:8080;若写,我这里为/GlassMaple,则访问 localhost:8080/GlassMaple。这个过程叫做虚拟路径映射。
在这里插入图片描述

⑤ 启动成功
这里访问到的 Hello World!就是我们默认的 index.jsp 中的内容
JavaWeb学习之旅【个人笔记/更新中】_第20张图片
⑥ 右侧 Maven Projects 的作用
Lifecycle:Maven 的命令行操作。
Plugins:插件,甚至可以删掉
Dependencies:项目依赖,里面是一个个的 jar 包。
JavaWeb学习之旅【个人笔记/更新中】_第21张图片

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.GlassMaple</groupId>
  <artifactId>JavaWeb-01-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--项目的打包方式        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 核心:约定大于配置! 所以后续可能会遇到我们写的配置文件,无法被导出或生效的问题。
解决方案:在 build 中配置 resources,来防止我们资源导出失败的问题。

<build>
      <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*.properties
                **/*.xml</exclude>
             </excludes>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties
                **/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

六、Servlet

Servlet 接口在 Sun 公司 有两个默认的实现类:HttpServlet,GenericServlet
HttpServlet 继承自 GenericServlet,所以我们自己的类只要继承 HttpServlet 即可。

6.1 Servlet 简介

Servlet 是 sun 公司开发动态 web 的一门技术。sun 公司在这些 API 中提供一个接口叫做:Servlet。如果想开发一个 Servlet 程序,只需要完成两个小步骤:

  • 编写一个类,实现 Servlet 接口。
  • 把开发好的 Java 类部署到 web 服务器中。

总结:把实现了 Servlet 接口的 Java 程序叫做 Servlet。

6.2 HelloServlet(重要)

① 构建一个普通的 Maven 项目,删掉里面的 src 目录,以后我们的学习就在这个项目建立 Module ;这个空的工程就是 Maven 的主工程。

② 导入 dependencies (pom.xml)

<dependencies>
        <!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>5.0.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>
    </dependencies>

这里可能会出现报红的现象,稍微等待一会儿(它在下载),刷新后,报红消失。

③ 再其中建一个 webapp 项目作为子项目
关于 Maven 父子工程的理解
父项目中会有:


    Servlet-01

子项目中会有:


    JavaWeb-02-servlet
    com.GlassMaple
    1.0-SNAPSHOT

父项目中的 jar 包子项目可以直接使用,子项目的父项目不能使用(类似于 java 中的继承)。

④ Maven 环境优化

  • 修改 web.xml 为最新(可以不做)
  • 将 Maven 结构搭建完整(main 中建两个包,java 和 resources,记得标记文件夹

⑤ 编写一个 Servlet 程序

  • 编写一个普通类
  • 实现 Servlet 接口,这里选择直接继承 HttpServlet(重写 doGet 和 doPost 方法)

我的目录:JavaWeb学习之旅【个人笔记/更新中】_第22张图片

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

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

  <!--注册Servlet    一个Servlet对应一个Class,对应要注册的类-->
  <servlet>
    <servlet-name>Hello</servlet-name>
    <servlet-class>com.GlassMaple.Servlet.HelloServlet</servlet-class>
  </servlet>
  <!--Servlet的请求路径-->
  <servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/Hello</url-pattern>
  </servlet-mapping>

⑦ 配置 Tomcat
简化版的 5.9,主要是用于配置项目发布的路径。

⑧ 启动测试(web.xml 中启动)
JavaWeb学习之旅【个人笔记/更新中】_第23张图片

映射请求路径:JavaWeb学习之旅【个人笔记/更新中】_第24张图片

6.3 Servlet 原理

Servlet 是由 web 服务器调用,web 服务器在收到浏览器请求后,会执行如下过程(这里也直接贴狂神老师画的图):
JavaWeb学习之旅【个人笔记/更新中】_第25张图片

6.4 Mapping 问题

① 一个Servlet 可以指定一个映射路径

  <servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/Hello</url-pattern>
  </servlet-mapping>

② 一个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>
    <servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/Hello3</url-pattern>
  </servlet-mapping>

③ 一个Servlet 可以指定通用映射路径(Hello 后可以加任何东西)

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

④ 一个Servlet 可以指定一些前缀或前缀等等…

  <servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>*.Hello</url-pattern>	//自定义后缀
  </servlet-mapping>

⑤ 默认请求路径(不推荐使用)

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

⑥ 优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求。
例:
再写一个 Error 的 Java 文件,同样继承自 HttpServlet,并重写 doGet() 方法。

public class ErrorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");	//以html方式展现
        resp.setCharacterEncoding("utf-8");

        PrintWriter writer = resp.getWriter();
        writer.print("

404

"
); //显示内容 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }

web.xml 中再加上:

  <!--404-->
  <servlet>
    <servlet-name>error</servlet-name>
    <servlet-class>com.GlassMaple.Servlet.ErrorServlet</servlet-class>
  </servlet>

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

此时 可能会报红, 所以我们删了这个头!
约定大于配置,所以只要删了约定就好啦!

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

运行结果如下:
JavaWeb学习之旅【个人笔记/更新中】_第26张图片
映射请求路径存在:
JavaWeb学习之旅【个人笔记/更新中】_第27张图片
映射请求路径不存在:
JavaWeb学习之旅【个人笔记/更新中】_第28张图片

6.5 ServletConfig

在 Servlet 运行期间,需要一些辅助信息,例如文件使用的编码等。

使用 getServletConfig() 来获取配置信息,例如初始化的编码格式等:

public class Test02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");

        ServletConfig config = this.getServletConfig(); //获取config对象
        String param = config.getInitParameter("encoding"); //获得初始化的编码参数,在web.xml中初始化

        PrintWriter writer = resp.getWriter();  //显示
        writer.print("编码格式为:" + param);
    }

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

.xml(在其中配置初始化参数,例如编码格式。getServletConfig() 获取到的参数就是这里面的,init-param 写在 servlet 里面):

  <servlet>
    <servlet-name>encoding</servlet-name>
    <servlet-class>com.GlassMaple.Servlet.Test02</servlet-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>encoding</servlet-name>
    <url-pattern>/param</url-pattern>
  </servlet-mapping>

6.6 ServletContext

在父工程下新建一个 module 为 Servlet-02,发现新建的包中没有 src 。
解决办法:在创建时添加如下的 Property。
JavaWeb学习之旅【个人笔记/更新中】_第29张图片
若发现 pom.xml 文件上有横线(并且在配置 Tomcat 时发现 Artifact 中没有当前 module 的 war 文件),表示先前创建过同名的 module ,IDEA 会自动忽略,所以在设置中修改一下即可。
JavaWeb学习之旅【个人笔记/更新中】_第30张图片
web 容器在启动的时候,它会为每个 web 程序都创建一个对应的 ServletContext 对象,它代表了当前的 web 应用。(我们建立的网站就是由这个 ServletContext 对象来管理的)

① 共享数据:
我在这个 Servlet 中保存的数据,可以在另一个 Servlet 中拿到。

创建一个放置数据的类,setAttribute():

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

        //this.getInitParameter();  初始化参数
        //this.getServletConfig();  Servlet配置
        //this.getServletContext(); 上下文

        ServletContext context = this.getServletContext();

        String username = "张三";
        context.setAttribute("username",username);  //将一个数据保存在ServletContext中,名字为username,值为username对象

        System.out.println("Hello");    //显示在终端上,而非网页界面上
    }

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

读取它的类,getAttribute():

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

.xml:

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.GlassMaple.Servlet.hello</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>getContext</servlet-name>
    <servlet-class>com.GlassMaple.Servlet.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>getContext</servlet-name>
    <url-pattern>/getContext</url-pattern>
  </servlet-mapping>

② 获取 web 应用程序初始化参数
java部分:

public class Test03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");

        ServletContext context = this.getServletContext();
        Enumeration<String> parameterNames = context.getInitParameterNames();
        PrintWriter writer = resp.getWriter();

        while (parameterNames.hasMoreElements()){   //循环打印获取到的参数名+参数值
            String name = parameterNames.nextElement(); //获取参数名
            String value = context.getInitParameter(name);  //获取参数名对应的参数值
            writer.println(name + ":" + value);
        }
    }

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

.xml部分(context-param 写在 servlet 前):

  <context-param>
    <param-name>address</param-name>
    <param-value>shanghai</param-value>
  </context-param>
  <context-param>
    <param-name>name</param-name>
    <param-value>GlassMaple</param-value>
  </context-param>
  <servlet>
    <servlet-name>servlet03</servlet-name>
    <servlet-class>com.GlassMaple.Servlet.Test03</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>servlet03</servlet-name>
    <url-pattern>/go</url-pattern>
  </servlet-mapping>

③ 读取资源文件(前两个有好多方法,稍微有点晕了,不徒增负担了,日后绕清楚了再补)

6.7 HttpServletResponse

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

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

1. 简单分类

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

    ServletOutputStream getOutputStream() throws IOException;	//写其他流
    PrintWriter getWriter() throws IOException;	//写中文

负责向浏览器发送响应头的方法(ServletResponse 中):

	void setCharacterEncoding(String var1);
	void setContentLength(int var1);
	void setContentLengthLong(long var1);
	void setContentType(String var1);

HttpServletResponse 中:

	void sendError(int var1, String var2) throws IOException;
	void sendError(int var1) throws IOException;
	void sendRedirect(String var1) throws IOException;
	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);
	void setStatus(int var1);

响应的状态码(记住 4.4 中写的即可,不用全部知道):

    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. 常见应用

① 向浏览器输出消息

② 下载文件:

  • 要获取下载文件的路径
  • 下载的文件名是什么
  • 设置让浏览器能够支持下载我们需要的文件
  • 获取下载文件的输入流
  • 创建缓冲区域
  • 获取 OutputStream 对象
  • 将 FileOutputStream 流写入到 buffer 缓冲区
  • 使用 OutputStream 将缓冲区中的数据输出到客户端

6.8 HttpServletRequest

index1.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>显示登录的用户信息</title>
</head>
<body>
<br/>
<center><h3>欢迎光临</h3></center>
<br />
<br />
<c:choose>
    <c:when test = "${sessionScope.user == null}">
        <a href="${pageContext.request.contextPath }/login.jsp">用户登录</a>
    </c:when>
    <c:otherwise>
        欢迎你,${sessionScope.user.username }!
        <a href="${pageContext.request.contextPath }/LogoutServlet">注销</a>
    </c:otherwise>
</c:choose>
<hr />
</body>
</html>

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" import="java.util.*" %>
<html>
<head></head>
<center><h3>用户登录</h3></center>
<body style="text-align: center;">
<form action="${pageContext.request.contextPath }/LoginServlet" method="post">
    <table border="1" width="600px" cellpadding="0" cellspacing="0" align="center">
        <tr>
            <td height="30" align="center">用户名:</td>
            <td> &nbsp;&nbsp;<input type="text" name="username" />${errerMsg} </td>
        </tr>
        <tr>
            <td height="30" align="center">&nbsp; 码:</td>
            <td>&nbsp;&nbsp;  <input type="password" name="password" /></td>
        </tr>
        <tr>
            <td height="35" align="center">自动登录时间</td>
            <td><input type="radio" name="autologin" value="${60*60*24*31}" />一个月
                <input type="radio" name="autologin" value="${60*60*24*31*3}" />三个月
                <input type="radio" name="autologin" value="${60*60*24*31*6}" />半年
                <input type="radio" name="autologin" value="${60*60*24*31*12}" />一年
            </td>
        </tr>
        <tr>
            <td height="30" colspan="2" align="center">
                <input type="submit" value="登录" />
                &nbsp;&nbsp;&nbsp;&nbsp;
                <input type="reset" value="重置" />
            </td>
        </tr>
    </table>
</form>
</body>
</html>

User:

public class User {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

LoginServlet:

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

import java.io.IOException;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获得用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //检查用户名和密码
        if ("GlassMaple".equals(username) && "123456789".equals(password)){
            //登陆成功,将用户状态user对象存入session
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            request.getSession().setAttribute("user",user);
            //发送自动登录的cookie
            String autoLogin = request.getParameter("autologin");
            if (autoLogin != null){
                Cookie cookie = new Cookie("autologin",username + "-" + password);
                cookie.setMaxAge(Integer.parseInt(autoLogin));
                cookie.setPath(request.getContextPath());
                response.addCookie(cookie);
            }
            //跳转至首页
            response.sendRedirect(request.getContextPath() + "/index1.jsp");
        }
        else {
            request.setAttribute("errerMsg","用户名或密码错误");
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        super.doGet(request, response);
    }
}

LogoutServlet

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

import java.io.IOException;

public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //用户注销
        request.getSession().removeAttribute("user");
        //从客户端删除自动登录的cookie
        Cookie cookie = new Cookie("autologin","msg");
        cookie.setPath(request.getContextPath());
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        response.sendRedirect(request.getContextPath() + "/index1.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        super.doGet(request, response);
    }
}

AutologinFilter

import jakarta.servlet.http.*;
import jakarta.servlet.http.HttpServletRequest;

import javax.servlet.*;
import java.io.IOException;


public class AutoLoginFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        //获得一个名为autologin的cookie
        Cookie[] cookies = request.getCookies();
        String autologin = null;
        for (int i = 0; cookies != null && i < cookies.length; i++){
            if ("autologin".equals(cookies[i].getName())){
                //找到了指定的cookie
                autologin = cookies[i].getValue();
                break;
            }
        }
        if (autologin != null){ //自动登录
            String[] parts = autologin.split("-");
            String username = parts[0];
            String password = parts[1];
            //检查用户名和密码
            if("GlassMaple".equals(username) && ("123456789").equals(password)){
                User user = new User();
                user.setUsername(username);
                user.setPassword(password);
                request.getSession().setAttribute("user",user);
            }
        }
        //放行
        chain.doFilter(req,response);
    }

    @Override
    public void destroy() {

    }
}

web.xml

  <filter>
    <filter-name>AutoLoginFilter</filter-name>
    <filter-class>com.GlassMaple.Servlet.AutoLoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>AutoLoginFilter</filter-name>
    <url-pattern>/*
  

  
    LoginServlet
    com.GlassMaple.Servlet.LoginServlet
  
  
    LoginServlet
    /LoginServlet
  

  
    LogoutServlet
    com.GlassMaple.Servlet.LogoutServlet
  
  
    LogoutServlet
    /LogoutServlet
  

(持续更新中…)

你可能感兴趣的:(学习之旅,学习,java,tomcat,maven,idea)