SpringBoot开发三
需求介绍-SpringMVC
服务层的三层架构:表现层,业务层,数据层,浏览器访问服务器先访问表现层,期待表现层返回一些数据,表现层呢就访问业务层处理业务,而业务层在处理业务的时候会调用数据层请求数据和处理数据.

SpringMVC 是一种设计模式,也是分为三层。

使用的核心组件是:DispatcherServlet.

ViewresResolver:视图解析视图层
HandleMapping:处理映射的一个组件,我们敲一个路径与Controller相匹配。
更细节的可以看:

MVC 架构的优缺点:
优点
- 开发人员可以只关注整个结构中的其中某一层;
- 可以很容易的用新的实现来替换原有层次的实现;
- 可以降低层与层之间的依赖;
- 有利于标准化;
- 利于各层逻辑的复用。
- 扩展性强。不同层负责不同的层面
缺点:
- 降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
- 有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码
- 增加了代码量,增加了工作量
SpringMVC的流程
- 发起请求到前端控制器(DispatcherServlet)
- 前端控制器请求 HandlerMapping 查找 Handler (可以根据xml配置、注解进行查找)
- 处理器映射器 HandlerMapping 向前端控制器返回 Handler,HandlerMapping 会把请求映射为HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象,多个 HandlerInterceptor对象),通过这种策略模式,很容易添加新的映射策略
- 前端控制器调用处理器适配器去执行 Handler
- 处理器适配器 HandlerAdapter 将会根据适配的结果去执行 Handler
- Handler 执行完成给适配器返回 ModelAndView
- 处理器适配器向前端控制器返回 ModelAndView (ModelAndView 是 springmvc 框架的一个底层对象,包括 Model 和 view)
- 前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可
- 视图解析器向前端控制器返回 View
- 前端控制器进行视图渲染 (视图渲染将模型数据(在 ModelAndView 对象中)填充到 request 域)
- 前端控制器向用户响应结果
然后码一个实现的 MVC 的代码有助理解一下
首先要理解怎么获取请求对象和响应对象以及如何确定发送方法:
第一个返回请求对象的结果

使用Post的方法的时候,需要html提交表单,那么对应的网页的数据的名字要和Controller的对应方法获取参数名字要相同
student.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>增加学生</title>
</head>
<body> <form method="post" action="/community/alpha/student">
<p>
姓名: <input type="text" name="name">
</p>
<p>
年龄: <input type="text" name="age">
</p>
<p>
<input type="submit" name="保存">
</p>
</form> </body>
</html>
如果你要返回一个动态的html的话就需要把数据传到模板文件上,
<!DOCTYPE html>
<html lang="en" xmlns:th="https://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Teacher</title>
</head>
<body>
<!-- 这里面取到的数据就是在Controller里面的方法传到这里才能正确的取到-->
<p th:text="${name}"></p>
<p th:text="${age}"></p> </body>
</html>
那么对应的方法我们就写到Controller文件里面,具体的实现的代码的方法就如下
AlphaController:
package com.nowcoder.community.controller; import com.nowcoder.community.service.AlphaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*; @Controller
@RequestMapping("/alpha")
public class AlphaController { @Autowired
private AlphaService alphaService; @RequestMapping("/hello")
@ResponseBody
public String sayHello() {
return "Hello Spring Boot.";
} @RequestMapping("/data")
@ResponseBody
public String getData() {
return alphaService.find();
} @RequestMapping("/http")
public void http(HttpServletRequest request, HttpServletResponse response) {
//获取请求
System.out.println(request.getMethod());
System.out.println(request.getServletPath());
//消息头
Enumeration<String> enumeration = request.getHeaderNames();
while (enumeration.hasMoreElements()) {
String name = enumeration.nextElement();
String value = request.getHeader(name);
System.out.println(name + ": " + value);
}
System.out.println(request.getParameter("code")); //给浏览器返回响应数据
response.setContentType("text/html;charset=utf-8");
try (PrintWriter writer = response.getWriter()) {
writer.write("<h1>牛客网</h1>");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println();
} /**
* Get请求
*/
// /student?current=1&limit=2
// 看参数可以理解怎么把url后面带的参数给获取到,以及做更详细的说明
@RequestMapping(path = "/students", method = RequestMethod.GET)
@ResponseBody
public String getStudents(
@RequestParam(name = "current", required = false, defaultValue = "1") int current,
@RequestParam(name = "limit", required = false, defaultValue = "10") int limit) {
System.out.println(current);
System.out.println(limit);
return "some students.";
}
// /student/123
@RequestMapping(path = "/student/{id}", method = RequestMethod.GET)
@ResponseBody
public String getStudent(@PathVariable("id") int id) {
System.out.println(id);
return "a student.";
} /**
* POST请求
*/
@RequestMapping(path = "/student", method = RequestMethod.POST)
@ResponseBody
public String saveStudent(String name, int age) {
System.out.println(name);
System.out.println(age);
return "success";
} // 响应HTML数据
@RequestMapping(path = "/teacher", method = RequestMethod.GET)
public ModelAndView getTeacher() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name", "张三");
modelAndView.addObject("age", "30");
// 设置模板目录
modelAndView.setViewName("/demo/view");
return modelAndView;
} // 这个方法返回html的话,最后就需要return路径
@RequestMapping(path = "/school", method = RequestMethod.GET)
public String getSchool(Model model) {
model.addAttribute("name", "中南大学");
model.addAttribute("age", 21);
return "/demo/view";
} // 相应JSON数据(异步请求)
// Java对象-->Json对象-->JS对象 跨语言转换
@RequestMapping(path = "/emp", method = RequestMethod.GET)
@ResponseBody // 加上返回一个Body 否则就返回了一个html
public Map<String, Object> getEmp() {
Map<String, Object> map = new HashMap<>();
map.put("name","张三");
map.put("salary",8000);
map.put("age",30);
return map;
} @RequestMapping(path = "/emps", method = RequestMethod.GET)
@ResponseBody // 加上返回一个Body 否则就返回了一个html
public List<Map<String, Object>> getEmps() {
List<Map<String, Object>> list = new ArrayList<>(); Map<String, Object> map = new HashMap<>();
map.put("name", "张三");
map.put("salary", 8000);
map.put("age", 30);
list.add(map); map = new HashMap<>();
map.put("name", "李四");
map.put("salary", 10000);
map.put("age", 31);
list.add(map); map = new HashMap<>();
map.put("name", "王二");
map.put("salary", 12000);
map.put("age", 28);
list.add(map); return list;
}
}
SpringBoot开发三的更多相关文章
- 基于SpringBoot开发一个Restful服务,实现增删改查功能
前言 在去年的时候,在各种渠道中略微的了解了SpringBoot,在开发web项目的时候是如何的方便.快捷.但是当时并没有认真的去学习下,毕竟感觉自己在Struts和SpringMVC都用得不太熟练. ...
- SpringBoot开发案例从0到1构建分布式秒杀系统
前言 最近,被推送了不少秒杀架构的文章,忙里偷闲自己也总结了一下互联网平台秒杀架构设计,当然也借鉴了不少同学的思路.俗话说,脱离案例讲架构都是耍流氓,最终使用SpringBoot模拟实现了部分秒杀场 ...
- springmvc/springboot开发restful API
非rest的url写法: 查询 GET /user/query?name=tom 详情 GET /user/getinfo? 创建 POST /user/create?name=tom 修改 POST ...
- SpringBoot第三集:热部署与单元测试(2020最新最易懂)
SpringBoot第三集:热部署与单元测试(2020最新最易懂) 有兴趣的可以先参考附录简单了解SpringBoot自动装配流程. 一.SpringBoot开发热部署 项目开发中,你是否也遇到更新配 ...
- App开发三种模式
APP开发三种模式 现在App开发的模式包含以下三种: Native App 原生开发AppWeb App 网页AppHybrid App 混合原生和Web技术开发的App 详细介绍: http:// ...
- iOS开发三步搞定百度推送
iOS开发三步搞定百度推送 百度推送很简单,准备工作:在百度云推送平台注册应用,上传证书. 步骤一: 百度云推送平台 http://push.baidu.com/sdk/push_client_s ...
- 基于Spring MVC的Web应用开发(三) - Resources
基于Spring MVC的Web应用开发(3) - Resources 上一篇介绍了在基于Spring MVC的Web项目中加入日志,本文介绍Spring MVC如何处理资源文件. 注意到本项目的we ...
- Java Web高性能开发(三)
今日要闻: Clarifai:可识别视频中物体 最近几年,得益于深度学习技术的发展,谷歌和Facebook等企业的研究人员在图形识别软件领域取得了重大突破.现在,一家名为Clarifai的创业公司则提 ...
- C#的百度地图开发(三)依据坐标获取位置、商圈及周边信息
原文:C#的百度地图开发(三)依据坐标获取位置.商圈及周边信息 我们得到了百度坐标,现在依据这一坐标来获取相应的信息.下面是相应的代码 public class BaiduMap { /// < ...
随机推荐
- PHP获取文件扩展名的常用方法小结【五种方式】
方法1: function getExt1($filename) { $arr = explode('.',$filename); return array_pop($arr);; } ...
- Acunetix敏感的数据泄露–泄露如何发生
术语"敏感数据暴露"是指允许未授权方访问存储或传输的敏感信息,例如信用卡号或密码.全球范围内大多数重大安全漏洞都会导致某种敏感的数据泄露. Acunetix利用攻击漏洞(例如Web ...
- Flink进入大厂面试准备,收藏这一篇就够了
1. Flink 的容错机制(checkpoint) Checkpoint机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态 ...
- ESP32-FAT文件系统使用磨损均衡存储文件笔记
基于ESP-IDF4.1 1 /* 2 FAT文件系统存储文件,使用磨损均衡库wear-leveling 3 */ 4 5 #include <stdlib.h> 6 #include & ...
- Linux | 文件编辑命令
cat cat 命令是是一次性显示文件的所有内容 cat 是 concatenate 的缩写,表示:连接/串联 cat 文件名 可以看到,cat 命令是一次性显示出所有的文件内容,这就导致了,有的文件 ...
- 将make的输出(标准输出/标准错误输出)重定向到文件
方式 描述符 含义 stdin 0 标准输入 stdout 1 标准输出 stderr 2 标准错误输出 1.想要把make输出的全部信息,输出到某个文件中 最常见的办法就是:make xxx > ...
- 让我手把手教你写一个强大、方便使用的 IOC 容器
一.介绍 1.介绍 最近无聊,也没什么事做,没事做总是要给自己找点事情做吧,毕竟人的生活在与折腾.于是,决定自己手动写一个 IOC 的框架.我们知道在 NetCore 的版本里面已经内置了 IOC 容 ...
- 让5G技术“智慧”生活
1.通讯技术的发展历程 2.5G技术的指标和具体概述 3. 5G的三个关键技术及概述 4.5G的应用场景及业务及安全挑战 如果你认为5G带来的只是下载视频 ...
- adb 记录ADB执行记录
自动化测试需要获得当前的activity,来判断处于的页面是否正确: hierarchy view经常连不上真机,无法获得activity,所以直接用 adb命令来查看当前运行的 activity就可 ...
- 用Python分析下王小波与李银河写情书最爱用哪些词
作家王小波其实也是我国最早期的程序员,突发奇想,王小波写情书最喜欢用哪些词呢?用Python词云分析下! 直接上代码吧,有注释很好理解.输出的图片设置的比较大,所以运行的比较慢,可以适当把图片尺寸改小 ...