1.1前言
web开发:
-
web,网页的意思
-
静态web
-
html、css
-
提供给所有人看的数据始终不会发生变化!
-
-
动态web
- 淘宝,几乎是所有的网站。
- 提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同。
- 技术栈:servlet/JSP,ASP,PHP
在java中,动态web资源开发的技术统称为JavaWeb
1.2web应用程序
web应用程序:可以提供浏览器访问的程序
- a.html 、b.html … 多个web资源,这些web资源可以被外界访问,对外界提供服务。
- 你能访问到的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上。
- URL
- 这个统一的web资源会被放在同一个文件夹下,web应用程序–》tomcat:服务器
- 一个web应用由多部分组成(静态web,动态web)
- html,css,js
- jsp,servlet
- java程序
- jar包
- 配置文件(Properties)
web应用编写完毕后,若想提供给外界访问,需要一个服务器来统一管理。
1.3静态web
- 这些都是网页的后缀,如果服务器上一直存在这些东西,我们就可以直接进行读取。
- 静态web存在缺点
- web页面无法动态更新,所有用户看到都是同一个页面
- 轮播图,点击特效:伪动态
- JavaScript【实际开发中,它用的最多】
- VBScript
- 它无法和数据库交互(数据无法持久化,用户无法交互)
- web页面无法动态更新,所有用户看到都是同一个页面
1.4动态web
页面会动态展示:web的页面展示的效果因人而异
缺点:
- 假如服务器的动态资源出现了错误,我们需要重新编写我们的后台程序,重新发布。
- 停机维护
优点:
- web页面可以动态更新,所有用户都可以看到不同的页面
- 它可以与数据库交互(数据持久化)
2.1技术讲解
ASP:
- 微软:国内最早流行的就是ASP
- 在html中嵌入了VB的脚本,ASP+COM
- 在ASP开发中,基本一个页面都是几千行的业务代码,页面极其乱
- 维护成本高
- C#
- IIS
PHP:
- PHP开发速度很快,功能很强大,跨平台,代码很简单
- 无法承载大访问量的情况(局限性)
JSP/Servlet:
B/S:浏览器和服务器
C/S:客户端和服务器
- sun公司主推的B/S架构
- 基于java语言的(所有的发送四,或者一些开源的组件,都是用java写的)
- 可以承载三高问题带来的影响
- 语法像ASP
2.2web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息
IIS
微软的 windows中自带的
Tomcat
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:
- 安装 or 解压
- 了解配置文件及目录结构
- 这个东西的作用
3.1安装tomcat
3.2tomcat启动和配置
启动,关闭tomcat
访问测试:http://localhost:8080/
可能遇到的问题:
- java环境变量没有配置
- 闪退问题:需要配置兼容性
- 乱码问题:配置文件中设置
3.3配置
可以配置启动的端口号
- tomcat的默认端口为:8080
- mysql默认端口:3306
- http默认端口:80
- https默认端口:443
可以配置主机的名称
- 默认的主机名为:localhost — 127.0.0.1
- 默认网站应用存放的位置为webapps
高难度面试题:
请你谈谈网站是如何进行访问的?
- 输入一个域名;回车
- 检查本机的配置文件C:WindowsSystem32driversetchosts下有没有这个域名的映射
- 有:直接返回对应的ip地址,这个地址中,有我们需要放的web程序,可以直接访问
- 没有:去DNS服务器找,找到的话就返回,找不到就返回找不到
- 可以配置一下环境变量(可选项)
3.4发布一个web网站
不会就先模仿
- 将自己写的网站,放到服务器(tomcat)中指定的web应用的文件夹(webapps)下,就可以访问了
网站应该有的结构
- webapps : tomcat服务器的web目录
- ROOT
- kuangstudy : 网站的目录名
- WEB-INF
- classes : java程序
- lib : web应用所依赖的jar包
- web.xml : 网站配置文件
- index.html : 默认的首页
- static
- css
- style.css
- js
- img
- css
- …
- WEB-INF
4.1什么是HTPP
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。
- 文本:html,字符串…
- 超文本:图片,音乐,视频,定位,地图…
- 80
HTTPS:安全的
- 443
4.2两个时代
- http1.0
- HTTP/1.0 : 客户端可以与web服务器连接后,只能获得一个web资源,断开连接
- http2.0
- HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。
4.3Http请求
- 客户端—发送请求(Request)–服务器
百度:
1.请求行
- 请求行中的请求方式:GET
- 请求方式:**GET,POST,**HEAD,DELETE,PUT,TRACT…
- get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址拦显示数据内容,不安全,但是高效
- post:请求能都携带的参数没有限制,大小没有限制,不会再在浏览器的URL地址拦显示数据内容,安全,但是不高效。
2.消息头
4.4Http响应
- 服务器—响应—客户端
百度:
1.响应体
2.响应状态码
200:请求响应成功
3xx:请求重定向
- 重定向:你重新到我给你的新位置去
4xx:找不到资源 404
- 资源不存在
5xx:服务器代码错误 500 502(网关错误)
常见面试题:
当你的浏览器中地址拦输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
我们为什么要学习这个技术?
- 在javaweb开发中,需要使用大量的jar,我们手动去导入
- 如何能够让一个东西自动帮我导入和配置这个jar包
由此,Maven诞生了!
5.1Maven项目架构管理工具
我们目前就是方便导入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
- 作用:加速我们的下载
- 国内建议使用阿里云的镜像
5.5本地仓库
在本地的仓库,远程仓库;
**建立一个本地仓库:**localRepository
6.1创建一个maven项目
- 启动idea
- 创建一个maven web项目
3.等待项目初始化完毕
4.观察maven仓库中多了什么东西?
5.idea中maven设置
idea项目创建成功后,看一眼Maven的配置
6.到这里,maven在idea中的配置和使用就ok了
6.2创建一个普通的maven项目
这个只有在web应用下才会有
6.3标记文件夹功能
方法【1】
方法【2】
6.4在idea中配置tomcat
1.点击下面这里
2.点击加号,【tomcat service】 --》【local】
3.配置tomcat服务器
4.启动tomcat
6.5POM文件
pom.xml是maven的核心配置文件
maven的高级之初在于它会帮你导入这个jar包所依赖的其他jar包
maven由于他的约定大于配置,我们之后可能会遇到我们写的配置文件,无法被导出或者生效的问题,解决方案:
1.maven 3.6.2
报错:unable to import maven project:see logs for details
解决方法:降级为3.6.1
2.tomcat闪退
3.idea中每次都要重复配置maven
在idea中的全局默认配置中去配置
4.maven项目中tomcat无法配置
5.maven默认web项目中的web.xml版本问题
替换为webapp3.1版本和tomcat一致(看tomcat下的webapps里面的官方案例)
6.maven仓库的使用
地址:https://mvnrepository.com
8.1servlet简介
- servlet就是sun公司开发动态web的一门技术
- sun在这些api中提供一个接口叫做:servlet,如果你想开发一个servlet程序,只需要完成两个小步骤:
- 编写一个类,实现servlet接口
- 把开发好的java类部署到web服务器中
把实现了servlet接口的java程序叫做,servlet
8.2HelloServlet
servlet接口sun公司有两个默认的实现类:HttpServlet、GenericServlet
2.然后在此项目中,新建一个module(javaweb maven项目)
关于maven父子工程的理解:
父项目中会有
子项目中会有
父项目中的jar包子项目可以直接使用
导servlet包(父项目POM文件中)
3.maven环境优化
- 修改web.xml为最新的
2.将maven的结构搭建完整
4.编写一个servlet程序
编写一个普通类,实现servlet接口,这里我们直接继承HttpServlet
5.编写一个servlet的映射
为什么需要映射:我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们 需要在web服务中注册我们写的servlet,还需要给他一个浏览器能够访问的路径。
6.配置tomcat
注意:配置项目发布的路径
7.测试
servlet是由web服务器调用
9.1Mapping问题
- 一个servlet可以指定一个映射路径
- 一个servlet可以指定多个映射路径
- 一个servlet可以指定通用映射路径
注意下面这样重启服务就不会默认进入到index.jsp页面了(不推荐使用)
- 指定一些后缀或者前缀等等
- 优先级问题
制定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
web容器在启动的时候,它会为每个web程序都创建一个对应的servletContext对象,它代表了当前的web应用。
1.共享数据
我在这个servlet中保存的数据,可以再另外一个servlet中拿到
- 新建一个module
- HelloServlet.java
- GetServlet.java
- web.xml
- 测试
先调用/hello
再调用/getName
重启,一开始就调用/getName
1.获取初始化参数
2.请求转发
3.读取资源文件
Properties
- 在java目录下新建properties
- 在resource目录下新建properties
发现:都被打包到同一个路径下:classes 我们俗称这个路径为classpath
思路:需要一个文件流
db.properties
1.HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,一个代表响应的HttpServletResponse
- 如果要获取客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应一些信息:找HttpServletResponse
简单分类
- 负责向浏览器发送数据的方法
- 负责向浏览器发送响应头的方法
- 响应的状态码(常见)
常见应用
- 向浏览器输出消息
- 下载文件
- 获取下载文件的路径
- 下载的文件名是啥?
- 设置想办法让浏览器能都支持我们下载的东西 文件名是中文的时候,可以设置URLEncoder.encode(fileName, “UTF-8”),否则有可能乱码
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStrem对象
- 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端
验证码怎么来的?
- 前端实现
- 后端实现,需要用到java图片类,生成一个图片
一个web之源收到客户端A请求后,B会通知A客户端去访问另外一个web资源C,这个过程就叫做重定向。
常见场景:
- 用户登录
面试题:请你聊聊重定向和转发的区别?
- 相同点
- 页面都会实现跳转
- 相同点
- 请求转发,URL地址拦不会变; 307
- 重定向,URL地址拦会发生变化。 302
模拟登录
index.jsp
success.jsp
HttpServletRequest代表客户端的请求,用户通过http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest中,通过HttpServletRequest这个方法,可以获取客户端的所有信息
1.获取参数、请求转发
index.jsp
success.jsp
测试
1.会话
**会话:**用户打开一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程可以称之为会话。
**有状态会话:**一个同学曾经来过教室,下次再来的教室的时候,我们会知道这个同学,曾经来过,称之为有状态会话。
你怎么证明你是西开的学生?
你 西开
- 发票 西开给你开发票
- 学校登记 西开标记你过来了
一个网站,怎么证明你来过?
客户端 服务器
- 服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以;cookie
- 服务器登记你过来了,下次你来的时候我来匹配你。session
拓展:
http是一个无状态的协议
什么是无状态:就是说这次请求和上一次请求没有任何关系,互不认识。这种无状态的好处是快速。坏处是假如我们想要把www.zhihu.com/login.html和www.zhihu.com/index.html关联起来,必须使用某些手段和工具
2.会话保持的两种技术
cookie
- 客户端技术(响应,请求)
session
- 服务端技术,利用这个技术,我们可以保存用户的会话信息,我们可以把信息或者数据放在session中。
常见场景:
- 网站登录之后,你下次不用再登录了,第二次访问直接就上去了。
3.Cookie
- 从请求中拿到cookie信息
- 服务器响应给客户端cookie
cookie:一般会保存在本地的用户目录下/AppData下
一个网站cookie是否存在上限?
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,每个web站点最多存放20个cookie( 不同的浏览器会有所不同)
- cookie大小有限制4kb
- 浏览器上限是300个cookie
删除cookie
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期时间为0
pom.xml
web.xml
CookieDemo01.java
CookieDemo02.java
CookieDemo03.java
1.session(重点)
什么是session?
- 服务器会给每一个用户(浏览器)创建一个session对象;
- 一个session独占一个浏览器,只要浏览器没有关闭,session就存在;
- 用户登录之后,整个网站它都可以访问。–》保存用户的信息;保存购物车的信息
也可以存对象
Person.java
清空session
测试:先调用/s3清空,在调用/s2获取session信息,就会报错
web.xml可以设置session自动失效时间
session和cookie的区别
- cookie是把用户的数据写给浏览器,浏览器保存(可以保存多个);
- session是把用户的数据写到用户独占的session中,服务器端保存(保存重要的信息,避免服务器的资源浪费);
- session由服务器创建
使用场景:
- 保存一个登录用户的信息
- 购物车信息
- 在整个网站中经常会使用的数据,我们会将它保存在session中
1.什么是jsp
java server pages:java服务器端页面,也是servlet一样,用于动态web技术!
最大的特别:
- 写jsp就像在写html
- 区别:
- html只给用户提供静态数据
- jsp页面中可以嵌入java代码,为用户提供动态数据
2.jsp原理
思路:jsp到底怎么执行的?
-
代码层面看不出啥(jsp)
-
服务器内部工作
tomcat中有一个work目录
idea使用tomcat的会在idea的tomcat中生产一个work目录
发现页面转变了java程序!
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问servlet
jsp最终也会被转换为一个java类
jsp本质上就是一个servlet
源码分析
在jsp页面中
只要是java代码就会原封不动的输出
如果是html代码,就会被转换为
这样的格式输出到前端
任何语言都有自己的语法,java有,jsp作为java技术的一种应用,它拥有一些自己扩充的语法(了解,知道即可),java所有语法都支持。
新建一个项目
导包pom.xml
1.jsp表达式
2.jsp脚本片段
3.脚本片段的再实现
4.jsp申明
jsp声明,会被编译到jsp生成java代码的类中!其他的,就会被生成到_jspService方法中!
在jsp,嵌入java代码即可
查看页面源代码
发现:jsp的注释,不会在客户端显示,html会!
5.jsp指令
定制错误页面
500.jsp
验证
或者web.xml中配置错误页面
web.xml
404.jsp
测试:
footer.jsp
header.jsp
jsp2.jsp
测试:
jsp标签
分析一下源码
1.九大内置对象
- PageContext【存东西】
- Request 【存东西】
- Response
- Session【存东西】
- Application(ServletContext)【存东西】
- config(ServletConfig)
- out
- page 【基本用不到】
- exception
新建pageContextDemo1.jsp
新建pageContextDemo2.jsp
结果(需要先请求一下pageContextDemo1.jsp然后再请求pageContextDemo2.jsp,不然都取不到值)
新建pageContextDemo3.jsp
新建pageContextDemo4.jsp
request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据
导包
EL表达式: ${ }
- 获取数据
- 执行运算
- 获取web开发的常用对象
- 调用java方法
jsp标签
jsptag.jsp
jsptag2.jsp
STL标签
jstl标签库的使用就是为了弥补html标签的不足;它自定义了许多标签,可以供我们使用,标签的功能和java代码一样!
- 核心标签(掌握)
- 格式化标签
- sql标签
- xml标签
核心标签如下:
JSTL标签库使用步骤:
- 引用对应的taglib
- 使用其中的方法
- 在tomcat也需要引入jstl的包,否则会报错
coreIf.jsp
coreWhen.jsp
coreForeach.jsp
实体类
javaBean特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
一般用来和数据库字段做映射
ORM:对象关系映射
- 表—》类
- 字段—》属性
- 行记录–》对象
javabean.jsp
什么是MVC:Model View Controller 模型视图控制器
1.早些年
用户直接访问控制层,控制层就可以直接操作数据库
2.MVC三层架构
View
- 展示数据
- 提供链接发起Servlet请求
Controller
- 接收用户的请求(req:请求参数 Session信息。。。)
- 交给业务层处理对应的代码
- 控制试图的跳转
Model
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD(Dao)
Filter:过滤器
- 处理中文乱码
- 登录验证…
filter开发步骤
-
导包
-
编写过滤器
-
包不要导入错误了
-
实现Filter接口,重写对应的方法即可
-
web.xml中配置过滤器
-
web.xml
HelloServlet.java
实现一个监听器的接口(有N种)
- 实现一个监听器接口
- 配置监听器web.xml
- 页面验证
1.过滤器,监听器常见应用
监听器:GUI编程中经常使用
用户登录之后才能进入主页!用户注销后就不能进入主页了!
- 用户登录后,想session中放入用户信息
- 进入主页的时候要判断用户是否已经登录(要求:在过滤器中实现)
登录页面login.jsp
错误页面error.jsp
登录接口LoginServlet
注销页面LogoutServlet
常量类Constant
过滤器LoginFilter
接口配置web.xml
什么是jdbc:java连接数据库!
需要jar包的支持:
- java.sql
- javax.sql
- mysql-connection-java…(连接驱动)
实验环境搭建
导入数据库依赖pom.xml
idea连接数据库
jdbc固定步骤:
- 加载驱动
- 连接数据库
- 创建Statement
- 编写sql
- 执行sql
- 关闭连接
预编译
要么都成功,要么都失败
ACID原则:保证数据的安全
Junit单元测试
依赖
简单实用
@Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行!
失败情况
新建表并插入数据
数据库
架构设计图
项目如何搭建
考虑是否使用maven? 依赖,jar
项目搭建准备工作
-
搭建一个maven web项目
-
配置tomcat
-
测试项目是否可以跑起来
-
导入项目中所需jar包
-
创建项目包结构
-
编写实体类
ORM映射:表-类映射
-
编写基础公共类
- 数据库配置文件
- 编写数据库的公共类
- 编写字符编码过滤器
-
导入静态资源
-
编写前端页面login.jsp
-
设置页面web.xml
- 编写dao层登录用户的接口
- 编写dao接口的实现类
- 业务层接口
- 业务层实现类
- 编写servlet
- 注册Servlet
- 测试访问,确保上面功能成功!
注销功能:
思路:移除session,返回登录页面
编写退出servlet
注册退出接口
登录拦截优化
编写一个过滤器并注册
验证功能!
没有登录直接请求http://localhost:8080/smbms/jsp/frame.jsp
- 导入前端素材pwdmodify.jsp
- 写项目,建议从底层向上写
- UserDao接口
- UserDao接口实现
- UserService接口
- UserService接口实现
- 编写servlet
- 注册servlet
- 验证功能
- 添加fastjson包
- UserServlet中添加方法
- 导入分页的工具类
- 用户列表 userlist.jsp 和分页页面userlist.jsp
获取用户数据量
- UserDao
- UserDaoImpl
- UserService
- UserServiceImpl
获取用户列表
- UserDao
- UserDaoImpl
- UserService
- UserServiceImpl
获取角色操作
为了我们职责统一,可以把角色的操作单独放在一个包中,和POJO类对应
- RoleDao
- RoleDaoImpl
- RoleService
- RoleServiceImpl
用户显示的servlet
- 获取用户前端的数据(查询)
- 判断请求是否需要执行,看参数的值判断
- 为了实现分页,需要计算出当前页面和总页数,页面大小。。
- 用户列表展示
- 返回前端
搭建环境等可参考:https://blog.csdn.net/qq_54897873/article/details/118551792?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-118551792-blog-114682781.pc_relevant_multi_platform_featuressortv2removedup&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-118551792-blog-114682781.pc_relevant_multi_platform_featuressortv2removedup&utm_relevant_index=11
1.搭建环境
可参考上述链接
2.配置Tomcat以及下载jar包
配置Tomcat可参考上述链接
common-io以及common-fileupload包
Maven Repository: commons-fileupload » commons-fileupload (mvnrepository.com)
Maven Repository: commons-io » commons-io (mvnrepository.com)
3.文件上传原理
4.上传文件注意事项
5.需要用到的类
ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象,在使用ServletFileUpload对象解析请求时需要DiskFileItemFactory对象。所以哦,我们需要在进行解析工作前构造好DiskFileItemFactory对象,通过ServletFileUpload对象的构造方法或ServletFileItemFactory()方法设置ServletFileUpload对象的fileItemFactory属性
FileItem类
在HTML页面input必须有name < input type=“file” name=“filename” >
表单如果包含一个文件上传输入项的话,这个表单的enctype属性就必须设置为multipart/form-date
浏览器表单的类型如果为multipart/form-data,在服务器端想获取数据就要通过流。
常用方法介绍
ServletFileUploda类
ServletFileUploda负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中,使用其parseRequest(HttpservletRequest)方法可以将通过表单中每一个HTML标签提交的数据封装成一个FileItem对象,然后以List列表的形式返回。使用该方法处理上传文件简答易用。
导包
commons-fileupload-1.4.jar
commons-io-2.11.0.jar
index.jsp
web.xml
FileServlet.java