在Tomcat上运行Maven管理的J2EE项目

这里将创建一个Maven管理的J2EE项目,然后,让其在Tomcat上运行。这里使用的是MacOS上的IDEA编辑器。

1、创建基于Maven的J2EE项目

1.1 创建Maven项目

在IDEA中依次点击File->New->Module...,如下。

image.png

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


image.png

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


image.png

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

image.png

1.2 设置J2EE资源目录

这src的main目录下创建一个webapp空目录,创建完成之后,结构如下。


image.png

接下来,需要将这个目录设置为J2EE资源目录。点击File->Project Structure...,在弹出的对话框中,点击Modules,然后,选中刚刚新建的mvn-tmct这个模块,点击加号,选中Web

image.png

接下来,添加web.xml描述文件,并设置web资源目录,如下图:


image.png

注意,这的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图标发生了变化,其中也多了内容。如下。

image.png

到这里,一个基于Maven的J2EE空项目就完成了。

1.3 创建测试页面

在前面新建的webapp目录下,新建一个测试页面index.html,内容如下:

  
  
  
      
    Hello World!  
  
  
    

Hello World!

创建完成之后,工程的目录结构如下。


image.png

1.4 启动项目

1.4.1 创建Artifact

点击File->Project Structure...,在弹出的对话框中,先点击Artifacts,然后点击加号,选中Web Application: Exploded->From Modules...,如下。

image.png

然后,选中当前模块:


image.png

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


image.png

1.4.2 运行项目

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

image.png

点击后如下:


image.png

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

image.png

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


image.png

然后点击OK,如下。


image.png

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


image.png

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

image.png

2、创建JSP并运行

这个比较简单,和html一样,直接新建即可。
在webapp目录下,创建index.jsp,如下:

  
  
  
      
    Hello World!  
  
<%  
    String tmpStr = "Hello World!";  
%>  
  
    

index.jsp: <%=tmpStr%>

目录结构如下:


image.png

重启之后,访问http://localhost:8080/index.jsp,效果如下。

image.png

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%>

到这里,目录结构如下:


image.png

重启之后,访问http://localhost:8080/indexJava.jsp,效果如下:

image.png

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

如下截图。


image.png

为了解决这个问题,首先在目录webapp/WEB-INF下新建两个目录classeslib,新建完成之后的目录结构如下。

image.png

然后,设置下当前module的编译输出目录。点击File->Project Structure...,在弹出的对话框中,点击Modules,然后,选中刚刚新建的mvn-tmct这个模块,点击Paths标签页,设置Output path/Users/chengxia/Developer/TrialProject/mvn-tmct/src/main/webapp/WEB-INF/classesTest output path不用管。如下图。

image.png

点击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包。如下。


image.png

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

image.png

你可能感兴趣的:(在Tomcat上运行Maven管理的J2EE项目)