这里将创建一个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
,内容如下:
Hello World!
Hello World!
创建完成之后,工程的目录结构如下。
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,如下:
Hello World!
<%
String tmpStr = "Hello World!";
%>
index.jsp: <%=tmpStr%>
目录结构如下:
重启之后,访问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.*" %>
Hello World!
<%
String tmpStr = Hello.say();
%>
indexJava.jsp: <%=tmpStr%>
到这里,目录结构如下:
重启之后,访问http://localhost:8080/indexJava.jsp
,效果如下:
4、创建JSP并引用使用Maven依赖的Java类
在这个场景中,如果一个jsp中引用了一个java类,而这个java类中,也用了一个maven依赖。这种情况下,如果没有任何处理,会直接报错。具体如下。
首先,修改pom.xml
文件,引入一个maven依赖。
4.0.0
com.lfqy.j2ee
mvn-tmct
1.0-SNAPSHOT
commons-lang
commons-lang
2.6
创建一个用于测试的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.*" %>
Hello World!
<%
String tmpStr = HelloStringUtils.sayStringUtils();
%>
indexJavaStringUtils.jsp: <%=tmpStr%>
这时候,重启服务器,然后浏览器访问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: Hello World!
7:
8: <%
9: String tmpStr = HelloStringUtils.sayStringUtils();
10: %>
11:
12: indexJavaStringUtils.jsp: <%=tmpStr%>
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
,发现已经正常了。如下: