這里將創(chuàng)建一個Maven管理的J2EE項目,然后,讓其在Tomcat上運行。這里使用的是MacOS上的IDEA編輯器。
1、創(chuàng)建基于Maven的J2EE項目
1.1 創(chuàng)建Maven項目
在IDEA中依次點擊File->New->Module...,如下。

點擊下一步,輸入模塊的名稱。

然后,設置Module的存儲路徑。

點擊Finish,就創(chuàng)建了一個空Maven項目,結構如下。

1.2 設置J2EE資源目錄
這src的main目錄下創(chuàng)建一個webapp空目錄,創(chuàng)建完成之后,結構如下。

接下來,需要將這個目錄設置為J2EE資源目錄。點擊File->Project Structure...,在彈出的對話框中,點擊Modules,然后,選中剛剛新建的mvn-tmct這個模塊,點擊加號,選中Web。

接下來,添加web.xml描述文件,并設置web資源目錄,如下圖:

注意,這的web.xml的路徑是/Users/chengxia/Developer/TrialProject/mvn-tmct/src/main/webapp/WEB-INF/web.xml,
Web Resource Directory是/Users/chengxia/Developer/TrialProject/mvn-tmct/src/main/webapp。
這一步做完之后,會發(fā)現(xiàn),前面新建的webapp圖標發(fā)生了變化,其中也多了內容。如下。

到這里,一個基于Maven的J2EE空項目就完成了。
1.3 創(chuàng)建測試頁面
在前面新建的webapp目錄下,新建一個測試頁面index.html,內容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<body>
<h2>Hello World!</h2>
</body>
</html>
創(chuàng)建完成之后,工程的目錄結構如下。

1.4 啟動項目
1.4.1 創(chuàng)建Artifact
點擊File->Project Structure...,在彈出的對話框中,先點擊Artifacts,然后點擊加號,選中Web Application: Exploded->From Modules...,如下。

然后,選中當前模塊:

可以看到,當前創(chuàng)建的Artifact的結構,如下。

1.4.2 運行項目
點擊Run->Edit Configurations...,然后在彈出的對話框中,點擊加號,選擇Tomcat Server->Local。

點擊后如下:

選中Deployment頁簽,點擊加號,選擇Artifact...:

然后,在彈出的對話框中,選中剛剛創(chuàng)建的Artifact,如下。

然后點擊OK,如下。

最后,點擊ok即可。到這里就可以,選中剛剛創(chuàng)建的Tomcat Server啟動運行,如下:

啟動之后,瀏覽器訪問http://localhost:8080/index.html,效果如下:

2、創(chuàng)建JSP并運行
這個比較簡單,和html一樣,直接新建即可。
在webapp目錄下,創(chuàng)建index.jsp,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<%
String tmpStr = "Hello World!";
%>
<body>
<h2>index.jsp: <%=tmpStr%></h2>
</body>
</html>
目錄結構如下:

重啟之后,訪問http://localhost:8080/index.jsp,效果如下。

3、創(chuàng)建JSP并引用Java類
在java目錄下,創(chuàng)建一個java類com.lfqy.util.Hello:
package com.lfqy.util;
/**
* Created by chengxia on 2022/11/22. */public class Hello {
public static String say(){
return "Hello World!";
}
}
在webapp目錄下,創(chuàng)建indexJava.jsp,如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="com.lfqy.util.*" %>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<%
String tmpStr = Hello.say();
%>
<body>
<h2>indexJava.jsp: <%=tmpStr%></h2>
</body>
</html>
到這里,目錄結構如下:

重啟之后,訪問http://localhost:8080/indexJava.jsp,效果如下:

4、創(chuàng)建JSP并引用使用Maven依賴的Java類
在這個場景中,如果一個jsp中引用了一個java類,而這個java類中,也用了一個maven依賴。這種情況下,如果沒有任何處理,會直接報錯。具體如下。
首先,修改pom.xml文件,引入一個maven依賴。
<?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.lfqy.j2ee</groupId>
<artifactId>mvn-tmct</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies> <dependency> <groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency> </dependencies>
</project>
創(chuàng)建一個用于測試的java文件com.lfqy.util.HelloStringUtils:
package com.lfqy.util;
import org.apache.commons.lang.StringUtils;
/**
* Created by chengxia on 2022/11/22. */public class HelloStringUtils {
public static String say(){
return "Hello World!";
}
public static String sayStringUtils(){
String resultStr = "";
if(!StringUtils.isBlank(say())){
resultStr = say() + ", is not blank.";
}
return resultStr;
}
}
然后,在webapp目錄下,創(chuàng)建一個jsp文件indexJavaStringUtils.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="com.lfqy.util.*" %>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<%
String tmpStr = HelloStringUtils.sayStringUtils();
%>
<body>
<h2>indexJavaStringUtils.jsp: <%=tmpStr%></h2>
</body>
</html>
這時候,重啟服務器,然后瀏覽器訪問http://localhost:8080/indexJavaStringUtils.jsp,會直接報錯。
# HTTP Status 500 – Internal Server Error
---
**Type** Exception Report
**Message** An exception occurred processing JSP page /indexJavaStringUtils.jsp at line 9
**Description** The server encountered an unexpected condition that prevented it from fulfilling the request.
**Exception**
org.apache.jasper.JasperException: An exception occurred processing JSP page /indexJavaStringUtils.jsp at line 9
6: <title>Hello World!</title>
7: </head>
8: <%
9: String tmpStr = HelloStringUtils.sayStringUtils();
10: %>
11: <body>
12: <h2>indexJavaStringUtils.jsp: <%=tmpStr%></h2>
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:579)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:461)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
**Root Cause**
javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:909)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:838)
org.apache.jsp.indexJavaStringUtils_jsp._jspService(indexJavaStringUtils_jsp.java:139)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
**Root Cause**
java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
com.lfqy.util.HelloStringUtils.sayStringUtils(HelloStringUtils.java:14)
org.apache.jsp.indexJavaStringUtils_jsp._jspService(indexJavaStringUtils_jsp.java:119)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
**Root Cause**
java.lang.ClassNotFoundException: org.apache.commons.lang.StringUtils
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1352)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1180)
com.lfqy.util.HelloStringUtils.sayStringUtils(HelloStringUtils.java:14)
org.apache.jsp.indexJavaStringUtils_jsp._jspService(indexJavaStringUtils_jsp.java:119)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
**Note** The full stack trace of the root cause is available in the server logs.
---
### Apache Tomcat/8.0.53
如下截圖。

為了解決這個問題,首先在目錄webapp/WEB-INF下新建兩個目錄classes和lib,新建完成之后的目錄結構如下。

然后,設置下當前module的編譯輸出目錄。點擊File->Project Structure...,在彈出的對話框中,點擊Modules,然后,選中剛剛新建的mvn-tmct這個模塊,點擊Paths標簽頁,設置Output path為/Users/chengxia/Developer/TrialProject/mvn-tmct/src/main/webapp/WEB-INF/classes,Test output path不用管。如下圖。

點擊OK完成。
接下來,還需要在當前模塊的根目錄,也就是pom.xml文件所在的目錄執(zhí)行如下命令,將該module的maven依賴的jar包拷貝到前面新建的lib目錄:
$ ls
mvn-tmct.iml pom.xml src target
$ mvn dependency:copy-dependencies -DoutputDirectory=/Users/chengxia/Developer/TrialProject/mvn-tmct/src/main/webapp/WEB-INF/lib -DincludeScope=runtime
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< com.lfqy.j2ee:mvn-tmct >-----------------------
[INFO] Building mvn-tmct 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:copy-dependencies (default-cli) @ mvn-tmct ---
[INFO] Copying commons-lang-2.6.jar to /Users/chengxia/Developer/TrialProject/mvn-tmct/src/main/webapp/WEB-INF/lib/commons-lang-2.6.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.669 s
[INFO] Finished at: 2022-11-23T21:45:02+08:00
[INFO] ------------------------------------------------------------------------
$
到這里,重啟服務,會發(fā)現(xiàn)編譯的輸出到了剛新建的classes目錄下,lib目錄下也有了maven依賴的jar包。如下。

這時候瀏覽器中訪問http://localhost:8080/indexJavaStringUtils.jsp,發(fā)現(xiàn)已經(jīng)正常了。如下:
