maven的简介
- Apache Maven 是一种用于软件项目管理工具,基于 Project Object Model(POM),用来管理项目的构建,汇报及文档生成等功能。
- 依赖管理 与maven仓库
maven 仓库是一个类似手机上的 App Store 的东西,上面会有全世界的人上传的各种第三方的 jar 包供我们使用,当我们的项目需要用到其中的内容,可以像手机安装 app 一样方便的进行查找和按照。
其中我们的项目用到了另一个项目,叫做依赖关系。而一个项目中往往需要很多的依赖,所以诞生了依赖管理的概念。
- maven 的作用
maven 的目标是完成项目构建解决的一切繁琐事宜。我们具体关注它的以下功能:
- 提供一个标准的项目工程目录
- 提供项目描述
- 提供强大的版本管理工具
- 可以分阶段的进行构建过程
- 提供了丰富的插件库使用
使用IDEA创建一个maven项目
- 然后一路finish知道出现如下页面表示创建成功
main文件配置
- Test用于测试代码 resources用于提供资源的文件 java写源代码
pom.xml文件配置
- 倒入HttpServcet的jar包
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
- 导入mysql包
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
- 这是最后我们导出war包的配置
<groupId>org.example</groupId>
<artifactId>20200712</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
- 这是一些插件 第一行是导出war包的名字
<build>
<finalName>listen</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>
写实现代码
- 在main文件里创建java文件继承HttpServlet
- 按请求报文方法重写doXX方法(不如请求是get方法 就重写doGet方法)
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 HttpServletCal extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求中的数据
String aStr = req.getParameter("a");
String bStr = req.getParameter("b");
int ret = Integer.parseInt(aStr) + Integer.parseInt(bStr);
//将结果写回到响应报文中
resp.getWriter().write("<h1>ret=" + ret + "</h1>");
}
}
配置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>
<servlet-name>HttpServletCal</servlet-name>
<servlet-class>package.HttpServletCal</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HttpServletCal</servlet-name>
<url-pattern>/cal</url-pattern>
</servlet-mapping>
</web-app>
本质的目的就是在于将 Servlet的类与url关联起来 这样 后序tomcat收到HTTP请求后 发现url中带有的路径与web.xml路径相吻合 就会找到对应的Servlet的代码
生产war包
- maven的生命周期
clean: 清空之前编译生成的临时文件
validate: 验证合法性
compile: 编译 自动地道用javac编译java文件为字节码文件
test: 此时单元 一般搭配junit完成
package: 打包
verify: 确认 也可以看做是一个校验的动作
install: 安装 把程序部署到一个本地目录中 提供其他程序使用
deploy: 部署到中央仓库
依赖管理时,可以指定一个依赖被用于哪个阶段,例如 junit 作为一种著名的单元测试框架,用于测试阶段,后面的阶段就不再需要了。
看着到这就说明打包成功
部署到Tomcat
- 直接把war包拷贝到Tomcat的webapps目录中即可(一般Tomcat会自动检测到你的war包 除非他卡死)
出现这样说吗部署成功
Tomcat基本原理
- Tomcat启动/初始化
- 会创建一个Socket对象绑定端口号(一般是8080) 然后扫描webapps加载当前目录中的webapps(把每个webapp加载到内存中
- 这里主要是加载对应的web.xml文件)
- 创建一个单独的线程 监控webapps目录中的webapp的变化 如果有就会自动加载
- 处理过程
- 收到GET请求处理url得到想要的url 比如我的 /listen/cal
- 根据一级路径确认是webapp中的哪个目录
- 再根据二级路径/cal 找到对应的Servlet的类的名字
- 根据类的名字进行加载类 也就是反射机制得到该类
- 初次加载完毕 会调用该类的init方法 (如果已经加载了, 后序就不需要加载了)
- 调用该类的service方法 service方法会根据Http请求中的方法 决定调用对于的doXX 方法 (这也是我们需要重写doXX方法的原因)
测试