SpringMVC Web应用结构

硬核!图文结合看懂SpringMVC 详细介绍了springmvc是什么,作用以及原理和工作流程,对于springmvc的连接和获取数据做了大量的示例附带图文解释,详细到位 阅读详情

应用层次结构

应用分层的目的是什么?复用,解耦,提高代码的可读性,减少代码的维护成本。这些目的都很重要,大家也都清楚。我想说的是一个大家忽略的同时也是最重要的目的,就是减少同事代码归置出错的概率。这怎么解释呢?一个项目不是一人吃饱全家不饿的情况,都是大家协作完成。由于大家技术能力不大相同,特别是当有很多刚毕业的同事时,良好的层次结构能提供一种约束力减少代码归置出错的概率,并且在Review代码的时候,更加简单轻松,通过率更高。因此,以下任何一个依据都可以做作为分成的必要条件:
1. 复用,解耦,提高代码的可读性,减少代码的维护成本
2. 提高代码归置的约束力,减少自己和同伴代码归置出错的概率

  • Controller(Action):
    1. 为公司App、公司Web、第三方提供的接口
  • Facade:
    1. 主要为Controller服务
    2. 总领本领域的所有Service
    3. 提供给其他模块的Service引用
  • Service:

    1. 提供给其他sevice类平行引用,禁止相互引用
    2. 主要处理业务逻辑
    3. 处理业务聚合后的cache
    4. 如果service代码量过多,请阅读下面“值得玩味的service”的内容

    其实这样也不能处理所有情况,更复杂的情况请看下面“值得玩味的Service”标题的内容。

  • InkService(Invoker Service):

    1. 屏蔽RPC接口的变化对项目的影响
    2. 封装invoker接口数据、缓存invoker接口数据
    3. 只处理invoker,invoker接口聚合,cache
    4. 能被多个模块的service引用
  • Manager:
    1. 只处理db,cache
    2. 只能被本模块的Service引用
  • Dao:
    1. 处理db
  • Invoker:
    1. interface
  • InvokerImpl:
    1. 简单的包装公司内部RPC接口
  • Remoter:
    1. interface
  • RmiImpl:
    1. 简单的包装公司内部RPC接口
  • Component
    1. 主要包括一个模块中Service群共同依赖的Service方法
    2. 只能本模块Service引用,辅助Service执行去职能
  • Helper:
    1. 只做共用数据打包和接口聚合逻辑,不做业务逻辑
    2. 只能本模块Service、Component引用

值得玩味的Service

如果Service的内容特别多,造成难维护的情况。有两种选择可以参考:

  1. 如果有必要,对目前的Service再进行domian划分,建立新的Service模块;
  2. 对目前的Service再进行更小的domian划分,分裂成多个Service。本领域的Service变多了也不好维护,并且相互依赖,怎么办?用Helper和
    Component辅助Service执行其职能,Helper和Component的具体内容请看层次结构介绍。

代码逻辑分解推荐

代码分为业务处理逻辑、业务异常处理逻辑、其他异常处理逻辑、数据打包逻辑、数据获取和存储逻辑等等

上面的划分只是个人观点。有种说法是所有代码逻辑都是业务处理逻辑,我觉得概念太过笼统。我细分了一下这些概念,其中“业务处理逻辑”的概念只是业务变更的那段逻辑,这样做的目的是剥离出真正的业务最关注的代码部分。例如,报备楼盘到带看楼盘的过程中,“业务处理逻辑”的概念只是报备状态0便变成带看状态1。

Spring注释规则


  1. Controller:@Controller用于标注控制层组件(如struts中的action)
  2. Service:@Service用于标注业务层组件
  3. Manager、InvokerImpl、RmiImpl:@Repository用于标注数据访问组件
  4. Dao:@MasterMapper、@SlaveMapper 自定义关于MyBits选择库的注释
  5. Other:@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这3个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用上述注解对分层中的类进行注释。

实施难点


  1. 抽象domain,划分Service边界
  2. 各层次只做职能当中的事情,禁止跨层调用。如果有,请拿上你的案例和我讨论!

最大难点:你想不想做,去不去做?

常见问题

问题一

Q:把代码写在哪里才正确? 
A:代码逻辑见上图

问题二

Q:如何抽象domian
A:详情请参考《大象-Think in UML》

问题三

Q:如何重构代码
A:详情请参考《重构-改善代码既有设计》

问题四

Q:如何避免大量service相互循环依赖?
A:目前service只允许循环平行引用,当出现相互循环依赖的问题时请考虑如下原因:
  原因一:service的domian划分出现了问题,请重新考虑边界问题;
  原因二:可以考虑抽象更加下层service领域,然后相互循环依赖的service再引用这个下层service;
  如果还有其他原因,请带上案例来和我讨论吧!

编写代码时的“警惕”


  1. domian
  2. 全能函数
  3. 超过64K的文件类
  4. 长函数体
  5. 长函数名
  6. 不明其意的命名
  7. 命名困难
  8. switch-case/if-else等多个Type的问题
  9. 接口VS继承
  10. 用多态处理一些问题,想想设计模式
  11. 数据类是否是合理的冗余
  12. 尽量简单,只做一件事

更多警惕请见《重构-改善代码既有设计》的第三章,以及书本最后几页,以及《程序性能优化》第三章3.5节。

SpringMVC 图文详解(一) 文章目录一、SpringMVC概述1.1、什么是三层架构1.2、什么是MVC1.3、什么是SpringMVC1.3.1、SpringMVC工作流程图1.3.2、SpringMVC架构图二、 SpringMVC入门案例2.1、环境准备2.2、案例编写2.3、@RequestMapping注解三、请求参数绑定3.1、请求参数绑定基本类型3.2、请求参数绑定实体类型3.3、解决中文乱码的过滤器 一、Sp... 阅读详情

相关推荐

Spring MVC整体结构介绍,图文+代码

Spring MVC是Spring提供的构建Web应用程序的框架,该框架遵循了Servlet规范,负责接收并处理Servelt容器传递的请求,并将响应写回Response。Spring MVC以DispatcherServlet为核心,众多组件如HandlerMapping为辅助,为用户封装了请求映射等底层逻辑,让用户可以更专注与业务逻辑的处理。本文会对Spring MVC整体结构做简单介绍。 Spring MVC结构图 Spring MVC是一个基于Servlet容器的Web应用框架,这里的Servl

weixin_64314555的博客 2374

SpringMVC 概述三层架构

根据ModelAndView中的视图名查找相应的View实现类,然后将查找的结果返回给DispatcherServlet,DispatcherServlet最终会将ModelAndView中的模型数据交给返回的View处理最终的视图渲染工作。后端接受的对象是含有List属性的,那么前端的name值格式要和后端list属性名称一致,而且用索引的格式 list[0].属性(list集合里对象的属性名称)1)日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。

weixin_65700815的博客 5297

基于Maven构建SpringMVC与MySQL交互的Web应用实战

Maven 通过标准化的目录结构提升了项目的可维护性与协作效率。一个典型的 Maven Web 项目结构如下:├── src/│ │ ├── java/ # Java源代码目录│ │ ├── resources/ # 配置文件目录(如Spring配置)│ │ └── webapp/ # Web资源目录(如JSP、WEB-INF)│ ├── java/ # 单元测试代码│ └── resources/ # 测试配置文件这种结构不仅提高了项目组织的清晰度,也便于自动化构建与部署。

weixin_42186387的博客 806

Spring MVC整体结构介绍,图文+代码;

Spring MVC是Spring提供的构建Web应用程序的框架,该框架遵循了Servlet规范,负责接收并处理Servelt容器传递的请求,并将响应写回Response。Spring MVC以DispatcherServlet为核心,众多组件如HandlerMapping为辅助,为用户封装了请求映射等底层逻辑,让用户可以更专注与业务逻辑的处理。本文会对Spring MVC整体结构做简单介绍。

2401_83384536的博客 1703

SpringMVC+Tomcat WEB工程搭建实战指南

SpringMVC是一个全面且模块化的MVC框架,它继承自Spring Framework,设计上以松耦合、高灵活性、低侵入性为理念。其优势在于易于与Spring的其他技术栈进行整合,例如Spring IoC和Spring AOP,同时支持多种视图技术。得益于轻量级和灵活的特性,SpringMVC广泛应用于Web层的快速开发。Apache Tomcat是一个开源的Servlet容器,它是Java Servlet技术规范和JavaServer Pages (JSP)技术规范的一个实现。

weixin_35189483的博客 968

springmvc完整工程代码

完整的springmvc项目代码,简单的springmvc工程代码,项目框架。

介绍一下 : spring-boot-starter-web和快速Web应用开发

在这个互联网时代,使用Spring框架除了开发少数的独立应用,大部分情况下实际上在使用 SpringMVC 开发 web 应用,为了帮我们简化快速搭建并开发一个 Web 项目,SpringBoot为我们提供了 spring-boot-starter-web 自动配置模块。 只要将 spring-boot-starter-web 加入项目的 maven 依赖: <dependency> <groupId>org.springframework.boot</groupId&gt

段远山 1102

2.2.1.3-移动平均线(python画k线、均线、5日线、买卖点图、python均线策略)

* 绘制一个k线图,也就是蜡烛图 * 计算5日均线值、10日均线值 * 在k线图上,绘制5日线和10日线图 * 在5日线上,绘制与10日线的交叉点(上穿、下穿时) python画k线、均线、5日线、买卖点图、python均线策略

KelvinLiu 3413

Spring--Eclipse中创建标准web工程以及标准目录结构说明

Eclipse中创建标准web工程以及标准目录结构说明 最近公司有个Web项目,项目结构如下: 虽然运行没有错,但是实在是别扭,标准的web应用一般不采用这种结构: 因此总结一下: 1.如何在Eclipse中创建一个标准的Web应用。 2.标准Web应用推荐的目录结构。 第一:如何在Eclipse中创建一个标准的web应用:(假设项目名称为:mywe...

blues的博客 758

SDR实战(五)-AD9361多芯片同步技术详解

本文详细解析了AD9361多芯片同步技术在SDR系统中的实现方法,涵盖硬件连接方案、软件配置流程及同步验证技巧。通过等长时钟走线、低抖动时钟分配和精确的SYNC信号控制,解决MIMO系统中多AD9361芯片的时钟同步难题,提升系统性能与稳定性。

weixin_30952535的博客 761

VMware17安装教程(附安装包)VMware17小白详细一键安装教程

VMware 17.5 是一款强大的虚拟机软件。本安装教程将为您详细介绍VMware17安装教程其下载、安装步骤及验证方法,助您轻松完成安装,开启虚拟化体验。

2501_91538706的博客 2万+

纷杂的Spring-boot-starter: 2 快速 Web 应用 开发 与 spring- boot- starter- web

在这个互联网时代,使用Spring框架除了开发少数的独立应用,大部分情况下实际上在使用SpriugnMVC开发web应用,为了帮助我们简化快速搭建并开发一个Web项目,SpringBoot为我们提供了spring-boot-starter-web自动配置模块 只要将spring-boot-starter-web加入项目的maven依赖: < dependency> < groupId> org. springframework. boot</ groupId> &

weixin_44778952的博客 309

QKD(量子密钥分发)

量子密钥分发(Quantum Key Distribution,QKD)是一种基于量子力学原理的安全通信协议,它允许两个用户通过不安全的通信信道创建并共享一个安全的密钥。这个密钥随后可以用于加密和解密信息,确保通信的机密性。QKD的核心原理是量子不可克隆定理和量子测量的不确定性。

qq_40844444的博客 2896

spring-boot-starter-web和快速Web应用开发

在这个互联网时代,使用 Spring 框架除了开发少数的独立应用,大部分情况下实际上在使用 SpringMVC 开发 web 应用,为了帮我们简化快速搭建并开发一个 Web 项目,SpringBoot 为我们提供了 spring-boot-starter-web 自动配置模块。 只要将 spring-boot-starter-web 加入项目的 maven 依赖: <dependency...

javaheheda的博客 1833

YOLOv11改进策略【卷积层】| CVPR2025 GBConv轻量门控瓶颈卷积 低秩瓶颈降参 + 门控聚焦形态,强效捕捉纤细目标

裂缝形态不规则、纹理纤细,传统卷积参数大、计算冗余,且无法动态聚焦裂缝形态;背景噪声强易干扰特征提取,需要轻量且能自适应聚焦裂缝形态的卷积单元,因此提出轻量门控瓶颈卷积 GBC。

Limiiiing的博客 853

SpringMVC框架理解

JavaEE体系结构包括四层, 从上到下分别是应用层、Web层、业务层、持久层。 Struts和SpringMVC是Web层的框架, Spring是业务层的框架, Hibernate和MyBatis是持久层的框架。 ...

cat marshal的博客 148

有道龙虾LobsterAI vs. OpenClaw:对比与安装部署攻略

LobsterAI是"中国版OpenClaw",更注重易用性和中文场景适配;OpenClaw是技术极客的玩具,需要大量命令行操作。

lpfasd123的博客 2396

SSM(springmvc/spring/mybatis)框架整合

首先学习ssm框架整合之前需要对框架相关知识进行了解,先阶段两大开发框架ssm与ssh分别是什么,ssh不了解的可以去另一篇博客去进行学习https://blog.youkuaiyun.com/qq_40852784/article/details/79696008 ssm简单的介绍,用大白话来讲ssm指的是使用springmvc作为web层进行路径解析处理/spring进行其他操作(ioc/di/aop....

Amour恋空的博客 473

Altium Designer应用技巧5: Altium Live账号的获得

为了更好的应用Altium Designer,我们需要得到一个Altium Live账号,但从其英文或者中文官方网站取得,都需要7个工作日的时间,而且对于个人用户来说,并不是100%都能够获取到。本文介绍一种,从俄罗斯Altium官方网站获取账号的方法,可以立即使用。     1、点击http://live.altium-ru.com/#Join网址进入俄罗斯Altium官方网站,Altiu

snmplink的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Eclipse中创建标准web工程以及标准目录结构说明

最近在学 web 框架 J2EE …… 但是 有一些内容书上没讲 借鉴大佬的博客看看~ 转自:https://www.cnblogs.com/sdjnzqr/p/3816899.html 最近公司有个Web项目,项目结构如下: 虽然运行没有错,但是实在是别扭,标准的web应用一般不采用这种结构: 因此总结一下: 1.如何在Eclipse中创建一个标准的Web应用。 ...

OneLine_的博客 889

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring MVC之基于xml配置的web应用构建

更多spring博文参考: http://spring.hhui.top/ 直接用SpringBoot构建web应用可以说非常非常简单了,在使用SpringBoot构建后端服务之前,一直用的是Spring + SpringMVC基于xml的配置方式来玩的,所以在正式进入SpringBoot Web篇之前,有必要看一下不用SpringBoot应该怎么玩的,也因此方便凸显SpringBoot的优越...

小灰灰blog的专栏 243

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Maven搭建SpringMVC+Mybatis项目详解

1.项目目的 a.通过Spring+Mybatis实现通过web访问达成mySql的操作 b.理解Spring+Mybatis的配置 c.理解maven对项目的管理 2.配置文件 a.采用maven约定结构,src/main/java、src/main/resources、src/main/test b.基本springMVC+Mybatis需要用到的jar spri

不忘初心的博客 841

springMVC

什么是SpringMVC? 在介绍SpringMVC之前,我们先看一张非常熟悉的图:    相信看这篇文章的博友都听说或者使用过Spring,并且我之前的文章也详细的讲解了Spring的整体框架,以及IOC,AOP,Hibernate和Mybatis等框架,JMS等等,同样Spring自己也支持对DAO层的开发,甚至对于最后一个Web模块,我们也使用过Struts,以及JSP等等。

沐埜专栏 267

SpringMVC简介(一)

1、SpringMVC简介 Spring MVC属于SpringFrameWork的后续产品,它提供了构建 Web 应用程序的全功能 MVC 模块,与Struts2一样是一种优秀MVC框架,不同的是自Spring2.5引入了注解式controller及Spring 3以后的不断完善,使得采用Spring MVC框架开发结构清晰明了,效率大大提高。 注解式Spring MVC响应流程 ...

dengyiyu5280的博客 215

手写springMVC简单实现——目录结构说明(二)

上一篇,展示了一下,实现springMVC的servlet,下面先展示一下,实现效果。 1.postman工具效果: 2.页面实现效果: 3.测试类实现效果: 4.项目结构 说明: demo包:业务逻辑代码的实现 utils包:工具包 annotation包:springMVC用到的注解类 common包:通用工具类 HttpRequest包:发送http请求的...

天生卷发 1600
上一篇: 重构-改善既有代码的设计
下一篇: 单元测试
iQuester
博客等级 码龄11年 22粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值