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

用springboot编写RestController之——详解RestController中获取请求的各种数据

参考资料:老葛课堂https:study.163.comcoursecourseLearn.htm?courseId1005213034#learnvideo?lessonId10

参考资料:老葛课堂

https://study.163.com/course/courseLearn.htm?courseId=1005213034#/learn/video?lessOnId=1052205269&courseId=1005213034

整个项目,葛老师已经上传到他的GitHub上面了,GitHub地址为:

http://github.com/gexiangdong/tutorial

 

使用的的是 maven项目管理、IDEA开发

一、首先看下maven的目录结构

 

整个项目结构比较清楚了以后,我们就看一下源代码。

二、源代码详解

  首先:源代码存放的目录在src/main/java 里面

  

  一共建了以上几种类

二(1)、Application——启动类

  

************************************************** 
package cn.devmgr.tutorial;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
*************************************************
就是很简单的启动类,是项目的入口
其中注解@SpringBootApplication就是用来声明:这是一个启动类

二(2)、TvSeriesController —— RestController的一个例子,展示了各种基本操作在RestController的实现方式。

*****************************************************************************
package cn.devmgr.tutorial;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.rest.webmvc.ResourceNotFoundException;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
* RestController的一个例子,展示了各种基本操作在RestController的实现方式。
*
*/
@RestController
@RequestMapping("/tvseries")
public class TvSeriesController {
private final Log log = LogFactory.getLog(TvSeriesController.class);

@GetMapping
public List getAll() {
if(log.isTraceEnabled()) {
log.trace("getAll() ");
}
List list = new ArrayList<>();
list.add(createWestWorld());
list.add(createPoi());

return list;
}

@GetMapping("/{id}")
public TvSeriesDto getOne(@PathVariable int id){
if(log.isTraceEnabled()) {
log.trace("getOne " + id);
}
if(id == 101) {
return createWestWorld();
}else if(id == 102) {
return createPoi();
}else {
throw new ResourceNotFoundException();
}
}

/**
* @Valid 注解表示需要验证传入的参数TvSeriesDto,需要验证的field在TvSeriesDto内通过注解定义(@NotNull, @DecimalMin等)
* @param tvSeriesDto
* @return
*/
@PostMapping
public TvSeriesDto insertOne(@Valid @RequestBody TvSeriesDto tvSeriesDto) {
if(log.isTraceEnabled()) {
log.trace("这里应该写新增tvSeriesDto到数据库的代码, 传递进来的参数是:" + tvSeriesDto);
}
//TODO:在数据
tvSeriesDto.setId(9999);
return tvSeriesDto;
}

/**
*
* @param id
* @param tvSeriesDto
* @return
*/
@PutMapping("/{id}")
public TvSeriesDto updateOne(@PathVariable int id, @RequestBody TvSeriesDto tvSeriesDto){
if(log.isTraceEnabled()) {
log.trace("updateOne " + id);
}
if(id == 101 || id == 102) {
//TODO: 根据tvSeriesDto的内容更新数据库,更新后返回新
return createPoi();
}else {
throw new ResourceNotFoundException();
}
}

/**
* 删除资源的例子;如果方法圣母了HttpServletRequest request参数,spring会自动把当前的request传给方法。
* 类似声明即可得到还有 HttpServletResponse,Authentication、Locale等
*
* @RequestParam(value="delete_reason", required=false) String deleteReason 表示deleteReason参数的值
* 来自Request的参数delete_reason(等同于request.getParameter("delete_reason"),可以是URL中Querystring,
* 也可以是form post里的值),required=false表示不是必须的。默认是required=true,required=true时,如果请求
* 没有传递这个参数,会被返回400错误。
* 类似的注解还有@COOKIEValue @RequestHeader等。
*/
@DeleteMapping("/{id}")
public Map deleteOne(@PathVariable int id, HttpServletRequest request,
@RequestParam(value="delete_reason", required=false) String deleteReason) throws Exception{
if(log.isTraceEnabled()) {
log.trace("deleteOne " + id);
}
Map result = new HashMap<>();
if(id == 101) {
//TODO: 执行删除的代码
result.put("message", "#101被" + request.getRemoteAddr() + "删除(原因:" + deleteReason + ")");
}else if(id == 102) {
//不能删除这个,RuntimeException不如org.springframework.security.access.AccessDeniedException更合适
//但此处还没到spring security,所以暂先抛出RuntimeException异常
throw new RuntimeException("#102不能删除");
}else {
//不存在
throw new ResourceNotFoundException();
}
return result;
}

/**
* 给电视剧添加剧照。
* 这是一个文件上传的例子(具体上传处理代码没有写)
* @param id
* @param imgFile
* @throws Exception
*/
@PostMapping(value="/{id}/photos", cOnsumes=MediaType.MULTIPART_FORM_DATA_VALUE)
public void addPhoto(@PathVariable int id, @RequestParam("photo") MultipartFile imgFile) throws Exception{
if(log.isTraceEnabled()) {
log.trace("接受到文件 " + id + "收到文件:" + imgFile.getOriginalFilename());
}
//保存文件
FileOutputStream fos = new FileOutputStream("target/" + imgFile.getOriginalFilename());
IOUtils.copy(imgFile.getInputStream(), fos);
fos.close();
}

/**
* 返回某电视剧的图标
* 这是一个返回非JSON格式(图片)格式的例子
* @param id
* @return
*/
@GetMapping(value="/{id}/icon", produces=MediaType.IMAGE_JPEG_VALUE)
public byte[] getIcon(@PathVariable int id) throws Exception{
if(log.isTraceEnabled()) {
log.trace("getIcon(" + id + ")");
}
String icOnFile= "src/test/resources/icon.jpg";
InputStream is = new FileInputStream(iconFile);
byte[] data = IOUtils.toByteArray(is);
is.close();
return data;
}



/**
* 创建电视剧“Person of Interest",仅仅方便此节做展示其他方法用,以后章节把数据存储到数据库后,会删除此方法
*/
private TvSeriesDto createPoi() {
Calendar c = Calendar.getInstance();
c.set(2011, Calendar.SEPTEMBER, 22, 0, 0, 0);
return new TvSeriesDto(102, "Person of Interest", 5, c.getTime());
}
/**
* 创建电视剧“West World",仅仅方便此节做展示其他方法用,以后章节把数据存储到数据库后,会删除此方法
*/
private TvSeriesDto createWestWorld() {
Calendar c = Calendar.getInstance();
c.set(2016, Calendar.OCTOBER, 2, 0, 0, 0);
return new TvSeriesDto(101, "West World", 1, c.getTime());
}

}
 

***************** *********************************************************************

@RestController 该注解表示请求资源

@RequestMapping 该注解表示请求资源的url

  按本例中,应在浏览器中输入:http://locolhost:8080/tvseries

 

@GetMapping  该注解表示获取资源。

 首先添加日志,然后获取资源。

其他方法也都差不多,所以我暂时不讲,有看不懂的可以留言问我

 

二(3)、TvCharacterDto、TvSeriesDto

  TvCharacterDto:

**********************************

package cn.devmgr.tutorial;

import javax.validation.constraints.NotNull;

public class TvCharacterDto {
private Integer id;
private int tvSeriesId;
@NotNull private String name;

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public int getTvSeriesId() {
return tvSeriesId;
}
public void setTvSeriesId(int tvSeriesId) {
this.tvSeriesId = tvSeriesId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

**********************************

TvSeriesDto:

**********************************

package cn.devmgr.tutorial;

import java.util.Date;
import java.util.List;

import javax.validation.Valid;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;

import com.fasterxml.jackson.annotation.JsonFormat;

/**
* 基本的POJO,而且使用Bean Validation注解进行校验数据
* @author gexiangdong
*
*/
public class TvSeriesDto {
@Null private Integer id;
@NotNull private String name;
@DecimalMin("1") private int seasonCount;
//@Valid表示要级联校验;@Size(min=2)表示这个列表至少要有2项内容,否则通不过校验
@Valid @NotNull @Size(min=2) private List tvCharacters;

//如果想用long型的timestamp表示日期,可用: @JsonFormat(shape = JsonFormat.Shape.NUMBER)
@JsonFormat(timezOne="GMT+8", pattern="yyyy-MM-dd")
//@Past表示只接受过去的时间,比当前时间还晚的被认为不合格
@Past private Date originRelease;

public TvSeriesDto() {
}

public TvSeriesDto(int id, String name, int seasonCount, Date originRelease) {
this.id = id;
this.name = name;
this.seasOnCount= seasonCount;
this.originRelease = originRelease;
}

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

public int getSeasonCount() {
return seasonCount;
}
public void setSeasonCount(int seasonCount) {
this.seasOnCount= seasonCount;
}

public Date getOriginRelease() {
return originRelease;
}
public void setOriginRelease(Date originRelease) {
this.originRelease = originRelease;
}

public List getTvCharacters() {
return tvCharacters;
}

public void setTvCharacters(List tvCharacters) {
this.tvCharacters = tvCharacters;
}

}
***********************************

推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
author-avatar
mobiledu2502862441
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有