1. 基本概念
静态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
- *.html,这网页的后缀,如果服务器上一直存在这些东西,我们就可以直接进行读取。
静态web存在的缺点:
- web页面无法动态更新,所有用户看到都是同一个页面
*. 轮播图,点击特效:伪动态
*. Javascript [实际开发中它用得最多]
*. VBScript - 他无法和数据交互(数据无法持久化,用户无法交互)
1.4 动态web
页面会动态展示:“Web的页面展示的效果因人而异”
动态Web存在的缺点:
- 加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布:
- 停机维护
动态Web存在的优点:
- Web页面可以动态更新,所有用户看到都不是同一个页面
- 他可以与数据库交互(数据持久化:注册,商品信息,用户信息。。)
2. web服务器
2.1 技术讲解
ASP
- 微软:国内最早流行的就是ASP
- 在HTML中嵌入VB的脚本,ASP+COM
- 在ASP开发中,基本一个页面都有几千行的业务代码,页面及其混乱,混有java代码
<h1>
<h1> </h1>
<h1>
<h1>
<%
System.out.println("hello");
%>
</h1>
</h1>
</h1>
- C#
- IIS
php
- PHP开发速度很快,功能很强大,跨平台,代码很简单(70%的网站,wp)
- 无法承载大访问量的情况(局限性)
JSP/Servlet
- sun公司主推的B/S架构
- 基于Java语言的(所有的大公司,或者一些开源的组件,都是用java写的)
- 可以承载三高问题带来的影响(高并发,高可用,高性能);
- 语法像ASP,加强原有市场强度;
2.2 web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些相应信息;
IIS
微软的:ASP。。。windows中自带的
Tomcat
Tomcat是Apache 软件基金会的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,是最佳选择
而Tomcat 实际上运行JSP 页面和Servlet。目前Tomcat最新版本为10.0.5。
3. Tomcat
在下载后的bin文件中startup.bat为启动,shutdown.bat为关闭
启动之后的访问测试:http://localhost:8080/
可能遇到的问题:
- java环境变量没有配置
- 闪退问题:需要配置兼容性
- 乱码问题:配置文件中设置
服务器核心配置文件:conf–>server.xml
可以配置启动的端口号:
- tomcat的默认端口号为:8080
<Connector port="8080" redirectPort="8443" connectionTimeout="20000" protocol="HTTP/1.1"/>
- mysql:3306
- http:80
- https:443
可以配置主机的名称 - 默认的主机名为:localhost->127.0.0.1
- 默认网站应用存放的位置为:webapps
<Host name="localhost" autoDeploy="true" unpackWARs="true" appBase="webapps">
一个网站访问的过程
谈谈一个网站是如何进行访问的
-
输入一个域名;回车
-
检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射
- 有:直接返回对应的ip地址,在这个地址中,有我们需要访问的web程序,可以直接访问
127.0.0.1 www.hehe.com
- 没有:去DNS服务器找,找到的话就返回,找不到就返回页面找不到
发布一个web网站
- 将自己写的网站,放到服务器(Tomcat)中指定的web应用的文件夹(webapps)下,就可以访问了
网站应该有的结构:
--webapps : Tomcat服务器的web目录
- ROOT
- bai : 网站的目录名
- WEB - INF
-classes : java程序
-lib : web应用所依赖的jar包
-web.xml : 网站配置文件
- index.html 默认的首页
- static
-css
-style.css
-js
-img
-...
4.HTTP
HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。
- 文本:html,字符串…
- 超文本:图片,音乐,视频,定位,地图…
- 80
Https:安全的
- 443
两个时代
- http/1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开连接
- http/1.1:客户端可以与web服务器连接后,可以获得多个web资源
Http请求
- 客户端–发请求(request)—服务器
百度:
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET get方法/post方法
Status Code: 200 OK 状态码:200
Remote Address: 220.181.38.150: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:主机。。
请求报文
重点是格式和参数
行 POST /s?ie=utf-8 HTTP/1.1
头 Host: lol.com (注意这里的格式 都是名字+:+空格+内容)
Cookie: name=lianmeng
Content-type: application/x-www-form-urlencoded
User-Agent: chrome 83
空行
体 username=admin&password=admin (如果是get,这里是空的,如果是post,这里可以不为空)
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:请求响应成功
3xx:请求重定向
- 重定向:你重新到我给你的新位置去
4xx:找不到资源 (如:404)
- 资源不存在
5xx:服务器代码错误 (如:500,502(网关错误))
响应报文
行 HTTP/1.1 200 OK
头 Content-Type: text/html;charset=utf-8
Content-length: 2048
Content-encoding:gzip
空行
体 <html>
<head>
</head>
<body>
<h1>呵呵</h1>
</body>
</html>
我们平时在向服务端发送请求的时候,服务端给我们返回的结果就包含这四部分,HTML的内容会放在响应体当中,浏览器在接到结果之后,会把响应体结果提取出来,做一个解析,再进行渲染展示出来
5.Maven
1.在javaweb开发中,需要使用大量的jar包,我们手动去导入
2.如何能够让一个东西自动帮我导入和配置这个jar包
由此,maven诞生
5.1Maven项目架构管理工具
我们目前用它来就是方便导入jar包的!
Maven的核心思想:约定大于配置
- 有约束,不要去违反
Maven会规定好你该如何编写我们的java代码,不需按照这个规范来
安装maven
更改conf->setting里的配置,新增一个maven-repo文件夹
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>D:\JAVA\IDEA\IDEA anzhuang\idea_2020\idea_Maven\apache-maven-3.8.1\maven-repo</localRepository>
<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>
在idea中创建MavenWeb项目
。。。省略建立项目的过程
注意IDEA项目创建成功后看一眼Maven的配置
创建一个普通的maven项目
这里不勾选,直接next
这是简介的MAVEN项目
这是web应用的复杂的maven项目:
新增两个文件夹之后改变样式
pom文件
pom.xml是Maven的核心配置文件
搜索Maven仓库,选取要导入的jar包,点进去,复制Maven一栏的内容复制到dependencies中,然后他就会自动帮我们下载jar包
Maven的高级之处在于,他会帮你导入这个jar包所以来的其他jar包
Maven由于他的约定大于配置,我们之后可能会遇到我们写的配置文件,无法被导出或者生效的问题,解决方案:
<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> //让在这个目录之下可以包含。properties和。xml文件
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
......
</build>
6.Servlet
6.1 简介
- servlet是sun公司开发动态web的一门技术
- Sun在这些API中提供一个接口叫做:Servlet,如果想开发一个Servlet程序,只需要完成两个步骤:
- 编写一个类,实现Servlet接口
- 把开发好的Java类部署到web服务器中
把实现了Servlet接口的Java程序叫做Servlet
Servlet接口中Sun公司有两个默认的实现类:HttpServlet,GenericServlet
6.2 helloservlet
1.构建一个普通的Maven项目,删除多余的东西(src目录),以后就在这个项目里建立Module,这个空工程就是Maven的主工程。(将依赖导入之后,展开其他的学习由于还在主工程里建立所以就不用重复的导入了)
2.关于Maven父子工程的理解:
父项目中的pom。xml会有
<modules>
<module>servlet-01</module>
</modules>
子项目会有
<parent>
<artifactId>Javaweb-02-servlet</artifactId>
<groupId>com.bai</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目中的jar包 子项目可以直接使用
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"
metadata-complete="true">
</web-app>
- 将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 {
ServletOutputStream outputStream = resp.getOutputStream();
PrintWriter writer = resp.getWriter(); //响应流
writer.print("hello");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
5.编写Servlet的映射
为什么要映射:我们写的事Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径
web.xml:
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.bai.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>hello</url-pattern>
</servlet-mapping>
6.配置tomcat
7.启动测试
8.JSP(不全)
8.1什么是JSP
java Server Pages:java服务器端页面。也和Servlet一样,用于动态Web技术!
最大的特点:
- 写JSP就是像在写HTML
- 区别:
- HTML只给用户提供静态的数据
- JSP页面中可以嵌入JAVA代码,为用户提供动态数据;
8.2 JSP的原理
思路:JSP是怎么执行的
- 代码层面没问题
- 服务器内部工作
tomcat中有一个work目录;
IDEA中使用Tomcat的会在IDEA的tomcat中产生一个work目录
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
JSP最终也会被转换成为Java类
JSP本质上就是一个Servlet。
10. MVC
什么是MVC:Model view Controller 模型、视图、控制器
Servlet和JSP都可以写Java代码;为了易于维护和使用;Servlet专注于处理请求,以及控制试图跳转,JSP专注于显示数据
10.1 早些年的架构
用户直接访问控制层,控制层就可以直接操作数据库
servlet--CRUD(增删改查)-->数据库
弊端:程序比较臃肿,不利于维护(servlet的代码中:处理请求、响应、试图跳转、处理JDBC、处理业务代码、处理逻辑代码,把JDBC的代码也歹写到servlet的处理请求里)
架构: 没有什么是加一层解决不了的
程序员调用---JDBC---MySQL Oracle SqlServer 。。。
10.2 MVC三层架构
Model
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD (增删改查) (dao)
View
- 展示数据
- 提供链接发起Servlet请求(a,from,img…)
Contorller
- 接受用户的请求:(req:请求参数、Session信息。。。)
- 交给业务层处理对应的代码
- 控制视图的跳转
登录--->接受用户的登录请求--->处理用户的请求(获取用户登录的参数,username,password)--->
交给业务层处理登录业务(判断用户名密码是否正确,事物)--->Dao层查询用户名和密码是否正确-->数据库