JavaWeb学习笔记——第四天
Maven
概述
- Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。它基于项目对象模型(POM,project object model)的概念,通过一小段描述信息来管理项目的构建。
- Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。官网:http://maven.apache.org/
Maven的作用
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题。
- 统一项目结构:提供标准、统一的项目结构:
- 标准的项目构建流程:即清理、编译、测试、打包和发布。
Maven的模型
- Maven由三部分组成:
- 构建声明周期/阶段(Build lifecycle & phases):在各个构建声明周期/阶段通过Maven提供的各种插件完成项目的标准化构建并产生对应的文件,如编译插件、测试插件、打包插件……
- 项目对象模型(POM):通过pom.xml中配置的信息来描述Maven工程。
- 依赖管理模型(Dependency):管理各种jar包,并在添加了依赖坐标后自动在仓库中寻找并下载相应的jar包。
- 仓库:用于存储资源,管理各种jar包。
- 本地仓库:自己计算机上的一个目录。
- 中央仓库:由Maven团队维护的全球唯一的。 仓库地址:https://repo1.maven.org/maven2/
- 远程仓库(私服):一般由公司团队搭建的私有仓库。
- 查找顺序:
- 没有连接远程仓库:先在本地仓库查找,如果找到了,就直接进行关联;如果没找到的话,就会去中央仓库查找并下载,再进行关联。
- 连接了远程仓库:先在本地仓库查找,如果找到了,就直接进行关联;如果没找到的话,就会去远程仓库查找并下载,还是没找到的话,远程仓库就会去中央仓库查找并下载,然后本地仓库再进行下载并关联。
Maven的安装
- 解压maven压缩包。
- 配置本地仓库:修改 conf/settings.xml 中的<localRepository>为一个指定目录。
<localRepository>Maven的本地仓库目录路径</localRepository>
- 配置阿里云私服:修改 conf/settings.xml 中的<mirrors>标签,为其添加如下子标签:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
- 配置环境变量:MAVEN_HOME为maven的解压目录,并将其bin目录加入PATH环境变量。
验证安装是否完成
在命令行中输入mvn -v
,如果能输出maven的版本号,则说明安装配置完成。
IDEA集成Maven
配置Maven环境
配置Maven环境(当前工程)
- 选择 IDEA中 File → Settings → Build,Execution,Deployment → Build Tools → Maven。
- 设置 IDEA 使用本地安装的 Maven,并修改配置文件及本地仓库路径。
配置Maven环境(全局)
- 退出工程 → All settings → Build,Execution,Deployment → Build Tools → Maven。
- 设置 IDEA 使用本地安装的 Maven,并修改配置文件及本地仓库路径。
创建Maven项目
- 创建模块,选择Maven,点击Next。
- 填写模块名称,坐标信息,点击finish,创建完成。
- 编写 HelloWorld,并运行。
Maven坐标
- Maven中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置。
- 使用坐标可以定义项目或引入项目中需要的依赖。
Maven坐标的主要组成
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写)。
- artifactId:定义当前Maven项目名称(通常是模块名称)。
- version:定义当前项目版本号。
坐标示例
<!--项目坐标-->
<groupId>com.zgg1h</groupId>
<artifactId>maven-project01</artifactId>
<version>1.0-SNAPSHOT</version>
<!--资源坐标-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
IDEA 导入 Maven 项目
- 方式一:打开IDEA,选择右侧Maven面板,点击 + 号,选中对应项目的pom.xml文件,双击即可。
- 方式二:打开IDEA,选择 File → Build Tools → Project Structure → Modules,点击 + 号,选择Import Module选中对应项目的pom.xml文件,双击即可。
依赖管理
依赖配置
- 依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。
- 配置步骤:
- 在 pom.xml 中编写 <dependencies> 标签。
- 在 <dependencies> 标签中 使用 <dependency> 引入坐标。
- 定义坐标的 groupId,artifactId,version。
- 点击刷新按钮,引入最新加入的坐标。
注意
- 如果引入的依赖在本地仓库不存在,将会连接远程仓库/中央仓库,然后下载依赖。
- 如果不知道依赖的坐标信息,可以到https://mvnrepository.com/中搜索。
依赖传递
依赖具有传递性:在被引入的依赖中引入的依赖也会被引入。
依赖传递的分类
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系。
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源。
排除依赖
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本。
用法
在pom.xml文件的<dependency>标签下添加<exclusions>标签,并在<exclusions>标签中添加<exclusion>标签,其中包含要排除的资源:
<dependency>
<groupId>com.zgg1h</groupId>
<artifactId>maven-projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖范围
依赖的jar包,默认情况下,可以在任何地方使用。可以通过 <scope>…</ scope > 设置其作用范围。
scope值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
---|---|---|---|---|
compile(默认) | √ | √ | √ | log4j |
test | × | √ | × | junit |
provided | √ | √ | × | servlet-api |
runtime | × | √ | √ | jdbc驱动 |
作用范围
- 主程序:main文件夹范围内有效。
- 测试程序:test文件夹范围内有效。
- 打包(运行):package指令范围内有效。
生命周期
-
Maven的生命周期是为了对所有的Maven项目构建过程进行抽象和统一而存在的。
-
Maven中有3套相互独立的生命周期
- clean:负责清理工作。
- default:负责核心工作,如:编译、测试、打包、安装、部署等。
- site:负责生成报告、发布站点等。
-
每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段,当运行后面的阶段时,前面的阶段都会运行。
部分生命周期的职责
生命周期 | 职责 |
---|---|
clean | 移除上一次构建生成的文件 |
compile | 编译项目源代码 |
test | 使用合适的单元测试框架运行测试,如:junit等 |
package | 将编译后的文件打包,如:jar、war等 |
install | 安装项目到本地仓库 |
执行指定生命周期的方式
- 方式一:在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行。
- 在命令行中,cd到模块目录下,通过命令:
mvn 生命周期名
执行。
Spring
- 官网:spring.io
- Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能。
- Spring Boot 可以帮助我们非常快速的构建应用程序、简化开发、提高效率。
SpringBootWeb入门
需求
使用 SpringBoot 开发一个web应用,浏览器发起请求 /hello后,给浏览器返回字符串 "Hello World ~"。
步骤
- 创建springboot工程,填写模块信息,并勾选web开发相关依赖。
- 创建请求处理类HelloController,添加请求处理方法 hello,并添加注解。
- 运行启动类,打开浏览器测试。
HTTP协议
HTTP-概述
HTTP全称Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
特点
- 基于TCP协议:面向连接,更加安全。
- 基于请求-响应模型的:一次请求对应一次响应。
- HTTP协议是无状态的协议:对于事务处理没有记忆能力,每次请求-响应都是独立的。
- 缺点:多次请求间不能共享数据。
- 优点:速度快。
HTTP-请求协议
HTTP的请求数据由三部分组成:
- 请求行:请求数据的第一行,包含三个部分:请求方式(GET、POST等)、资源路径和协议。
- 请求头:第二行开始,格式为key:value。
- 请求体:POST请求特有,存放请求参数,与请求头之间有一个空行隔开。
常见请求头
请求头 | 含义 |
---|---|
Host | 请求的主机名 |
User-Agent | 浏览器版本 |
Accept | 表示浏览器能接收的资源类型,*/*表示所有类型都能接收 |
Accept-Language | 表示浏览器偏好的语言,服务器可以据此返回不同语言的网页 |
Accept-Encoding | 表示浏览器可以支持的压缩类型 |
Content-Type | 请求主体的数据类型。 |
Content-Length | 请求主体的大小(单位:字节) |
GET和POST的区别
- GET请求方式的请求参数在请求行中,没有请求体,GET请求大小是有限制的。
- POST请求方式的请求参数在请求体中,POST请求大小是没有限制的。
HTTP-响应协议
HTTP的响应数据由三部分组成:
- 响应行:响应数据第一行,包含三个部分:协议、状态码和描述。
- 响应头:第二行开始,格式为key:value。
- 响应体:最后一部分,存放响应数据。
状态码大类
状态码 | 含义 |
---|---|
1xx | 响应中-临时状态码,表示请求已经接收,告诉客户端应该继续请求,如果客户端已经完成则忽略它 |
2xx | 成功-表示请求已经被成功接收,处理已完成 |
3xx | 重定向-重定向到其他地方;让客户端再发起一次请求以完成整个处理 |
4xx | 客户端错误-处理发生错误,责任在客户端 |
5xx | 服务器错误-处理发生错误,责任在服务端 |
常见状态码
状态码 | 英文描述 | 解释 |
---|---|---|
200 | OK |
客户端请求成功,即处理成功,这是我们最想看到的状态码 |
302 | Found |
指示所请求的资源已移动到由Location 响应头给定的 URL,浏览器会自动重新访问到这个页面 |
304 | Not Modified |
告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向 |
400 | Bad Request |
客户端请求有语法错误,不能被服务器所理解 |
403 | Forbidden |
服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源 |
404 | Not Found |
请求资源不存在,一般是URL输入有误,或者网站资源被删除了 |
405 | Method Not Allowed |
请求方式有误,比如应该用GET请求方式的资源,但用了POST |
428 | Precondition Required |
服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头 |
429 | Too Many Requests |
指示用户在给定时间内发送了太多请求(“限速”),配合Retry-After(多长时间后可以请求)响应头一起使用 |
431 | Request Header Fields Too Large |
请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。 |
500 | Internal Server Error |
服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧 |
503 | Service Unavailable |
服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好 |
状态码大全:https://cloud.tencent.com/developer/chapter/13553
常见响应头
响应头 | 含义 |
---|---|
Content-Type | 表示该响应内容的类型 |
Content-Length | 表示该响应内容的长度(字节数) |
Content-Encoding | 表示该响应压缩算法 |
Cache-Control | 指示客户端应如何缓存 |
Set-Cookie | 告诉浏览器为当前页面所在的域设置cookie |
HTTP-协议解析
使用Java来解析HTTP协议费时费力,可以通过使用Web服务器来简化开发过程,提高开发效率。
Web服务器-Tomcat
- Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。
- 主要功能是部署web项目,对外提供网上信息浏览服务。
Tomcat简介
- Tomcat是Apache 软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet和JSP等少量JavaEE规范。
- JavaEE:Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF。
- Tomcat 也被称为 Web容器、Servlet容器。Servlet程序需要依赖于 Tomcat才能运行 。
- 官网:https://tomcat.apache.org/
Tomcat的基本使用
下载
官网下载,地址 https://tomcat.apache.org/download-90.cgi
安装
- 绿色版,直接解压即可。
- 安装完成的文件夹下各目录保存内容:
目录 | 保存内容 |
---|---|
bin | 可执行文件 |
conf | 配置文件 |
lib | Tomcat依赖的jar包 |
logs | 日志文件 |
temp | 临时文件 |
webapps | 应用发布目录 |
work | 工作目录 |
卸载
直接删除目录即可。
启动
双击bin\startup.bat即可。
关闭
- 直接×掉运行窗口:强制关闭。
- 双击bin\shutdown.bat:正常关闭。
- Ctrl+C:正常关闭。
部署
将项目放置到 webapps 目录下,即部署完成。
常见问题
控制台中文乱码
将conf/logging.properties文件中的java.util.logging.ConsoleHandler.encoding = UTF-8
改成java.util.logging.ConsoleHandler.encoding = GBK
即可。
启动窗口一闪而过
检查JAVA_HOME环境变量是否正确配置。
端口号冲突
- 方法一:找到对应程序,将其关闭掉。
- 方法二:配置Tomcat端口号,在conf/server.xml文件中找到以下代码,并把port后的值改为想要的端口号。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
注意:HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,不用输入端口号。
SpringBootWeb快速入门程序解析
- springboot项目自动生成时包含了以下依赖,它们被称为起步依赖:
- spring-boot-starter-web:包含了web应用开发所需要的常见依赖。
- spring-boot-starter-test:包含了单元测试所需要的常见依赖。
- 官方提供的starter:https://docs.spring.io/spring-boot/docs/2.7.4/reference/htmlsingle/#using.build-systems.starters
- 基于Springboot开发的web应用程序,内嵌了Tomcat服务器,当启动类运行时,会自动启动内嵌的Tomcat服务器。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步