maven14_idea开发maven项目4
1. idea的maven配置
idea中操作:File->Settings中配置maven
2. 使用骨架创建maven的java工程
打开idea,选择创建一个新工程
选择 idea 提供好的 maven 的骨架,也叫工程模板
maven-archetype-quickstart:java工程模块,来创建java工程
点击 Next 填写项目信息
点击 Next,此处不做改动。
点击Next,选择项目所在目录
点击 Finish 后开始创建工程,耐心等待,直到出现如下界面。
可以看到:自动生成了一个App类,执行其中的main方法,控制台输出:Hello World!
观察自动生成的目录,目录结构不完整,需要自己手动补齐。
手动添加src/main/resources目录,如下图右键 main 文件夹->New->Directory
创建一个新的新的目录命名为resources
点击 OK 后,resources并不会被自动识别为资源文件,需要在新的resources文件夹上右键->Make Directory as->Resources Root
测试需要资源文件也需要我们手动添加,右键test文件夹->New->Directory
3. 不使用骨架创建maven的java工程
打开idea,选择创建一个新工程
在maven工程中不选择骨架,其他步骤同上面使用骨架的步骤。
最后工程创建成功,观察使用骨架(左侧图片)跟不使用骨架(右侧图片)创建出来的目录结构不一样
注意:推荐不使用骨架来创建java工程。
4. 使用骨架创建maven的web工程
打开idea,选择创建一个新工程
选择 idea 提供好的 maven 的骨架,也叫工程模板
maven-archetype-webapp:web工程模板,来创建web工程
点击 Next 填写项目信息
点击 Next,此处不做改动。
点击 Next 选择项目所在目录
点击 Finish 后开始创建工程,耐心等待,直到出现如下界面。
手动添加 src/main/java 目录,如下图右键 main 文件夹->New->Directory
创建一个新的文件夹命名为 java
点击 OK 后,在新的文件夹 java 上右键->Make Directory as->Sources Root
5. servlet实例
1、指定web资源包
在web工程中的src/main/webapp目录下创建jsp文件,默认不支持,需要操作如下
Modules->选中maven_web->点击“+”->Web
操作完后发现webapp的图标变化了。
这时,webapp下就能创建jsp文件了。
2、新建servlet
src/main/java目录下新建包:com.itheima.servlet;
在servlet包下New->Servlet:MyServlet,创建完后会自动打开webapp->WEB-INF下的web.xml,同时MyServlet报错
MyServlet报错是因为缺少servlet相关的依赖包,那么可以使用pom.xml引入,同时也引入jsp依赖包
这种情况是本地仓库有对应的jar包,如果本地仓库没有这些jar包那就只能从网络上搜索下载jar包(百度搜索maven,进入maven仓库地址搜索servlet,选择版本复制坐标到pom.xml中,联网状态下会自动下载jar包到本地仓库)
实现MyServlet代码
package com.itheima.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class MyServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/hello.jsp").forward(request,response); } }
执行:
执行成功:
访问http://localhost:8080/maven_web/MyServlet报错,同时idea控制台也会报错
MyServlet不能被识别为Servlet。
3、解决各种执行异常
a. MyServlet不能被识别为Servlet
maven有一键构建的功能,一键构建表示不再使用本地安装的tomcat而是使用maven自身集成的tomcat插件对项目进行构建。
maven自身具有tomcat插件,可能不知道maven集成的tomcat插件在哪儿。但是它既然是tomcat插件,那么tomcat所依赖的包也就是maven tomcat插件中应该有的包。
我们直接找到本地tomcat就是本地安装的tomcat目录,进入lib目录
lib目录中圈起来的两个jar包就是pom.xml引入的jar包。
运行项目前出现两套一模一样的包,会导致自己导入的jar包和tomcat中的包相冲突。问题找到了,怎么解决?
解决办法:自己导入的jar包只想让它在编译的时候起作用,可以对导入的jar包设置作用域。修改pom.xml文件
idea操作停止运行,然后重新执行tomcat:run命令,执行成功后刷新访问http://localhost:8080/maven_web/MyServlet:
因为没有创建hello.jsp,所以hello.jsp找不到。
b. 找不到hello.jsp异常
创建hello.jsp文件
刷新访问http://localhost:8080/maven_web/MyServlet:
从截图可以看到使用maven使用的是tomcat6来运行的这个项目,而我在一开始创建项目时使用的是jdk1.8版本,tomcat6是不支持这个版本的jdk的。所以我这里将tomcat设置为tomcat7.0的版本。
c. jdk和tomcat版本不匹配异常
第一种方法:jdk1.8换成jdk1.7
第二种方法:不用maven默认的Tomcat6,改为Tomcat7,方法是在pom.xml文件plugins标签中添加如下子标签
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin>
然后,运行命令由Tomcat:run改为Tomcat7:run
刷新访问http://localhost:8080/maven_web/MyServlet:
另外也要注意,不要执行重复执行tomcat:run命令,否则8080端口号冲突:
4、运行环境修改
a. 修改tomcat
方法一:修改pom.xml文件,plugins标签中手动添加如下子标签
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8888</port> </configuration> </plugin>
执行tomcat:run,则使用tomcat6启动成功;执行tomcat7:run,则使用tomcat7启动成功;启动了两个tomcat
访问http://localhost:8080/maven_web/MyServlet、http://localhost:8888/maven_web/MyServlet可以发现都访问成功
方法二:File->Settings->Live Templates添加模板
然后在pom.xml文件中只要在plugins标签中输入tomcat,出现tomcat7提示后选择tomcat7就会补全方法一中的信息。
b. 修改jdk
方法一:修改pom.xml文件,plugins标签中手动添加如下子标签
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <target>1.8</target> <source>1.8</source> <encoding>UTF-8</encoding> </configuration> </plugin>
target标签:表示所有java代码使用jdk1.8进行编译
source标签:表示所有class文件使用jdk1.8
方法二:同tomcat方法二
5、 maven的Java工程取mysql数据库数据
a. 插入数据库数据
CREATE DATABASE maven; -- 创建数据库 USE maven; -- 使用数据库 CREATE TABLE items( -- 创建表 id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), price FLOAT(10,0), pic VARCHAR(40), createtime DATETIME, detail VARCHAR(200) ); -- 插入数据 INSERT INTO items VALUES(NULL,'传智播客',1000,NULL,'2018-03-13 09:29:30','带我走上人生巅峰'); INSERT INTO items VALUES(NULL,'黑马310',NULL,NULL,'2018-03-28 10:05:52','插入测试'); INSERT INTO items VALUES(NULL,'黑马307',199,NULL,'2018-03-07 10:08:04','插入测试'); INSERT INTO items VALUES(NULL,'插入测试',NULL,NULL,NULL,NULL); INSERT INTO items VALUES(NULL,'插入测试',NULL,NULL,NULL,NULL);
b. 创建商品类
package com.itheima.domain; public class Items { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Items{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
c. 创建查询商品接口
package com.itheima.dao; import com.itheima.domain.Items; import java.sql.SQLException; import java.util.List; public interface ItemsDao { public List<Items> findAll() throws Exception; }
d. 创建实现类
package com.itheima.dao.impl; import com.itheima.dao.ItemsDao; import com.itheima.domain.Items; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; /** * 要想从数据库中取出数据 * 必须有四个属性:数据库驱动,连接数据库的地址,数据库用户名称,数据库密码 */ public class ItemsDaoImpl implements ItemsDao { public List<Items> findAll() throws Exception { ArrayList<Items> list = new ArrayList<Items>(); //先获取connection对象 Connection connection = null; //获取真正操作数据的对象 PreparedStatement pst = null; //执行数据库查询操作 ResultSet rs = null; try { //加载驱动类 Class.forName("com.mysql.jdbc.Driver"); connection= DriverManager.getConnection("jdbc:mysql:///maven","root","root"); pst = connection.prepareCall("select * from items"); rs = pst.executeQuery(); //把数据库结果集转成java的list集合 while (rs.next()){ Items items = new Items(); items.setId(rs.getInt("id")); items.setName(rs.getString("name")); list.add(items); } }catch (Exception e){ e.printStackTrace(); }finally { connection.close(); pst.close(); rs.close(); } return list; } }
e. 测试类
package com.itheima.test; import com.itheima.dao.ItemsDao; import com.itheima.dao.impl.ItemsDaoImpl; import com.itheima.domain.Items; import org.junit.Test; import java.util.List; public class ItemsTest { @Test public void findAll() throws Exception { ItemsDao itemsDao = new ItemsDaoImpl(); List<Items> list = itemsDao.findAll(); for(Items items: list){ System.out.println(items.getId()+":"+items.getName()); } } }
执行完成输出结果