JavaWeb基础教程

目录

1 web的基本概念

1.1 前言

web开发:

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

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

1.2 web应用程序

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,ASP→JSP,加强市场强度

2.2 web服务器

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

IIS

微软的 windows中自带的

Tomcat
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/
在这里插入图片描述

解压

3.2 tomcat启动和配置

文件夹作用:
在这里插入图片描述

启动,关闭tomcat
在这里插入图片描述

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

可能遇到的问题:

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

3.3 配置

在这里插入图片描述

可以配置启动的端口号

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:\Windows\System32\drivers\etc\hosts下有没有这个域名的映射
    1. 有:直接返回对应的ip地址,这个地址中,有我们需要放的web程序,可以直接访问
    2. 没有:去DNS服务器找,找到的话就返回,找不到就返回找不到

在这里插入图片描述
3. 可以配置一下环境变量(可选项)

3.4 发布一个web网站

在这里插入图片描述

不会就先模仿

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

网站应该有的结构:

--webapps : tomcat服务器的web目录
   -ROOT
   -Mystudy : 网站的目录名
       -WEB-INF
          -web.xml : 网站配置文件
          -classes : java程序
          -lib : web应用所依赖的jar包
       -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.3 Http请求

客户端—发送请求(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

4.3.1.请求行

请求行中的请求方式:GET

请求方式:GET/POST, HEAD,DELETE,PUT,TRACT…

  • get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址拦显示数据内容,不安全,但是高效
  • post:请求能都携带的参数没有限制,大小没有限制,不会再在浏览器的URL地址拦显示数据内容,安全,但是不高效。

4.3.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                 编码
Content-Type: text/html;charset=utf-8  类型

4.4.1.响应体

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

4.4.2.响应状态码

200:请求响应成功

3xx:请求重定向
重定向:你重新到我给你的新位置去

4xx:找不到资源 404
资源不存在

5xx:服务器代码错误 500 502(网关错误)

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

  1. (域名解析)在客户端,浏览器输入地址后,首先会在windows系统文件的hosts中查找是否有对应的ip地址,如果没有则需要向DNS域名解析服务器询问该域名对应的ip地址。
  2. (TCP三次握手)获取相应的ip地址后,客户端与服务器端建立TCP连接(三次握手),(网络层,数据链路层,物理层)
    三次握手–>
    第一次握手:客户端向服务器端发送一个SYN段,该段中包含客户端的初始序列号。
    第二次握手:服务器端返回客户端SYN+ACK,该端中包含服务器端的初始序列号,ACK表示,已经确定收到客户端的SYN段。
    第三次握手:客户端向服务器端响应一个ACK端,ACK表示,已经确定接受到服务器端的SYN段。
  3. (建立起TCP连接后发起http请求)客户端向服务器端发送请求,包含请求行,请求头。主要的两种请求方式(GET与POST)
    –>GET:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据的内容,不安全,但高效。
    –>POST:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效。
  4. (服务器响应http请求)服务器处理请求,并返回响应,包含状态码,响应头,响应体。
  5. (浏览器解析http代码)浏览器收到响应,解析http代码渲染页面,并在浏览器页面展示出来。
  6. (断开连接)http1.0短连接,http1.1长连接。

5.Maven环境搭建

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

  1. 在javaweb开发中,需要使用大量的jar,我们手动去导入
  2. 如何能够让一个东西自动帮我导入和配置这个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

测试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:\JAVA\Maven\apache-maven-3.8.5\maven-repo</localRepository>

6.idea中的maven操作

6.1创建一个maven项目

  1. 启动idea

  2. 创建一个maven web项目
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 等待项目初始化完毕
    在这里插入图片描述
    在这里插入图片描述

  4. 观察maven仓库中多了什么东西?
    在这里插入图片描述

  5. idea中maven设置

idea项目创建成功后,看一眼Maven的配置
在这里插入图片描述
在这里插入图片描述

到这里,maven在idea中的配置和使用就ok了
在这里插入图片描述

6.2 创建一个普通的maven项目

不选,直接next,next,next
在这里插入图片描述

在这里插入图片描述

如果报错了,比如出现:

Cannot resolve plugin org.apache.maven.plugins:maven-resources-plugin:2.6

是因为它配置了IDEA自带的Maven版本,这时候自己设置成本地的版本
在这里插入图片描述

6.3 标记文件夹功能

方法【1】

在这里插入图片描述

方法【2】

在这里插入图片描述

在这里插入图片描述

6.4 在idea中配置tomcat

点击下面这里

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

配置tomcat服务器

启动tomcat

6.5 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.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.6 idea操作

目录树
在这里插入图片描述

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

7.1 maven 3.8.5

报错:unable to import maven project:see logs for details
解决方法:降级为3.6.3

7.2 tomcat闪退

7.3 idea中每次都要重复配置maven

在idea中的全局默认配置中去配置
在这里插入图片描述

在这里插入图片描述

7.4 maven项目中tomcat无法配置

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

在这里插入图片描述

替换为webapp4.0版本和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_4_0.xsd"
         version="4.0">
</web-app>

7.6 maven仓库的使用

可以找例子:http://localhost:8080/
在这里插入图片描述
在这里插入图片描述

Maven仓库地址:https://mvnrepository.com/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
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">
    <display-name>Welcome to Tomcat</display-name>
    <!--  web.xml是配置我们web的核心应用-->
    <!--  注册servlet-->
    <servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>com.mav.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--  一个servlet对应一个Mapping:映射-->
    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <!--    请求路径-->
        <url-pattern>/mav</url-pattern>
    </servlet-mapping>

</web-app>

HelloServlet.java

package com.mav.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.*;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
        //响应的类型:html
        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 {
        super.doPost(req, resp);
    }
}

在这里插入图片描述

然后就可以:
在这里插入图片描述

8.helloServlet

8.1 servlet简介

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

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

8.2 HelloServlet

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

1.建立一个普通的maven项目,删除src目录
在这里插入图片描述

2.然后在此项目中,新建一个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

在这里插入图片描述
导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>

3.maven环境优化

  • 修改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">
</web-app>
  • 将maven的结构搭建完整
    在这里插入图片描述

4.编写一个servlet程序

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

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;


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

5.编写一个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_4_0.xsd"
         version="4.0">
    <display-name>Welcome to Tomcat</display-name>
    <!--  web.xml是配置我们web的核心应用-->
    <!--  注册servlet-->
    <servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>com.mav.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--  一个servlet对应一个Mapping:映射-->
    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <!--    请求路径-->
        <url-pattern>/mav</url-pattern>
    </servlet-mapping>

</web-app>

6.配置tomcat

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

7.测试

9.servlet原理

servlet原理
servlet是由web服务器调用

9.1Mapping问题

  1. 一个servlet可以指定一个映射路径
  <!--  一个servlet对应一个Mapping:映射-->
  <servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <!--    请求路径-->
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  1. 一个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>
  1. 一个servlet可以指定通用映射路径
  <servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello/*</url-pattern>
  </servlet-mapping>
  1. 注意下面这样重启服务就不会默认进入到index.jsp页面了(不推荐使用)
  <servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
  1. 指定一些后缀或者前缀等等
  <!--  可以自定义后缀实现请求映射
  注意点:*前面不能加项目映射的路径    /hello/*.do   是不可以的
  但是/hello/hi.do是可以的
  -->  
  <servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  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_4_0.xsd"
         version="4.0">
    <display-name>Welcome to Tomcat</display-name>
    <!--  web.xml是配置我们web的核心应用-->
    <!--  注册servlet-->
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.mav.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--  一个servlet对应一个Mapping:映射-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <!--    请求路径-->
        <url-pattern>/mav</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>error</servlet-name>
        <servlet-class>com.mav.servlet.ErrorServlet</servlet-class>
    </servlet>
    <!--  一个servlet对应一个Mapping:映射-->
    <servlet-mapping>
        <servlet-name>error</servlet-name>
        <!--    请求路径-->
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

HelloServlet.java

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;


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

ErrorServlet.java

package com.mav.servlet;

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

public class ErrorServlet extends HelloServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
        //响应的类型:html
        response.setContentType("text/html");
        //获取响应的输出流
        response.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();

        out.println("<h1>404</h1>");

    }

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

在这里插入图片描述

在这里插入图片描述

10.servletContext对象

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

10.1. 共享数据

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

  1. 新建一个module
    在这里插入图片描述
  2. 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;


public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //this.getInitParameter()   初始化参数
        //this.getServletConfig()   Servlet配置
        //this.getServletContext()  Servlet上下文
        //servlet 上下文
        ServletContext servletContext = this.getServletContext();
        String name = "xxxx";
        //将一个数据保存在了ServletContext中
        servletContext.setAttribute("name", name);
        System.out.println("hello " + name);
    }
}
  1. 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;


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);
    }
}
  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_4_0.xsd"
         version="4.0">


    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.study.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

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

    <servlet>
        <servlet-name>getName</servlet-name>
        <servlet-class>com.study.servlet.GetServlet</servlet-class>
    </servlet>

</web-app>
  1. 测试

一开始就调用/getName
在这里插入图片描述

得先调用/hello,存数据
在这里插入图片描述
再调用/getName
在这里插入图片描述

11.servletContext应用

11.1.获取初始化参数

web.xml

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

ServletDemo03.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;


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

在这里插入图片描述

11.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;


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

在这里插入图片描述

请求转发
在这里插入图片描述
重定向
在这里插入图片描述

11.3.读取资源文件

Properties

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

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

思路:需要一个文件流

db.properties

username=root
password=123456

在这里插入图片描述

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

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

在这里插入图片描述

12.response下载文件

12.1.HttpServletResponse

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

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

12.2.简单分类

  1. 负责向浏览器发送数据的方法
    public ServletOutputStream getOutputStream() throws IOException;
    public PrintWriter getWriter() throws IOException;
  1. 负责向浏览器发送响应头的方法
    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);
  1. 响应的状态码(常见)
    响应状态码

    /**
     * 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 references should
     * still use the original URI to access the resource.
     *
     * This definition is being retained for backwards compatibility.
     * SC_FOUND is now the preferred definition.
     */
    public static final int SC_MOVED_TEMPORARILY = 302;
    /**
     * Status code (404) indicating that the requested resource is not
     * available.
     */
    public static final int SC_NOT_FOUND = 404;
    /**
     * Status code (500) indicating an error inside the HTTP server
     * which prevented it from fulfilling the request.
     */
    public static final int SC_INTERNAL_SERVER_ERROR = 500;
    /**
     * Status code (502) indicating that the HTTP server received an
     * invalid response from a server it consulted when acting as a
     * proxy or gateway.
     */
    public static final int SC_BAD_GATEWAY = 502;

//...

12.3.常见应用

  1. 向浏览器输出消息
  2. 下载文件
    1. 获取下载文件的路径
    2. 下载的文件名是啥?
    3. 设置想办法让浏览器能都支持我们下载的东西 文件名是中文的时候,可以设置URLEncoder.encode(fileName, “UTF-8”),否则有可能乱码
    4. 获取下载文件的输入流
    5. 创建缓冲区
    6. 获取OutputStrem对象
    7. 将FileOutputStream流写入到buffer缓冲区
    8. 使用OutputStream将缓冲区中的数据输出到客户端
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.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;


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

        //1. 获取下载文件的路径
        String realPath = "D:\\IdeaProjects\\javaweb-project-maven\\servlet-response\\src\\main\\resources\\哈哈.jpg";
        //2. 下载的文件名是啥?
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
        //3. 设置想办法让浏览器能都支持我们下载的东西 文件名是中文的时候,可以设置URLEncoder.encode(fileName, "UTF-8"),否则有可能乱码
        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. 获取OutputStrem对象
        ServletOutputStream out = resp.getOutputStream();
        //7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
        out.flush();
        out.close();
        in.close();
    }

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

13.response验证码实现

验证码怎么来的?

  • 前端实现
  • 后端实现,需要用到java图片类,生成一个图片
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 bufferedImage = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
        //得到图片
        Graphics2D bi = (Graphics2D) bufferedImage.getGraphics();
        //设置背景颜色为白色
        bi.setColor(Color.WHITE);
        bi.fillRect(0, 0, 80, 20);
        //给图片写数据
        bi.setColor(Color.BLUE);
        bi.setFont(new Font(null, Font.BOLD, 20));
        bi.drawString(makeNum(), 0, 20);
        //告诉浏览器用图片的方式打开
        resp.setContentType("image/jpeg");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("Expires",0);
        resp.addHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");

        ImageIO.write(bufferedImage, "jpeg", resp.getOutputStream());

    }

    /**
     * 生成随机数
     *
     * @return
     */
    private String makeNum() {
        Random random = new Random();
        String num = random.nextInt(999999) + "";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 6 - num.length(); i++) {
            sb.append("0");
        }
        return sb.toString() + num;

    }

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

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

    <servlet>
        <servlet-name>image</servlet-name>
        <servlet-class>com.zyy.res.ImageServlet</servlet-class>
    </servlet>

在这里插入图片描述

14.response重定向

一个web之源收到客户端A请求后,B会通知A客户端去访问另外一个web资源C,这个过程就叫做重定向。
在这里插入图片描述

常见场景:

  • 用户登录
    public void sendRedirect(String location) throws IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //重定向
        resp.sendRedirect("/res/image");

        //相当于
//        resp.setHeader("Location", "/res/image");
//        resp.setStatus(302);
    }

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

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

相同点

  • 页面都会实现跳转

不相同点

  • 请求转发,URL地址栏不会变; 307
  • 重定向,URL地址栏会发生变化。 302

模拟登录

index.jsp

<html>
<body>
<h2>Hello World!</h2>

<%--这里提交的路径,需要寻找项目的路径--%>
<%--${pageContext.request.contextPath}代表当前的项目--%>
<form action="${pageContext.request.contextPath}/login" method="get">
    用户名:<input type="text" name="username"/><br/>
    密码:<input type="password" name="pwd"/><br/>
    <input type="submit"/>
</form>
</body>
</html>
    <servlet-mapping>
        <servlet-name>req</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>req</servlet-name>
        <servlet-class>com.zyy.res.RequestTest</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;

public class RequestTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String pwd = req.getParameter("pwd");
        System.out.println(username + ":" + pwd);

        //重定向的时候,一定要注意路径问题,否则可能会404
        resp.sendRedirect("/res/success.jsp");
    }

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

success.jsp

<html>
<body>
<h2>成功</h2>
</body>
</html>

在这里插入图片描述

15.request应用

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

15.1.获取参数、请求转发

在这里插入图片描述

在这里插入图片描述
index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<h1>登录</h1>
<div style="text-align: center">
    <form action="${pageContext.request.contextPath}/login" method="post">
        用户名:<input type="text" name="username"/><br/>
        密码:<input type="password" name="pwd"/><br/>
        爱好:
        <input type="checkbox" name="hobbies" value="看电影"/>看电影
        <input type="checkbox" name="hobbies" value="阅读"/>阅读
        <input type="checkbox" name="hobbies" value="爬山"/>爬山
        <input type="checkbox" name="hobbies" value="摄影"/>摄影
        <br/>
        <input type="submit"/>
    </form>
</div>

</body>
</html>

success.jsp

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

</body>
</html>

web.xml

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

    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.zyy.req.LoginServlet</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.util.Arrays;


public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        String username = req.getParameter("username");
        String pwd = req.getParameter("pwd");
        String[] hobbies = req.getParameterValues("hobbies");

        System.out.println("======================");
        System.out.println(username);
        System.out.println(pwd);
        //后台接收中文乱码问题
        System.out.println(Arrays.toString(hobbies));
        System.out.println("======================");
        //通过请求转发
        // 这里的/代表当天的web应用
        req.getRequestDispatcher("/success.jsp").forward(req, resp);

    }

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

测试
在这里插入图片描述

16.cookie讲解

16.1.Session 会话

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

有状态会话: 一个同学曾经来过教室,下次再来的教室的时候,我们会知道这个同学,曾经来过,称之为有状态会话。

你怎么证明你是西开的学生?

你 西开

  1. 发票 西开给你开发票
  2. 学校登记 西开标记你过来了

一个网站,怎么证明你来过?

客户端 服务器

  1. 服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以;cookie
  2. 服务器登记你过来了,下次你来的时候我来匹配你。session

拓展:

http是一个无状态的协议

什么是无状态:就是说这次请求和上一次请求没有任何关系,互不认识。这种无状态的好处是快速。坏处是假如我们想要把www.zhihu.com/login.htmlwww.zhihu.com/index.html关联起来,必须使用某些手段和工具

16.2.会话保持的两种技术

cookie和session的区别
cookie

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

session

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

常见场景:

  • 网站登录之后,你下次不用再登录了,第二次访问直接就上去了。

16.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:一般会保存在本地的用户目录下/AppData下

一个网站cookie是否存在上限?

  • 一个cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,每个web站点最多存放20个cookie(
    不同的浏览器会有所不同)
  • cookie大小有限制4kb
  • 浏览器上限是300个cookie

删除cookie

  • 不设置有效期,关闭浏览器,自动失效
  • 设置有效期时间为0

新建一个项目
在这里插入图片描述
pom.xml

<?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-session-cookie</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
    </dependency>

  </dependencies>
</project>

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>c1</servlet-name>
        <url-pattern>/c1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>c1</servlet-name>
        <servlet-class>com.zyy.servlet.CookieDemo01</servlet-class>
    </servlet>


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

    <servlet>
        <servlet-name>c2</servlet-name>
        <servlet-class>com.zyy.servlet.CookieDemo02</servlet-class>
    </servlet>


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

    <servlet>
        <servlet-name>c3</servlet-name>
        <servlet-class>com.zyy.servlet.CookieDemo03</servlet-class>
    </servlet>

</web-app>

CookieDemo01.java

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;


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

        //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        PrintWriter writer = resp.getWriter();

        //cookie,服务器从客户端中获取
        Cookie[] cookies = req.getCookies();//这里返回的是数组,说明Cookie可能存在多个
        if (cookies == null) {
            writer.print("这是您第一次访问本站!");
        } else {
            writer.print("您上一次访问本站的时间是:" );
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if ("lastLoginTime".equals(cookie.getName())) {
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    writer.print(sd.format(date));
                }
            }
        }
        //添加 or 更新
        Cookie cookie = new Cookie("lastLoginTime", "" + System.currentTimeMillis());
        //设置cookie为1天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);
        writer.flush();
    }

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

CookieDemo02.java

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;


public class CookieDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        //添加 or 更新
        Cookie cookie = new Cookie("lastLoginTime", "" + System.currentTimeMillis());
        //设置有效期为0
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
    }

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

CookieDemo03.java

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;


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

        //解决中文乱码
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        PrintWriter writer = resp.getWriter();

        //cookie,服务器从客户端中获取
        Cookie[] cookies = req.getCookies();
        if (cookies == null) {
            writer.print("这是您第一次访问本站!");
        } else {
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if ("name".equals(cookie.getName())) {
                    //防止网络传输中文乱码问题
                    writer.print(URLDecoder.decode(cookie.getValue(), "UTF-8"));
                }
            }
        }
        //添加 or 更新
        Cookie cookie = new Cookie("name", URLEncoder.encode("狂神", "UTF-8"));
        resp.addCookie(cookie);
        writer.flush();
    }

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

17.session详解(重点)

17.1.session

什么是session?

  • 服务器会给每一个用户(浏览器)创建一个session对象;
  • 一个session独占一个浏览器,只要浏览器没有关闭,session就存在;
  • 用户登录之后,整个网站它都可以访问。–》保存用户的信息;保存购物车的信息
    在这里插入图片描述
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;


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存值
        session.setAttribute("name", "狂神");
        //获取session的id
        String id = session.getId();
        if (session.isNew()) {
            resp.getWriter().write("session创建成功,id:" + id);
        } else {
            resp.getWriter().write("session已经在服务器中存在了,id:" + id);
        }
        resp.getWriter().flush();
        //session创建的时候做了什么
//        Cookie cookie = new Cookie("JSESSIONID", id);
//        resp.addCookie(cookie);

    }

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

web.xml

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

    <servlet>
        <servlet-name>s1</servlet-name>
        <servlet-class>com.zyy.servlet.SessionDemo01</servlet-class>
    </servlet>

也可以存对象

Person.java


public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
import com.zyy.pojo.Person;

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


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存值
        session.setAttribute("person", new Person("zyy", 18));
        //获取session的id
        String id = session.getId();
        if (session.isNew()) {
            resp.getWriter().write("session创建成功,id:" + id);
        } else {
            resp.getWriter().write("session已经在服务器中存在了,id:" + id);
        }
        resp.getWriter().flush();
        //session创建的时候做了什么
//        Cookie cookie = new Cookie("JSESSIONID", id);
//        resp.addCookie(cookie);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
import com.zyy.pojo.Person;

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


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();
        //给session存值
        Person person = (Person) session.getAttribute("person");
        System.out.println(person.getName());

    }

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

清空session

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

public class SessionDemo03 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
        session.invalidate();
    }

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

web.xml

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

    <servlet>
        <servlet-name>s2</servlet-name>
        <servlet-class>com.zyy.servlet.SessionDemo02</servlet-class>
    </servlet>

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

    <servlet>
        <servlet-name>s3</servlet-name>
        <servlet-class>com.zyy.servlet.SessionDemo03</servlet-class>
    </servlet>

测试:先调用/s3清空,在调用/s2获取session信息,就会报错
在这里插入图片描述
web.xml可以设置session自动失效时间

    <session-config>
        <!--        设置session自动失效时间,单位分钟-->
        <session-timeout>1</session-timeout>
    </session-config>

session和cookie的区别

  • cookie是把用户的数据写给浏览器,浏览器保存(可以保存多个);
  • session是把用户的数据写到用户独占的session中,服务器端保存(保存重要的信息,避免服务器的资源浪费);
  • session由服务器创建
    在这里插入图片描述
    在这里插入图片描述
    使用场景:
  • 保存一个登录用户的信息
  • 购物车信息
  • 在整个网站中经常会使用的数据,我们会将它保存在session中

18.jsp原理剖析

18.1.什么是jsp

java server pages:java服务器端页面,也是servlet一样,用于动态web技术!

最大的特点:

  • 写jsp就像在写html
  • 区别:
    • html只给用户提供静态数据
    • jsp页面中可以嵌入java代码,为用户提供动态数据

18.2.jsp原理

思路:jsp到底怎么执行的?

  • 代码层面看不出啥(jsp)
  • 服务器内部工作
    tomcat中有一个work目录
    idea使用tomcat的会在idea的tomcat中生产一个work目录

在这里插入图片描述
我电脑的地址

C:\Users\64855\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\4ceb497d-02e5-46da-b920-2393ad9fa913\work\Catalina\localhost\cookie_war\org\apache\jsp

发现页面转变了java程序!
在这里插入图片描述
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问servlet

jsp最终也会被转换为一个java类

jsp本质上就是一个servlet

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {
                     
                 }

///
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {}

在这里插入图片描述
源码分析

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {
  //初始化      
  public void _jspInit() {
  }
  //销毁
  public void _jspDestroy() {
  }
  //jsp service
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {
      //1.请求方式判断  
      //...
      //2.内置一些对象
    final javax.servlet.jsp.PageContext pageContext;//页面上下本
    javax.servlet.http.HttpSession session = null;//session
    final javax.servlet.ServletContext application;//applicationContext
    final javax.servlet.ServletConfig config;//config
    javax.servlet.jsp.JspWriter out = null;//out
    final java.lang.Object page = this;//page:当前
      //...
      //3.输出页面前增加的代码
      response.setContentType("text/html");//设置响应页面类型
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;
      //4.以上的这些个对象我们可以在jsp中直接使用。
  }
}

在这里插入图片描述
在jsp页面中

只要是java代码就会原封不动的输出

如果是html代码,就会被转换为

      out.write("    <title>Title</title>\r\n");

这样的格式输出到前端
在这里插入图片描述

19.jsp基础语法和指令

任何语言都有自己的语法,java有,jsp作为java技术的一种应用,它拥有一些自己扩充的语法(了解,知道即可),java所有语法都支持。

新建一个项目
在这里插入图片描述
导包pom.xml

<?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-jsp</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--        servlet依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <!--        jsp依赖-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>
        <!--        jstl依赖-->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <!--      standard标签库  -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
    </dependencies>


</project>

19.1.jsp表达式

<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%--jsp表达式
  作用:用来将程序的输出到客户端
  <%= 变量或者表达式%>
  --%>
  <%=new Date()%>
  </body>
</html>

19.2.jsp脚本片段

<%--jsp脚本片段--%>
<%
  int sum = 0;
  for (int i = 1; i <= 100; i++) {
    sum += i;
  }
  out.print("<h1>sum=" + sum + "</h1>");
%>

在这里插入图片描述

19.3.脚本片段的再实现

<%
  int i = 5;
  out.print("i=" + i);
%>
<br/>
<%
  i += 5;
  out.print("i=" + i);
%>

<%--在代码中嵌入html元素--%>
<%
  for (int j = 0; j < 5; j++) {
%>
<h2>hello<%=j%></h2>
<%
  }
%>

在这里插入图片描述
在这里插入图片描述

19.4.jsp申明

<%!
  static {
    System.out.println("servlet load...");
  }

  private String globalVar = "zyy";

  public void zyy() {
    System.out.println("进入了zyy方法!");
  }
%>

<%zyy();%>

在这里插入图片描述
在这里插入图片描述
jsp声明,会被编译到jsp生成java代码的类中!其他的,就会被生成到_jspService方法中!

在jsp,嵌入java代码即可

<%%>
<%=%>
<%!%>

<%--注释--%>


${}  EL表达式

在这里插入图片描述
查看页面源代码
在这里插入图片描述
发现:jsp的注释,不会在客户端显示,html会!

19.5.jsp指令

<%@ page args... %>

<%@include file=""%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
  int i = 1/0;
%>

</body>
</html>

在这里插入图片描述
定制错误页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--定制错误页面--%>
<%@ page errorPage="error/500.jsp" %>
<%
  int i = 1/0;
%>

</body>
</html>

500.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>error</title>
</head>
<body>
<img src="../img/error_500.jpg">
</body>
</html>

在这里插入图片描述
验证
在这里插入图片描述
或者web.xml中配置错误页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
  int i = 1/0;
%>
</body>
</html>

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

    <error-page>
        <error-code>500</error-code>
        <location>/error/500.jsp</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
    </error-page>

</web-app>

404.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>error</title>
</head>
<body>
<img src="../img/error_404.jpg">
</body>
</html>

在这里插入图片描述
测试:
在这里插入图片描述
<%@include "%>
footer.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>我是Footer</h1>

header.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>我是Header</h1>

jsp2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%@include file="common/header.jsp"%>
<h1>网页主体</h1>
<%@include file="common/footer.jsp"%>

</body>
</html>

测试:
在这里插入图片描述
jsp标签

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
%@include会将两个页面合二为一 注意页面合并后的冲突(比如两个页面都定义了int i = 10  这种会报错)
--%>
<%@include file="common/header.jsp"%>
<h1>网页主体</h1>
<%@include file="common/footer.jsp"%>

<hr/>

<%--jsp标签
jsp:include 拼接页面 本质还是三个   推荐使用这种,这种不会出现上面的int i=10冲突的情况,因为本质还是三个页面
--%>
<jsp:include page="common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="common/footer.jsp"/>

</body>
</html>

在这里插入图片描述
分析一下源码
在这里插入图片描述
在这里插入图片描述

20.jsp内置对象及作用域

20.1.九大内置对象

  1. PageContext【存东西】
  2. Request 【存东西】
  3. Response
  4. Session【存东西】
  5. Application(ServletContext)【存东西】
  6. config(ServletConfig)
  7. out
  8. page【基本用不到】
  9. exception

新建pageContextDemo1.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
    pageContext.setAttribute("name1","zyy01");//保存的数据只在一个页面中有效
    request.setAttribute("name2","zyy02");//保存的数据只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3","zyy03");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","zyy04");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>

<%--脚本片段中的代码,会原封不动生成xxx.jsp.java
要求:这里面的代码,必须保证java语法的正确性
--%>
<%
    //从pageContext取出,我们通过寻找的方式来
    String name1 = (String) pageContext.findAttribute("name1");
    String name2 = (String) pageContext.findAttribute("name2");
    String name3 = (String) pageContext.findAttribute("name3");
    String name4 = (String) pageContext.findAttribute("name4");
    String name5 = (String) pageContext.findAttribute("name5");//不存在
%>
<%--使用el表达式输出  ${} --%>
<h1>取出的值为</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}不存在</h3>
<h3><%=name5%>不存在</h3>
</body>
</html>

在这里插入图片描述
新建pageContextDemo2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    //从pageContext取出,我们通过寻找的方式来
    String name1 = (String) pageContext.findAttribute("name1");
    String name2 = (String) pageContext.findAttribute("name2");
    String name3 = (String) pageContext.findAttribute("name3");
    String name4 = (String) pageContext.findAttribute("name4");
    String name5 = (String) pageContext.findAttribute("name5");//不存在
%>
<%--使用el表达式输出  ${} --%>
<h1>取出的值为</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}不存在</h3>
<h3><%=name5%>不存在</h3>
</body>
</html>

结果(需要先请求一下pageContextDemo1.jsp然后再请求pageContextDemo2.jsp,不然都取不到值)
在这里插入图片描述
新建pageContextDemo3.jsp

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


<%--
  public void setAttribute (String name,
			    Object attribute,
			    int scope)
  {
    switch (scope) {
    case PAGE_SCOPE:
      mPage.put (name, attribute);
      break;
    case REQUEST_SCOPE:
      mRequest.put (name, attribute);
      break;
    case SESSION_SCOPE:
      mSession.put (name, attribute);
      break;
    case APPLICATION_SCOPE:
      mApp.put (name, attribute);
      break;
    default:
      throw new IllegalArgumentException  ("Bad scope " + scope);
    }
  }
--%>

<%--内置对象--%>
<%
    pageContext.setAttribute("name1","zyy01", PageContext.REQUEST_SCOPE);
    //等价于 request.setAttribute("name1","zyy01");
%>
</body>
</html>

新建pageContextDemo4.jsp

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

<%
    pageContext.forward("/index.jsp");
    //request.getRequestDispatcher("/index.jsp").forward(request, response);
%>
</body>
</html>

在这里插入图片描述
request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻

session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车

application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据

21.jsp、jstl标签、EL表达式

导包

        </dependency>
        <!--        jstl依赖-->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <!--      standard标签库  -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

EL表达式: ${ }

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象
  • 调用java方法

jsp标签
jsptag.jsp

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

<h1>tag1</h1>
<%--<jsp:include>--%>

<%-- http://localhost:8080/jsptag.jsp?name=zyy&age=18 --%>
<jsp:forward page="/jsptag2.jsp">
    <jsp:param name="name" value="zyy"/>
    <jsp:param name="age" value="18"/>
</jsp:forward>

</body>
</html>

jsptag2.jsp

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

<h1>tag2</h1>
姓名:<%=request.getParameter("name")%>
年龄:<%=request.getParameter("age")%>
</body>
</html>

在这里插入图片描述
JSTL标签

jstl标签库的使用就是为了弥补html标签的不足;它自定义了许多标签,可以供我们使用,标签的功能和java代码一样!

  • 核心标签(掌握)
  • 格式化标签
  • sql标签
  • xml标签

核心标签如下:
在这里插入图片描述
JSTL标签库使用步骤:

  • 引用对应的taglib
  • 使用其中的方法
  • 在tomcat也需要引入jstl的包,否则会报错
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:55)

coreIf.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入jstl核心标签库,我们才能使用jstl标签 core--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h4>if测试</h4>
<form action="coreIf.jsp" method="get">
    <%--
    el表达式获取表单中的数据
    ${param.参数名}
    --%>
    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="登录">
</form>

<%--判断如果提交的用户名是管理员,则登录成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
    <c:out value="管理员!"></c:out>
</c:if>

<c:out value="${isAdmin}"></c:out>

</body>
</html>

coreWhen.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<c:set var="score" value="100"/>
<c:choose>
    <c:when test="${score>90}">优秀</c:when>
    <c:when test="${score>80}">良好</c:when>
    <c:when test="${score>60}">一般</c:when>
    <c:otherwise>不及格</c:otherwise>
</c:choose>
</body>
</html>

coreForeach.jsp

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
    List<String> personList = new ArrayList<>();
    personList.add(0, "张三");
    personList.add(1, "李四");
    personList.add(2, "王五");
    personList.add(3, "赵六");
    request.setAttribute("personList", personList);
%>

<%--
var 每一次遍历出来的变量
item 要遍历的对象
begin 开始下标
end 结束下标
step  步长
--%>
<c:forEach var="person" items="${personList}">
    <c:out value="${person}"/><br/>
</c:forEach>
<hr/>
<c:forEach var="person" items="${personList}" begin="1" end="3" step="2">
    <c:out value="${person}"/><br/>
</c:forEach>

</body>
</html>

22.javabean及作业

实体类

javaBean特定的写法:

  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的get/set方法

一般用来和数据库字段做映射

ORM:对象关系映射

  • 表—》类
  • 字段—》属性
  • 行记录–》对象
    在这里插入图片描述
public class Student {
    private int id;
    private String name;
    private int age;
    private String address;
    //...省了构造方法和get set 方法
}
  • 15
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值