JavaWeb学习笔记(全)(狂神)

本文深入探讨了JavaWeb开发的基础概念,包括Web应用程序、静态Web与动态Web的区别,以及Tomcat服务器的安装与配置。进一步,讲解了HTTP协议、Maven的使用以及IDEA中Maven项目的操作。同时,详细介绍了Servlet、HttpServletRequest和HttpServletResponse的应用,以及会话管理技术如Cookie和Session。最后,文章涵盖了JSP的基础语法、内置对象和JSTL标签的使用,并讨论了基于JavaBean的MVC架构和Filter过滤器的实现。
摘要由CSDN通过智能技术生成

1.web的基本概念

1.1前言

web开发:

  • web,网页的意思

  • 静态web

    • html、css
    • 提供给所有人看的数据始终不会发生变化!
  • 动态web

    • 淘宝,几乎是所有的网站。
    • 提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同。
    • 技术栈:servlet/JSP,ASP,PHP

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

1.2web应用程序

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

  • a.html 、b.html … 多个web资源,这些web资源可以被外界访问,对外界提供服务。
  • 你能访问到的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上。
  • URL
  • 这个统一的web资源会被放在同一个文件夹下,web应用程序–》tomcat:服务器
  • 一个web应用由多部分组成(静态web,动态web)
    • html,css,js
    • jsp,servlet
    • java程序
    • jar包
    • 配置文件(Properties)

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

1.3静态web

  • *.htm,*.html这些都是网页的后缀,如果服务器上一直存在这些东西,我们就可以直接进行读取。
  • 静态web存在缺点
    • web页面无法动态更新,所有用户看到都是同一个页面
      • 轮播图,点击特效:伪动态
      • JavaScript【实际开发中,它用的最多】
      • VBScript
    • 它无法和数据库交互(数据无法持久化,用户无法交互)

1.4动态web

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

缺点:

  • 假如服务器的动态资源出现了错误,我们需要重新编写我们的后台程序,重新发布。
    • 停机维护

优点:

  • web页面可以动态更新,所有用户都可以看到不同的页面
  • 它可以与数据库交互(数据持久化)

2.web服务器讲解

2.1技术讲解

ASP:

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

PHP:

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

JSP/Servlet:

B/S:浏览器和服务器

C/S:客户端和服务器

  • sun公司主推的B/S架构
  • 基于java语言的(所有的发送四,或者一些开源的组件,都是用java写的)
  • 可以承载三高问题带来的影响
  • 语法像ASP

2.2web服务器

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

IIS

微软的 windows中自带的

Tomcat

img

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

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

诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。

工作3-5年之后,可以尝试手写tomcat服务器。

下载tomcat:

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

3.tomcat详解

3.1安装tomcat

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

image-20210817215536281

解压

image-20210817215611861

3.2tomcat启动和配置

image-20210817220006987

启动,关闭tomcat

image-20210817220257077

访问测试:http://localhost:8080/

可能遇到的问题:

  1. java环境变量没有配置
  2. 闪退问题:需要配置兼容性
  3. 乱码问题:配置文件中设置

3.3配置

image-20210817220627007

可以配置启动的端口号

  • tomcat的默认端口为:8080

  • mysql默认端口:3306

  • http默认端口:80

  • https默认端口:443

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

可以配置主机的名称

  • 默认的主机名为:localhost — 127.0.0.1

  • 默认网站应用存放的位置为webapps

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
    

高难度面试题:

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

  1. 输入一个域名;回车
  2. 检查本机的配置文件C:WindowsSystem32driversetchosts下有没有这个域名的映射
    1. 有:直接返回对应的ip地址,这个地址中,有我们需要放的web程序,可以直接访问
    2. 没有:去DNS服务器找,找到的话就返回,找不到就返回找不到

4.可以配置一下环境变量(可选项)

3.4发布一个web网站

不会就先模仿

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

网站应该有的结构

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

4.http详解

4.1什么是HTPP

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

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

HTTPS:安全的

  • 443

4.2两个时代

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

4.3Http请求

  • 客户端—发送请求(Request)–服务器

百度:

Request URL: https://www.baidu.com/    请求地址
Request Method: GET     get方法/post方法
Status Code: 200 OK     状态码:200
Remote Address: 14.215.177.38:443


Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Cookie: BIDUPSID=E915D8DAC0FCA4159DF81414176EBD43; PSTM=1618281055; BAIDUID=E915D8DAC0FCA415F0B2ABB582D30135:FG=1; __yjs_duid=1_042d578ea86bfb698f35ffbf7e97f5ff1619488718760; BAIDUID_BFESS=E915D8DAC0FCA415F0B2ABB582D30135:FG=1; COOKIE_SESSION=16414_3_8_4_7_1_1_0_7_1_0_0_16416_0_3_0_1625410778_1625394325_1625410775%7C9%2379260_3_1625394323%7C2; BD_LAST_QID=9581266030928333830
Host: www.baidu.com

1.请求行

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

2.消息头

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

4.4Http响应

  • 服务器—响应—客户端

百度:

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

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环境搭建

我们为什么要学习这个技术?

  1. 在javaweb开发中,需要使用大量的jar,我们手动去导入

  2. 如何能够让一个东西自动帮我导入和配置这个jar包

    由此,Maven诞生了!

5.1Maven项目架构管理工具

我们目前就是方便导入jar包的

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

  • 有约束,不要去违反

Maven会规定好你该如何取编写我们的java代码,必须要按照这个规范来。

5.2下载安装Maven

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

image-20210819203013457

下载完成后,解压即可

友情建议:电脑上的所有环境都放到一个文件夹下,方便管理

5.3环境变量配置

在我们的系统环境变量中

配置如下配置:

  • M2_HOME maven目录下的bin目录
  • MAVEN_HOME maven的目录
  • 在系统的Path中配置%MAVEN_HOME%/bin

image-20210819203930744

测试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

<localRepository>D:/mavenRepository</localRepository>

6.idea中的maven操作

6.1创建一个maven项目

  1. 启动idea

  2. 创建一个maven web项目

    image-20210821112933801

    image-20210821142829865

    image-20210821143047701

    image-20210821113859409

  3. 等待项目初始化完毕

    image-20210821114719623

    image-20210821143126383

  4. 观察maven仓库中多了什么东西?

  5. idea中maven设置

    idea项目创建成功后,看一眼Maven的配置

    image-20210821142139214

    image-20210821142313164

  6. 到这里,maven在idea中的配置和使用就ok了

6.2创建一个普通的maven项目

image-20210821143805967

image-20210821143821541

image-20210821144032602

这个只有在web应用下才会有

image-20210821144237704

6.3标记文件夹功能

方法【1】

image-20210821144843840

方法【2】

image-20210821145104525

image-20210821145140271

image-20210821145356313

6.4在idea中配置tomcat

  1. 点击下面这里

    image-20210821145754956

  2. 点击加号,【tomcat service】 --》【local】

  3. 配置tomcat服务器

    image-20210821150504811

    image-20210821150537899

  4. 启动tomcat

    image-20210821151243135

    image-20210821151618902

6.5POM文件

pom.xml是maven的核心配置文件

image-20210821151913777

<?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.zyy</groupId>
  <artifactId>javaweb-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--packaging  项目的方法方式
    jar:jar应用
    war:javaWeb应用
  -->
  <packaging>war</packaging>

  <name>javaweb-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.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <!--项目依赖-->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <!--项目构建用的东西-->
  <build>
    <finalName>javaweb-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包所依赖的其他jar包

maven由于他的约定大于配置,我们之后可能会遇到我们写的配置文件,无法被导出或者生效的问题,解决方案:

  <!--在build中配置resources,来防止我们资源导出失败的问题-->  
  <build> 
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
  </build>

6.6idea操作

目录树

image-20210821154123366

maven中jar的联系关联图

image-20210821154340605

7.解决大家遇到的一些问题

  1. maven 3.6.2

    报错:unable to import maven project:see logs for details

    解决方法:降级为3.6.1

  2. tomcat闪退

  3. idea中每次都要重复配置maven

    在idea中的全局默认配置中去配置

    image-20210822112015614

  4. maven项目中tomcat无法配置

  5. maven默认web项目中的web.xml版本问题

    image-20210822112520405

    替换为webapp3.1版本和tomcat一致(看tomcat下的webapps里面的官方案例)

    <?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_3_1.xsd"
             version="3.1"
             metadata-complete="true">
    
      <display-name>Welcome to Tomcat</display-name>
    
    </web-app>
    
  6. maven仓库的使用

    地址:https://mvnrepository.com/

    image-20210822114151023

    image-20210822114058324

    image-20210822114215253

8.helloServlet

8.1servlet简介

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

把实现了servlet接口的java程序叫做,servlet

8.2HelloServlet

servlet接口sun公司有两个默认的实现类:HttpServlet、GenericServlet

  1. 建立一个普通的maven项目,删除src目录

image-20210822151123982

  1. 然后在此项目中,新建一个module(javaweb maven项目)

    关于maven父子工程的理解:

    父项目中会有

        <modules>
            <module>servlet-01</module>
        </modules>
    

    子项目中会有

        <parent>
            <artifactId>javaWeb-03-maven</artifactId>
            <groupId>com.zyy</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    

    父项目中的jar包子项目可以直接使用

    son extends father
    

    image-20210822152912534

    导servlet包(父项目POM文件中)

    <?xml version="1.0" encoding="UTF-8"?>
    <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>
    
        <groupId>com.zyy</groupId>
        <artifactId>javaWeb-03-maven</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>servlet-01</module>
        </modules>
        <dependencies>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    
    </project>
    
    1. maven环境优化

      1. 修改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_3_1.xsd"
                 version="3.1"
                 metadata-complete="true">
        
        </web-app>
        
      2. 将maven的结构搭建完整

        image-20210822153435351

    2. 编写一个servlet程序

      编写一个普通类,实现servlet接口,这里我们直接继承HttpServlet

      image-20210822154732934

      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.io.PrintWriter;
      
      /**
       * @ClassName: HelloServlet
       * @Description: TODO 类描述
       * @Author: zyy
       * @Date: 2021/08/22 15:35
       * @Version: 1.0
       */
      public class HelloServlet extends HttpServlet {
      
      
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
              response.setContentType("text/html");
              response.setCharacterEncoding("utf-8");
              PrintWriter out = response.getWriter();
              out.println("<html>");
              out.println("<head>");
              out.println("<title>Hello World!</title>");
              out.println("</head>");
              out.println("<body>");
              out.println("<h1>你好!</h1>");
              out.println("</body>");
              out.println("</html>");
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
      
    3. 编写一个servlet的映射

      为什么需要映射:我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的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_3_1.xsd"
               version="3.1"
               metadata-complete="true">
      
          <display-name>Welcome to Tomcat</display-name>
          <!--  web.xml是配置我们web的核心应用-->
          <!--  注册servlet-->
          <servlet>
              <servlet-name>helloServlet</servlet-name>
              <servlet-class>com.zyy.servlet.HelloServlet</servlet-class>
          </servlet>
          <!--  一个servlet对应一个Mapping:映射-->
          <servlet-mapping>
              <servlet-name>helloServlet</servlet-name>
              <!--    请求路径-->
              <url-pattern>/hello</url-pattern>
          </servlet-mapping>
      
      </web-app>
      
    4. 配置tomcat

      注意:配置项目发布的路径

      image-20210822160116977

    5. 测试

      image-20210822163233073

9.servlet原理

servlet是由web服务器调用

9.1Mapping问题

  1. 一个servlet可以指定一个映射路径

      <!--  一个servlet对应一个Mapping:映射-->
      <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <!--    请求路径-->
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
    
  2. 一个servlet可以指定多个映射路径

      <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/hello2</url-pattern>
      </servlet-mapping>
    
  3. 一个servlet可以指定通用映射路径

      <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/hello/*</url-pattern>
      </servlet-mapping>
    

    image-20210823222516732

    注意下面这样重启服务就不会默认进入到index.jsp页面了(不推荐使用)

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

    image-20210823222649069

  4. 指定一些后缀或者前缀等等

      <!--  可以自定义后缀实现请求映射
      注意点:*前民不能加项目映射的路径    /hello/*.do   是不可以的
      但是/hello/hi.do是可以的
      -->  
      <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
    

    image-20210823223110545

  5. 优先级问题

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

      <servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>com.zyy.servlet.HelloServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/hello/hi.do</url-pattern>
      </servlet-mapping>
      <!--  404-->
      <servlet>
        <servlet-name>errorServlet</servlet-name>
        <servlet-class>com.zyy.servlet.ErrorServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>errorServlet</servlet-name>
        <url-pattern>/*</url-pattern>
      </servlet-mapping>
    
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /**
     * @ClassName: HelloServlet
     * @Description: TODO 类描述
     * @Author: zyy
     * @Date: 2021/08/22 15:35
     * @Version: 1.0
     */
    public class HelloServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html");
            response.setCharacterEncoding("utf-8");
            PrintWriter out = response.getWriter();
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Hello World!</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>你好!</h1>");
            out.println("</body>");
            out.println("</html>");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

    image-20210823224313150

    image-20210823224325887

10.servletContext对象

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

1.共享数据

我在这个servlet中保存的数据,可以再另外一个servlet中拿到

  1. 新建一个module

image-20210825224031400

  1. HelloServlet.java

    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @ClassName: HelloServlet
     * @Description: TODO 类描述
     * @Author: zyy
     * @Date: 2021/08/25 22:14
     * @Version: 1.0
     */
    public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //this.getInitParameter()
            //this.getServletConfig()
            //servlet 上下文
            ServletContext servletContext = this.getServletContext();
            String name = "zyy";
            //将一个数据保存在了ServletContext中
            servletContext.setAttribute("name", name);
            System.out.println("hello " + name);
        }
    }
    
  2. GetServlet.java

    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @ClassName: GetServlet
     * @Description: TODO 类描述
     * @Author: zyy
     * @Date: 2021/08/25 22:31
     * @Version: 1.0
     */
    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.setCharacterEncoding("utf-8");
            resp.setContentType("text/html");
            resp.getWriter().print("get name is " + name);
        }
    }
    
  3. web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                          http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1"
             metadata-complete="true">
    
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>
    
        <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>com.zyy.servlet.HelloServlet</servlet-class>
        </servlet>
    
    
        <servlet-mapping>
            <servlet-name>getName</servlet-name>
            <url-pattern>/getName</url-pattern>
        </servlet-mapping>
    
        <servlet>
            <servlet-name>getName</servlet-name>
            <servlet-class>com.zyy.servlet.GetServlet</servlet-class>
        </servlet>
    
    </web-app>
    
  4. 测试

    先调用/hello

    image-20210825224259579

    再调用/getName

    image-20210825224324401

    重启,一开始就调用/getName

    image-20210825224503928

11.servletContext应用

1.获取初始化参数

    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    </context-param>

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

    <servlet>
        <servlet-name>getUrl</servlet-name>
        <servlet-class>com.zyy.servlet.ServletDemo03</servlet-class>
    </servlet>


import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @ClassName: ServletDemo03
 * @Description: TODO 类描述
 * @Author: zyy
 * @Date: 2021/08/26 22:43
 * @Version: 1.0
 */
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = req.getServletContext();
        String url = servletContext.getInitParameter("url");
        resp.getWriter().print(url);
    }

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

image-20210826225315359

2.请求转发

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

    <servlet>
        <servlet-name>dis</servlet-name>
        <servlet-class>com.zyy.servlet.ServletDemo04</servlet-class>
    </servlet>


import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @ClassName: ServletDemo03
 * @Description: TODO 类描述
 * @Author: zyy
 * @Date: 2021/08/26 22:43
 * @Version: 1.0
 */
public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = req.getServletContext();
//        RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/getUrl");
//        requestDispatcher.forward(req, resp);
        servletContext.getRequestDispatcher("/getUrl").forward(req, resp);

    }

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

image-20210826225845151

3.读取资源文件

Properties

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

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

思路:需要一个文件流

db.properties

username=root
password=123456

image-20210826231912370

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

    <servlet>
        <servlet-name>05</servlet-name>
        <servlet-class>com.zyy.servlet.ServletDemo05</servlet-class>
    </servlet>


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @ClassName: ServletDemo03
 * @Description: TODO 类描述
 * @Author: zyy
 * @Date: 2021/08/26 22:43
 * @Version: 1.0
 */
public class ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream in = req.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");

        Properties pro = new Properties();
        pro.load(in);

        String name = pro.getProperty("username");
        String pwd = pro.getProperty("password");

        resp.getWriter().print(name + ":" + pwd);

    }

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

image-20210826231820482

12.response下载文件

1.HttpServletResponse

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

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

简单分类

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

        public ServletOutputStream getOutputStream() throws IOException;
    
        public PrintWriter getWriter() throws IOException;
    
  2. 负责向浏览器发送响应头的方法

        public void setCharacterEncoding(String charset);
    
        public void setContentLength(int len);
    
        public void setContentLengthLong(long len);
    
        public void setContentType(String type);
    
        public void setDateHeader(String name, long date);
    
        public void addDateHeader(String name, long date);
    
        public void setHeader(String name, String value);
    
        public void addHeader(String name, String value);
    
        public void setIntHeader(String name, int value);
    
        public void addIntHeader(String name, int value);
    
  3. 响应的状态码(常见)

        /**
         * Status code (200) indicating the request succeeded normally.
         */
        public static final int SC_OK = 200;
        /**
         * Status code (302) indicating that the resource has temporarily
         * moved to another location, but that future refere
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值