在记录这次控制器编写前,对于Spring的感觉就是经常提这样代码好简洁,这样好方便,这个是用来干嘛的诸如之类的话。

What is Spring ?这是我想问自己的,一直认为是简化代码利于工程的开源框架,还不够。里面包含的太多了,人称Spring全家桶可不是闹着玩的。。。。。。

毕竟入门,先来区分一下这三者:Spring MVC和Spring Boot都属于Spring,Spring MVC 是基于Spring的一个 MVC 框架,而Spring Boot 是基于Spring的一套快速开发整合包,详细点的话可以看简书上的这篇文章 https://www.jianshu.com/p/42620a0a2c33,  个人理解是Spring Boot 就是 Spring 的plus版本,那么SpringMVC呢?

  • M 代表 模型(Model)
    模型是什么呢?我想到了固定的这个词, 模型就是固定的数据,就是 dao,bean。这一层就是把相同的业务封装到一起,它的功能主要是做数据的持久化,就是跟数据库相关的操作。比如把老虎跟狮子的相关信息保存到数据库或从数据库取出或删除。
  • V 代表 视图(View)
    视图是什么呢? 就是网页, JSP,用来展示模型中的数据。用户可以通过可视化的页面把要请求的信息传递给后台然后返回想要的结果展示。
  • C 代表 控制器(controller)
    控制器是什么? 控制器的作用就是把不同的数据(Model),显示在不同的视图(View)上,Servlet 扮演的就是这样的角色。它就像是一个路由器,连接着视图页面和业务模块。根据不同的请求,它把用内户想要的信息从对应的业务模块获取然后反馈到不同的页面给用户或者是将请求转发给其他controller
    这么干说,没有一个逻辑过程是行不通的,先贴一张图,个人再阐述步骤。

   步骤如下:
   第一步,用户在浏览器操作时(比如提交一个订单),HTTP请求被捕获到了我们的DispatcherServlet中央控制器!
   
   第二步,这个中央控制器通过我们的XML配置文件找到HandlerMapping映射处理器,从而找到处理请求的Controller后端控制器。(控制器是处理器的一种)
   
   第三步,DispatcherServlet找到Controller后,就把处理过的请求转交给它了,Controller负责处理业务逻辑(只是决定发给哪个Model来处理!控制控制!),经过Model处理后返回数据(ModelAndView)给DispatcherServlet。(比如提示商家已经接单!!)
 
   第四步,DispatcherServlet传给ViewReslover视图解析器进行解析,再将具体的View传回给DispatcherServlet,再根据具体的View进行渲染(将模型数据填充到视图中)
   
   第五步,HTTP响应回到用户了!(关于这套流程,如以后继续学习发现自己理解有偏差,会回来改!)
   over!
   好了,下面开始控制器Controller的编写:
 
 package tacos.web;

 import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.validation.Errors;
import lombok.extern.slf4j.Slf4j;
import tacos.Ingredient;
import tacos.Ingredient.Type;
import tacos.Taco;
@Slf4j
@Controller
@RequestMapping("/design") //类级别注解
public class DesignTacoController { @GetMapping
public String showDesignForm(Model model) {
List<Ingredient> ingredients= Arrays.asList(
new Ingredient("MEDIUM","Medium",Type.COMPONENT),
new Ingredient("SMALL","Small",Type.COMPONENT),
new Ingredient("BIG","Big",Type.COMPONENT), //份量
new Ingredient("MILD","Mild",Type.FLAVOR),
new Ingredient("HOT","Hot",Type.FLAVOR),
new Ingredient("MEDIUM","Medium",Type.FLAVOR), //口味
new Ingredient("BBALL","Beefball",Type.SIDEDISH),
new Ingredient("FANS","Fans",Type.SIDEDISH),
new Ingredient("POT","Potato",Type.SIDEDISH),
new Ingredient("SAU","Sausage",Type.SIDEDISH),
new Ingredient("COR","Coriander",Type.SIDEDISH),
new Ingredient("COLA","Cola",Type.DRINK),
new Ingredient("JUICE","Juice",Type.DRINK),
new Ingredient("WATER","Water",Type.DRINK)
); Type[] types = Ingredient.Type.values();
for(Type type : types) {
model.addAttribute(type.toString().toLowerCase(),
filterByType(ingredients, type));
}
model.addAttribute("design",new Taco());
return "design";
} private List<Ingredient> filterByType(List<Ingredient> ingredients, Type type){
return ingredients
.stream()
.filter(x -> x.getType().equals(type))
.collect(Collectors.toList());
//stream方法获取指向当前Collection对象的流对象,filter将对流中元素进行过滤
//结合lambda表达式,需要在filter参数中实现一个类似于比较器的Predicate对象,返回一个boolean类型返回值
//只有返回为true的Collection中的元素才会进入到list中。
} @PostMapping
public String processDesign(Taco design) {
log.info("processing design:" +design);
return "redirect:/orders/current";
} }

这里首先想对几个注解做一下解释说明

@Sl4j:这是一个日志类库注解。

@Controller:这里想与@RestController用法做个对比,当你想要返回一个视图的时候应该用前者@Controller,而单纯的返回字符串应该用后者。有关JSON类型数据等自己在Spring中运用到再进行补充。

@RequestMapping(" "):这个开始我自动划到黑魔法,现在熟练度提升一点:当启动项目后,在浏览器地址栏访问8080时,所需要的路径,也就是后面应该跟的html文件名(也就是return 返回的视图名,这里特地注意:.html的文件名应该与前两者统一!!!     当初本人就是不细心花费了大半天时间才发现文件名手抖打错了)

其中的一些基础foreach,枚举泛型等在此就不过多阐述。还有倒数第二个方法可以留意一下,注释已经给出。

对于此项目这个控制器的讲解目前到这了,等用到后面,会对整个控制器来个大礼包。

现在都是逻辑处理,下一篇我们就可以验收一个小成果了(张伟别打我)

Spring Taco Cloud——Controller的创建(含SpringMVC执行过程&SpringBoot&Spring三者解释及关联)的更多相关文章

  1. 深入源码分析SpringMVC执行过程

    本文主要讲解 SpringMVC 执行过程,并针对相关源码进行解析. 首先,让我们从 Spring MVC 的四大组件:前端控制器(DispatcherServlet).处理器映射器(HandlerM ...

  2. 浅谈SpringMVC执行过程

    通过深入分析Spring源码,我们知道Spring框架包括大致六大模块, 如Web模块,数据库访问技术模块,面向切面模块,基础设施模块,核心容器模块和模块, 其中,在Spring框架的Web模块中,又 ...

  3. SpringMVC系列(十五)Spring MVC与Spring整合时实例被创建两次的解决方案以及Spring 的 IOC 容器和 SpringMVC 的 IOC 容器的关系

    一.Spring MVC与Spring整合时实例被创建两次的解决方案 1.问题产生的原因 Spring MVC的配置文件和Spring的配置文件里面都使用了扫描注解<context:compon ...

  4. Spring Taco Cloud——design视图的创建(含thymeleaf模板遇到的一些小问题)

    先来看下综合前两篇内容加上本次视图的成果   可能不是很美观,因为并没有加css样式,我想等整个项目有个差不多的功能实现后再进行页面优化,请谅解 下面我贴上自己定义修改过的Taco的design视图代 ...

  5. Spring Taco Cloud——配料表(Lombok的安装及其注解)

    先简单概括下这个项目:外卖订餐平台Web,这个是承接我的这篇博文来续写的https://www.cnblogs.com/yycjavastudy/articles/12666104.html,在这一篇 ...

  6. Spring Boot 使用Java代码创建Bean并注冊到Spring中

    从 Spring3.0 開始,添加了一种新的途经来配置Bean Definition,这就是通过 Java Code 配置 Bean Definition. 与Xml和Annotation两种配置方式 ...

  7. SpringMvc执行过程

    --Test过程: 1. 先执行各种 Filter 2. HttpServlet.service(ServletRequest req, ServletResponse res) 3. HttpSer ...

  8. spring boot / cloud (十二) 异常统一处理进阶

    spring boot / cloud (十二) 异常统一处理进阶 前言 在spring boot / cloud (二) 规范响应格式以及统一异常处理这篇博客中已经提到了使用@ExceptionHa ...

  9. spring boot&&cloud干货系列

    接触spring boot也有些时日了,刚开始博主还想参照官方参考指南自己写一个系列的入门式的教程,包含spring boot的所有模块的用法,后来发现,有一大波优秀的系列文章和项目了,所以就没班门弄 ...

随机推荐

  1. flink RPC(akka)

    flink中的rpc框架使用的akka.在本节并不详细讲述akka,而是就flink中rpc来讲述akka的部分内容.本节,我从AkkaRpcActor.handleRpcInvocation方法讲起 ...

  2. 《前端之路》 - 初试 TypeScript(一)基础数据类型

    一.先讲讲 TypeScript 什么是 typeScript ? typeScript 是 Javascript 的超集 我们用一张图来简单介绍下 ts 和 js 清清楚楚明明白白的关系- 为什么会 ...

  3. Simulink仿真入门到精通(十一) 模块的封装

    当用户编写了自定义的S函数或者使用Simulink标准库中的模块搭建子系统后,可以通过封装为其设计显示外观,追加参数对话框. 封装是构建一个以对话框为接口的交互界面的过程,它将复杂的模块逻辑关系隐藏起 ...

  4. Drf 序列化 ModelSerializer跨表取数据

    1.对于OneToOne.Foreignkey.choices字段可以使用source取出相关信息: class CourseSerializer(serializers.ModelSerialize ...

  5. element UI中的tab切换栏

    html代码:(用的是el-tab组件) <el-tabs v-model="activeIndex" type="border-card" @tab-c ...

  6. (转)GNU风格ARM汇编语法指南(非常详细)4

    原文地址:http://zqwt.012.blog.163.com/blog/static/12044684201011148226622/ 4.GNU汇编语言定义入口点 汇编程序的缺省入口是_sta ...

  7. SpringMvc @Validated注解执行原理

    @Validated和@Valid对比 Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),j ...

  8. WxPython 4.0.4多线程访问UI

    最开始做框架的时候的需求就是多线程访问UI,以前在.NET WPF使用MVVM和数据驱动很容易做到,在JavaSwing中使用另类的观察者模式也实现了.在WxPython中使用观察者模式直接程序崩溃, ...

  9. [转载] 全局键盘钩子(WH_KEYBOARD)

    为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找. KeyBoardHook.dll代码 libr ...

  10. [Docker4] Docker-machine进行多docker host管理

    Docker Machine Docker machine就是自动化安装docker daemon Docker machine的provider docker machine provider 常见 ...