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)设计模式,它的优化点在于它将应用程序分为三个独立的部分,使得代码更易于维护和扩展。
其中,对于模型来说,可以优化以下几个方面:
- 数据库性能优化:通过索引、分区、缓存等技术提升数据库查询性能。
- 数据库设计优化:设计合理的表结构,避免多余字段和冗余数据,以减少资源消耗。
- 代码复用:将公共的数据操作方法提取出来,封装成通用的Dao层。
- 业务逻辑优化:将业务逻辑分层,使得每一层只关注自己的职责,提高代码的可读性和可维护性。
对于视图来说,可以考虑以下优化点:
- 前端优化:使用前端框架、模板引擎、静态资源优化等手段提升页面性能。
- 界面美化:增加动画效果、交互体验等,提升用户体验。
- 移动端适配:针对不同设备进行适配,提高移动端用户体验。
- 国际化支持:支持多语言,满足全球用户需求。
对于控制器来说,可以优化以下几个方面:
- 请求路由优化:使用RESTful设计风格,使得URL语义化清晰易懂。
- 代码复用:将公共的请求处理逻辑封装成通用的Controller层。
- 异常处理:对于异常情况进行统一处理,提高系统健壮性。
- 安全防范:进行输入验证、权限校验等安全措施,保证系统安全稳定。
最典型的MVC就是JSP servlet javabean的模式。
image.png
Controller可以分为两部分:
- 后端Controller:负责处理客户端发送过来的请求,将请求参数解析并校验,调用业务逻辑层进行数据处理,最终返回处理结果给客户端。此处可以通过使用Spring MVC等框架实现请求的路由、参数解析与校验、异常处理等功能。
- 前端Controller:负责前端页面的渲染和交互逻辑。在前后端分离的架构下,前端Controller往往指的是JavaScript编写的控制器(如React中的组件),它负责从后端接收数据并将其展示在页面上,同时监听用户事件进行相应的操作。此处可以通过使用React、Vue等框架实现组件化开发、状态管理、响应式更新等功能。
Model可以分为两部分:
- 数据库模型:负责数据存储和读取,与后端业务逻辑紧密关联。此处可以通过使用ORM框架(如MyBatis、Hibernate)实现对象-关系映射、事务管理等功能。
- 视图模型:负责前端展示所需的数据和状态,与前端组件紧密关联。此处可以通过使用状态管理库(如Redux、Vuex)实现数据缓存、数据响应式更新等功能。
View也可以分为两部分:
- 后端模板:负责渲染前端所需的HTML代码和数据,与后端业务逻辑紧密关联。此处可以通过使用模板引擎(如Freemarker、Thymeleaf)实现动态生成HTML页面的功能。
- 前端组件:负责展示数据和交互逻辑,与前端Controller紧密关联。此处可以通过使用React、Vue等框架实现组件化开发、响应式更新等功能。
需要注意的是,在前后端分离的架构下,前端组件往往承担了更多的职责,包括视图展示、用户输入校验、数据缓存、状态更新等,因此需要仔细设计前端组件的接口和数据结构,保证其与后端接口的衔接良好。
MVC框架需要完成的主要任务:
- 路由管理:将客户端请求的URL映射到相应的控制器方法上,并将请求参数进行解析和封装。
- 参数验证:对于客户端提交的参数进行数据类型、格式、长度等方面的校验,避免非法参数对系统造成损害。
- 身份认证和权限控制:对于需要身份认证和权限控制的功能,对客户端进行身份验证和权限判断,保证系统安全稳定。
- 业务逻辑处理:根据用户请求调用相应的服务层方法进行业务处理,包括数据查询、更新、删除等操作。
- 数据访问:负责与数据库交互,执行数据操作(如CRUD操作)。
- 视图渲染:根据控制器返回的数据,将数据渲染到视图模板中,生成HTML页面或其他表示层数据,返回给客户端。
- 异常处理:在整个业务流程中,可能发生各种异常,如参数校验失败、数据库连接超时、数据操作异常等。MVC框架需要有完善的异常处理机制,对各类异常进行统一处理,保证系统的健壮性和稳定性。
- 性能优化:针对系统性能瓶颈进行优化,如缓存、数据库连接池、请求并发量控制等方面的优化。
- 安全防护:防止各类安全威胁攻击,如SQL注入、XSS攻击、CSRF攻击等,保证系统数据的安全性。
总之,MVC框架需要完成的工作非常多,包括但不限于路由管理、参数验证、业务逻辑处理、数据访问、视图渲染、异常处理、性能优化、安全防护等方面的任务。因此,在设计和开发MVC框架时,需要综合考虑各个方面的需求和问题,并充分测试和评估系统的性能和安全性。
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。
Spring MVC是基于MVC设计模式的轻量级Web框架,具有以下特点:
- 轻量级、简单易学:Spring MVC不依赖于其他第三方框架,核心代码量相对较小,入门和使用都比较容易。
- 高效:Spring MVC采用了基于请求响应的模型,请求的处理过程经过封装并进行大量的缓存,处理效率相对较高。
- 与Spring兼容性好:Spring MVC是Spring Framework组件之一,与Spring其他组件无缝集成,可以利用Spring的IoC、AOP等功能。
- 约定优于配置:Spring MVC采用约定优于配置的思想,提供了许多默认配置,使得开发者只需要关注特定的配置部分,避免了繁琐的配置过程。
- 功能强大:Spring MVC提供了许多实用的功能,如RESTful风格的URL映射、数据验证、格式化、本地化、主题等,为开发者提供了更加便捷、高效的开发体验。
- 简洁灵活:Spring MVC可以根据业务需求进行灵活的定制和扩展,而且Spring MVC的代码结构清晰、逻辑简单,使得开发者可以快速理解和调试。
总之,Spring MVC是一个功能强大、易学易用、灵活可扩展的轻量级Web框架,可以满足不同规模和需求的Web应用开发。
Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计。
Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类) 。
image.png
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
所有的地址栏请求默认都会是 HTTP GET 类型的。
代码语言:javascript复制@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
代码语言:javascript复制@RequestMapping("/hello")
public String hello(String name){
System.out.println(name);
return "hello";
}
代码语言:javascript复制//@RequestParam("username") : username提交的域的名称 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
System.out.println(name);
return "hello";
}
代码语言:javascript复制@RequestMapping("/user")
public String user(User user){
System.out.println(user);
return "hello";
}
代码语言:javascript复制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插件!
代码语言:javascript复制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;
}
代码语言:javascript复制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();
}
代码语言:javascript复制<?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>
代码语言:javascript复制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
代码语言:javascript复制controller
- BookController
dao
- BookDao
- BookMapper.xml
- pojo
- Books
- service
- BookService
- BookServiceImpl
fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。实现json的转换方法很多,最后的实现结果都是一样的。
代码语言:javascript复制<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>
仓库地址:https://github.com/webVueBlog/JavaGuideInterview