接下来我们基于这样的组合工具来创作第一个Java Web项目,在这个过程中由于不熟悉Idea和Maven自身的强大功能,走了很多弯路,这里把这些弯路都总结一下,输出一篇较为正确的第一个项目:
安装与配置
首先需要进行组合套件的安装与配置,因为我之前写过类似的文章,这里就不再重复了,针对当前的组合套件来进行一个介绍:(Idea2021+Maven3+Tomcat8+JDK8)
- JDK的安装与环境变量的配置:【安装与配置 一】Java环境变量的配置
- Tomcat的安装与环境变量的配置:【安装与配置 二】tomcat环境变量的配置
- Idea2021的下载与安装: Idea官方下载站点
- Maven3:Maven我使用了Idea集成绑定版,所以没有单独下载,如果需要下载可以参考这个站点:Maven官方下载站点
好的,所有的套件组装完毕了,让我们接下来创建第一个Java Web项目并且明确一些注意事项
Java Web创建
包括创建新项目,Tomcat的一些配置疑惑,以及Maven去哪里了?
创建新项目
点击新建项目创建一个新的project,点击【New Project】开始创建第一个项目,并且为这个项目的组成方式选择配置:
选择要构建的项目的一些必须属性,例如我们通过Maven来构建这个Java Web项目,就按照如下的方式去选择,当然你也可以通过Gradle去构建,这里我们选择Maven;同时这里的服务器是我们本地安装好的,选中即可。
接下来是我们项目可以选择的额外装配内容,这里我们暂时都不选择,需要的时候再通过Maven引入即可:
这样一个项目已经构建完了,构建完成的目录如下:
项目目录结构
因为是依据Maven构建的,所以也是用的Maven的经典目录结构,详细我会在Maven的一篇专题Blog中具体介绍,敬请期待,这里简单的说明下:
再来看看部署后的文件:
而WEB-INF下存放编译后的Servlet文件和web配置文件:
配置Tomcat服务器
我们需要调整一下Tomcat的默认配置来让我们的项目运转的更舒服,让我们解决以下几个问题:
解决URL路径和项目名称不符问题
首先我们需要调整一下请求的URL路径名称,这样我们在浏览器里就不必输入较为长的Tomcat默认附加的奇怪地址:
解决JSP修改后需要重启服务器问题
接下来我们打开Tomcat热部署,这样每次JSP的调整都不需要重启服务器了,会自动的生效。同时我们还需要设置Tomcat所有项目部署,这样的好处是所有部署在Tomcat上的项目启动时都可以同时使用了
这里顺便提一下两种部署模式:
- war模式这种可以称之为是发布模式,就是先将WEB工程打成war包,然后再将其上传到服务器进行发布
- war exploded模式是将WEB工程以当前文件夹的位置关系上传到服务器,即直接把文件夹、jsp页面 、classes等等移到Tomcat 部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。
在平时开发的时候,使用热部署的话,应该对Tomcat进行相应的设置,这样的话修改的jsp界面什么的东西才可以及时的显示出来.
同时需要注意需要设置Tomcat所有项目部署,这里的勾选指的是会连同:TOMCAT_HOME\webapps
下的项目一起部署。如果不勾选,那么甚至连localhost的主页都不会显示,因为它会遵循配置寻找自己要部署的项目,下面将会聊到:
解决tomcat的webapps目录下找不到项目的问题
最后我们要设置Web部署包的输出目录,Idea对tomcat的操作是这样的,默认设置输出的部署地址:
每次在IDEA启动Tomcat的时候Idea会在一个默认的地址为我们生成一个包含Tomcat全部配置拷贝的Tocat副本:
C:\Users\13304\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat
在这个拷贝下我们可以找到当前项目的配置文件,该配置文件描述了tomcat该如何找到当前的部署地址:
\522868f8-acc6-45a8-8ea9-753cc1111423\conf\Catalina\localhost
这样当tomcat启动时通过配置文件找到真实的项目输出位置,启动项目,为了解决这个问题,让我们所有的项目不必依赖idea而启动我们需要修改项目地址,修改为安装的tomcat的webapps下:
这样当我们运行项目后就能找到了:
当然这个属于历史服务器默认配置tomcat没有办法的办法,如果我们依然想使用idea默认的方式也可以,但是其中的原理还是要理解一下的,即tomcat依据配置路径去寻找部署包并运行。
WEB-INF下的lib目录去哪了
我们知道标准的Java EE构建在web-inf下会有lib,文件夹里会存放我们的包依赖,但是从这里我们却没有找到lib,这是因为Maven已经接管了我们的包管理,无需自己再进行手动装配和引入依赖了,这就是Maven最大的优势啊,还搞神秘lib目录?
配置Maven包管理器
我们先来找到Maven并修改一些配置,保证项目可用。关于Maven的详细介绍,可以看我的这个目录:Maven的基本概念和基本功能
Maven安装在哪
我们可以看到,到现在为止并没有安装任何的Maven,那是因为Idea依据帮我们集成了,版本默认是3.6.3,本地仓库默认放到了用户文件夹下。
添加Maven的依赖
为了能让JSP能正常运行,我们后续能够引入Java代码使用,我们需要修改Maven的pom.xml文件引入相关依赖:
<dependencies> <!--引入servlet相关依赖,https://repo.maven.apache.org/maven2/javax/servlet/servlet-api/--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!--引入jsp相关依赖,https://repo.maven.apache.org/maven2/javax/servlet/jsp/jsp-api/--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.2.1</version> <scope>provided</scope> </dependency> <!--引入junit测试引擎相关依赖--> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies>
如果没有引用,很有可能报如下错误:
编辑项目并启动
查看和编辑下JSP和Servlet文件,启动查看显示。
编辑JSP&Servlet文件
首先我们看到有个入口的index.jsp程序,这个文件是我们的首页文件,在首页文件我们能调整页面显示的文字等:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <title>JSP - Hello World</title> </head> <body> <h1><%= "Hello World!" %> </h1> <br/> <a href="hello-servlet">我的第一个JavaWeb项目</a> </body> </html>
然后我们可以看到一个默认的Servlet文件,可以看到接收的是一个Get请求
package com.example.FirstJavaWeb; import java.io.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebServlet(name = "helloServlet", value = "/hello-servlet") public class HelloServlet extends HttpServlet { private String message; public void init() { message = "Hello World!"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>" + message + "</h1>"); out.println("</body></html>"); } public void destroy() { } }
关于JSP和Servlet,之后的文章里详细介绍,这里有个概念即可。
启动服务器并在浏览器查看
然后我们启动服务器,访问我们的URL路径来查看启动的JSP:
总结一下
这是我这几天实践的一点感悟,工具更新了,时代变了,最好的方式就是拥抱变化,不要再停留在MyEclipse时代,不要再停留在固有的历史的web结构和古早的实现方式,技术变化太快了,idea真是yyds,可以让我们专注业务开发,组件全部集成,看来还是要不断学习才能赶上技术的变化,至于为什么还是用tomcat8和JDK8,是因为生产环境目前还是jdk8,tomcat8也比较适配,真的要快速追赶式学习,在迎接最新的框架和技术时又要做好原理的沉淀,凡事多问几个为什么。