5.3 搭建dao模块
dao子工程中一般写实体类和dao层:
1、在父工程下创建maven模块,不选择模板,创建时一定要选择父工程。
2、准备数据库
3、编写实体类
public class User { private int userid; private String username; private String userpwd; private String usersex; private String phonenumber; private String qqnumber; //构造方法,get\set方法略 }
4、在resources中编写连接数据库的配置文件db.properties
#本地数据库localhost可以省略 jdbc.url=jdbc:mysql:///test jdbc.user=root jdbc.password=123456
5、编写dao方法
package com.zj.dao; import com.zj.pojo.User; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Properties; public class UserDao { //查询全部用户 public List<User> getUsers() throws IOException, SQLException { User user = null; //使用工具类读取配置文件 Properties properties = new Properties(); InputStream resourceAsStream = UserDao.class.getClassLoader().getResourceAsStream("db.properties"); properties.load(resourceAsStream); String url = properties.getProperty("jdbc.url"); String username = properties.getProperty("jdbc.user"); String password = properties.getProperty("jdbc.password"); //查询数据库 Connection connection = DriverManager.getConnection(url, username, password); PreparedStatement ps = connection.prepareStatement("SELECT * FROM users"); ResultSet resultSet = ps.executeQuery(); //处理结果集 List<User> users = new ArrayList<>(); while (resultSet.next()) { int userid = resultSet.getInt("userid"); String username1 = resultSet.getString("username"); String userpwd = resultSet.getString("userpwd"); String usersex = resultSet.getString("usersex"); String phonenumber = resultSet.getString("phonenumber"); String qqnumber = resultSet.getString("qqnumber"); user = new User(userid, username1, userpwd, usersex,phonenumber,qqnumber); users.add(user); } //释放资源,注意关闭资源的顺序。 resultSet.close(); ps.close(); connection.close(); return users; } }
6、测试dao方法
package com.zj.dao; import com.zj.pojo.User; import org.junit.Test; import java.io.IOException; import java.sql.SQLException; import java.util.List; public class UserDaoTest { @Test public void testGetUsers() throws IOException, SQLException { UserDao userDao = new UserDao(); List<User> users = userDao.getUsers(); for (User user : users) { System.out.println(user); } } }
测试结果:
5.4 搭建service模块
service子工程中一般写service层的内容,也需要继承父工程,由于需要调用dao子工程的方法,所以需要导入dao子工程的依赖。
1、在父工程下创建maven模块,不选择模板,选择父工程。
2、在service模块的pom文件中引入dao子工程的依赖。
<dependencies> <!--service依赖dao--> <dependency> <groupId>com.zj</groupId> <artifactId>maven2_dao</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
3、编写Service方法
package com.zj.service; import com.zj.dao.UserDao; import com.zj.pojo.User; import java.io.IOException; import java.sql.SQLException; import java.util.List; public class UserService { private UserDao userDao = new UserDao(); //查询全部 public List<User> getUsers() throws IOException, SQLException { return userDao.getUsers(); } }
4、测试service方法
package com.zj.service; import com.zj.pojo.User; import org.junit.Test; import java.io.IOException; import java.sql.SQLException; import java.util.List; public class TestUserService { @Test public void TestGetUsers() throws IOException, SQLException { UserService userService = new UserService(); List<User> users = userService.getUsers(); for (User user : users) { System.out.println(user); } } }
5.5 搭建web模块
web子工程中一般要写控制器和前端页面的内容。它不是普通的java工程,而是一个web工程,需要继承父工程,导入service子工程的依赖。
1、在父工程下创建maven模块,选择web工程模板,选择父工程。
2、引入service模块
<dependencies> <dependency> <groupId>com.zj</groupId> <artifactId>maven2_service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
3、编写控制器
package com.zj.servlet; import com.zj.pojo.User; import com.zj.service.UserService; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.sql.SQLException; import java.util.List; @WebServlet("/get") public class GetAllUsersServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { UserService userService = new UserService(); try { List<User> users = userService.getUsers(); req.setAttribute("users", users); req.getRequestDispatcher("all.jsp").forward(req, resp); } catch (SQLException e) { e.printStackTrace(); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
4、编写前端页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <table border="1" align="center"> <tr> <th>ID</th> <th>姓名</th> <th>性别</th> <th>密码</th> <th>电话</th> <th>QQ</th> </tr> <c:forEach items="${list}" var="user"> <tr> <td>${user.userid}</td> <td>${user.username}</td> <td>${user.usersex}</td> <td>${user.userpwd}</td> <td>${user.phonenumber}</td> <td>${user.qqnumber}</td> </tr> </c:forEach> </table> </body> </html>
千万注意:使用EL表达式的时候一定加上isELIgnored 属性。要不不能使用。
5.6 运行项目
配置tomcat插件运行父工程,此时会自动聚合运行项目。
5.7 依赖传递失效及解决方案
之前的案例中,junit是在父工程当中引入的,如果在dao工程引入,service工程引入dao工程,即service --> dao --> junit
。按照依赖的传递性,service工程也可以使用junit。可实际情况却是无法使用。这就是依赖传递失效问题。
Maven在定义依赖传递时,一些依赖范围的依赖无法传递,表格如下:
在实际开发中,不需要记这张表格,遇到依赖没有传递过来时,我们直接在本工程再次添加一遍依赖即可。
<dependencies> <dependency> <groupId>com.itbaizhan</groupId> <artifactId>maven_demo2_dao</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>