springboot第18集:SpringMVC我的春天

news2024/12/23 0:35:29

mybatis-spring

http://mybatis.org/spring/zh/index.html

mybatis-ehcache

http://mybatis.org/ehcache-cache/

MVC是一种常用的软件设计规范,它将一个应用程序分为三个不同的部分:模型(Model)、视图(View)、控制器(Controller)。这三个部分相互协作,共同完成应用程序的各项任务。

其中,模型表示应用程序的数据和业务逻辑,视图用于显示数据和与用户交互,而控制器负责处理用户请求并更新模型和视图。通过将业务逻辑、数据和显示分离,MVC可以使代码更加清晰、易于维护和扩展,并能够快速地进行单元测试和集成测试。

MVC的主要作用在于降低了视图与业务逻辑间的双向偶合。这意味着,当一个应用程序需要修改或者更新时,只需要修改相应的模型或者控制器,而无需改变视图。这样就可以大大提高开发效率,同时也能够在维护应用程序时减少出错的可能性。

需要注意的是,虽然MVC被广泛使用,但是不同的MVC实现可能存在差异。因此,在使用MVC时,需要根据具体情况进行选择和调整。

经典的MVC(Model-View-Controller)设计模式,它的优化点在于它将应用程序分为三个独立的部分,使得代码更易于维护和扩展。

其中,对于模型来说,可以优化以下几个方面:

  1. 数据库性能优化:通过索引、分区、缓存等技术提升数据库查询性能。

  2. 数据库设计优化:设计合理的表结构,避免多余字段和冗余数据,以减少资源消耗。

  3. 代码复用:将公共的数据操作方法提取出来,封装成通用的Dao层。

  4. 业务逻辑优化:将业务逻辑分层,使得每一层只关注自己的职责,提高代码的可读性和可维护性。

对于视图来说,可以考虑以下优化点:

  1. 前端优化:使用前端框架、模板引擎、静态资源优化等手段提升页面性能。

  2. 界面美化:增加动画效果、交互体验等,提升用户体验。

  3. 移动端适配:针对不同设备进行适配,提高移动端用户体验。

  4. 国际化支持:支持多语言,满足全球用户需求。

对于控制器来说,可以优化以下几个方面:

  1. 请求路由优化:使用RESTful设计风格,使得URL语义化清晰易懂。

  2. 代码复用:将公共的请求处理逻辑封装成通用的Controller层。

  3. 异常处理:对于异常情况进行统一处理,提高系统健壮性。

  4. 安全防范:进行输入验证、权限校验等安全措施,保证系统安全稳定。

最典型的MVC就是JSP + servlet + javabean的模式。

9e4c9807a95ace55fb2a7f538e44689c.png
image.png

Controller可以分为两部分:

  1. 后端Controller:负责处理客户端发送过来的请求,将请求参数解析并校验,调用业务逻辑层进行数据处理,最终返回处理结果给客户端。此处可以通过使用Spring MVC等框架实现请求的路由、参数解析与校验、异常处理等功能。

  2. 前端Controller:负责前端页面的渲染和交互逻辑。在前后端分离的架构下,前端Controller往往指的是JavaScript编写的控制器(如React中的组件),它负责从后端接收数据并将其展示在页面上,同时监听用户事件进行相应的操作。此处可以通过使用React、Vue等框架实现组件化开发、状态管理、响应式更新等功能。

Model可以分为两部分:

  1. 数据库模型:负责数据存储和读取,与后端业务逻辑紧密关联。此处可以通过使用ORM框架(如MyBatis、Hibernate)实现对象-关系映射、事务管理等功能。

  2. 视图模型:负责前端展示所需的数据和状态,与前端组件紧密关联。此处可以通过使用状态管理库(如Redux、Vuex)实现数据缓存、数据响应式更新等功能。

View也可以分为两部分:

  1. 后端模板:负责渲染前端所需的HTML代码和数据,与后端业务逻辑紧密关联。此处可以通过使用模板引擎(如Freemarker、Thymeleaf)实现动态生成HTML页面的功能。

  2. 前端组件:负责展示数据和交互逻辑,与前端Controller紧密关联。此处可以通过使用React、Vue等框架实现组件化开发、响应式更新等功能。

需要注意的是,在前后端分离的架构下,前端组件往往承担了更多的职责,包括视图展示、用户输入校验、数据缓存、状态更新等,因此需要仔细设计前端组件的接口和数据结构,保证其与后端接口的衔接良好。

MVC框架需要完成的主要任务:

  1. 路由管理:将客户端请求的URL映射到相应的控制器方法上,并将请求参数进行解析和封装。

  2. 参数验证:对于客户端提交的参数进行数据类型、格式、长度等方面的校验,避免非法参数对系统造成损害。

  3. 身份认证和权限控制:对于需要身份认证和权限控制的功能,对客户端进行身份验证和权限判断,保证系统安全稳定。

  4. 业务逻辑处理:根据用户请求调用相应的服务层方法进行业务处理,包括数据查询、更新、删除等操作。

  5. 数据访问:负责与数据库交互,执行数据操作(如CRUD操作)。

  6. 视图渲染:根据控制器返回的数据,将数据渲染到视图模板中,生成HTML页面或其他表示层数据,返回给客户端。

  7. 异常处理:在整个业务流程中,可能发生各种异常,如参数校验失败、数据库连接超时、数据操作异常等。MVC框架需要有完善的异常处理机制,对各类异常进行统一处理,保证系统的健壮性和稳定性。

  8. 性能优化:针对系统性能瓶颈进行优化,如缓存、数据库连接池、请求并发量控制等方面的优化。

  9. 安全防护:防止各类安全威胁攻击,如SQL注入、XSS攻击、CSRF攻击等,保证系统数据的安全性。

总之,MVC框架需要完成的工作非常多,包括但不限于路由管理、参数验证、业务逻辑处理、数据访问、视图渲染、异常处理、性能优化、安全防护等方面的任务。因此,在设计和开发MVC框架时,需要综合考虑各个方面的需求和问题,并充分测试和评估系统的性能和安全性。

Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。

Spring MVC是基于MVC设计模式的轻量级Web框架,具有以下特点:

  1. 轻量级、简单易学:Spring MVC不依赖于其他第三方框架,核心代码量相对较小,入门和使用都比较容易。

  2. 高效:Spring MVC采用了基于请求响应的模型,请求的处理过程经过封装并进行大量的缓存,处理效率相对较高。

  3. 与Spring兼容性好:Spring MVC是Spring Framework组件之一,与Spring其他组件无缝集成,可以利用Spring的IoC、AOP等功能。

  4. 约定优于配置:Spring MVC采用约定优于配置的思想,提供了许多默认配置,使得开发者只需要关注特定的配置部分,避免了繁琐的配置过程。

  5. 功能强大:Spring MVC提供了许多实用的功能,如RESTful风格的URL映射、数据验证、格式化、本地化、主题等,为开发者提供了更加便捷、高效的开发体验。

  6. 简洁灵活:Spring MVC可以根据业务需求进行灵活的定制和扩展,而且Spring MVC的代码结构清晰、逻辑简单,使得开发者可以快速理解和调试。

总之,Spring MVC是一个功能强大、易学易用、灵活可扩展的轻量级Web框架,可以满足不同规模和需求的Web应用开发。

Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计。

Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)

c7e6afa9f960ba6775594070e090408e.png
image.png

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。

所有的地址栏请求默认都会是 HTTP GET 类型的。

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestMapping("/hello")
public String hello(String name){
    System.out.println(name);
    return "hello";
}
//@RequestParam("username") : username提交的域的名称 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
    System.out.println(name);
    return "hello";
}
@RequestMapping("/user")
public String user(User user){
    System.out.println(user);
    return "hello";
}
CREATE DATABASE `ssm`;

USE `ssm`;

drop table if exixts `books`;

create table `books` (
 `bookID` int(10) not null auto_increment comment `书id`,
 `bookName` varchar(100) not null comment `书名`,
 `bookCounts` int(11) not null comment `数量`,
 `detail` varchar(200) not null comment `描述`,
 key `bookID` (`bookID`)
) engine = INNODB default charset=utf8

lombok插件!

package com.da.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Books {
    private int bookID;
    private String bookName;
    private int bookCounts;
    private String detail;
}
package com.da.dao;
import com.da.pojo.Books;
import java.util.List;

public interface BookMapper {
    //增加一个Book
    int addBook(Books book);
    //根据id删除一个Book
    int deleteBookById(int id);
    //更新Book
    int updateBook(Books books);
    //根据id查询,返回一个Book
    Books queryBookById(int id);
    //查询全部Book,返回list集合
    List<Books> queryAllBook();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.da.dao.BookMapper">
    <!--增加一个Book-->
    <insert id="addBook" parameterType="Books">
        insert into ssm.books(bookName,bookCounts,detail)
        values (#{bookName}, #{bookCounts}, #{detail})
    </insert>
    <!--根据id删除一个Book-->
    <delete id="deleteBookById" parameterType="int">
        delete from ssm.books where bookID=#{bookID}
    </delete>
    <!--更新Book-->
    <update id="updateBook" parameterType="Books">
        update ssm.books
        set bookName = #{bookName},bookCounts = #{bookCounts},detail = #{detail}
        where bookID = #{bookID}
    </update>
    <!--根据id查询,返回一个Book-->
    <select id="queryBookById" resultType="Books">
        select * from ssm.books
        where bookID = #{bookID}
    </select>
    <!--查询全部Book-->
    <select id="queryAllBook" resultType="Books">
        SELECT * from ssm.books
    </select>
</mapper>
package com.da.service;
import com.da.pojo.Books;
import java.util.List;

public interface BookService {
    //增加一个Book
    int addBook(Books book);
    //根据id删除一个Book
    int deleteBookById(int id);
    //更新Book
    int updateBook(Books books);
    //根据id查询,返回一个Book
    Books queryBookById(int id);
    //查询全部Book,返回list集合
    List<Books> queryAllBook();
}

springmvc

controller
 - BookController
dao
 - BookDao
 - BookMapper.xml
- pojo
 - Books
- service
 - BookService
 - BookServiceImpl

fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。实现json的转换方法很多,最后的实现结果都是一样的。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.60</version>
</dependency>

对表单中的 enctype 属性做个详细的说明:

  • application/x-www=form-urlencoded:默认方式,只处理表单域中的 value 属性值,采用这种编码方式的表单会将表单域中的值处理成 URL 编码方式。

  • multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数中,不会对字符编码。

  • text/plain:除了把空格转换为 “+” 号外,其他字符都不做编码处理,这种方式适用直接通过表单发送邮件。

<form action="" enctype="multipart/form-data" method="post">
    <input type="file" name="file"/>
    <input type="submit">
</form>

加群联系作者vx:xiaoda0423

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/505020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业论文内容参考|基于三维建模和卷积神经网络的人脸转正的技术设计

文章目录 导文文章重点摘要前言绪论课题背景国内外现状与趋势课题内容相关技术与方法介绍技术分析技术设计人脸转正方法卷积神经网络的训练和优化数据预处理技术实现总结与展望本文总结导文 基于java开发汽车销售系统资料 文章重点 摘要 在实际应用中,人脸图像往往具有旋转、…

基于线特征的图像配准

一、线特征提取 1.1 模板检测 使用模板在一幅图像上移动&#xff0c;他会对特定方向上的&#xff08;一个像素宽&#xff09;线响应强烈。下面是常见检测模板&#xff1a; 1.2 边缘检测 边缘检测的基本思想是使用如下两个准则之一找到图像中快速变换的位置&#xff1a; 1.…

Flutter框架:从入门到实战,构建跨平台移动应用的全流程解析

第一章&#xff1a;Flutter框架介绍 Flutter框架是由Google推出的一款跨平台移动应用开发框架。相比其他跨平台框架&#xff0c;Flutter具有更高的性能和更好的用户体验。本章将介绍Flutter框架的概念、特点以及与其他跨平台框架的比较&#xff0c;以及Flutter开发环境的搭建和…

MathGPT是什么,MathGPT与ChatGPT的区别是什么,MathGPT十大应用场景

MathGPT是一种基于自然语言处理技术的数学语言模型&#xff0c;其目的是通过自动化生成数学公式、证明和解题步骤等来辅助数学学习和研究。 与ChatGPT相比&#xff0c;MathGPT主要关注数学领域而非通用性的自然语言理解&#xff0c;因此其训练语料库和预测任务都与数学有关&…

Ubuntu20.04安装Vtk9.2.6+PCL1.12.1(成功无报错)

成功不报错的原因&#xff1a;VTK和PCL版本需要对应正确.. 错误可参考&#xff1a;Ubuntu20.04 编译 pcl1.8可能出现的问题 安装参考1&#xff1a;ubuntu20.04下安装pcl_ubuntu安装pcl_Yuannau_jk的博客-CSDN博客 安装参考2&#xff1a;Ubuntu20.04 安装pcl详细教程_ubuntu20…

构造函数,析构函数,拷贝构造函数与运算符重载简图总结,赋值运算符重载与前置++后置++的重载参数区分

构造函数简图 析构函数简图 拷贝构造函数简图 运算符重载简图 赋值运算符重载与拷贝构造函数的区别 即为赋值运算符这涉及到两个已经存在的实例化对象之间的复制拷贝。这个与拷贝构造函数是完全不一样的&#xff0c;拷贝构造函数它的本质上就是一个构造函数&#xff0c;主要是用…

C++ 类和对象下

文章目录 重载operator<< 输出自定义类型const对象 无法调用 非const成员函数非const函数的缺陷 初始化列表&#xff1a;对象的成员定义的位置为什么会要用到初始化列表&#xff1f;自定义类型成员如何初始列表初始化灵活的初始化列表声明次序内置类型_size不给缺省值&am…

win10系统电脑硬盘里的文件不显示,到底出了什么问题呢?有什么解决方法呢?

演示机型&#xff1a;技嘉 H310M HD22.0 系统版本&#xff1a;Windows 10 专业版 软件版本&#xff1a;云骑士数据恢复软件3.21.0.92 Win10系统是我们经常使用的操作系统之一&#xff0c;但这也意味着我们可能会遇到一些问题。其中一个比较常见的问题是硬盘中的文件不显示。在这…

国内又款智能AI聊天软件-科大讯飞星火模型

介绍 介绍 中国科大讯飞星火GPT聊天软件是一款基于自然语言处理技术的人工智能聊天机器人。它利用了大量的文本数据&#xff0c;通过深度学习模型进行训练&#xff0c;从而实现与用户的智能对话。讯飞星火GPT聊天软件能够理解用户输入的问题或指令&#xff0c;并根据预设的回答…

MySQL 主从复制涉及到了几个线程?

目录 前言一、主从同步原理二、主从同步分析 前言 说到主从&#xff0c;我相信大家在 MySQL 这一节面试经常被问到MySQL 的主从复制原理&#xff0c;而且大家背得滚瓜烂熟。但是在主从复制的过程中&#xff0c;是如何进程数据同步的&#xff0c;又涉及到了哪些线程呢&#xff…

卖一辆亏5.8万美元!福特的困扰

随着电动化进入关键的「抢量」周期&#xff0c;加上年初掀起的降价潮&#xff0c;对于还无法适应转型节奏的传统汽车制造商来说&#xff0c;现在是一个艰难的时刻。 本月初&#xff0c;福特首席执行官Jim Farley表示&#xff0c;电动汽车市场的降价是"令人担忧的趋势"…

js垃圾回收机制各阶段问题以及解决方案

很多文章的三色标记法&#xff0c;增量标记法&#xff0c;新生代老生代&#xff0c;引用计数法&#xff0c;标记回收法。很容易给最开始学习垃圾回收算法的朋友搞混。文章适合有一部分基础&#xff0c;但是要把算法搞混的朋友们。这篇文章带大家梳理一下本人的思路&#xff0c;…

ASEMI代理ADV7125JSTZ330原装ADI车规级ADV7125JSTZ330

编辑&#xff1a;ll ASEMI代理ADV7125JSTZ330原装ADI车规级ADV7125JSTZ330 型号&#xff1a;ADV7125JSTZ330 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;LQFP-48 批号&#xff1a;2023 引脚数量&#xff1a;48 工作温度&#xff1a;-40C~85C 安装类型&#xff1a;表面…

深夜12点,果断卸载Access,3分钟启用国产Access,源自WPS

Access的“忠实粉丝”&#xff0c;你我皆可能是一员 历经20多年迭代的微软Access&#xff0c;因简单易用&#xff0c;在全球吸引了一大批的“忠实粉丝”&#xff0c;你我可能就是其中的一员。 基于Windows操作系统的集成开发的大环境&#xff0c;Access的灵活性和实用性大大提…

QUIC在京东直播的应用与实践 | 京东云技术团队

作者&#xff1a;京东零售 周凯 一. 前言与背景 国内的互联网直播技术从2005年前后兴起&#xff0c;彼时最具代表性的直播产品是由PPLive创始人姚欣在华中科技大学就读期间发起的校园直播项目PPLive。当时的直播技术用的还是基于windows系统自带的mediaplayer内置的COM组件开…

小程序uniapp利用canvas生成海报并可以保存至相册

✨uniapp实现生成海报并保存至相册组件&#xff0c;u-popup可以根据自己所使用的组件进行替换 这里主要讲的是JS部分&#xff0c;css和元素相关的就不展开赘述了&#xff0c;下方先给大伙看看效果图&#xff0c;图的下方有代码讲解&#xff0c;最下方有完整代码&#xff0c;如…

Echarts 热力图的详细配置过程

文章目录 一&#xff0c;配置过程二&#xff0c;具体实例 一&#xff0c;配置过程 引入Echarts库和热力图插件 <script src"https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script> <script src"https://cdn.jsdelivr.net/npm/…

Java多线程入门到精通学习大全?了解线程池和线程常用集合的基本原理、代码示例!(第六篇:线程池和集合的学习)

设计和实现多线程应用程序需要了解线程池、线程常用集合等相关知识。下面我们将分别介绍线程池、线程常用集合的原理、使用场景、代码示例、注意事项和总结。 1. 线程池 线程池是一种线程调度机制&#xff0c;它可以管理多个线程&#xff0c;并且可以重复使用这些线程来处理多…

Transformers回顾 :从BERT到GPT4

人工智能已成为近年来最受关注的话题之一&#xff0c;由于神经网络的发展&#xff0c;曾经被认为纯粹是科幻小说中的服务现在正在成为现实。从对话代理到媒体内容生成&#xff0c;人工智能正在改变我们与技术互动的方式。特别是机器学习 (ML) 模型在自然语言处理 (NLP) 领域取得…

大众软件之变:宾利品牌制造负责人接任CARIAD CEO

作者 | 德新 编辑 | 王博 上周五&#xff0c;Business Insider爆料了大众软件组织CARIAD人事大调整&#xff0c;董事会几乎全军覆没&#xff0c;引发轩然大波。 这周一&#xff0c;大众的官宣接踵而至——大众集团老兵、原宾利品牌制造负责人Peter Bosch接替CARIAD CEO一职。 …