目录
一,MVC 模式下实现 CRUD
1,任务概述
2,任务过程
3,编码过程
3.1 数据库设计
3.2 项目结构
3.3 编码思路
3.4 运行结果
3.5 注意
一,MVC 模式下实现 CRUD
1,任务概述
软件工程师小亮在编写企业门户网站时发现,由于项目体积越来越大,现 有代码错综复杂,不好梳理,虽然功能实现了,但是返回来看代码时乱七八糟, 现在迫切需要学习 MVC 和三层架构的思想来解决问题。
2,任务过程
1. 理解 mvc 概念
2. 创建包结构,并理解每一层的作用
3. 添加各层代码
4. 实现前后端的访问
3,编码过程
先简单回顾一下两个重要概念:MVC,三层架构,CRUD
MVC三层架构
- M(Model) 模型:应⽤程序的核⼼功能,管理这个模块中⽤的数据和值(bean,dao);
- V(View )视图:视图提供模型的展示,管理模型如何显示给⽤户,它是应⽤程序的外观;(jsp/html)
- C(Controller)控制器:对⽤户的输⼊做出反应,管理⽤户和视图的交互,是连接模型和视图的枢纽。(servlet/service)
CRUD
- 表现层(UI):通俗讲就是展现给⽤户的界⾯,即⽤户在使⽤⼀个系统的时候他的所⻅所得。jsp/html
- 业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。servlet,service
- 数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。dao
- 增加(Create)
- 读取查询(Retrieve)
- 更新(Update)
- 删除(Delete)
3.1 数据库设计
沿用之前的用户表
3.2 项目结构
3.3 编码思路
完整项目在这里https://gitee.com/goodbyefirefly/java-course/tree/master/Chapter7/MVCTaskCard
使用一个jsp页面,三个form表单各自占一行分别表示添加Create,更新Update,查询Retrieve。
一个table组件展示用户信息,每行最右侧含有删除链接(a标签),点击即可删除该条数据。
index.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="userServlet?method=create" method="post">
<div>
账户:<input type="text" name="username">
密码:<input type="text" name="password">
积分:<input type="text" name="score">
<input type="submit" value="添加">
</div>
</form>
<form action="userServlet?method=update" method="post">
<div>
账户:<input type="text" name="username">
新密码:<input type="text" name="password">
新积分:<input type="text" name="score">
<input type="submit" value="更新">
</div>
</form>
<form action="userServlet?method=retrieve" method="post">
<div>
账户:<input type="text" name="username">
<input type="submit" value="查询">
</div>
</form>
<table border="1px" width="300px" >
<tr>
<th>账户</th>
<th>密码</th>
<th>积分</th>
<th>操作</th>
</tr>
<c:forEach items="${list}" var="u">
<tr>
<td>${u.username}</td>
<td>${u.password}</td>
<td>${u.score}</td>
<td>
<a href="userServlet?method=delete&username=${u.username}">删除</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
使用一个servlet即可。用method参数区别不同的方法。servlet中识别出这些方法后,调用service中提供的服务。service中的服务是由dao中的一个个基本操作组成。
通过实时更新table中的列表,来展示操作是否成功。
UserServlet.jsp
package com.xrh.servlet;
import com.xrh.bean.User;
import com.xrh.service.UserService;
import com.xrh.service.impl.UserServiceImpl;
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.util.ArrayList;
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
private UserService userService = new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String method = req.getParameter("method");
ArrayList<User> list = new ArrayList<>();
if(method.equals("create")) {
String username = req.getParameter("username");
String password = req.getParameter("password");
String score = req.getParameter("score");
userService.create(username, password, score);
list = userService.getAll();
} else if (method.equals("retrieve")) {
String username = req.getParameter("username");
User user = userService.retrieve(username);
list.add(user);
} else if (method.equals("update")) {
String username = req.getParameter("username");
String password = req.getParameter("password");
String score = req.getParameter("score");
userService.update(username, password, score);
list = userService.getAll();
} else if (method.equals("delete")) {
String username = req.getParameter("username");
userService.delete(username);
list = userService.getAll();
} else if (method.equals("getAll")) {
list = userService.getAll();
}
req.setAttribute("list", list);
req.getRequestDispatcher("index.jsp").forward(req, resp);
}
}
3.4 运行结果
3.5 注意
form表单的action中,如果想要通过地址传递参数的方式,需要设置method为POST,否则action中添加的参数不会被拼接到最后的链接地址中的