likes
comments
collection
share

springboot第18集:SpringMVC我的春天

作者站长头像
站长
· 阅读数 17

mybatis-spring

mybatis.org/spring/zh/i…

mybatis-ehcache

mybatis.org/ehcache-cac…

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的模式。

springboot第18集:SpringMVC我的春天

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 基类)

springboot第18集:SpringMVC我的春天

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

仓库地址:github.com/webVueBlog/…

转载自:https://juejin.cn/post/7230460443188772901
评论
请登录