[maven] maven 创建 web 项目并嵌套项目

[maven] maven 创建 web 项目并嵌套项目

这里主要就创建另外一个 web 项目,并且创建一个 parent 项目比较方便的管理一下两个子项目。

maven web 项目

web 创建和 quickstart 的过程是差不多的,只不过这里换乘 webapp,配置方便的话可以搞的东西挺多的……这里就搞 servlet,上古版本的东西了。

create new web application

在这里插入图片描述

创建新的 maven 项目这里就换成 webapp,创建后的项目,pom 也会不太一样:

❯ tree productweb
productweb
├── pom.xml
├── src
│   └── main
│       └── webapp
│           ├── WEB-INF
│           │   └── web.xml
│           └── index.jsp
└── target├── classes├── m2e-wtp│   └── web-resources│       └── META-INF│           ├── MANIFEST.MF│           └── maven│               └── com.goldenaarcher.product│                   └── productweb│                       ├── pom.properties│                       └── pom.xml└── test-classes14 directories, 6 files❯ cat productweb/pom.xml
<?xml version="1.0" encoding="UTF-8"?><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><groupId>com.goldenaarcher.product</groupId><artifactId>productweb</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><name>productweb Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><build><finalName>productweb</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>

简单的过一下 pom 的配置:

  • 如 pom 显示的一样,这里打包的包是 war 而不是 jar。
  • finalName 这个选项设置会重写默认的项目名

这时候项目还是没有办法运行的,因为目前项目没有服务器,所以这个时候需要完成服务器相关的配置。

  1. eclipse 中添加 tomcat

    完成这一步项目就不会报错,可以正常 build

    这个也可以通过直接在 pom 里面设置,这里是直接配置本地已经下载好的 tomcat

    具体步骤就是在项目属性里面选择 targeted runtime:

    在这里插入图片描述

    如果 tomcat 的配置像在之前的笔记 Mac 中安装 tomcat 及 Eclipse 配置 Tomcat 提过的一样已经搞好了,也可以通过 tomcat 进行修改:

    在这里插入图片描述

  2. 添加 servlet 的依赖

    依赖如下:

        <dependency><groupId>org.apache.geronimo.specs</groupId><artifactId>geronimo-servlet_3.0_spec</artifactId><version>1.0</version><scope>provided</scope></dependency>
    

两个都配置好了就可以运行 mvn clean install 了:

[[1;34mINFO[m] [1m--- [0;32mmaven-war-plugin:3.2.2:war[m [1m(default-war)[m @ [36mproductweb[0;1m ---[m
[[1;34mINFO[m] Packaging webapp
[[1;34mINFO[m] Assembling webapp [productweb] in [/Users/usr/study/maven/productweb/target/productweb]
[[1;34mINFO[m] Processing war project
[[1;34mINFO[m] Copying webapp resources [/Users/usr/study/maven/productweb/src/main/webapp]
[[1;34mINFO[m] Webapp assembled in [24 msecs]
[[1;34mINFO[m] Building war: /Users/usr/study/maven/productweb/target/productweb.war
[[1;34mINFO[m]
[[1;34mINFO[m] [1m--- [0;32mmaven-install-plugin:2.5.2:install[m [1m(default-install)[m @ [36mproductweb[0;1m ---[m
[[1;34mINFO[m] Installing /Users/usr/study/maven/productweb/target/productweb.war to /Users/usr/.m2/repository/com/goldenaarcher/product/productweb/0.0.1-SNAPSHOT/productweb-0.0.1-SNAPSHOT.war
[[1;34mINFO[m] Installing /Users/usr/study/maven/productweb/pom.xml to /Users/usr/.m2/repository/com/goldenaarcher/product/productweb/0.0.1-SNAPSHOT/productweb-0.0.1-SNAPSHOT.pom
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] [1;32mBUILD SUCCESS[m
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] Total time:  1.631 s
[[1;34mINFO[m] Finished at: 2023-09-11T21:12:28-04:00
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m

注意这里 war 就已经打包好了

准备工作

maven 创建项目的时候,可能会漏结构,所以需要确认一下结构。Maven resource folder isn’t created 中提到的是资源文件夹没有创建,不过我这里是连 java 都瘸了……所以说,如果 main 没有三个文件夹,就需要创建缺失的文件夹,,随后更新一下 maven 项目,此时结构如下:

cd productweb
❯ mkdir src/main/java
❯ mkdir src/main/resources
❯ tree .
.
├── pom.xml
├── src
│   └── main
│       ├── java
│       ├── resources
│       └── webapp
│           ├── WEB-INF
│           │   └── web.xml
│           └── index.jsp
└── target├── classes├── m2e-wtp│   └── web-resources│       └── META-INF│           ├── MANIFEST.MF│           └── maven│               └── com.goldenaarcher.product│                   └── productweb│                       ├── pom.properties│                       └── pom.xml├── maven-archiver│   └── pom.properties├── productweb│   ├── META-INF│   ├── WEB-INF│   │   ├── classes│   │   └── web.xml│   └── index.jsp├── productweb.war└── test-classes21 directories, 10 files

resources 还是挺重要的,一些资源的同步就靠这个文件夹。

创建 servlets

创建产品 servlet

这里点击项目右键选择创建新的 servlet,现在这个年代已经不是热门选项了,有可能需要到 more 里面去找:

在这里插入图片描述

下一步提供 servlet 的名称:

在这里插入图片描述

选择 URL mapping:

在这里插入图片描述

完成创建:

在这里插入图片描述

完成后的结构如下:

❯ tree src/main/java
src/main/java
└── com└── goldenaarcher└── product└── servlets└── CreateProductServlet.java5 directories, 1 file

servlet 的文件内容为:

package com.goldenaarcher.product.servlets;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class CreateProductServlet*/
public class CreateProductServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public CreateProductServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub}}

展示产品 servlet

也是右键新建生成一个 servlet,这里选择 doGet,然后生成一个空的 java 模板。

关于 mapping

这个跟自动生成有关系,有可能是通过注解 @WebServlet 实现,或者是通过 webapp/WEB-INF 下的 web.xml 实现 mapping,eclipse 自动生成 xml 文件:

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>CreateProductServlet</servlet-name><display-name>CreateProductServlet</display-name><description></description><servlet-class>com.goldenaarcher.product.servlets.CreateProductServlet</servlet-class></servlet><servlet-mapping><servlet-name>CreateProductServlet</servlet-name><url-pattern>/CreateProductServlet</url-pattern></servlet-mapping>
</web-app>

stack overflow 上也有一个回答解释了 mapping 的问题: Not getting automatically web.xml file while creating servlet in Eclipse Juno 4.2

简单的说就是,@WebServlet("/CreateProductServlet") 可以代替这几行代码:

  <servlet><servlet-name>CreateProductServlet</servlet-name><display-name>CreateProductServlet</display-name><description></description><servlet-class>com.goldenaarcher.product.servlets.CreateProductServlet</servlet-class></servlet><servlet-mapping><servlet-name>CreateProductServlet</servlet-name><url-pattern>/CreateProductServlet</url-pattern></servlet-mapping>

两种配置可以同时存在,但是同一个 servelet 不能被 map 两次,否则会运行失败。

tomecat 10 更新

tomcat10 的包从 javax.servlet.jsp 变成了 jakarta.servlet.jsp,所以要下载对应的新 dependency

		<!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api --><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version><scope>provided</scope></dependency>

创建 HTML

这个页面就是创建产品的页面,它的目录为 src/main/webapp 完整代码如下:

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>Create Product</title><style>div {display: flex;}input {display: block;}</style></head><body><h3>Enter Product Details:</h3><form method="post" action="CreateProductServlet"><div>Product Id: <input name="id" /></div><div>Product Name: <input name="name" /></div><div>Product Description: <input name="description" /></div><div>Product Price: <input name="price" /></div><div><input type="submit" /></div></form></body>
</html>

此时的结构为:

❯ tree src
src
└── main├── java│   └── com│       └── goldenaarcher│           └── product│               └── servlets│                   ├── CreateProductServlet.java│                   └── DisplayProductDetailsServelet.java├── resources└── webapp├── WEB-INF│   └── web.xml├── index.jsp└── product.html10 directories, 5 files

运行项目

在这里插入图片描述

这回直接在 tomcat 上进行运行,这时候页面显示如下:

在这里插入图片描述

在这里插入图片描述

下一步要做的,就是把 product service 和 product web 两个项目连起来,实现一个可以运行的页面。

多模块项目

为了方便管理,主要这样可以只用跑一次 maven 相关的指令。

清理结构

我这里创建了一个新的文件夹,然后把两个 product 相关的文件夹搬进去了。这个可以用 GUI 也可以用命令行。

调整完了结构如下:

❯ tree -L 3
.
├── pom.xml
├── productservices
│   ├── pom.xml
│   ├── src
│   │   ├── main
│   │   └── test
│   └── target
│       ├── classes
│       ├── generated-sources
│       ├── generated-test-sources
│       ├── maven-archiver
│       ├── maven-status
│       ├── productservices-1.0.jar
│       ├── surefire-reports
│       └── test-classes
└── productweb├── pom.xml├── src│   └── main└── target├── classes├── generated-sources├── m2e-wtp├── maven-archiver├── maven-status├── productweb└── productweb.war23 directories, 5 files

新增&修改 pom 文件

总共需要修改 3 个 pom 文件

新增 parent 文件夹下的 pom

创建 parent 文件夹下的 pom 文件:

<?xml version="1.0" encoding="UTF-8"?><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><groupId>com.goldenaarcher.product</groupId><artifactId>productparent</artifactId><version>1.0</version><packaging>pom</packaging><name>productparent</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><modules><module>productservices</module><module>productweb</module></modules>
</project>

这里主要需要注意的就是亮点:

  1. packaging 的格式是 pom
  2. modules 下包含所有的子项目

更新子项目的 pom

更新 parent 下的部分都是共同的,所有子项目都要重新定义一下父项目

productservices pom
	<parent><groupId>com.goldenaarcher.product</groupId><artifactId>productparent</artifactId><version>1.0</version></parent><artifactId>productservices</artifactId><name>productservices</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url>
productweb pom

除了 parent,web 这里海需要更新 dependency,因为 web 需要调用 service 中的 bo 去实现具体功能。

	<parent><groupId>com.goldenaarcher.product</groupId><artifactId>productparent</artifactId><version>1.0</version></parent><artifactId>productweb</artifactId><packaging>war</packaging><name>productweb Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><dependencies><!-- 省略其他 --><dependency><groupId>com.goldenaarcher.product</groupId><artifactId>productservices</artifactId><version>1.0</version></dependency></dependencies>

servelt 的 java 实现

这里主要实现的就是从 request 中获取数据,传到 bo 中实现功能即可

实现 CreateProductServlet

这里会从 THML 中获取对应的数据,调用 bo 里的 create 创建一个 product

package com.goldenaarcher.product.servlets;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.goldenaarcher.product.bo.ProductBO;
import com.goldenaarcher.product.bo.ProductBOImpl;
import com.goldenaarcher.product.dto.Product;/*** Servlet implementation class CreateProductServlet*/
public class CreateProductServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Integer id = Integer.parseInt( request.getParameter("id"));String name = request.getParameter("name");String desc = request.getParameter("description");Integer price = Integer.parseInt( request.getParameter("price"));Product product = new Product();product.setId(id);product.setDescription(desc);product.setName(name);product.setPrice(price);ProductBO bo = new ProductBOImpl();bo.create(product);PrintWriter out = response.getWriter();out.print("product created");}}

实现 DisplayProductDetailsServelet

因为这里需要从 query param 中获取 id,所以如果没提供 query param 就会抛出 parse 异常

package com.goldenaarcher.product.servlets;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.goldenaarcher.product.bo.ProductBO;
import com.goldenaarcher.product.bo.ProductBOImpl;
import com.goldenaarcher.product.dto.Product;/*** Servlet implementation class DisplayProductDetailsServelet*/
public class DisplayProductDetailsServelet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {ProductBO bo = new ProductBOImpl();Product product = bo.findProduct(Integer.parseInt(request.getParameter("id")));PrintWriter out = response.getWriter();out.print("Product details: ");out.print("Product ID: " + product.getId());out.print("Product Name: " + product.getName());out.print("Product Description: " + product.getDescription());out.print("Product Price: " + product.getPrice());}}

最终创建和运行

这里会把 build install 拆分成几个部分简单解释一下

reactor

reactor 指的是 maven 能够根据项目的依赖,调整打包顺序的能力,maven 会根据其依赖关系调整打包的顺序。

❯ mvn clean install
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] productparent                                                      [pom]
[INFO] productservices                                                    [jar]
[INFO] productweb Maven Webapp                                            [war]
[INFO]
[INFO] --------------< com.goldenaarcher.product:productparent >---------------
[INFO] Building productparent 1.0                                         [1/3]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ productparent ---
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ productparent ---
[INFO] Installing /Users/usr/study/maven/parent/pom.xml to /Users/usr/.m2/repository/com/goldenaarcher/product/productparent/1.0/productparent-1.0.pom

打包子项目

这里 maven 会将 service 的项目打包到 m2 的文件夹中让其他的项目使用,这里 web 就需要调用 service 中的内容。

[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ productservices ---
[INFO] Building jar: /Users/usr/study/maven/parent/productservices/target/productservices-1.0.jar
[INFO]
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ productservices ---
[INFO] Installing /Users/usr/study/maven/parent/productservices/target/productservices-1.0.jar to /Users/usr/.m2/repository/com/goldenaarcher/product/productservices/1.0/productservices-1.0.jar
[INFO] Installing /Users/usr/study/maven/parent/productservices/pom.xml to /Users/usr/.m2/repository/com/goldenaarcher/product/productservices/1.0/productservices-1.0.pom
[INFO]

其他项目打包部分与其他的 maven 差不多,这里不多赘述。

这里的功能实现完了,war 也打包完了,可以直接放到服务器上运行。本质上来说,war 中的内容和 target 中的 productweb 结构是一样的,前者是后者的压缩版。

最终运行结果

依旧是在 eclipse 中的 tomcat 运行服务器,所有的功能都实现了,最终的运行结果如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

CSS 会不太一样,我笔记里改了一点 CSS。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/109764.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D目标检测框架 MMDetection3D环境搭建 docker篇

本文介绍如何搭建3D目标检测框架&#xff0c;使用docker快速搭建MMDetection3D的开发环境&#xff0c;实现视觉3D目标检测、点云3D目标检测、多模态3D目标检测等等。 需要大家提前安装好docker&#xff0c;并且docker版本> 19.03。 1、下载MMDetection3D源码 https://gith…

spring boot 整合多数据源

多数据源产生的场景 一般情况下&#xff0c;不会有多数据源这样的场景出现&#xff0c;但老项目或者特殊需求的项目&#xff0c;可能会有这样的场景 同一个应用需要访问两个数据库不用数据库中间件的读写分离 注入数据源选择的时机 声明两个数据源实例&#xff0c;在getConnect…

【多线程】CAS 详解

CAS 详解 一. 什么是 CAS二. CAS 的应用1. 实现原子类2. 实现自旋锁 三. CAS 的 ABA 问题四. 相关面试题 一. 什么是 CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“一个 CAS 涉及到以下操作&#xff1a; 我们假设内存中的原数据 V&#xff0c;旧的预期值…

pytorch生成CAM热力图-单张图像

利用ImageNet预训练模型生成CAM热力图-单张图像 一、环境搭建二、主要代码三、结果展示 代码和图片等资源均来源于哔哩哔哩up主&#xff1a;同济子豪兄 讲解视频&#xff1a;CAM可解释性分析-算法讲解 一、环境搭建 1&#xff0c;安装所需的包 pip install numpy pandas mat…

干净优雅的做iOS应用内全局交互屏蔽

本文字数&#xff1a;4930字 预计阅读时间&#xff1a;28分钟 01 交互屏蔽的需求 很多应用开发者都会遇到这样一个需求&#xff0c;当程序需要处理某个敏感的核心任务&#xff0c;或者执行某些动画时&#xff0c;需要杜绝一切外部干扰&#xff0c;优先保证任务的完成&#xff0…

thinkphp:查询本周中每天中日期的数据,查询今年中每个月的数据,查询近五年每年的总数据

一、查询本周中每天中日期的数据 结果&#xff1a; 以今天2023-09-14为例&#xff0c;这一周为2023-09-11~2023-09-07 代码 后端thinkphp: //查询本周每天的的总金额数 //获取本周的起始日期和结束日期 $weekStart date(Y-m-d, strtotime(this week Monday)); $weekEnd …

centos 下 Makefile 独立模块编译ko

1、安装编译内核环境包 编译需要用到kernel 源码&#xff0c;centos 下需先安装 kernel-devel 包&#xff0c;要下与自己kernel 对应版本 yum install kernel-devel 2、首先从内核或自己写的模块&#xff0c;发到编译环境中 注&#xff1a;就像我自己拷贝一个 bcache 驱动的目…

msvcp120.dll怎么修复?msvcp120.dll丢失的解决方法

在当今这个信息化的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;随着电脑技术的不断发展&#xff0c;我们也会遇到各种各样的问题。其中&#xff0c;msvcp120.dll丢失是一个常见的问题。一、msvcp120.dll 文件介绍 1 msvcp120.dll 文件的定…

红外成像技术

针对GI S设备红外检测目前未被大众认可的原因&#xff1a; 1 、 目前对GI S带电检测的意义认识不够&#xff0c; 许多单位认为GI S测温发现不了什么&#xff0c; 对其测温仅仅检测接头。 2、 GI S外壳温度异常的原因多种&#xff0c; 出现外壳温度异常大家不会分析&#xff0c;…

数据科学的文本技术 Text Technology(IR信息检索、搜索引擎)

一、文章摘要 1. 内容 * Introduction to IR and text processing, system components * Zipf, Heaps, and other text laws * Pre-processing: tokenization, normalisation, stemming, stopping. * Indexing: inverted index, boolean and proximity search * Evaluation m…

物联网行业案例 - Splashtop 助力成都谷帝科技有限公司远程维护安卓设备

成都谷帝科技有限公司专注于提供针对特定行业需求的全面物联网软硬件解决方案。其产品系列包括智慧路灯系统、智能门禁、智能柜控、智慧体育步道、农业灌溉、工业焙烧系统、水质在线检测系统等。 客户需求 成都谷帝科技有限公司提供物联网软硬件解决方案&#xff0c;还需要对…

伦敦银时走势与获利机会

交易时间灵活、资金杠杆充沛是伦敦银交易的主要优势&#xff0c;投资者应该充分利用这个品种的制度优势&#xff0c;结合自己个人的作息时间&#xff0c;在工作、投资与生活三者之间取得平衡的前提下&#xff0c;借助国际白银市场的波动&#xff0c;通过交易逐步实现自己的财富…