热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springboot新手入门之web开发

文章目录1.简单功能分析1.1静态资源访问1.1.1、静态资源目录1.1.2、静态资源访问前缀1.1.3、webjar1.2、欢迎页支持1.3、自定义Favicon2.请求参数处理

文章目录

  • 1.简单功能分析
    • 1.1静态资源访问
      • 1.1.1、静态资源目录
      • 1.1.2、静态资源访问前缀
      • 1.1.3、webjar
    • 1.2、欢迎页支持
    • 1.3、自定义 Favicon
  • 2.请求参数处理
    • 2.1请求映射
      • 2.1.1Rest使用
      • 2.1.2rest原理
      • 2.1.2请求映射原理
    • 2.2普通参数与基本注解
      • 2.2.1、注解:
      • 2.2.2自定义对象参数
  • 3.响应处理与内容协商
    • 3.1响应json
      • 3.1.1、jackson.jar+@ResponseBody
        • 原理
      • 3.1.2、SpringMVC到底支持哪些返回值


1.简单功能分析

1.1静态资源访问


1.1.1、静态资源目录

只要静态资源放在类路径下: called /static (or /public or /resources or /META-INF/resources
访问 : 当前项目根路径/ + 静态资源名
原理: 静态映射/**。
结构如下图
在这里插入图片描述

请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面

改变默认的静态资源路径(默认的直接写路径即可)

spring:mvc: #访问前缀·static-path-pattern: /res/** /resources: #静态资源static-locations: [classpath:/haha/]

1.1.2、静态资源访问前缀

默认无前缀

spring:mvc:static-path-pattern: /res/**

当前项目 + static-path-pattern + 静态资源名 = 静态资源文件夹下找

1.1.3、webjar

自动映射 /webjars/**

https://www.webjars.org/<dependency><groupId>org.webjarsgroupId><artifactId>jqueryartifactId><version>3.5.1version>dependency>

访问地址&#xff1a;http://localhost:8080/webjars/jquery/3.5.1/jquery.js 后面地址要按照依赖里面的包路径

1.2、欢迎页支持

• 静态资源路径下 index.html
• 可以配置静态资源路径
• 但是不可以配置静态资源的访问前缀。否则导致 index.html不能被默认访问

spring:
# mvc:
# static-path-pattern: /res/** 这个会导致welcome page功能失效resources:static-locations: [classpath:/haha/]

• controller能处理/index

1.3、自定义 Favicon

即页面访问的图标
favicon.ico 放在静态资源目录下即可。

2.请求参数处理

2.1请求映射


2.1.1Rest使用

Rest风格支持&#xff08;使用HTTP请求方式动词来表示对资源的操作&#xff09;

  • 以前&#xff1a;
    /getUser      获取用户
    /deleteUser      删除用户
    /updateuser      修改用户
    /saveUser      保存用户
  • 现在&#xff1a; /user GET-获取用户     DELETE-删除用户     PUT-修改用户     POST-保存用户
  • 核心Filter&#xff1b;HiddenHttpMethodFilter
               • 用法&#xff1a; 表单method&#61;post&#xff0c;隐藏域 _method&#61;put
               • SpringBoot中手动开启
    代码实现
    前端代码

DOCTYPE html>
<html lang&#61;"en">
<head><meta charset&#61;"UTF-8"><title>Spring-Boottitle>
head>
<body>
欢迎来到spring-Boot
<br>
<b>ResFul风格测试b>
<form action&#61;"user" method&#61;"get"><input type&#61;"submit" value&#61;"Get提交">
form>
<form action&#61;"user" method&#61;"post"><input type&#61;"submit" value&#61;"Post提交">
form>
<form action&#61;"user" method&#61;"post"><input name&#61;"_method" value&#61;"delete" type&#61;"hidden" ><input type&#61;"submit" value&#61;"delete提交">
form>
<form action&#61;"user" method&#61;"post"><input name&#61;"_method" value&#61;"put" type&#61;"hidden"><input type&#61;"submit" value&#61;"Post提交">
form>
body>
html>

后台实现

package springboot.day01.controller;import org.springframework.web.bind.annotation.*;&#64;RestController
public class HollowControler {// &#64;RequestMapping(value &#61; "/user",method &#61; RequestMethod.GET)&#64;GetMapping("/user")public String getUser(){return "Get_张三";}// &#64;RequestMapping(value &#61; "/user",method &#61; RequestMethod.POST)&#64;PostMapping("/user")public String saveUser(){return "Post_张三";}// &#64;RequestMapping(value &#61; "/user",method &#61; RequestMethod.PUT)&#64;PutMapping("/user")public String putUser(){return "Put_张三";}// &#64;RequestMapping(value &#61; "/user",method &#61; RequestMethod.DELETE)&#64;DeleteMapping("/user")public String deleteUser(){return "Delete_张三";}}

核心配置
在application.yaml中

spring:mvc:hiddenmethod:filter:enabled: true

2.1.2rest原理

Rest原理&#xff08;表单提交要使用REST的时候&#xff09;
• 表单提交会带上_method&#61;PUT
• 请求过来被HiddenHttpMethodFilter拦截
• 请求是否正常&#xff0c;并且是POST
• 获取到_method的值。
• 兼容以下请求&#xff1b;PUT.DELETE.PATCH
• 原生request&#xff08;post&#xff09;&#xff0c;包装模式requesWrapper重写了getMethod方法&#xff0c;返回的是传入的值。
• 过滤器链放行的时候用wrapper。以后的方法调用getMethod是调用requesWrapper的。

2.1.2请求映射原理


  • 所有的请求映射都在HandlerMapping中。
  • SpringBoot自动配置欢迎页的 WelcomePageHandlerMapping 。访问 /能访问到index.html&#xff1b;
  • SpringBoot自动配置了默认 的 RequestMappingHandlerMapping
  • 请求进来&#xff0c;挨个尝试所有的HandlerMapping看是否有请求信息。
    • 如果有就找到这个请求对应的handler
    • 如果没有就是下一个 HandlerMapping

2.2普通参数与基本注解


2.2.1、注解&#xff1a;

&#64;pathvariable(路径变量)
&#64;RequestHeader(获取请求头)
&#64;RequestParam(获取请求参数)
&#64;RequestValue(获取COOKIE值)
&#64;RequestAttriable(获取request域属性)
&#64;RequestBody(获取请求体&#xff0c;只用于post请求)
&#64;MatriVariable(矩阵变量)

代码实现
html

DOCTYPE html>
<html lang&#61;"en">
<head><meta charset&#61;"UTF-8"><title>Spring-Boottitle>
head>
<body>
欢迎来到spring-Boot
测试基本注解
<ul><a href&#61;"car/3/owner/张三?name&#61;张三&age&#61;18">&#64;pathvariable(路劲变量)a><a href&#61;"">&#64;RequestHeader(获取请求头)a><a href&#61;"">&#64;RequestParam(获取请求参数)a><a href&#61;"">&#64;RequestValue(获取COOKIE值)a><a href&#61;"">&#64;RequestAttriable(获取request域属性)a><a href&#61;"">&#64;RequestBody(获取请求体)a><a href&#61;"">&#64;MatriVariable(矩阵变量)a>
ul>
<br>
<form method&#61;"post" action&#61;"useracc">用户名:<input type&#61;"text" name&#61;"username"><br>密码:<input type&#61;"password" name&#61;"password"><br><input type&#61;"submit" value&#61;"提交">
form>
body>
html>

java

package springboot.day01.controller;import org.springframework.web.bind.annotation.*;import javax.servlet.http.COOKIE;
import java.util.HashMap;
import java.util.Map;&#64;RestController
public class ParameterTextcontroller {&#64;GetMapping("/car/{id}/owner/{username}")public Map<String,Object> getcar(&#64;PathVariable("id") Integer id,&#64;PathVariable("username") String username,&#64;PathVariable Map<String,String>pv,&#64;RequestHeader("Host") String host,&#64;RequestHeader Map<String,String> heahers,&#64;RequestParam("name") String name,&#64;RequestParam("age") int age){Map<String,Object> map&#61;new HashMap<>();map.put("id",id);map.put("username",username);map.put("pv",pv);map.put("host",host);map.put("name",name);map.put("age",age);
// map.put("headers",heahers);
// System.out.println(COOKIE);return map;}&#64;PostMapping("/useracc")public String PostMapp(&#64;RequestBody String context){return context;}
}

&#64;RequestAttribute测试

package springboot.day01.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;&#64;Controller
public class RequestController {&#64;RequestMapping("/attr")public String attr(HttpServletRequest request){request.setAttribute("user","张三");request.setAttribute("age",18);return "forward:success";}&#64;RequestMapping("/success")&#64;ResponseBodypublic void success(&#64;RequestAttribute("user") String user,&#64;RequestAttribute("age") int age,HttpServletRequest request){System.out.println(user);System.out.println(age);String user1 &#61; (String) request.getAttribute("user");int age1 &#61;(int) request.getAttribute("age");System.out.println(user1);System.out.println(age1);}
}

2.2.2自定义对象参数

可以自动类型转换与 格式化&#xff0c;可以级联封装
样例
Pet类

package com.blb.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;&#64;Data
&#64;ToString
&#64;AllArgsConstructor
&#64;NoArgsConstructor
public class Pet {private String name;private String age;}

person类

package com.blb.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;&#64;Data
&#64;ToString
&#64;AllArgsConstructor
&#64;NoArgsConstructor
public class Person {private String userName;private Integer age;private Pet pet;}

前端

DOCTYPE html>
<html lang&#61;"en">
<head><meta charset&#61;"UTF-8"><title>Titletitle>
head>
<body>
测试封装POJO
<form action&#61;"/saveuser" method&#61;"post">姓名:<input type&#61;"text" name&#61;"userName"><br>年龄:<input type&#61;"text" name&#61;"age"><br>宠物姓名:<input type&#61;"text" name&#61;"pet.name"><br>宠物年龄:<input type&#61;"text" name&#61;"pet.age"><br><input type&#61;"submit" value&#61;"提交" >
form>body>
html>

controller端

package com.blb.Conreoller;import com.blb.entity.Person;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;&#64;RestController
public class PersonController {&#64;PostMapping("/saveuser")public Person saveuser(Person person){System.out.println(person);return person;}
}

3.响应处理与内容协商

数据响应的分类&#xff1a;响应页面、响应数据&#xff08;json、xml、xls、图片、音频、自定义协议数据&#xff09;

3.1响应json


3.1.1、jackson.jar&#43;&#64;ResponseBody

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
web场景自动引入了json场景<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-json</artifactId><version>2.3.4.RELEASE</version><scope>compile</scope></dependency>

给前端返回json数据
1.返回值解析器
在这里插入图片描述

原理

1、返回值处理器判断是否支持这种类型返回值 supportsReturnType
2、返回值处理器调用 handleReturnValue 进行处理
3、RequestResponseBodyMethodProcessor 可以处理返回值标了&#64;ResponseBody 注解的。

  • . 利用 MessageConverters 进行处理 将数据写为json
  • 内容协商&#xff08;浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型&#xff09;
  • 服务器最终根据自己自身的能力&#xff0c;决定服务器能生产出什么样内容类型的数据&#xff0c;
  • SpringMVC会挨个遍历所有容器底层的 HttpMessageConverter &#xff0c;看谁能处理&#xff1f;
    • 1、得到MappingJackson2HttpMessageConverter可以将对象写为json
    • 2、利用MappingJackson2HttpMessageConverter将对象转为json再写出去。

3.1.2、SpringMVC到底支持哪些返回值


  • ModelAndView
  • Model
  • View
  • ResponseEntity
  • ResponseBodyEmitter
  • StreamingResponseBody
  • HttpEntity
  • HttpHeaders
  • Callable
  • DeferredResult
  • ListenableFuture
  • CompletionStage
  • WebAsyncTask
    有 &#64;ModelAttribute 且为对象类型的
    &#64;ResponseBody 注解 为RequestResponseBodyMethodProcessor&#xff1b;

推荐阅读
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 解决文件名过长下载失败问题的jQuery方案
    本文介绍了使用jQuery解决文件名过长导致下载失败的问题。原方案中存在文件名部分丢失的问题,通过动态生成隐藏域表单并提交的方式来解决。详细的解决方案和代码示例在文章中给出。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
author-avatar
xiaodubo1R
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有