《Spring Boot 实战派》--02 Spring Boot 应用
Spring Boot 应用:
5. 分层开发web应用程序
本章首先介绍 Web开发中最常用的分层开发的模式 MVC ( Model View Cont olle 「),然后讲解视图技术 Thymeleaf的语法和实用技术, 并用实例讲解如何将 MVC 者联系起来构建 Web用程序;最后通过实例讲解如何用 Validator实现数据验证,以及如何自定义数据验证; 5.1 应用程序分层开发模式--MVC 如果不想使用 MVC 开发模式也是可以的, MVC 只是一个非常合理的规范 MVC 的关系:如果读者对MVC 开发模式理解得不深入,那么往往会以为用户通过浏览器访问 MVC 模型的页面就是访问视图 ( View ) 。实际上, 它并不是直接访问视图,
而是访问 DispatcherServlet处理映射和调用视图渲染,然后返回给用户的数据;
在整个 Spring MVC 框架中, DispatcherServlet 处于核心位置,继承自 HttpServlet。它负责协调和组织不同组件,以完成请求处理并返回响应果工作; 整个工程流程如下: ( 1 )客户端(用户)发出的请求由 Tomcat (服务器)接收,然后Tomcat 将请求转交给DispatcherServlet 处理 ( 2 ) DispatcherServlet 匹配控制器中配置的映射路径,进行下一步处理 ( 3 ) ViewResolver将ModelAndView 或Exception 解析成 View。 然后 View会调用 render方法,并根据 ModelAndView 中的数据渲染出页面; 在MVC 开发模式中,容易混淆的还有 Model, 它往往会被认为是业务逻辑层或 DAO。这种理解并不能说是错误的, 但并不是严格意义上的 MVC 模式; 三层架构,就是将整个应用程序划分为表现层( UI )、业务逻辑层( Service) 、数据访问层( DAO/Repository) RepositoryDAO 层一样,都可以进行数据的增加、删除、修改和查询。它们相当于仓库管理员,执行进/出货操作。 DAO 层的工作是存取对象 Repository 层的工作是存取和管理对象。 简单理解就是:Repository =管理对象(对象缓存和在 Repository 的状态)+ DAO 控制器Controller中常用的注解: @RequestMapping 它用来处理请求地址映射的注解, 可用在类或方法上。 如果用在类上,则表示类中的所有响应请求的方法都以该地址作为父路径; RequestMapping 注解有6个属性:- value :指定请求的地址
- method :指定请求的 method 类型-GET 、HEAD、 POST、 PUT、 PATCH、 DELETE、 OPTIONS、 TRACE
- consumes :消费消息,指定处理请求的提交内容类型( Content-Type ),例如 application/json、text/html
- produces :生产消息,指定返回的内容类型。 仅当request 请求头中的 Accept 类型中包含该指定类型时才返回
- params :指定request 中必须包含某些参数值才让该方法处理请求。
- headers :指定request 中必须包含某些指定的 header 值才能让该方法处理请求
@RequestMapping(value = "/product/{id}" method = RequestMethod.GET) public String getProduct(@PathVaribale("id") String id){ Product product = productRepository.findById(id); System.out.println("产品id:"+ product.getld()); System.out.printin("产品名称:"+product.getTitle()); return "product/show"; }5.3.2 URL 映射到方法 URL (统一资源定位符)映射到方法,是通过注解@ RequestMapping 来处理的; URL映射真实就是用控制器定义访问的 URL 路径, 用户通过输入路径来访问某个方法 Spring Boot 还提供了更简洁的编写 URL 映射的方法,如@GetMapping(“/”),它等价于@ RequestMapping(value =”/”,method= RequestMethod.GET), 除此之外还有下面的写法。 ? @GetMapping :处理 GET 请求 ? @PostMapping : 处理 POST 请求 ? @DeleteMapping : 处理删除请求 ? @PutMapping :处理修改请求。 5.3.3 处理 HTTP 请求的方法 RequestMapping 的method 类型有 GE HEAD POST PUT PATCH DELETE OPTIONS TRACE 可以通过这些 method 来处理前端用不同方法提交的数据。 1. GET GET 方法是最常用的万法 GET 方法可以获取资源, 比如,以下代码用 GET万法根据 id来获取文章对象。
@GetMapping(”/{id}”)
public ModelAndView getArticle(@PathVariable("id") Integer id) throws Exception {
Article ticles = articleRepository.findById(id);
ModelAndView mav = new ModelAndView("article/show”);
mav.addObject("article", articles);
return mav;
}
2. DELETE
如果需要删除一个数据,根据 Restful 风格则需要使用 DELETE方法。在使用 Delete方法 删除资源时 要注意判断是否成功,因为返回的是 VOID 类型,一般有以下三个方法进行判断。- 使用 try catch exception :如果不发生异常,则默认为成功,但是这样并不好。
- 通过存储过程的返回值来判断是否正确执行:如果执行成功,则返回 1或大于0 的值;如果执行失败,则返回0
- 在执行 DELETE 方法前先查询是否有数据:在执行 DELETE 方法后返回值是 0,所以,一般先查询 一下是否有数据。
?GET在浏览器中可以回退,而POST 访问同一个地址时也是再次提交请求 ?GET请求会被浏览器主动缓存,而 POST 则不会 ?GET中的参数会被完整地保留在浏览器历史记录里,而 POST 中的参数则不会t1呆留 ?GET只能进行 URL 编码,而 POST 支持多种编码方式 ?GET只接收 ASCII字符,而 POST 没有限制 ?GET的安全性相比POST 低,因为参数直接暴露在 URL上,所以不能用它传遂敏感信息 ?GET 的参数是通过URL 传递的,而 POST 的参数是放在request body 中的 但是,以上这些都不是绝对的,比如 POST 也可以通过 URL 路径提交参数
4. PUT
如果对象需要更新, 则用 PUT方法发送请求。 5. PATCH PATCH 是一个新引入的方法,是对 PUT 万洁的补充,用来对己知资源进行局部更新。很多人对这个方法不太理解 , 因为使用 PUT和 PATCH 方法都能成功,导致不太理解什么叫局部更新。下面以更新 set对象来理解它们的区别。 Use 「对象有 id name passwo rd se 等属性。如果只需要修改 name 的值,则此时的更 新操作就 以用 PATC 元;去。 但是在大多数的应用程序中 ,很多人都会使用 PUT 方法提交完整的 Use「对象给后端。这种做