这里将创建一个Maven管理的J2EE项目,然后,让其在Tomcat上运行。这里使用的是MacOS上的IDEA编辑器。
1、创建基于Maven的J2EE项目
1.1 创建Maven项目
在IDEA中依次点击File->New->Module...,如下。

点击下一步,输入模块的名称。

然后,设置Module的存储路径。

点击Finish,就创建了一个空Maven项目,结构如下。

1.2 设置J2EE资源目录
这src的main目录下创建一个webapp空目录,创建完成之后,结构如下。

接下来,需要将这个目录设置为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。
这一步做完之后,会发现,前面新建的webapp图标发生了变化,其中也多了内容。如下。

到这里,一个基于Maven的J2EE空项目就完成了。
1.3 创建测试页面
在前面新建的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>
创建完成之后,工程的目录结构如下。

1.4 启动项目
1.4.1 创建Artifact
点击File->Project Structure...,在弹出的对话框中,先点击Artifacts,然后点击加号,选中Web Application: Exploded->From Modules...,如下。

然后,选中当前模块:

可以看到,当前创建的Artifact的结构,如下。

1.4.2 运行项目
点击Run->Edit Configurations...,然后在弹出的对话框中,点击加号,选择Tomcat Server->Local。

点击后如下:

选中Deployment页签,点击加号,选择Artifact...:

然后,在弹出的对话框中,选中刚刚创建的Artifact,如下。

然后点击OK,如下。

最后,点击ok即可。到这里就可以,选中刚刚创建的Tomcat Server启动运行,如下:

启动之后,浏览器访问http://localhost:8080/index.html,效果如下:

2、创建JSP并运行
这个比较简单,和html一样,直接新建即可。
在webapp目录下,创建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、创建JSP并引用Java类
在java目录下,创建一个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目录下,创建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、创建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>
创建一个用于测试的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目录下,创建一个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文件所在的目录执行如下命令,将该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] ------------------------------------------------------------------------
$
到这里,重启服务,会发现编译的输出到了刚新建的classes目录下,lib目录下也有了maven依赖的jar包。如下。

这时候浏览器中访问http://localhost:8080/indexJavaStringUtils.jsp,发现已经正常了。如下:

