MVC设计模式就是一种规范。
Web MVC中的M(模型)-V(视图)-C(控制器)概念和标准MVC概念⼀样,我们再看⼀下Web MVC标准架构,
在Web MVC模式下,模型⽆法主动推数据给视图,如果⽤户想要视图更新,需要再发送⼀次请求(即请求-响应模型)。
M(Model) 模型 : 应⽤程序的核⼼功能,管理这个模块中⽤的数据和值(bean,dao);
V(View )视图: 视图提供模型的展示,管理模型如何显示给⽤户,它是应⽤程序的外观;(jsp/html)
C(Controller)控制器: 对⽤户的输⼊做出反应,管理⽤户和视图的交互,是连接模型和视图的枢纽。(servlet/service)
案例:
通过MVC设计模式,把数据库的数据展示到网页上。
1:WEB-INF创建目录lib,将所需的依赖包导入
2 依次建立bean包,dao包,service包,servlet包,servlet包,(写代码顺序也一样)
3 建立util工具包,druid.properties文件
druid.properties文件
util工具包
package yhp.util;
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.ResourceBundle;
public class DBUtils {
//1.定义变量
private Connection connection;
private PreparedStatement pps;
private ResultSet resultSet;
private int count;//存储受影响的行数
private static String userName;
private static String userPass;
private static String url;
private static String driverName;
//德鲁伊
private static DruidDataSource dataSource = new DruidDataSource();
//2.加载驱动
static {
//德鲁伊
ResourceBundle bundle = ResourceBundle.getBundle("druid");
driverName = bundle.getString("driverClassName");
url = bundle.getString("url");
userName = bundle.getString("username");
userPass = bundle.getString("password");
dataSource.setUsername(userName);
dataSource.setPassword(userPass);
dataSource.setUrl(url);
dataSource.setDriverClassName(driverName);
}
//2.获得链接
protected Connection getConnection(){
try {
connection=dataSource.getConnection();
//connection = comboPooledDataSource.getConnection();
//connection = basicDataSource.getConnection();
//connection = DriverManager.getConnection(url, userName, userPass);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//得到预状态通道
protected PreparedStatement getPps(String sql){
try {
pps = getConnection().prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return pps;
}
//5.绑定参数 List保存的是给占位符所赋的值
protected void param(List list){
if(list!=null && list.size()>0){
for (int i=0;i<list.size();i++) {
try {
pps.setObject(i+1,list.get(i));
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
//6.执行操作(增删改+查询)
protected int update(String sql,List list){
getPps(sql);
param(list);
try {
count = pps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return count;
}
//7.查询
protected ResultSet quary(String sql,List list){
getPps(sql);
param(list);
try {
resultSet = pps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return resultSet;
}
//8.关闭资源
protected void closeAll(){
try {
if (connection != null) {
connection.close();
}
if (pps != null) {
pps.close();
}
if (resultSet != null) {
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
4 bean包创建Student实体类
类名=表名 列名=属性名
package yhp.bean;
//实体类包---主要存放和数据库对应的实体类
//类名=表名
//列名=属性名
//bean(实体类)需要包含:属性,构造(无参,全参构造),setter,getter
//属于Model(M)
public class Student {
private Integer stuid;
private String stuname;
private Integer age;
private Integer sex;
public Student() {
}
public Integer getStuid() {
return stuid;
}
public void setStuid(Integer stuid) {
this.stuid = stuid;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Student(Integer stuid, String stuname, Integer age, Integer sex) {
this.stuid = stuid;
this.stuname = stuname;
this.age = age;
this.sex = sex;
}
}
5 dao包中创建StudentDao接口()(实体类名+Dao=当前类名)
package yhp.dao;
//实体类名+Dao=当前类名
import yhp.bean.Student;
import java.util.List;
public interface StudentDao {
//定义操作数据库方法
public List<Student> getall() ;
}
6 dao包中建立impl包,实现接口类
package yhp.dao.impl;
import yhp.bean.Student;
import yhp.dao.StudentDao;
import yhp.util.DBUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
//接口名+Impl=当前类名
public class StudentDaoImpl extends DBUtils implements StudentDao {
@Override
public List<Student> getall() {
ArrayList list = new ArrayList();
try {
String sql = "select * from student";
ResultSet resultSet = quary(sql, null);//util包中的查询方法
while (resultSet.next()) {
Student student = new Student();
student.setStuid(resultSet.getInt("stuid"));
student.setStuname(resultSet.getString("stuname"));
student.setAge(resultSet.getInt("age"));
student.setSex(resultSet.getInt("sex"));
list.add(student);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeAll();//util包中的关闭方法
}
return list;
}
}
7 service包中创捷StudentService接口(service层主要定义业务逻辑,现阶段主要实现调取dao层)
package yhp.service;
import yhp.bean.Student;
import java.util.List;
//bean类名+service=当前类名
//service层主要定义业务逻辑,现阶段主要实现调取dao层
public interface StudentService {
//查询全部
public List<Student> getall();
}
8 service包中创建impl包实现接口
package yhp.service.impl;
import yhp.bean.Student;
import yhp.dao.StudentDao;
import yhp.dao.impl.StudentDaoImpl;
import yhp.service.StudentService;
import java.util.List;
public class StudentServiceImpl implements StudentService {
private StudentDao studentDao = new StudentDaoImpl();
@Override
public List<Student> getall() {
return studentDao.getall();
}
}
9 View层
(1).index.jsp初始页面
<%--
Created by IntelliJ IDEA.
User: 86182
Date: 2021/9/30
Time: 9:32
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="getstus">查询学生列表</a>
</body>
</html>
(2)show.jsp(跳转后查询到的数据展示页面)
<%--
Created by IntelliJ IDEA.
User: 86182
Date: 2021/9/30
Time: 11:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>show.jsp</h1>
<table border="1" width="500px" bgcolor="aqua">
<tr>
<td>id</td>
<td>name</td>
<td>age</td>
<td>sex</td>
</tr>
<c:forEach items="${stulist}" var="stu">
<tr>
<td>${stu.stuid}</td>
<td>${stu.stuname}</td>
<td>${stu.age}</td>
<td>${stu.sex==1?"男":"女"}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
10 Control层 servlet包中创建Student类(控制层,实现页面跳转,将从数据库查询到的数据存入request中)
package yhp.servlet;
import yhp.bean.Student;
import yhp.service.StudentService;
import yhp.service.impl.StudentServiceImpl;
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.List;
//C -control 控制层
@WebServlet(urlPatterns = "/getstus")
public class StudentServlet extends HttpServlet {
@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 {
//1.接受请求参数
//2.调取servlet层参数
StudentServiceImpl studentService = new StudentServiceImpl();
List<Student> getall = studentService.getall();
//3.跳转页面
//后台传递数据给前台
req.setAttribute("stulist",getall);//request存值
req.getRequestDispatcher("/show.jsp").forward(req,resp);//跳转页面
}
}
11 结果
最后:
感谢各位大佬对我的帮助和支持