运维开发网

零到熟练的数据和页面响应

运维开发网 https://www.qedev.com 2022-05-21 18:29 出处:网络
SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架

SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架


1 数据响应


emspemsp数据响应一般分为两种:页面响应和数据响应。一般来说,页面响应用于开发一些单个项目(即前端和后端都在一个开发工具中),而数据响应用于分离前后端。前端发送它们来请求后端响应相应的数据。


1.1 数据响应(JSON为例)

emspemsp如果希望SpringMVC响应返回一个JSON类型的数据,首先需要在项目的pom.xml文件中导入web场景的启动器。

lt;dependencygt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-starter-weblt;/artifactIdgt;lt;/dependencygt;lt;!--web场景的启动器的底层导入了JSON的开发场景--gt;lt;dependencygt;lt;groupIdgt;org.springframework.bootlt;/groupIdgt;lt;artifactIdgt;spring-boot-starter-jsonlt;/artifactIdgt;lt;versiongt;2.6.4lt;/versiongt;lt;scopegt;compilelt;/scopegt;lt;/dependencygt;

emspemsp其次,在控制器中添加@ResponseBody批注,使其响应数据而不是页面跳转,或者将控制器上的@Controller批注改为@RestController,相当于自动将@ResponseBody批注添加到该控制器下的所有方法中。



1.2 数据响应之内容协商

内容协商:服务器会根据客户端接收能力的不同,返回不同媒体类型的数据。

原理:前端发送请求时,请求头携带Accept字段,服务器用它来声明它(客户端)可以接收的数据类型。

处理流程:首先判断之前处理中缓存的媒体类型是否已经存在于当前响应头中。如果没有,则是第一次处理需要确定的媒体类型,通过Accept字段获取客户(邮差、浏览器)支持的内容类型。遍历当前系统的所有MessageConverter,看谁支持这个对象(Person)的操作,找到支持Person操作的转换器,统计它支持的媒体类型。这样,我们可以得到客户端支持接受的类型和服务器可以返回的类型。然后,通过内容协商的最佳匹配媒体类型,我们可以使用support将对象转换为最佳匹配媒体类型转换器。


2 页面响应

emspemspSpringBoot默认的打包方式是jar包,但是JSP不支持在jar包(一个压缩包)中编译,所以SpringBoot默认不支持JSP,所以需要引入第三方模板引擎技术;;百里香实现了页面的渲染。


2.1 模板引擎之Thymeleaf

emspemsp如果想用百里香叶渲染页面,首先需要在pom.xml文件中引入它的场景启动器依赖。

lt;dependencygt;lt;groupIdgt;org.springframework.bootlt;/groupIdgt;lt;artifactIdgt;spring-boot-starter-thymeleaflt;/artifactIdgt;lt;/dependencygt;

emspemsp导入场景启动器后,SpringBoot会为我们配置ThymeleafAutoConfiguration类中的所有相关组件,并通过注释@EnableConfigurationProperties将相关配置项与ThymeleafProperties.class(下面的代码)关联起来。默认页面跳转的前缀和后缀是在配置中设置的,这意味着页面存储位置必须是templates文件夹,页面的文件后缀必须是。html。我们只需要直接开发页面。

private String prefix = "classpath:/templates/";private String suffix = ".html";

介绍案例

步骤1:在templates文件夹下创建一个html文件。

第二步:lt;htmlgt标签模板命名为空,优点是编页码时会有相关提示信息。

xmlns:th="http://www.thymeleaf.org"

步骤3:为页面跳转创建一个控制器。

@Controllerpublic class ViewTestController { @GetMapping("/jump") public String jumpTo(Model model) { // 之前讲过model的所有属性值都会存储在request域中,需要使用的时候直接使用 model.addAttribute("msg", "你好,张三"); model.addAttribute("link", "http://www.baidu.com"); return "seccess"; }}

步骤4:编写页面代码以获取域中的值。

lt;!DOCTYPE htmlgt;lt;html lang="en" xmlns:th="http://www.thymeleaf.org"gt;lt;headgt; lt;meta charset="UTF-8"gt; lt;titlegt;Titlelt;/titlegt;lt;/headgt;lt;bodygt; lt;h1 th:text="${msg}"gt;哈哈lt;/h1gt; lt;h2gt; lt;a th:href="${link}" rel="external nofollow" gt;点击进入百度lt;/agt; lt;a th:href="@{link}" rel="external nofollow" gt;点击进入百度lt;/agt; lt;/h2gt;lt;/bodygt;lt;/htmlgt;


?emsp页面中两个符号的区别:$ {0}是直接获取链接属性的值作为链接地址,而@ {0}是组装项目的访问路径+符号中的值。本例中,第一个链接是打开百度,第二个是发送http://localhost:8080/link的请求。


2.2 拦截器

emspemsp用户登录成功后,发送任何请求都要有一个登录判断过程(判断会话中是否有正确的用户名和密码)。这个函数可以通过每个控制器中的代码来判断,但是这个过程的重复会大大增加代码的冗余度,所以我们可以把判断函数放在拦截器中,拦截成功登录后页面发来的所有请求供用户判断,如果成功则返回登录。以上面的例子为例来解释拦截器的使用:

第一步:定制拦截器(实现HandlerInterceptor接口,重写内置方法,在相应的方法中编写判断逻辑)

public class LoginInterceptor implements HandlerInterceptor { // 在目标方法执行之前执行的方法 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 实现登录检查的逻辑 HttpSession session = request.getSession(); Object user = session.getAttribute("loginUser"); if (user != null) { // 已经登录,放行 return true; } // 未登录,重定向到登录页面 request.setAttribute("msg", "请先登录之后再进行相关操作"); request.getRequestDispatcher("/").forward(request, response); return false; } // 在目标方法执行之后执行的方法 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } // 页面渲染之后执行的方法 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }}

步骤2:自定义配置类以实现WebMvcConfigurer接口,重写addInterceptors方法以将拦截器注册到容器中,并指定拦截规则。

@Configurationpublic class AdminWebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 有个问题就是,拦截器拦截的不只是动态请求,还有静态的页面资源和样式,所以也要将静态资源放行 registry.addInterceptor(new LoginInterceptor()) // 拦截所有的请求 .addPathPatterns("/**") // 直接放行的请求 .excludePathPatterns("/", "/login", "/css/**", "/fonts/**", "/js/**", "/images/**"); }}


2.3 文件上传

emspemsp上传文件需要前端和后端的协调。前端使用表单形式提交所有信息,包括单文件上传和多文件上传。后端使用注释获取表单中的所有值,并对它们进行操作。前端表单:

lt;form role="form" th:action="@{/upload}" method="post" enctype="multipart/form-data"gt;lt;!--email邮箱--gt; lt;div class="form-group"gt; lt;label for="exampleInputEmail1"gt;Email addresslt;/labelgt; lt;input type="email" name="email" class="form-control" id="exampleInputEmail1" placeholder="Enter email"gt; lt;/divgt; lt;!--userName用户名--gt; lt;div class="form-group"gt; lt;label for="exampleInputPassword1"gt;userNamelt;/labelgt; lt;input type="text" name="userName" class="form-control" id="exampleInputPassword1" placeholder="Password"gt; lt;/divgt; lt;!--单文件上传 头像--gt; lt;div class="form-group"gt; lt;label for="exampleInputFile"gt;headerImglt;/labelgt; lt;input type="file" name="headerImg" id="exampleInputFile"gt; lt;/divgt; lt;!--多文件上传 生活照--gt; lt;div class="form-group"gt; lt;label for="exampleInputFile"gt;image of yourselflt;/labelgt; lt;input type="file" name="photos" multiple gt; lt;/divgt; lt;div class="checkbox"gt; lt;labelgt; lt;input type="checkbox"gt; Check me out lt;/labelgt; lt;/divgt; lt;button type="submit" class="btn btn-primary"gt;Submitlt;/buttongt;lt;/formgt;

后端控制器:

@PostMapping("/upload")public String upload(@RequestParam("email") String email, @RequestParam("userName") String userName, @RequestPart("headerImg")MultipartFile headerImg, @RequestPart("photos")MultipartFile[] photos) throws IOException { // 将头像保存到本地磁盘中 if (!headerImg.isEmpty()) { // 创建相应的文件夹 File file1 = new File("E:\\bootTest\\" + userName + "\\headerImg"); file1.mkdirs(); // 获取图片名 生成存储路径 headerImg.transferTo(new File("E:\\bootTest\\" + userName + "\\headerImg\\" + headerImg.getOriginalFilename())); } // 将生活照保存到本地磁盘中 if (photos.length gt; 0) { // 创建相应的文件夹 File file1 = new File("E:\\bootTest\\" + userName + "\\photos"); file1.mkdirs(); // 存储图片 for (MultipartFile photo:photos) { if (!photo.isEmpty()) { // 获取图片名 生成存储路径 photo.transferTo(new File("E:\\bootTest\\" + userName + "\\photos\\" + photo.getOriginalFilename())); } } } return "index";}

文件上传的配置:

#文件上传大小的设置
Spring:
servlet:
multipart:
#单个文件的最大大小
Max-file-size:50mb
#总文件的最大大小
]

这就是这篇关于SpringBoot2从零基础到精通的数据和页面响应的文章。关于SpringBoot2数据响应的更多信息,请搜索源搜网之前的文章或者继续浏览下面的相关文章。

0

精彩评论

暂无评论...
验证码 换一张
取 消