技术标签: spring Java spring boot java
我们勾选springweb的话,它会帮助我们下载springMVC相关的依赖
目录结构
我们新建一个controller的包,然后新建一个HelloController的类
这里@RestController会在下面控制器讲到
然后我们启动一下项目
找到spring boot的启动类,我们run即可
我们可以在浏览器运行一下
注意:浏览器只能接受get请求
端口我们可以进行更改
简单来说,@Controller用于前后端不分离的项目,例如JSP
这个return的hello返回的是一个html、或者是jsp,并不是单独的一个hello数据
默认情况下,@RestController注解会将返回的对象数据转换为JSON格式。
@RequestMapping注解主要负责URL的路由映射。它可以添加在Controller 类或者具体的方法上。
如果添加在Controller类上,则这个Controller中的所有路由映射都将会加上此映射规则,如果添加在方法上,则只对当前方法生效。
@RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则。常用的属性参数如下:
value:请求URL的路径,支持URL模板、正则表达式
method: HTTP请求方法
consumes:请求的媒体类型(Content-Type),如application/json
produces: 响应的媒体类型
params,headers: 请求的参数及请求头的值
二者等价
Method匹配
application/json
、application/xml
等类型的数据
我们进行一个参数的拼接
需要注意的是,这里的传参和我们接受的参数名字一定是一一对应的,要是对应的话,我们是接收不到的
这种情况我们可以加一个映射
但是这样的话,我们的参数就变为必传的了,那么怎么设置非必传呢
我们加上required = false即可
我们如果想发起post请求就不能通过浏览器直接发起请求了,需要通过第三方工具来发起,例如postman、apipost、apifox等
这里我就先用apipost了
我们通过@PostMapping注解来发送post请求
Post请求也是可以加参数的
Post请求的参数一般是放在请求体当中的
如果还是想放在参数里的话,也是可以的
如果我们的参数特别多,我们会放在一个对象当中
这就是我们想要的参数
注意如果没有重写对象的toString()方法,则会默认打印对象的地址。在这个例子中,打印出来的是User对象的地址,后面的一长串类似于“73018e8a”的字符就是该对象在内存中的地址,而不是对象的属性值。
所以我们加上tostring方法
这样就好了
有的时候,前端传过来的是json数据的格式,那么我们需要加一个RequestBody注解
使用IDEA创建Spring Boot项目,会默认创建出classpath:/static/目录,静态 资源一般放在这个目录下即可。
如果默认的静态资源过滤策略不能满足开发需求,也可以自定义静态资源过滤策略。
在application.properties中直接定义过滤规则和静态资源位置:
过滤规则为/static/**,静态资源位置为classpath:/static/
我们可以直接访问
创建目录
我们想让用户在浏览器当中访问到怎么做
这样就可以了
拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现。总结起来,拦截器大致有以下几种使用场景:
Spring Boot定义了HandlerInterceptor接口来实现自定义拦截器的功能
HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作
通常我们新建一个interceptor包,里面放拦截器的类
但是这样还不能生效,我们需要进行配置
新建config包,建立WebConfig类
这样的话,就会对user下的路径进行拦截
RESTful是目前流行的互联网软件服务架构设计风格。
每一个URI代表一种资源
客户端使用GET、POST、PUT、DELETE四种表示操作方式的动词对服务端资源进行操作
:GET用于获取资源,POST用于新建资源(也可以用于更新资源),PUT用于更新资源,DELETE用于删除资源。两个关键特性:
状态码分为以下5个类别:
@GetMapping:处理GET请求,获取资源。
@PostMapping:处理POST请求,新增资源。
@PutMapping:处理PUT请求,更新资源。
@DeleteMapping:处理DELETE请求,删除资源。
@PatchMapping:处理PATCH请求,用于部分更新资源。
package com.example.demo.demos.web.controller;
import com.example.demo.demos.web.entity.User;
import org.springframework.web.bind.annotation.*;
@RestController
public class UserController {
@GetMapping(value = "user/{id}")
public String getUserById(@PathVariable int id){
System.out.println(id);
return "根据ID获取用户信息";
}
@PostMapping(value = "/user")
public String save(User user){
return "添加用户";
}
@PutMapping(value = "/user")
public String update(User user){
return "更新用户";
}
@DeleteMapping(value = "/user/{id}")
public String deleteById(@PathVariable int id){
System.out.println(id);
return "根据ID删除用户";
}
}
Swagger能够自动生成完善的RESTful API文档,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。
<!-- Swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
package com.example.demo.demos.web.config;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Controller
@EnableSwagger2
@EnableWebMvc
public class SwaggerConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations(
"classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations(
"classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
WebMvcConfigurer.super.addResourceHandlers(registry);
}
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
// com包下所有API都交给Swagger2管理
.apis(RequestHandlerSelectors.basePackage("com"))
.paths(PathSelectors.any()).build();
}
API文档页面显示信息
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("演示项目")//标题
.description("学习")//描述
.version("1.0")//版本
.build();
}
}
最后访问:http://localhost:8080/swagger-ui.html即可
但是可能会乱码,所以可能需要加一个配置
这样就没问题了
Swagger提供了一系列注解来描述接口信息,包括接口说明、请求方法、请求 参数、返回信息等
当然,你可以用swagger-bootstrap-ui来换一种UI风格,具体的方法可以自行搜索
文章浏览阅读1k次。关于各类Python安装软件之间的关系(Python, Anaconda, Jupyter notebook和Pycharm)Python这里说的Python,就是最原生的Python,是我们学习Python所需要的最基本的环境。就像学习Java需要安装JDK一样。Python可以到Python官网(https://www.python.org/downloads/)下载对应版本,使用“下一步”进行安装,然后配置环境变量;接着就可以计事本里编写python代码程序,并到终端编译运行。上述过程与初学_jupyter,pycharm和python的关系
文章浏览阅读4.5k次。一、安装说明。 为了方便安装我在安装Redhat3.0时选了apache、php、mysql,注意mysql-devel开发包一定要装上, 二、安装ucspi-tcp-0.88 1.这是由于redhat3.0(包括redhat 9.0)的glibc的版本有问题,必须有下列软件及补丁才能编译 http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gzhttp://
文章浏览阅读7.2k次,点赞3次,收藏43次。我们经常听这样的描述,数据呈现上升/下降/无明显趋势,这个结论大都是靠人眼观察出来的,往往不够严谨。我们需要更科学的方法,下面就借助非参里的符号检验,来谈谈检验趋势存在性的两种常用方法。Cox-Stuart趋势检验原理对于数据序列x1,x2,x3,……,xn,我们以位置中间数c为界把该序列分成两部分,并两两配对成(x1,xc+1),(x2,xc+2),……(xc,xn)的形式。接着我们以每一组中后一个数减去前一个数并记下正负性,s+表示得到正数的个数,s-表示得到负数的个数。如果s+远远大于s
文章浏览阅读62次。
文章浏览阅读701次。在第2部分里介绍了Hotspot中的堆结构、对象分配以及次要回收。Hotspot中的堆结构理解不同的收集器的工作方式,是探讨Java堆结构如何支持分代机制的最好的方式。伊甸区(Eden)的大部分对象都是刚刚被分配的。幸存区(survivor)用来临时存储那些从伊甸区里幸存下来的对象。当我们讨论完次要回收(minor collections)后将描述幸存区的用途。伊甸区和幸存区统称为“年
文章浏览阅读305次。本文是计算机科学家Christoph Rasche撰写的一份计算机视觉方面的系列教程,从传统的图像处理、特征提取到近几年很热的深度神经网络,以及深度学习方法在目标检测、图像检索、图像分割、目标跟踪等一系列前沿的介绍。书本里本文是计算机科学家Christoph Rasche撰写的一份计算机视觉方面的系列教程,从传统的图像处理、特征提取到近几年很热的深度神经网络,以及深度学习方法在目标检测、图像检索、..._本文是计算机科学家christoph rasche撰写的一份计算机视觉方面的系列教程,从
文章浏览阅读2.9k次。一个ovf文件,文件包虚拟机的硬件配置,例如cpu规格、内存等一个或多个vmdk,虚拟机的硬盘镜像,数量取决于虚拟机有多少个硬盘。_virtio scsi single
文章浏览阅读191次。一、直接使用ListView组件创建1.直接在XML中创建ListView用entries属性附上一个数组资源其中divider属性是设置分割线可以使用颜色和drawable资源分割 <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:divi_listview的基本使用与优化
文章浏览阅读833次,点赞8次,收藏7次。【代码】华为无线AC常用命令记录。_display ap all为idle
文章浏览阅读1k次,点赞3次,收藏21次。本次复习采用的是这本书,如有书写不当的地方,欢迎批评指正!_有害规则和多余规则
文章浏览阅读1.4k次。提供:ZStack云计算 系列教程本教程为DNS管理介绍系列七篇中的第五篇。内容介绍DNS,或者称为域名系统,往往成为学习网站与服务器配置中的一大难点。尽管很多人都会使用由托管厂商或者域名注册商提供的DNS服务器,但建立自己的DNS服务器亦能带来诸多不容忽视的助益。在本篇教程中,我们将探讨如何在Ubuntu 14.04当中安装Bind9 DNS服务器并将其配置为仅权威DNS服务器。作为示例,我们将立_auth-nxdomain no;
文章浏览阅读377次,点赞8次,收藏7次。快速格式化代码(改善代码格式,砍起来更好看) ctrl + alt + L。【第一次是添加注释,第二次是取消注释】快速运行程序 自己定义 shift +在java中找到+号 进行添加。将光标放在一个方法上,输入。导入该行需要的类 先配置。ctrl + 左键 ,查看一个类的层级关系。学习继承后,非常有用。还有很多其它的快捷键。自己的定义的一些模板。_idea 设置自定义快捷键模板