javaweb 笔记

1、基本概念

1.1、前言

web开发:

  • web,网页的意思,www.baidu.com·

  • 静态web

    • html,sss

    • 提供给所有人看的数据始终不会发生变化!

  • 动态web

    • 淘宝,几乎是所有的网站;

    • 提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同!

    • 技术栈:Servlet/ISP,ASP,PHP

1.2、web应用程序web应用程序:

可以提供浏览器访问的程序;

  • a.html、b.html.….多个web资源,这些web资源可以被外界访问,对外界提供服务;

  • 你们能访问到的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上。

  • URL

  • 这个统一的web资源会被放在同一个文件夹下,web应用程序>Tomcat:服务器

  • 一个web应用由多部分组成(静态web,动态web)

    • html,sss,is

    • jsp,servlet

    • Java程序

    • jar包

    • 配置文件(Properties)

Web酸用程序编写完毕后,若想提供给外界访问;需费一个服务蔬来统一管理

1.3、静态web

  • *.htm, *.html这些都是网员的后境、如果服务器上一直存在这些东四,我们就可以直接进行读取、需要网络;

  • 在这里插入图片描述

  • 静态web存在的缺点

    • Web页面无法动态更新,所有用户看到都是同一个页面

      • 轮播图,点击特效:伪动态

      • JavaScript[实际开发中,它用的最多]

      • VBScript

    • 它无法和数据库交互(数据无法持久化,用户无法交互)

1.4、 动态web

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

  • 加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布;

    • 停机维护优点:

  • Web页面可以动态更新,所有用户看到都不是同一个页面

  • 它可以与数据库交互(数据持久化:注册,商品信息,用户信息………) 在这里插入图片描述

 

2、web服务器

2.1、技术讲解

ASP:

  • 微软:国内最早流行的就是ASP;

  • ·在HTML中嵌入了VB的脚本,ASP+COM;

  • ·在ASP开发中,基本一个页面都有几干行的业务代码,页面极其换乱

  • ·维护成本高!

  • C#

  • IIS

php:

  • PHP开发速度很快,功能很强大,跨平台,代码很简单(70%,WP)

  • ·无法承载大访问量的情况(局限性)

jSP/Servlet: B/S;浏览和服务器C/S:客户端和服务器

  • sun公司主推的B/S架构

  • 基于Java语言的(所有的大公司,或者一些开源的组件,都是用Java写的)

  • 可以承载三高问题带来的影响;

  • 语法像ASP,ASP->JSP,加强市场强度;

2.2、web服务器

服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息; lIS 微软的;ASP.,Windows中自带的 Tomcat

在这里插入图片描述 面向百度编程: Tomcat是Apache 软件基金会(Apache Software Foundation)的jakarta项目中的一个核心项目,最新的Servlet 和ISP 规范总是能在Tomcat中得到体现,因为Tomcat 技术先进、性能稳定,而且免费,因而深受lava爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。

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

Tomcat 实际上运行JSP页面和Serlet。Tornct最新版易9.0

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

下载tomcat:

  1. 安装or解压

  2. 了解配置文件及目录结构

  3. 这个东西的作用

 

3、Tomcat

3.1安装tomcat tomcat

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

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

3.2、Tomcat启动和配置

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

img 访问测试:http://localhost:8080/ 可能遇到的问题:

  1. Java环境变量没有配置

  2. 闪退问题:需要配置兼容性

  3. 乱码问题:配置文件中设置

可以修改 conf/logging.properties 中的 java.util.logging.ConsoleHandler.encoding = GBK 解决乱码问题

3.3、配置

在这里插入图片描述

可以配置启动的端口号

  • tomcat的默认端口号为:8080

  • mysql:3306

  • http:80

  • https:443

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

可以配置主机的名称

  • 默认的主机名为:localhost->127.0.0.1

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

  <Host name="www.qinjiang.com"  appBase="webapps"
       unpackWARs="true" autoDeploy="true">

高难度面试题: 请你谈谈网站是如何进行访问的!

  1. 输入一个域名;回车

  2. 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射;

    1. 有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问

       127.0.0.1 www.qinjiang.com
      • 1

    2. 没有:去DNS服务器找,找到的话就返回,找不到就返回找不到; 在这里插入图片描述

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

3.4、发布一个web网站

不会就先模仿

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

  •  

     

    img

     

     

网站应该有的结构

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

HTTP协议:面试 Maven:构建工具

  • Maven安装包

Servlet入门

  • HelloWorld!

  • Servlet配置 ·原理

4、Http

4.1、什么是HTTPHTTP

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

  • 文本:html,字符串,…

  • 超文本:图片,音乐,视频,定位,地图.……

  • 端口:80

Https:安全的

4.2、两个时代

http/1.1请求一次资源可以连续获取多个web资源,不需要每次获取一个web资源就必须再次连接一次

  • 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.39:443

Accept:text/html  
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9   语言
Cache-Control:max-age=0
Connection:keep-alive

1、请求行

  • 请求行中的请求方式:GET

  • 请求方式:Get,Post,HEAD,DELETE,PUT,TRACT.…

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

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

2、消息头

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

4.4、Http响应

  • 服务器–响应…….客户端

百度:

Cache-Control:private    缓存控制
Connection:Keep-Alive   连接
Content-Encoding:gzip   编码
Content-Type:text/html   类型  

 

1、响应体

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

2、响应状态码

200:请求响应成功200 3xx:请求重定向·重定向:你重新到我给你新位置去; 4xx:找不到资源404·资源不存在; 5xx:服务器代码错误 500 502:网关错误

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

 

环境变量的作用

https://blog.csdn.net/wdfscsdn2015/article/details/76652375

https://blog.csdn.net/Pre_waist_L/article/details/79696507?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

1、随着电脑安装的软件越来越多,我们记不住所有软件的安装路径,想运行某一软件就很麻烦。2、如果想在某一路径下直接运行某款软件,我们无能为力。

通过在环境变量里面加入所有软件的安装路径,当我们想运行某一软件时双击其快捷方式或者在DOS界面输入软件名称,此时,计算机除了在其当前目录下寻找该软件的.exe文件外,还在环境变量中搜索软件的路径,找到,运行。

综上,Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

网关和502错误

从网络设备上的“网关”讲,这个设备有时候又叫“路由器”或者“防火墙”又或者叫“(三层)交换机”。如果给出一张拓扑图,可以想见网关是处于两个或两个以上的网络之间的,负责路由转发或者地址转换或者执行数据包过滤的设备。从别的角度看描述起来不会这么绕,比如说终端配置的网关地址,它的意义就在于访问本网段以外的地址都经由所配置网关地址所在的网关设备转发。

出现502的原因是: 对用户访问请求的响应超时造成的,简单来说 502 是报错类型代码 bad gateway 错误的网关。连接超时 我们向服务器发送请求 由于服务器当前链接太多,导致服务器方面无法给于正常的响应,产生此类报错。在最基本的级别上,502错误网关表示服务器通信出现了问题。它涉及网关或代理服务器之间的通信,这些网关或代理服务器接受来自上游(或源)服务器的无效响应。当上游服务器和网关服务器无法决定交换数据的协议,就会出现问题,因此无法显示网站。502错误通常意味着在你的网站设置过程中出现了错误配置。

具体分析有几下几点:

服务器超载——如果服务器耗尽内存,服务器可能会崩溃,原因是站点上有大量访问者或DDOS攻击。 防火墙阻止请求——防火墙可能会阻止边缘服务器和上游服务器之间的通信。某些DDoS保护系统可能会过度反应并阻止来自内容传送系统的请求。 编程错误——有时网站代码中的一个错误可能意味着请求不能得到正确的响应,从而导致出现这个错误。 网络错误——DNS问题、路由问题和ISP相关的问题也可以导致错误网关。 服务器软件超时——当Web服务器需要更多时间来完成并且缓存工具达到其超时值时,也会发生此错误。慢查询也会导致此问题。 解决办法: 1.提高 Web 服务器的响应速度,也即减少内部的调用关系,可以把需要的页面、素材或数据,缓存在内存中,可以是专门的缓存服务器 ,也可以Web服务器自身的缓存,提高响应速度;

2.网络带宽的问题,则对传输的数据包进行压缩处理,或者向IDC申请增加带宽;

3.属于内部网络的故障或设置问题,也即内部网络拥塞,可能内部存在大量的数据调用或交互造成的,则需要优化内部网络传输或协议;

4.另外很大的问题在MySQL数据库这一块,如果数据库执行命令超时也会大延长php脚本的执行时间,导致 Nginx 等待超时。可以my.cnf的 slow log进行确认效能低下的sql语句是哪些,进行优化配置。数据库的数据读取造成前端服务器 ,响应用户的请求变慢,那么必须提高数据库的处理能力,若是只读业务可以增加数据缓存的模式 或者增加数据库备机,分散读压力; 若是写的压力,则可以考虑延迟写的模式,想这个时候做数据写分散肯定来不及。

5.在发生错误时检查Web服务器日志将是一个很好的起点。如果你是该网站的所有者,则可以检查你的FQDN(完全

5、Maven

<!--    maven的高级之处在于 他会帮你导入这个jar包所依赖的其他jar包-->
<!--   在build中配置resource 来防止资源导出失败的问题-->
   <build>

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

   </build>

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

  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>

D:Enmvironment\apache-maven-3.6.2conf\ettings.xml (狂神老师配置源和仓库的文件位置)

5.5本地仓库

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

<localRepository>D:\Environment\apache-maven-3.6.2\maven-repo</localRepository>

5.6在idea中使用Maven

  1. 启动idea

  2. 创建一个maven项目

    156784478560215678448411721567844917185

1567844956177

1567845029864

等待项目初始化

1567845105970

等右下角跑完,再点击enable auth-import

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

 

1567845341956

这里设置是项目的设置,所以会出现这种情况,在file中选择other

settrings,setting,for,new,projects可以解决

1567845413672

到这 maven配置差不多了

5.7开始创建一个普通maven项目

image-20210621130232935

 

156784571737715678457820341567845910728

 

5.8标记文件夹功能

156784595713915678460349061567846073511

5.9idea 配置tomcat

1567846073511156784617957315678462341751567846234175

解决警告问题

 

必须要的配置:为什么会有这个问题:我们访问一个网站,需要制定一个文件夹名字

156784642196315678465464651567846559111

 

5.10pom文件

pom.xml是maven核心配置文件

1567846784849

要用的

<?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.kuang</groupId>
 <artifactId>javaweb-01-maven</artifactId>
 <version>1.0-SNAPSHOT</version>
 <!--Package:项目的打包方式
 jar:java应用
 war:JavaWeb应用
 -->
 <packaging>war</packaging>


 <!--配置-->
 <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>
   <!--具体依赖的jar包配置文件-->
   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.11</version>
   </dependency>
 </dependencies>

 <!--项目构建用的东西-->
 <build>
   <finalName>javaweb-01-maven</finalName>
   <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
     <plugins>
       <plugin>
         <artifactId>maven-clean-plugin</artifactId>
         <version>3.1.0</version>
       </plugin>
       <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
       <plugin>
         <artifactId>maven-resources-plugin</artifactId>
         <version>3.0.2</version>
       </plugin>
       <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>3.8.0</version>
       </plugin>
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
         <version>2.22.1</version>
       </plugin>
       <plugin>
         <artifactId>maven-war-plugin</artifactId>
         <version>3.2.2</version>
       </plugin>
       <plugin>
         <artifactId>maven-install-plugin</artifactId>
         <version>2.5.2</version>
       </plugin>
       <plugin>
         <artifactId>maven-deploy-plugin</artifactId>
         <version>2.8.2</version>
       </plugin>
     </plugins>
   </pluginManagement>
 </build>
</project>

 

1567847410771

约定大于配置 以后我们的可能导出失败 解决方案

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

   </build>


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

 

<dependency>
 <groupId>javax.servlet</groupId>
 <artifactId>servlet-api</artifactId>
 <version>2.5</version>
 <scope>provided</scope>
</dependency>
<dependency>
 <groupId>javax.servlet</groupId>
 <artifactId>jsp-api</artifactId>
 <version>2.0</version>
 <scope>provided</scope>
</dependency>

====================


   <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
   <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>javax.servlet-api</artifactId>
     <version>4.0.1</version>

   </dependency>
   <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
   <dependency>
     <groupId>javax.servlet.jsp</groupId>
     <artifactId>jsp-api</artifactId>
     <version>2.2</version>

   </dependency>

 

 

6.Servlet

6.1Servlet简介

  • Servlet就是sun公司开发动态web的一门技术

  • sun公司在这些API中提供一个接口叫作:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:

    • 编写一个类,实现Servlet接口

    • 把开发好的java类部署道web服务器中。

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

6.2HelloServlet

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

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

2.关于Maven父子工程的理解

父项目中会有一个

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

子项目中会有一个

 <parent>
       <artifactId>javaweb-02-servlet</artifactId>
       <groupId>com.dong</groupId>
       <version>1.0-SNAPSHOT</version>
   </parent>

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

son extends parents

web配置文件更改

   
   <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                     http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
        version="4.0"
        metadata-complete="true">
 

</web-app>

3.Maveb环境优化

1.修改web。xml为最新的

2.将maven的结构搭建完整

4.编写一个Servlet程序

1.编写一个普通类

2.实现Servlet接口,这里我们直接继承HTTPServlet


public class HelloServlet extends HttpServlet {
   //由于get或者post只是请求实现的不同的方式 可以相互调用 业务逻辑都一样
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       System.out.println("进入doget");
       //ServletOutputStream outputStream = resp.getOutputStream();

       PrintWriter writer = resp.getWriter();//相应流
       writer.print("hello servlet");
  }
   @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"
        metadata-complete="true">
<!--   注册servlet -->
<servlet>
   <servlet-name>Hellosevlet</servlet-name>
   <servlet-class>com.yao.servlet.HelloServlet</servlet-class>
</servlet>
   <servlet-mapping>
       <servlet-name>Hellosevlet</servlet-name>
       <url-pattern>/985211</url-pattern>
   </servlet-mapping>

</web-app>

6.配置Tomcat

注意:配置项目发布的路径就可以了

7.启动测试

 

 

6.3、Servlet原理

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

6.4、Mapping问题

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

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

一个servlet可以指定多个映射路径

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

      <servlet-mapping>
         <servlet-name>hello</servlet-name>
         <url-pattern>/hello/*</url-pattern>
     </servlet-mapping>
  1. 默认请求路径

       <!--默认请求路径-->
      <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/*</url-pattern>
      </servlet-mapping>
  1. 指定一些后缀或者前缀等等…

  <!--可以自定义后缀实现请求映射
     注意点,*前面不能加项目映射的路径
     hello/sajdlkajda.qinjiang
     -->
 <servlet-mapping>
     <servlet-name>hello</servlet-name>
     <url-pattern>*.qinjiang</url-pattern>
 </servlet-mapping>

 

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

  <!--404-->
 <servlet>
     <servlet-name>error</servlet-name>
     <servlet-class>com.kuang.servlet.ErrorServlet</servlet-class>
 </servlet>
 <servlet-mapping>
     <servlet-name>error</servlet-name>
     <url-pattern>/*</url-pattern>
 </servlet-mapping>

6.5、ServletContext

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

1、共享数据

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

public class HelloServlet extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       
       //this.getInitParameter()   初始化参数
       //this.getServletConfig()   Servlet配置
       //this.getServletContext() Servlet上下文
       ServletContext context = this.getServletContext();

       String username = "秦疆"; //数据
       context.setAttribute("username",username); //将一个数据保存在了ServletContext中,名字为:username 。值 username

  }

}
public class GetServlet extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       ServletContext context = this.getServletContext();
       String username = (String) context.getAttribute("username");

       resp.setContentType("text/html");
       resp.setCharacterEncoding("utf-8");
       resp.getWriter().print("名字"+username);

  }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req, resp);
  }
   <servlet>
       <servlet-name>hello</servlet-name>
       <servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
   </servlet>
   <servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/hello</url-pattern>
   </servlet-mapping>


   <servlet>
       <servlet-name>getc</servlet-name>
       <servlet-class>com.kuang.servlet.GetServlet</servlet-class>
   </servlet>
   <servlet-mapping>
       <servlet-name>getc</servlet-name>
       <url-pattern>/getc</url-pattern>
   </servlet-mapping>

 

测试访问结果;

2、获取初始化参数

    <!--配置一些web应用初始化参数-->
   <context-param>
       <param-name>url</param-name>
       <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
   </context-param>

 

 

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   ServletContext context = this.getServletContext();
   String url = context.getInitParameter("url");
   resp.getWriter().print(url);
}

 

3、请求转发

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   ServletContext context = this.getServletContext();
   System.out.println("进入了ServletDemo04");
   //RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //转发的请求路径
   //requestDispatcher.forward(req,resp); //调用forward实现请求转发;
   context.getRequestDispatcher("/gp").forward(req,resp);
}

 

在这里插入图片描述

4、读取资源文件

Properties

  • 在java目录下新建properties

  • 在resources目录下新建properties

发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath: 思路:需要一个文件流

username=root12312
password=zxczxczxc

 

在这里插入图片描述

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

       InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.properties");//这个目录是生成的target目录下的文件

       Properties prop = new Properties();
       prop.load(is);
       String user = prop.getProperty("username");
       String pwd = prop.getProperty("password");

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

  }

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

 

访问测试即可ok;

6.6、HttpServletResponse

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

 

  • 如果要获取客户端请求过来的参数:找HttpServletRequest

  • 如果要给客户端响应一些信息:找HttpServletResponse

     

     

1简单分类

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

 servletOutputstream getOutputstream() throws IOException;
   Printwriter getwriter() throws IOException;

 

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

void setCharacterEncoding(String var1)
void setContentLength(int var1)
void setContentLengthLong(long var1);
void setContentType(String var1)
void setDateHeader(String varl,long var2)
void addDateHeader(String var1,long var2)
void setHeader(String var1,String var2);
void addHeader(String var1,String var2)
void setIntHeader(String var1,int var2);
void addIntHeader(String varl,int var2);

 

响应的状态码 在这里插入图片描述 在这里插入图片描述

2、下载文件

  1. 向浏览器输出消息(一直在讲,就不说了)

  2. 下载文件

    1. 要获取下载文件的路径

    2. 下载的文件名是啥?

    3. 设置想办法让浏览器能够支持下载我们需要的东西

    4. 获取下载文件的输入流

    5. 创建缓冲区

    6. 获取OutputStream对象

    7. 将FileOutputStream流写入到bufer缓冲区

    8. 使用OutputStream将缓冲区中的数据输出到客户端!


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

//       要获取下载文件的路径
       String realPath = "D:\\JAVA\\javacode\\javaweb-02-servlet\\response\\src\\main\\resources\\1.jpg";

       System.out.println(realPath);
//       下载的文件名是啥?
      // String fileName = realPath.substring(realPath.lastIndexOf("//") + 1);
       //System.out.println(fileName);

//       设置想办法让浏览器能够支持下载我们需要的东西
       resp.setHeader("Content-Disposition","attachment;filename="+realPath);
//               获取下载文件的输入流
       FileInputStream in = new FileInputStream(realPath);


//       创建缓冲区
       int len=0;
       byte[] buffer = new byte[1024];
//               获取OutputStream对象
       ServletOutputStream out = resp.getOutputStream();
//       将FileOutputStream流写入到bufer缓冲区 使用OutputStream将缓冲区中的数据输出到客户端!
   while ((len=in.read(buffer))>0){
       out.write(buffer,0,len);

  }
       in.close();
   out.close();
  }

 

 

String random = drawRandomNum((Graphics2D) g,"l");//生成纯字母的验证码

6.7、HttpServletRequest

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

 

获取参数,请求转发

在这里插入图片描述

自己创建类,且需要继承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 password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");
System.out.println("==========");
//后台接收中文乱码问题
System. out.println(username);
System. out.println(password);
System. out.println(Arrays.tostring(hobbys));
System. out.println("============");
system. out.println(req.getContextPath());
//通过请求转发
//这里的/代表当前的web应用
req.getRequestDispatcher("/success.jsp").forward(req,resp);

}

7 Cookie、Session

7.1 会话

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

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

你能怎么证明你是学生? 你 学校 发票 学校开的发票 学校登记 校牌

学校
发票 学校开的发票
学校的登记 学校给你的校牌

一个网站,怎么证明你来过? 客户端 服务端 服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了; cookie

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

7.2 保存会话的两种技术

cookie

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

session

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

7.3 Cookie

在这里插入图片描述

  1. 从请求中拿到 cookie 信息

  2. 服务器响应给客户端 cookie

Cookie[] cookies = req.getCookies(); //获得Cookie
cookie.getName(); //获得cookie中的key
cookie.getValue(); //获得cookie中的vlaue
new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie
cookie.setMaxAge(24*60*60); //设置cookie的有效期
resp.addCookie(cookie); //响应给客户端一个cookie
123456

cookie : 一般会保存在本地的用户目录下 appdata ;

  • 一个 Web 站点可以给浏览器发送多个 Cookie,最多存放 20 个 cookie;

  • cookie 大小有限制 4kb;

  • 300 个 cookie 浏览器上限

删除 Cookie;

  • 不设置有效期,关闭浏览器,自动失效;

  • 设置有效期为 0;

编码解码:

URLEncoder.encode("秦疆","utf-8")
URLDecoder.decode(cookie.getValue(),"UTF-8")

7.4 Session(重点)

在这里插入图片描述 什么是 Session ?

  • 服务器会给每一个用户(浏览器)创建一个 Session 对象;

  • 一个 Session 独占一个浏览器,只要浏览器没有关闭,这个 Session 就存在;

  • 用户登录之后,整个网站它都可以访问!-> 保存用户的信息;保存购物车的信息…

在这里插入图片描述 Session 和 cookie 的区别:

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)

  • Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)

  • Session 对象由服务创建;

使用场景:

  • 保存一个登录用户的信息;

  • 购物车信息;

  • 在整个网站中经常会使用的数据,我们将它保存在 Session 中;

使用 Session:

package com.kuang.servlet;

import com.kuang.pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.*;
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",new Person("秦疆",1));
       //获取Session的ID
       String sessionId = session.getId();

       //判断Session是不是新创建
       if (session.isNew()){
           resp.getWriter().write("session创建成功,ID:"+sessionId);
      }else {
           resp.getWriter().write("session以及在服务器中存在了,ID:"+sessionId);
      }

       //Session创建的时候做了什么事情;
//       Cookie cookie = new Cookie("JSESSIONID",sessionId);
//       resp.addCookie(cookie);

  }

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

//得到Session
HttpSession session = req.getSession();

Person person = (Person) session.getAttribute("name");

System.out.println(person.toString());

HttpSession session = req.getSession();
session.removeAttribute("name");
//手动注销Session
session.invalidate();
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354

会话自动过期:web.xml 配置

<!--设置Session默认的失效时间-->
<session-config>
   <!--15分钟后Session自动失效,以分钟为单位-->
   <session-timeout>15</session-timeout>
</session-config>
12345

在这里插入图片描述

8 JSP

8.1 什么 JSP

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

最大的特点:

写JSP就像在写HTML

区别:

  • HTML只给用户提供静态的数据

  • JSP 页面中可以嵌入Java 代码,为用户提供动态数据;

8.2 JSP 原理

服务器内部工作: Tomcat 中有一个 work 工作目录; IDEA 中使用 Tomcat 的会在 IDEA 中 Tomcat 中生产一个 work 目录

在这里插入图片描述

C:\Users\Administrator\.IntelliJIdea2018.1\system\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\ROOT\org\apache\jsp
1

发现页面转变成了 Java 程序

在这里插入图片描述 浏览器向服务器发送请求,不管访问什么资源,起始都是在访问 Servlet !

JSP 最终也会被转换成一个 Java 类! JSP 本质上就是一个 Servlet

//初始化
 public void _jspInit() {
     
}
//销毁
 public void _jspDestroy() {
}
//JSPService
 public void _jspService(.HttpServletRequest request,HttpServletResponse response)
123456789
  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:当前
HttpServletRequest request                        //请求
HttpServletResponse response                      //响应
12345678
  1. 输出页面前增加的代码

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

4.以上这些对象可直接在 JSP 中使用

在这里插入图片描述

在JSP页面中;

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

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

out.write("<html>\r\n");
1

这样的格式,输出到前端!

8.3 JSP 基础语法

JSP 表达式

  <%--JSP表达式
 作用:用来将程序的输出,输出到客户端
 <%= 变量或者表达式%>
--%>
 <%= new java.util.Date()%>
12345

JSP 脚本片段

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

脚本片段的再实现

  <%
   int x = 10;
   out.println(x);
 %>
 <p>这是一个JSP文档</p>
 <%
   int y = 2;
   out.println(y);
 %>

 <hr>


 <%--在代码嵌入HTML元素--%>
 <%
   for (int i = 0; i < 5; i++) {
%>
   <h1>Hello,World  <%=i%> </h1>
 <%
   }
 %>
123456789101112131415161718192021

JSP 声明

  <%!
   static {
     System.out.println("Loading Servlet!");
   }

   private int globalVar = 0;

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

JSP 声明: 会被编译到 JSP 生成 Java 的类中! 其他的,就会被生成 _jspService 方法中!

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

<%--注释--%>
12345

JSP 的注释,不会在客户端显示,HTML就会!

8.4 JSP 指令

<%@page args.... %>
<%@include file=""%>

<%--@include会将两个页面合二为一--%>

<%@include file="common/header.jsp"%>
<h1>网页主体</h1>

<%@include file="common/footer.jsp"%>

<hr>


<%--jSP标签
   jsp:include:拼接页面,本质还是三个
   --%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>
12345678910111213141516171819

8.5 九大内置对象

  • PageContext 存东西

  • Request 存东西

  • Response

  • Session 存东西

  • Application 【ServletContext】 存东西

  • config 【ServletConfig】

  • out

  • page

  • exception

pageContext.setAttribute("name1","秦疆1号"); //保存的数据只在一个页面中有效
request.setAttribute("name2","秦疆2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","秦疆3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","秦疆4号");  //保存的数据只在服务器中有效,从打开服务器到关闭服务器
1234

request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!

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

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

8.6 JSP标签、JSTL标签、EL表达式

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

EL 表达式: ${}

  • 获取数据

  • 执行运算

  • 获取 Web 开发的常用对象

JSP 标签

<%--jsp:include--%>

<%--
http://localhost:8080/jsptag.jsp?name=kuangshen&age=12
--%>

<jsp:forward page="/jsptag2.jsp">
   <jsp:param name="name" value="kuangshen"></jsp:param>
   <jsp:param name="age" value="12"></jsp:param>
</jsp:forward>
12345678910

JSTL表达式

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

格式化标签

SQL标签

XML 标签

核心标签 (掌握部分)

在这里插入图片描述 JSTL标签库使用步骤

  • 引入对应的 taglib

  • 使用其中的方法

  • 在 Tomcat 也需要引入 JSTL 的包,否则会报错:JSTL 解析错误

c: if

<head>
   <title>Title</title>
</head>
<body>


<h4>if测试</h4>

<hr>

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

<%--自闭合标签--%>
<c:out value="${isAdmin}"/>

</body>
12345678910111213141516171819202122232425262728

c:choose c:when

<body>

<%--定义一个变量score,值为85--%>
<c:set var="score" value="55"/>

<c:choose>
   <c:when test="${score>=90}">
      你的成绩为优秀
   </c:when>
   <c:when test="${score>=80}">
      你的成绩为一般
   </c:when>
   <c:when test="${score>=70}">
      你的成绩为良好
   </c:when>
   <c:when test="${score<=60}">
      你的成绩为不及格
   </c:when>
</c:choose>

</body>
123456789101112131415161718192021

c:forEach

<%

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


<%--
var , 每一次遍历出来的变量
items, 要遍历的对象
begin,   哪里开始
end,     到哪里
step,   步长
--%>
<c:forEach var="people" items="${list}">
   <c:out value="${people}"/> <br>
</c:forEach>

<hr>

<c:forEach var="people" items="${list}" begin="1" end="3" step="1" >
   <c:out value="${people}"/> <br>
</c:forEach>

9 JavaBean

实体类 JavaBean有特定的写法:

  • 必须要有一个无参构造

  • 属性必须私有化

  • 必须有对应的get/set方法;

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

ORM :对象关系映射

  • 表—>类

  • 字段–>属性

  • 行记录---->对象

idnameageaddress
1 sjmp01 3 西安
2 sjmp02 18 西安
3 sjmp03 100
class People{
   private int id;
   private String name;
   private int id;
   private String address;
}

class A{
   new People(1,"秦疆1号",3"西安");
   new People(2,"秦疆2号",3"西安");
   new People(3,"秦疆3号",3"西安");
}
123456789101112

过滤器实现登录拦截功能,放一个常量标记是否已登录。

10 MVC 三层架构

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

10.1 以前

在这里插入图片描述用户直接访问控制层,控制层就可以直接操作数据库;

servlet--CRUD-->数据库
弊端:程序十分臃肿,不利于维护  
servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码

架构:没有什么是加一层解决不了的!
程序猿调用
|
JDBC
|
Mysql Oracle SqlServer ....
12345678910

10.2 MVC 三层架构

在这里插入图片描述 Model

  • 业务处理:业务逻辑(Service)

  • 数据持久层:CRUD

View

  • 展示数据

  • 提供链接发起 Servlet 请求(a,form,img…)

Controller (Servlet)

  • 接收用户的请求:(req:请求参数、Session 信息…)

  • 交给业务层处理对应的代码

  • 控制试图的跳转

      登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username,password)---->交给业务层处理登录业务(判断用户名密码是否正确:事务)--->Dao层查询用户名和密码是否正确-->数据库
    1

11 Filter(重点)

Filter:过滤器,用来过滤网站的数据;

  • 处理中文乱码

  • 登录验证

在这里插入图片描述 Filter 开发步骤:

  1. 导包

  2. 编写过滤器

    • 导包不要错 在这里插入图片描述

public class CharacterEncodingFilter implements Filter {

   //初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!
   public void init(FilterConfig filterConfig) throws ServletException {
       System.out.println("CharacterEncodingFilter初始化");
  }

   //Chain : 链
   /*
   1. 过滤中的所有代码,在过滤特定请求的时候都会执行
   2. 必须要让过滤器继续同行
       chain.doFilter(request,response);
    */
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       request.setCharacterEncoding("utf-8");
       response.setCharacterEncoding("utf-8");
       response.setContentType("text/html;charset=UTF-8");

       System.out.println("CharacterEncodingFilter执行前....");
       chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!
       System.out.println("CharacterEncodingFilter执行后....");
  }

   //销毁:web服务器关闭的时候,过滤会销毁
   public void destroy() {
       System.out.println("CharacterEncodingFilter销毁");
  }
}
12345678910111213141516171819202122232425262728
  1. 在 web.xml 中配置Filter

<filter>
   <filter-name>CharacterEncodingFilter</filter-name>
   <filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>CharacterEncodingFilter</filter-name>
   <!--只要是 /servlet的任何请求,会经过这个过滤器-->
   <url-pattern>/servlet/*</url-pattern>
   <!--<url-pattern>/*</url-pattern>-->
</filter-mapping>
12345678910

12 监听器

实现一个监听器;

  1. 编写一个监听器 实现监听器的接口…

//统计网站在线人数 : 统计session
public class OnlineCountListener implements HttpSessionListener {

   //创建session监听: 看你的一举一动
   //一旦创建Session就会触发一次这个事件!
   public void sessionCreated(HttpSessionEvent se) {
       ServletContext ctx = se.getSession().getServletContext();

       System.out.println(se.getSession().getId());

       Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

       if (onlineCount==null){
           onlineCount = new Integer(1);
      }else {
           int count = onlineCount.intValue();
           onlineCount = new Integer(count+1);
      }

       ctx.setAttribute("OnlineCount",onlineCount);

  }

   //销毁session监听
   //一旦销毁Session就会触发一次这个事件!
   public void sessionDestroyed(HttpSessionEvent se) {
       ServletContext ctx = se.getSession().getServletContext();

       Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

       if (onlineCount==null){
           onlineCount = new Integer(0);
      }else {
           int count = onlineCount.intValue();
           onlineCount = new Integer(count-1);
      }

       ctx.setAttribute("OnlineCount",onlineCount);

  }


   /*
   Session销毁:
   1. 手动销毁 getSession().invalidate();
   2. 自动销毁
    */
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. 在 web.xml 中注册监听器

<!--注册监听器-->
<listener>
   <listener-class>com.kuang.listener.OnlineCountListener</listener-class>
</listener>
1234
  1. 看情况是否使用!

  2.  

 

posted @ 2021-06-21 13:20  川上富江  阅读(105)  评论(0)    收藏  举报