曾经混过的,都需要偿还。
IDE:Intellij IDEA 2018.2 64位专业版
Maven:3.5.4
Tomcat:9
JDK:10
现在项目大多使用Maven管理,就我现在的理解,Maven是一个构建工具,可以管理项目模块之间的依赖关系,有了它,我们不需要到处寻找各种jar包,当所依赖的jar包需要更新时,不需要一个个去lib覆盖;Maven所涉及的知识和理念以及其强大之处必然不限于这些,有兴趣的伙伴可以自行深入了解~
这里我们将介绍使用Intellij IDEA创建Maven管理的Web项目(简单返回百度首页)的三种方式:
在这种方式里,我们将首先创建一个Web项目,然后向其添加Maven支持。具体步骤如下:
修改项目结构
这里,首先将src目录取消源码根目录标记:
然后在src下创建main文件夹,并在其内创建java和resources文件夹,之后通过Mark Directory as 菜单项分别将其标记为Sources Root和Resources Root。于main同级,创建test目录,然后在其中创建java文件夹,将其标志为Test Sources Root。这个结构是Maven所要求的~
添加Maven支持
与src同级,创建pom.xml文件(该文件内容其实是来自第二种方法里IDEA创建的pom.xml文件),然后点击右侧Maven Projects按钮,点击+添加Maven 支持:
配置Tomcat
这里,为了让项目run起来,需要配置一下Tomcat,值得注意的是,因为我们首先创建的是一个Web Application,所以这里IDEA为我们做了一些事情(虽然,并没有什么用,至于为什么,请关注文末后记部分)
我们点击Tomcat旁边的倒三角,点击Edit Configurations,可以看到:
嗯,看一看就好,接下来我们进入Project Structure,结果如下:
可以发现,IDEA自己创建了一个Artifact,需要注意的是它的目录结构。这就使得run的时候,会发现run不起来。
修改Artifact
最后结果如下:
这里需要注意的是它的结构。我知道需要这么做,是因为不这么做,就会发现run的时候会出错,而出错原因正是前者没有lib,所以找不到一些类。可以不修改,然后自己试一试(不保证一定会出现问题哦,bug这回事,谁说的准呢?)
编写pom.xml和Controller
为了测试Maven的确管理了我们所以来的第三方包,我们编写一个Servlet,用以返回百度的首页,这里我们使用OkHttp3+Servlet 来实现,需要注意的是,IDEA不会自己引入Servlet相关包,所以我们需要添加对servlet的依赖。
pom.xml如下:
<modelVersion>4.0.0modelVersion>
<groupId>xiaomogroupId>
<artifactId>aslxartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<name>aslx Maven Webappname>
<url>http://www.example.comurl>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.7maven.compiler.source>
<maven.compiler.target>1.7maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
<dependency>
<groupId>com.squareup.okhttp3groupId>
<artifactId>okhttpartifactId>
<version>3.11.0version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>4.0.1version>
<scope>providedscope>
dependency>
dependencies>
<build>
<finalName>aslxfinalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-pluginartifactId>
<version>3.0.0version>
plugin>
<plugin>
<artifactId>maven-resources-pluginartifactId>
<version>3.0.2version>
plugin>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
<version>3.7.0version>
plugin>
<plugin>
<artifactId>maven-surefire-pluginartifactId>
<version>2.20.1version>
plugin>
<plugin>
<artifactId>maven-war-pluginartifactId>
<version>3.2.0version>
plugin>
<plugin>
<artifactId>maven-install-pluginartifactId>
<version>2.5.2version>
plugin>
<plugin>
<artifactId>maven-deploy-pluginartifactId>
<version>2.8.2version>
plugin>
plugins>
pluginManagement>
build>
project>
package controllers;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class BaiDuController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp){
try {
OkHttpClient client = new OkHttpClient.Builder().build();
Request baiduHomeRequest = new Request.Builder()
.get()
.url("https://www.baidu.com/")
.build();
Call homeCall = client.newCall(baiduHomeRequest);
Response homeResponse = homeCall.execute();
String content = homeResponse.body().string();
PrintWriter writer = resp.getWriter();
writer.write(content);
}catch (Exception e){
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
最后结果如下:
我们发现中文乱码,其实也很正常,我们没做关于字符集编码的设置,所以乱码了,关于乱码,可以看看这篇文章。
至此,第一种方法工作正常~
在这种方法里,我们将先创建一个Maven项目,然后添加Web模块;
使用IDEA创建Maven项目;
注意,不要勾选create from archetype选择框哦;
然后,默认结构如下:
这里的结构,也就是我们在第一种方法里所模仿的结构;
添加Web模块;
创建Artifact
选择默认,点击ok
这里,需要注意的是,如果你展开WEB-INF,会发现没有lib,而且是Web exploded哦!当然,这是我后来才意识到的,所以截图中没有显示;然后点击Apply。(后面我们再修改~);
这是因为我们没有选择部署的Artifact(我们刚刚添加Web结构的时候,按照IDEA提示创建了一个Artifact),这里点击fix即可;然后,点击ok退出,把web.xml、pom.xml、Controller拷贝一下,这很重要哦,然后run,接着就会出错原因在第四步提到了
修改Artifact
进入Project Structure,然后选择Artifact,将创建的Artifact删除,然后点击加号,新建一个。
结果如下:
这次,我们创建的是一个war exploded:它包含lib!而原来的Web exploded,好像再也找不到了。
值得注意的是,如果在修改Artifact的时候,controller没有到位的话,创建的WEB-INF下还是没有lib。这样就可以理解为什么IDEA创建了一个不能run的Artifact:创建Artifact的时候,java下是没有代码的,大胆猜测,如果先把Controller等文件写到相应位置,说不定就ok了。但我没去尝试哦;
在这种方法里,我们你将通过Maven+Archetype的方法创建Maven Web项目
使用Intellij IDEA创建项目
值得注意的地方都标出来了;哈哈哈,其实最重要的是把create from archetype 选择框选上~
填充Controller、web.xml、pom.xml等信息
配置Tomcat
操作同第二种方法中的配置Tomcat,在deployment选项卡下,点击fix,此时会有两个选项,war和war exploded,我们选择war就好,值得注意的是,这两个Artifact是IDEA创建的
从以上各种方法来看,第三种方法最统一,因为IDEA创建的Artifact是ok的,而第一二种方法里都涉及到对Artifact的修改,其核心问题是对WEB-INF下lib文件的处理,我们知道Web项目里依赖的第三方库都会在lib中去寻找,没有lib,自然会报找不到类的错误。