SpringBoot学习碎片之Controller

@RestController

默认情况下,@RestController会将返回的对象数据转换为JSON格式

@RestController
public class HelloController{
	@RequestMapping("/user")
	public User getUser(){
		User user = new User();
		user.setUsername("zhangsan");
		user.setPassword("123");
		return user;
	}
}

路由映射

  • @RequestMapping注解主要负责URL的路由映射。它可以添加在Controller类或者具体的方法上。
  • 如果添加在Controller类上,则这个Controller中的所有路由映射都将会加上此映射规则,如果添加在方法上,则只对当前方法生效。
  • @RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则。常用的属性参数如下:
    • value:请求URL的路径,支持URL模板、正则表达式
    • methodHTTP请求方法
    • consumes:请求的媒体类型(Content-Type),如application/json
    • produces:响应的媒体类型
    • params,headers:请求的参数及请求头的值
  • @RequestMappingvalue属性用于匹配URL映射,value支持简单表达式@RequestMapping("/user")
  • @RequestMapping支持使用通配符匹配URL,用于统一映射某些URL规则类似的请求:@RequestMapping("/getJson/*.json"),当在浏览器中请求/getJson/a.json或者/getJson/b.json时都会匹配到后台的Json方法
  • @RequestMapping的通配符匹配非常简单实用,支持 "*" "?" "**" 等通配符
  • 符号 "*" 匹配任意字符,符号 "**" 匹配任意路径,符号 "?" 匹配单个字符
  • 有通配符的优先级低于没有通配符的
  • "**" 通配符的优先级低于有 "*" 通配符的

Method匹配

  • HTTP请求MethodGET、POST、PUT、DELETE等方式。HTTP支持的全部Method
  • @RequestMapping注解提供了method参数指定请求的Method类型,包括RequestMethod.GET、RequestMethod.POST、RequestMethod.DELETE、RequestMethod.PUT等值,分别对应HTTP请求的Method
    @RequestMapping(value = "/getData", method = RequestMethod.GET)
    public String getData(){
    	return "hello";
    }
    
  • Method匹配也可以使用@GetMapping、@PostMapping等注解代替

参数传递

  • @RequestParam将请求参数绑定到控制器的方法参数上,接收的参数来自HTTP请求体或请求urlQueryString,当请求的参数名称与Controller的业务方法参数名称一致时,@RequestParam可以省略
  • @PathVaraible:用来处理动态的URLURL的值可以作为控制器中处理方法的参数
  • @RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非Conten-Type:application/x-www-form-urlencoded编码格式的数据,比如:`application/json`、`application/xml` 等类型的数据
### Java 中实现文档上传分片 在处理大型文件上传时,采用分片上传策略能够有效提高系统的稳定性和用户体验。对于Java环境下的Web应用而言,通常的做法是前端将大文件分割成多个较小的数据块(即分片),然后逐个发送到服务器端;而服务端负责接收这些数据片段并将其保存至临时位置,在所有部分都接收到之后再进行合并。 #### 使用Spring Boot框架作为例子展示具体流程: 1. **定义MultipartFile参数用于接受单个切片** 为了适应HTTP请求中的多部件表单字段传输方式,这里选用`org.springframework.web.multipart.MultipartFile`接口表示每一个待存储的小块二进制流对象。 2. **创建Controller层方法处理客户端提交过来的每一片段** 下面是一段简单的控制器逻辑代码用来说明如何获取来自浏览器或其他HTTP客户端传入的一个单独的部分,并指定其对应的索引号以及整个资源的名字以便后续操作。 ```java @PostMapping("/uploadChunk") public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file, @RequestParam(value="fileName", required=true) String fileName, @RequestParam(value="chunkIndex", defaultValue="0") int chunkIndex){ try { File dir = new File(System.getProperty("java.io.tmpdir"), "chunks"); if (!dir.exists()) { boolean created = dir.mkdirs(); if(!created){ throw new IOException("Failed to create directory for chunks."); } } Path path = Paths.get(dir.getAbsolutePath(), fileName + "_" + chunkIndex); Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING); return ResponseEntity.ok().body("Uploaded the chunk successfully!"); } catch (IOException e) { logger.error(e.getMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } ``` 3. **编写Service组件完成最终组装动作** 当所有的碎片都被收集完毕后,则可以通过遍历目标目录下按照命名规则排列好的各个子文件来进行拼接恢复原始资料的操作。此过程可能涉及到并发控制机制防止重复写入覆盖等问题的发生。 ```java @Service public class ChunkMerger { public void mergeChunks(String originalFileName, long totalSize) throws Exception{ List<File> filesToMerge = Arrays.asList(Objects.requireNonNull(new File( System.getProperty("java.io.tmpdir"),"chunks").listFiles())); Collections.sort(filesToMerge,(f1,f2)->Integer.compare(Integer.parseInt(f1.getName() .split("_")[1]), Integer.parseInt(f2.getName().split("_")[1]))); RandomAccessFile raf = null; FileOutputStream fos = null; try { raf = new RandomAccessFile(originalFileName,"rw"); byte[] buffer = new byte[8 * 1024]; // 8KB Buffer size for(File f : filesToMerge){ FileInputStream fis = new FileInputStream(f); while ((int readCount=fis.read(buffer)) != -1 ) { raf.write(buffer, 0 ,readCount ); } fis.close(); // Optionally delete each part after merging. f.delete(); } raf.setLength(totalSize); // Ensure final length is correct. } finally { IOUtils.closeQuietly(raf); IOUtils.closeQuietly(fos); } } } ``` 上述示例展示了基于SpringBoot构建RESTful API来支持断点续传特性的基本思路[^1]。需要注意的是实际项目中还需要考虑到安全性验证、进度跟踪反馈给用户界面等功能模块的设计与集成。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值