本篇博客是基于Javaweb利用MVC设计模式在前端页面上查询数据库信息

MVC设计模式

Java bean技术 javabean技术完成学生查询代码_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的区别与联系

Java bean技术 javabean技术完成学生查询代码_sql_02


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 ,建立好基本的项目文件

Java bean技术 javabean技术完成学生查询代码_Java bean技术_03


如图几个文件夹是项目必备的文件夹

bean文件夹存放实体类,

Java bean技术 javabean技术完成学生查询代码_sql_04

这里在创建类名和属性名需要和数据库中信息对应

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;
}

Java bean技术 javabean技术完成学生查询代码_java_05


然后再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灵活的将前端和后端连接起来做到前后端分离

Java bean技术 javabean技术完成学生查询代码_MVC_06


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,保存从数据库里接收来的信息然后传入作用域中返回给前端

Java bean技术 javabean技术完成学生查询代码_sql_07

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);
    }
}

接着导入数据库配置文件

Java bean技术 javabean技术完成学生查询代码_java_08

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>

Java bean技术 javabean技术完成学生查询代码_sql_09


需要导入包的地方,在使用DAO包的时候需要导入

Java bean技术 javabean技术完成学生查询代码_MVC_10


导入方法

Java bean技术 javabean技术完成学生查询代码_Java bean技术_11


Java bean技术 javabean技术完成学生查询代码_java_12


把那三个包导入即可,然后是后边使用集合存取的时候需要用到jstl的两个包

在web下建立一个lib文件夹把两个包导入,导入以后再用上边的那个方法到你项目目录下找到lib文件夹添加进去

Java bean技术 javabean技术完成学生查询代码_java_13


Java bean技术 javabean技术完成学生查询代码_java_14


导入方法

Java bean技术 javabean技术完成学生查询代码_MVC_15


这样一个前后端的交互就好了

效果如图

Java bean技术 javabean技术完成学生查询代码_java_16


Java bean技术 javabean技术完成学生查询代码_MVC_17


本项目涉及的包在我上传的资源里可自行下载 名称为MVC项目工具类