本篇博客是基于Javaweb利用MVC设计模式在前端页面上查询数据库信息
MVC设计模式
M:(Model) 模型 : 应用程序的核心功能,管理这个模块中用的数据和值(bean,dao);
JavaBeans :是Java中一种特殊的类(换言之:JavaBean就是一个Java类).
一个Java类 ,满足以下要求,则可称为一个JavaBean
a. public修饰的类,提供public 无参构造方法
b. 所有属性 都是private
C. 提供getter和setter方法
从使用层面来看,JavaBean分为2大类:
a. 封装业务逻辑的JavaBean(eg:LoginDao.java 封装了登录逻辑)
b. 封装数据的JavaBean(实体类:eg:Student.java Vadio.java 。往往对应于数据库中的一张表,即数据库
中有个Student表,项目中就有个Student.java类)通常:表名=类名,列名=属性名
JavaBean是一个可以重复使用的组件,通过编写一个组件来实现某种通用功能,“一次编写、任何地方执行、任何地方重
用”。
V(View )视图: 视图提供模型的展示,管理模型如何显示给用户,它是应用程序的外观;(jsp/html)
C(Controller)控制器: 对用户的输入做出反应,管理用户和视图的交互,是连接模型和视图的枢纽。
(servlet/service)
MVC用于将web(UI)层进行职责解耦
.三层架构
三层架构 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层
(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。
1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。 jsp/html
2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
servlet,service
3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。dao
表现层实现的代表作品是Struts,springmvc框架,
业务层实现的代表作品是Spring,
持久层实现的代表作品是Hibernate,mybatis。
层就相当于一个黑盒子,我们不用知道它内部怎么实现,只需要知道如何去调用它就行了。每层只与上下相邻的两
层打交道。当一层内部由于技术变迁发生变化时,只要接口不变,其他层不用做任何改变。分层之后灵活性提高,
也便于团队分工开发。
3.三层架构和MVC的区别与联系
MVC把三层架构中的UI层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话。
MVC可以是三层中的一个表现层框架,属于表现层。三层和mvc可以共存。
三层是基于业务逻辑来分的,而MVC是基于页面来分的。
MVC主要用于表现层,3层主要用于体系架构,3层一般是表现层、中间层、数据层,其中表现层又可以分成M、
V、C,(Model View Controller)模型-视图-控制器
MVC是表现模式(Presentation Pattern)
三层架构是典型的架构模式(Architecture Pattern)
三层架构的分层模式是典型的上下关系,上层依赖于下层。但MVC作为表现模式是不存在上下关系的,而是相互协
作关系。即使将MVC当作架构模式,也不是分层模式。MVC和三层架构基本没有可比性,是应用于不同领域的技
术。
基本了解MVC与三层架构后做如下案例,项目中用到的包在博客里可自行下载
1 ,建立好基本的项目文件
如图几个文件夹是项目必备的文件夹
bean文件夹存放实体类,
这里在创建类名和属性名需要和数据库中信息对应
student类创建如下
package com.yhp.bean;
//类名=表名 列名=属性名
public class Student {
private int studentId;
private String studentNo;
private String stuName;
private int stuAge;
public Student(int studentId, String studentNo, String stuName, int stuAge) {
this.studentId = studentId;
this.studentNo = studentNo;
this.stuName = stuName;
this.stuAge = stuAge;
}
public Student() {
}
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getStudentNo() {
return studentNo;
}
public void setStudentNo(String studentNo) {
this.studentNo = studentNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
}
接下来写DAO包,DAO中存储的是数据库之间的联系
定义接口
package com.yhp.dao;
import com.yhp.bean.Student;
import java.sql.SQLException;
import java.util.List;
//定义操作数据库的方法
public interface StudentDAO {
public List<Student> getall() throws SQLException;
}
然后再impl中写一个类来实现接口,这里分开的原因是为了多个项目公用接口,在此处只有一个实现类,所以不怎么能体现接口的作用,但是在项目大的时候接口的作用就显现出来了
package com.yhp.dao.impl;
import com.yhp.bean.Student;
import com.yhp.dao.StudentDAO;
import com.yhp.util.DruidUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class studentDAOimpl extends DruidUtil implements StudentDAO {
@Override
public List<Student> getall() throws SQLException {
Connection conn=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
List list=new ArrayList();
try {
conn= getConnection();
String sql="select * from stud";
preparedStatement=conn.prepareStatement(sql);
resultSet=preparedStatement.executeQuery();
while (resultSet.next()){
Student stu=new Student();
stu.setStudentId(resultSet.getInt("studentid"));
stu.setStuAge(resultSet.getInt("stuage"));
stu.setStudentNo(resultSet.getString("studentno"));
stu.setStuName(resultSet.getString("stuname"));
list.add(stu);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
close(conn,preparedStatement,resultSet);
}
return list;
}
}
接着写service包,service灵活的将前端和后端连接起来做到前后端分离
service接口和DAO中的接口是一样的
然后是service的实现类
package com.yhp.service.impl;
import com.yhp.bean.Student;
import com.yhp.dao.StudentDAO;
import com.yhp.dao.impl.studentDAOimpl;
import com.yhp.service.StudentService;
import java.sql.SQLException;
import java.util.List;
public class StudentImp implements StudentService {
private StudentDAO dao=new studentDAOimpl();
@Override
public List<Student> getall() throws SQLException {
return dao.getall();
}
}
再接着是util包,里边放一些工具类,此项目中放的是连接数据库的DruidUtil类
package com.yhp.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import javax.xml.transform.Result;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DruidUtil {
private static DataSource ds;
static{
try {
Properties ppt = new Properties();
ppt.load(DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
ds = DruidDataSourceFactory.createDataSource(ppt);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 从连接池中取出一个连接给用户
* @return
*/
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
public static void close(Connection conn, Statement state, ResultSet rs){
try {
rs.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
try {
state.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
try {
conn.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
}
}
web包里放入的是StudentServlet,保存从数据库里接收来的信息然后传入作用域中返回给前端
package com.yhp.web;
import com.yhp.bean.Student;
import com.yhp.service.StudentService;
import com.yhp.service.impl.StudentImp;
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(value = "/getallstudent")
public class StudentServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException{
//1 接收参数
//无参数输入
//2调取service方法
StudentService studentService = new StudentImp();
List<Student> students= null;
try {
students = studentService.getall();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//3跳转页面
//用转发的方式
req.setAttribute("students",students);
req.getRequestDispatcher("show.jsp").forward(req, resp);
}
}
接着导入数据库配置文件
url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf-8
username=root
password=root
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10
minIdle=5
maxWait=3000
后端写好,写前端
默认访问的index.jsp页面
<%--
Created by IntelliJ IDEA.
User: ly
Date: 2021/1/22
Time: 22:01
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>
<h1>欢迎访问 查询学生信息 <a href="/getallstudent">students</a> </h1>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: ly
Date: 2021/1/23
Time: 11:02
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>点击查看学生信息</h1>
<table border="1" cellspacing="0" width="600">
<tr>
<td>学号</td>
<td>姓名</td>
<td>年龄</td>
</tr>
<c:forEach items="${students}" var="stu" >
<tr>
<td>${stu.studentNo}</td>
<td>${stu.stuName}</td>
<td>${stu.stuAge}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
需要导入包的地方,在使用DAO包的时候需要导入
导入方法
把那三个包导入即可,然后是后边使用集合存取的时候需要用到jstl的两个包
在web下建立一个lib文件夹把两个包导入,导入以后再用上边的那个方法到你项目目录下找到lib文件夹添加进去
导入方法
这样一个前后端的交互就好了
效果如图
本项目涉及的包在我上传的资源里可自行下载 名称为MVC项目工具类