一、逻辑介绍
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)
用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
控制器是核心
M(Model) 模型 JavaBean
V(View) 视图 html jsp Thymeleaf volicity freemaker
C(Control) 控制器 Servlet,Controller,Action
当控制器接受到用户的需求时,接受用户传输过来的数据,将处理此需求所需要的参数传递给service层处理,service层将处理好的数据传递给dao层,进行数据库的修改,最终由dao层返回出来的值传递给service层,处理好之后再传给controller层,最终由controller层传递给用户,从而实现此功能
- Controller:负责控制,拿到View传递过来的数据,封装之后交给Service处理,Service处理完了之后,Controller拿到结果之后,将结果交给界面。
- Service:业务逻辑(分页,为了完成分页就要调用两次DAO层)
- DAO:纯粹的JDBC的增删改查操作
二、实例讲解
分页功能的实现
首先封装一个PageInfo类,来存储分页所需数据
@Data
public class PageInfo<T> {
private List<T> list;
private Integer total;
private Integer pageNo;
private Integer pageSize;
public PageInfo() {
}
public PageInfo(List<T> list, Integer total, Integer pageNo, Integer pageSize) {
this.list = list;
this.total = total;
this.pageNo = pageNo;
this.pageSize = pageSize;
}
}
Controller层
UserController
@WebServlet("/user")
public class UserController extends HttpServlet {
private IUserService userService = new UserServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 处理post请求乱码问题
// req.setCharacterEncoding("UTF-8");
String method = req.getParameter("method");
switch (method) {
case "selectByPage":
selectByPage(req, resp);
break;
}
}
private void selectByPage(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//第几页
String pageNo = req.getParameter("pageNo");
//一页有多少数据
String pageSize = req.getParameter("pageSize");
//处理空值问题
if (pageNo == null || pageNo.equals("")) {
pageNo = "1";
}
if (pageSize == null || pageSize.equals("")) {
pageSize = "5";
}
//传递给service层处理并接受PageInfo类型的返回值
PageInfo pageInfo = userService.selectByPage(Integer.parseInt(pageNo), Integer.parseInt(pageSize));
//将接受的返回值返回给用户端
req.setAttribute("pageInfo", pageInfo);
req.getRequestDispatcher("user_list.jsp").forward(req, resp);
}
}
Service层
IUserService
public interface IUserService {
PageInfo selectByPage(Integer pageNo, Integer pageSize);
}
UserServiceImpl
public class UserServiceImpl implements IUserService {
//引入DAO层
private IUserDao userDao = new UserDaoImpl();
@Override
public PageInfo selectByPage(Integer pageNo, Integer pageSize) {
//Service业务层为了完成PageInfo的封装,需要调用两次dao操作
//1.查找当前页数据
int offset = (pageNo - 1) * pageSize;
List<User> list = userDao.selectByPage(offset, pageSize);
//2.总的页数 查总的数量 Math.ceil(总数量/pageSize)
int totalCount = userDao.selectTotalCount();
int totalPage = (int) Math.ceil((double)totalCount / pageSize);
PageInfo<User> pageInfo = new PageInfo<>(list, totalPage, pageNo, pageSize);
return pageInfo;
}
}
DAO层
IUserDao
public interface IUserDao {
//查找当前页的数据
List<User> selectByPage(int offset, Integer pageSize);
//查找一共有多少条数据
int selectTotalCount();
}
UserDaoImpl
public class UserDaoImpl implements IUserDao {
@Override
public List<User> selectByPage(int offset, Integer pageSize) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
List<User> list = new ArrayList<>();
try {
connection = JDBCUtil.getConnection();
String sql = "select id, name, password from user limit ?, ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, offset);
preparedStatement.setInt(2, pageSize);
resultSet = preparedStatement.executeQuery();
System.out.println("selectByPage:" + resultSet);
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String password = resultSet.getString("password");
User user = new User(id, name, password);
list.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
@Override
public int selectTotalCount() {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
int count = 0;
try {
connection = JDBCUtil.getConnection();
String sql = "select count(*) from user";
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
//判断是否执行成功
System.out.println("统计所有(user):" + resultSet);
while (resultSet.next()) {
count = resultSet.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(connection, preparedStatement, resultSet);
}
return count;
}
}