JavaWeb中的MVC模式(有案例)

背景介绍

写Java Web项⽬时会发现,⼀个中型或者⼤型项⽬ 随着代码的增多,会发现:代码既可以写在src⽬录
下,也可以写在WebContent⽬录下。src下可以建很多包 ,WebContent下可以建很多⽂件夹。
所以问题就来了:⼀个新的类 到底往哪个⽬录下的哪个⽂件夹⾥写?
此时解决办法就是:需要⼀个模式去规范,到底哪个类该往哪⾥写。

MVC设计模式

MVC设计模式就是一种规范。
Web MVC中的M(模型)-V(视图)-C(控制器)概念和标准MVC概念⼀样,我们再看⼀下Web MVC标准架构,
如下图所示:

JavaWeb中的MVC模式(有案例)_第1张图片
在Web MVC模式下,模型⽆法主动推数据给视图,如果⽤户想要视图更新,需要再发送⼀次请求(即请求-响应模型)。

M(Model) 模型 : 应⽤程序的核⼼功能,管理这个模块中⽤的数据和值(bean,dao);

V(View )视图: 视图提供模型的展示,管理模型如何显示给⽤户,它是应⽤程序的外观;(jsp/html

C(Controller)控制器: 对⽤户的输⼊做出反应,管理⽤户和视图的交互,是连接模型和视图的枢纽。(servlet/service

案例

下面就用代码简单实现一个MVC设计模式:
JavaWeb中的MVC模式(有案例)_第2张图片
通过MVC设计模式,把数据库的数据展示到网页上。

1. 新建包名

依次创建bean包、dao包、service包、servlet包、util包。
JavaWeb中的MVC模式(有案例)_第3张图片

2. bean包

bean包

package com.mvc.bean;

/**
 * 实体类包 -- 主要存放和数据库对应的实体类
 * 类名 = 表名
 * 列名 = 属性名
 * 实体类需要包含:属性,构造(无参,全参构造),setter/getter
 * 此模块属于Model(M)
 */
public class Student {
    private Integer id;
    private String name;
    private String gender;
    private Integer age;

    public Student() {
    }

    public Student(Integer id, String name, String gender, Integer age) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

3. dao包

JavaWeb中的MVC模式(有案例)_第4张图片

3.1 创建一个接口

package com.mvc.dao;

import com.mvc.bean.Student;

import java.util.List;

/**
 * 实体类名+Dao == 当前类名
 */
public interface StudentDao {

    //定义操作数据库的方法
    public List<Student> getAll();
}

3.2 实现接口类

在dao包下创建impl包

package com.mvc.dao.impl;

import com.mvc.bean.Student;
import com.mvc.dao.StudentDao;
import com.mvc.util.DruidUtil;

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() {
        List list = new ArrayList();
        try {
            String sql = "select * from student";
            ResultSet resultSet = query(sql, null);
            while(resultSet.next()){
                Student student = new Student();
                student.setId(resultSet.getInt("id"));
                student.setName(resultSet.getString("name"));
                student.setGender(resultSet.getString("gender"));
                student.setAge(resultSet.getInt("age"));
                list.add(student);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }

        return list;
    }
}

ps:需要根据具体情况修改sql语句

4. service包

在这里插入图片描述

4.1 创建接口

package com.mvc.service;

import com.mvc.bean.Student;

import java.util.List;

/**
 * bean名+Service == 当前类名
 * service层主要定义业务逻辑层,现阶段主要是调取Dao层
 */
public interface StudentService {
    //查询全部
    public List<Student> getAll();
}

4.2 实现接口类

在service包下创建impl包

package com.mvc.service.impl;

import com.mvc.bean.Student;
import com.mvc.dao.impl.StudentDaoImpl;
import com.mvc.service.StudentService;

import java.util.List;

/**
 * 调取Dao层的方法
 * 属于C(Controller)控制层
 */
public class StudentServiceImpl implements StudentService {

    private StudentDaoImpl studentDao = new StudentDaoImpl();

    @Override
    public List<Student> getAll() {
        return studentDao.getAll();
    }
}

5. servlet包

在这里插入图片描述

创建类,继承HttpServlet,重写其中的doGet()doPost()
(ps:重写在IDEA按下CTRL+o键)

package com.mvc.servlet;

import com.mvc.bean.Student;
import com.mvc.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) -- controller
 */
@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.    调取service
        StudentServiceImpl service = new StudentServiceImpl();
        List<Student> list = service.getAll();
        //3.    跳转页面
        //后台传递数据给前台
        req.setAttribute("stulist",list);
        req.getRequestDispatcher("/show.jsp").forward(req,resp);
    }
}

6. util包

在这里插入图片描述
util包是工具类包,适用于存放一些通用的类
这里使用的接口是德鲁伊连接数据库

package com.mvc.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 DruidUtil {

    //1.定义需要的工具类对象
    protected Connection connection = null;
    protected PreparedStatement pps = null;
    protected ResultSet rs = null;
    protected int k = 0; //受影响的行数
    private static String url;
    private static String userName;
    private static String password;
    private static String dirverName;
    //德鲁伊
    private static DruidDataSource dds = new DruidDataSource();
    //2.加载驱动
    static {
        //德鲁伊
        ResourceBundle bundle = ResourceBundle.getBundle("db");
        dirverName = bundle.getString("driver");
        url = bundle.getString("url");
        userName = bundle.getString("user");
        password = bundle.getString("password");
        dds.setUsername(userName);
        dds.setPassword(password);
        dds.setUrl(url);
        dds.setDriverClassName(dirverName);
    }

    //3.获得连接
    protected Connection getConnection() {
        try {
            //德鲁伊
            connection = dds.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return connection;
    }

    //4.创建通道
    protected PreparedStatement getPps(String sql) {
        try {
            getConnection();
            pps = connection.prepareStatement(sql);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return pps;
    }

    //5.给占位符赋值 list中保存的是占位符所赋的值
    private void setParams(List list) {
        try {
            if (list != null && list.size() > 0) {
                for (int i = 0; i < list.size(); i++) {
                    pps.setObject(i+1,list.get(i));
                }
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    //6.增删改调取的方法
    protected int update(String sql,List params) {
        try {
            getPps(sql);
            setParams(params);
            k = pps.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return k;
    }

    //7.查询的时候调取一个方法
    protected ResultSet query(String sql,List list) {
        try {
            getPps(sql);
            setParams(list);
            rs = pps.executeQuery();
            return  rs;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    //8.关闭资源
    protected void closeAll(){
        try {
            if (rs != null) {
                rs.close();
            }
            if (pps != null) {
                pps.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}


在这里还需要添加一个db.properties文件,这个文件是直接在src文件夹下创建
在这里插入图片描述
内容:

其中需要修改的地方是:

  1. url中的mydb2是数据库名称
  2. user中的root是数据库用户名
  3. password中的123456是数据库的密码
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb2?serverTimezone=UTC
user=root
password=123456

ps:根据自己的数据库修改值

7.添加lib包

注意添加的lib包是在web->WEB-INF->lib
JavaWeb中的MVC模式(有案例)_第5张图片
把需要的jar包拷贝到lib包下后,还需要引用它们
点击选中lib包,按右键选择Add as Library...
JavaWeb中的MVC模式(有案例)_第6张图片
JavaWeb中的MVC模式(有案例)_第7张图片

8. 编写视图层

在index.jsp下添加如下信息:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$title>
  head>
  <body>
  <a href="getstus">查询学生信息a>
  body>
html>

其中a标签的地址是关联到servlet包中的注解
JavaWeb中的MVC模式(有案例)_第8张图片
如果不使用注解的方式,也可以用另一种方法。
在web.xml配置文件添加地址路径:
例如:


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>mvcservlet-name>
        <servlet-class>
            com.mvc.servlet.StudentServlet
        servlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>mvcservlet-name>
        <url-pattern>/getstusurl-pattern>
    servlet-mapping>
web-app>

添加show.jsp文件:

<%--
  Created by IntelliJ IDEA.
  User: hyh
  Date: 2021/9/29
  Time: 12:59
  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>Titletitle>
    <script type="text/javascript" src="js/jquery-1.11.1.js">script>
    <script type="text/javascript" src="js/bootstrap.js">script>
    <link rel="stylesheet" type="text/css" href="css/bootstrap.css"/>
    <link rel="stylesheet" type="text/css" href="css/bootstrap-theme.css" />
    <link rel="stylesheet" type="text/css" href="css/mycss.css">
head>
<body>
    <table class="table table-bordered">
        <caption class="text-center">学生信息表caption>
        <tr class="active">
            <td>idtd>
            <td>nametd>
            <td>sextd>
            <td>agetd>
        tr>
        <c:forEach items="${stulist}" var="stu">
            <tr class="success">
                <td>${stu.id}td>
                <td>${stu.name}td>
                <td>${stu.gender=="male"?"男":"女"}td>
                <td>${stu.age}td>
            tr>
        c:forEach>
    table>
body>
html>

9.运行效果

点击运行后,启动Tomcat服务器
在这里插入图片描述
点击链接,就跳转到show.jsp编写的页面
JavaWeb中的MVC模式(有案例)_第9张图片

注意事项

  1. bean包中的实体类,属性名要和数据库的字段名一致
  2. dao包中的实现接口类,sql语句要根据需要去实现
  3. 添加jar接口类包要注意是否成功引用
  4. 编写MVC顺序:bean包->dao包->service包->servlet包->util包->jsp/html文件
  5. 运行顺序:index.jsp->servlet类->service类->dao类->bean类->dao类->service类->servlet类->show.jsp

你可能感兴趣的:(JavaWeb,mvc,数据库,java)