JavaWeb每日学习记录(第14天):Spring MVC高级功能与综合应用
2024年X月X日 星期X 晴
今天是JavaWeb学习的第十四天,我继续深入学习Spring MVC框架的高级功能,并尝试将这些功能综合应用到一个更复杂的Web项目中。今天的主要内容包括请求参数处理、文件上传下载、拦截器(Interceptor)的使用,以及如何结合Spring MVC实现更复杂的业务逻辑。
一、请求参数处理
在Spring MVC中,可以通过多种方式处理请求参数,包括使用@RequestParam
、@PathVariable
和@RequestBody
等注解。这些注解能够灵活地获取和绑定请求参数。
示例1:请求参数处理
1.使用@RequestParam
获取请求参数
package com.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class RequestParamController {@GetMapping("/greet")public String greet(@RequestParam("name") String name, Model model) {model.addAttribute("message", "Hello, " + name + "!");return "greet";}
}
2.使用@PathVariable
获取路径参数
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") int id, Model model) {model.addAttribute("userId", id);return "user";
}
3.使用@RequestBody
接收JSON请求体
@PostMapping("/user")
public String createUser(@RequestBody User user, Model model) {model.addAttribute("user", user);return "user";
}
通过这些注解,我能够灵活地处理不同类型的请求参数,无论是简单的表单提交、路径参数,还是复杂的JSON请求体。
二、文件上传与下载
昨天我学习了文件上传和下载的基本实现,今天我尝试将这些功能整合到Spring MVC中,实现更优雅的文件操作。
示例2:Spring MVC中的文件上传与下载
1.文件上传
package com.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;@Controller
public class FileUploadController {@PostMapping("/upload")public String uploadFile(@RequestParam("file") MultipartFile file) {if (!file.isEmpty()) {try {String uploadPath = "uploads/" + file.getOriginalFilename();file.transferTo(new File(uploadPath));return "redirect:/success";} catch (IOException e) {e.printStackTrace();}}return "redirect:/uploadStatus?status=failed";}
}
2.文件下载
package com.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;@Controller
public class FileDownloadController {@GetMapping("/download")public void downloadFile(@RequestParam("filename") String filename, HttpServletResponse response) {String filePath = "uploads/" + filename;File file = new File(filePath);if (file.exists()) {response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");try (FileInputStream fis = new FileInputStream(file);OutputStream os = response.getOutputStream()) {byte[] buffer = new byte[1024];int length;while ((length = fis.read(buffer)) != -1) {os.write(buffer, 0, length);}} catch (IOException e) {e.printStackTrace();}}}
}
通过Spring MVC的MultipartFile
接口,我能够轻松处理文件上传,同时结合HttpServletResponse
实现文件下载。这种方式比传统的Servlet更加简洁和高效。
三、拦截器(Interceptor)的使用
拦截器(Interceptor)是Spring MVC中用于拦截请求并执行特定逻辑的组件。它可以用于日志记录、权限验证、性能监控等场景。
示例3:自定义拦截器
1.定义一个简单的拦截器
package com.example.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LoggingInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("LoggingInterceptor: Pre-handle request");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("LoggingInterceptor: Post-handle request");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("LoggingInterceptor: After completion");}
}
2.注册拦截器
package com.example.config;import com.example.interceptor.LoggingInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoggingInterceptor loggingInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loggingInterceptor).addPathPatterns("/**");}
}
通过拦截器,我能够在请求处理的不同阶段插入自定义逻辑,例如日志记录或权限验证。
四、综合应用:用户管理系统
为了巩固今天的学习内容,我尝试将请求参数处理、文件上传下载和拦截器功能整合到一个简单的用户管理系统中。用户可以通过表单上传头像,系统会记录用户的操作日志。
示例4:用户管理系统
1.用户实体类
package com.example.model;public class User {private int id;private String username;private String email;private String avatar; // 头像路径// Getter和Setter方法
}
2.用户控制器
package com.example.controller;import com.example.model.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;@Controller
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/")
register public String showRegisterForm(Model model) {model.addAttribute("user", new User());return "register";}@PostMapping("/register")public String registerUser(@ModelAttribute("user") User user, @RequestParam("avatar") MultipartFile avatar) {if (!avatar.isEmpty()) {try {String uploadPath = "uploads/" + avatar.getOriginalFilename();avatar.transferTo(new File(uploadPath));user.setAvatar(uploadPath);} catch (IOException e) {e.printStackTrace();}}userService.saveUser(user);return "redirect:/user/list";}@GetMapping("/list")public String listUsers(Model model) {model.addAttribute("users", userService.getAllUsers());return "userList";}
}
3.用户列表页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head><title>User List</title>
</head>
<body><h1>User List</h1><table border="1"><tr><th>ID</th><th>Username</th><th>Email</th><th>Avatar</th></tr><c:forEach items="${users}" var="user"><tr><td>${user.id}</td><td>${user.username}</td><td>${user.email}</td><td><img src="${user.avatar}" width="50" height="50"></td></tr></c:forEach></table>
</body>
</html>
通过这个综合应用,我将Spring MVC的高级功能整合到一个完整的用户管理系统中,实现了用户注册、头像上传和用户列表展示。
五、总结
今天我深入学习了Spring MVC的高级功能,包括请求参数处理、文件上传下载和拦截器的使用,并尝试将这些功能整合到一个更复杂的用户管理系统中。通过实践,我对Spring MVC的灵活性和强大功能有了更深刻的理解。
Spring MVC是现代JavaWeb开发中不可或缺的框架,它极大地简化了Web应用的开发复杂性。明天,我计划学习Spring Boot框架,进一步提升开发效率,实现更快速的项目搭建和部署。