mvc设计模式与三层架构

article/2025/8/23 16:21:49

mvc与三层架构 

1.什么是mvc设计模式

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

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

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

C(Controller) 控制器 : 对用户的输入做出的反应,管理用户和视图的交互,也是连接模型和视图的枢纽( servlet/service)
MVC用 于将 web UI )层进行职责解耦
说明 :mvc 设计模式 ( 不属于 23 种设计模式 )

2.三层架构 

 3.三层架构和MVC的区别与联系

准备工作

1.包结构

2.导入jar包

配置Tomcat 

 简化地址栏信息

工具类util:DruidUtil

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

属性配置文件 druid.properties

url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
username=root
password=123456
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10
minIdle=5
maxWait=3000

 一个请求的流程

一:MVC之Model开发

 beam包:实体类Student

package bean;
//实体类包=主要存放数据库对应的实体类
//类名=表名
//列名=属性名
//实体类包括:属性,构造方法(无参,全参),setter/getter
//属于Model(M)
public class Student {private Integer stuid;private String stuname;private Integer age;private String sex;//无参构造方法public Student() {}//全参构造方法public Student(Integer stuid, String stuname, Integer age, String sex) {this.stuid = stuid;this.stuname = stuname;this.age = age;this.sex = sex;}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 String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "Student{" +"stuid=" + stuid +", stuname='" + stuname + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}
}

dao包:StudentDao接口

package dao;import bean.Student;import java.util.List;//实体类名+Dao=当前类名
public interface StudentDao {//定义操作数据库的方法//查询全部方法public List<Student> getAll();
}

dao包:impl子包: StudentDaoImpl接口实现类

package dao.impl;import bean.Student;
import dao.StudentDao;
import 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;
//接口名+impl=当前类名
public class StudentDaoImpl extends DruidUtil implements StudentDao {@Overridepublic List<Student> getAll() {Connection connection =null;PreparedStatement preparedStatement =null;ResultSet resultSet=null;List list=new ArrayList();try {connection = getConnection();preparedStatement = connection.prepareStatement("select * from  student");resultSet=preparedStatement.executeQuery();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.getString("sex"));list.add(student);}} catch (SQLException e) {e.printStackTrace();}finally {close(connection,preparedStatement,resultSet);}return list;}
}

二:MVC之Controlle开发

service包 :StudentService接口

package service;import bean.Student;import java.util.List;//bean类名+Service=当前类名
//Service层主要定义业务逻辑,现阶段主要实现调取dao层
public interface StudentService {//查询全部方法public List<Student> getAll();
}

service包 :impl子包:StudentServiceImpl接口实现类

package service.impl;import bean.Student;
import dao.StudentDao;
import dao.impl.StudentDaoImpl;
import service.StudentService;import java.util.List;public class StudentServiceImpl implements StudentService {private StudentDao studentDao=new StudentDaoImpl();@Overridepublic List<Student> getAll() {return studentDao.getAll();}
}

servlet包 :StudentServlet处理类处理请求

package servlet;import bean.Student;
import 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 {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//接参数(接收请求参数)//写逻辑(调取service层方法)StudentServiceImpl studentService=new StudentServiceImpl();List<Student> getAll=studentService.getAll();//返结果(跳转页面)//后台传递数据给前台req.setAttribute("stulist",getAll);req.getRequestDispatcher("/show.jsp").forward(req,resp);}
}

 三:MVC之View开发

index.jsp页面  

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

 show.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>
<h1>show.jsp</h1>
<table border="" 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>

测试结果 

 

前后端分离技术(了解)

 

 


http://chatgpt.dhexx.cn/article/3Fx4UE7O.shtml

相关文章

随机游走模型

6.2.1 随机游走模型&#xff08;Random Surfer Model&#xff09; 《这就是搜索引擎&#xff1a;核心技术详解》第6章链接分析&#xff0c;本章主要介绍一些著名的链接分析方法。本节为大家介绍随机游走模型&#xff08;Random Surfer Model&#xff09;。 6.2 两个概念模型及算…

图嵌入表示学习—Node Embeddings随机游走

Random Walk Approaches for Node Embeddings 一、随机游走基本概念 想象一个醉汉在图中随机的行走&#xff0c;其中走过的节点路径就是一个随机游走序列。 随机行走可以采取不同的策略&#xff0c;如行走的方向、每次行走的长度等。 二、图机器学习与NLP的关系 从图与NLP的…

图机器学习——2.1 节点嵌入:基于随机游走

嵌入&#xff08;embedding&#xff09;方法是目前文本分析&#xff0c;知识图谱相关中非常常见的一种算法。其为表示学习的一类方法&#xff0c;可以自动地从数据中学习“有用”的特征&#xff0c;并可以直接用于后续的具体任务。后面学习的相关嵌入学习均为表示学习中的内容。…

Python模拟随机游走

随机游走模型由首先由爱因斯坦在1926年以数学方式描述。由于自然界中的许多实体会以不可预知的方式移动&#xff0c;因此随机游走模型用来描述这种不稳定的移动。在这种移动模型中&#xff0c;移动节点随机选择一个方向和速度来从当前位置移动到新的位置。下面展示一维和多维情…

Python基于随机游走模型的PageRank算法及应用

资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/86812933 资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/86812933 基于随机游走模型的 PageRank 算法及应用 一、课题背景介绍 1.1 随机游走模型 随机游走也称随机漫步&…

图——随机游走算法

文章目录 推荐基本概念PageRankPersonalRankTextRankSimRank 推荐基本概念 其中用户user[A,B,C],物品item[a,b,c,d]&#xff0c;用户和物品有以下的关系 上述便是一个典型的二分图&#xff0c;我们用G(V,E)来表示&#xff0c;其中V为用户user和物品item组成的顶点集即[A,B,C,…

python二维随机游走_Python模拟随机游走图形效果示例

本文实例讲述了Python模拟随机游走图形效果。分享给大家供大家参考,具体如下: 在python中,可以利用数组操作来模拟随机游走。 下面是一个单一的200步随机游走的例子,从0开始,步长为1和-1,且以相等的概率出现。纯Python方式实现,使用了内建的 random 模块: # 随机游走 i…

随机游走 推荐系统论文阅读

emmmm本篇博客主要写了&#xff0c;自己阅读的一些论文&#xff0c;做了一些笔记&#xff0c;主要是记录。 基于深度随机游走的协同过滤推荐算法_刘靖凯 推荐算法&#xff1a;召回和排序 召回步骤常用的算法有协同过滤算法、隐语义算法 常用的协同过滤算法有基于用户的协同过…

理解随机游走

随机游走 基本思想 从一个或一系列顶点开始遍历一张图。在任意一个顶点&#xff0c;遍历者将以概率1-a游走到这个顶点的邻居顶点&#xff0c;以概率a随机跳跃到图中的任何一个顶点&#xff0c;称a为跳转发生概率&#xff0c;每次游走后得出一个概率分布&#xff0c;该概率分布…

随机游走问题

随机游走指的是在一个点以等可能的概率走向下一个点。 问题1&#xff1a; Link:https://www.luogu.com.cn/problem/P3232 题意&#xff1a;这道题其实相当于求每条边经过的期望次数。 思路&#xff1a;每条边经过的期望次数不好算&#xff0c;我们想到点经过的期望次数。于…

随机游走 Random Walk

随机游走&#xff08;英语&#xff1a;Random Walk&#xff0c;缩写为 RW&#xff09;&#xff0c;是一种数学统计模型&#xff0c;它是一连串的轨迹所组成&#xff0c;其中每一次都是随机的。[1][2]它能用来表示不规则的变动形式&#xff0c;如同一个人酒后乱步&#xff0c;所…

时间序列:时间序列模型---随机游走过程(The Random Walk Process)

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 随机游走过程是一种特殊的ARMA序列。从分子运动到股价波动等现象都被建模为随机游走。 随机游走过程是AR(1)序列&#xff0c;而且,时间序列在时刻的值为&#xff1a; 随机游走过程本质上是到当前时间…

随机游走(Random Walk)算法

随机游走 英文&#xff1a;random walk 定义&#xff1a;随机游走&#xff0c;概念接近于布朗运动&#xff0c;是布朗运动的理想数学状态。 核心概念&#xff1a;任何无规则行走者所带的守恒量都各自对应着一个扩散运输定律。 随机游走算法的基本思想是: 从一个或一系列顶点…

ArrayList分页Lists.partition遇到的坑

一、问题的发现 最近在用分布式任务powerjob的时候&#xff0c;发现了一个关于数组分页之后的序列化问题。事情是这样的&#xff0c;在我执行MapReduce模式的时候&#xff0c;发现了在生成子任务时报了com.esotericsoftware.kryo.kryo5.KryoException: Class cannot be created…

partition list java_Java之Lists.Partition项目中的使用

开心一笑 【媳妇儿问我:“孩子都快出生了,你名字想好了没呀?” 我说:“都想好了,要是生个儿子名字就叫“好帅” 媳妇儿问:“为什么呀?” 我说:“别人看到我就会说,好帅的爸爸。】 提出问题 Java之Lists.Partition在项目中的如何被使用??? 学习地址 解决问题 前言 具…

Lists.partition的使用和里面的坑

作用 partition(List list, int size): 将list集合按指定长度进行切分&#xff0c;返回新的List<List<??>>集合。 案例 引入pom文件 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><vers…

Lists.partition集合分组使用以及注意事项

1.介绍 Lists.partition是com.google.common.collect包下的一个方法。 作用是将目标集合按照传入的size分组。 2.使用场景 一般用于固定大小的集合处理&#xff0c;比如&#xff1a;我有两百个商品类型&#xff0c;要求前一百个一种处理方式&#xff0c;后一百个一种处理方…

Guava Lists.transform踩坑小记

1.问题提出 1.前段时间在项目中用到Lists.transform返回的List&#xff0c;在对该list修改后发现修改并没有反映在结果里&#xff0c;研究源码后发现问题还挺大。 下面通过单步调试的结果来查看Guava Lists.transform使用过程中需要注意的地方。 a.对原有的list列表修改会影响L…

Google guava工具类中Lists、Maps、Sets简单使用

Google guava Guava是对Java API的补充&#xff0c;对Java开发中常用功能进行更优雅的实现&#xff0c;使得编码更加轻松&#xff0c;代码容易理解。Guava使用了多种设计模式&#xff0c;同时经过了很多测试&#xff0c;得到了越来越多开发团队的青睐。Java最新版本的API采纳了…

Java常用工具类 : StringUtils、CollectionUtils、ArrayUtils、Lists、Maps等

文章目录 StringUtils引入依赖判断函数 (isNotBlank系列)大小写函数 (转换)删除函数 (remove)字符替换函数 (replace)拆分合并函数 (split)截取函数 (substring)删除空白函数 (trim)判断是否相等函数 (equals)是否包含函数 (contains) CollectionUtils集合判断函数并集、交集、…