深入解析:【Spring MVC终极指南】一文掌握请求处理与响应!从Servlet原生方式到SpringMVC高效优雅写法
一、环境准备
首先,我们有一个基本的Spring MVC控制器类DeptController
,它包含了多种请求处理方式:
package com.qcby.controller;
import com.qcby.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Controller
@RequestMapping("dept")
public class DeptController {
// 多种请求处理方式将在下面详细展开
}
二、ModelAndView方式
//方式1
@RequestMapping("/save")
public ModelAndView save(){
ModelAndView mv = new ModelAndView();
mv.addObject("msg","save success");
mv.setViewName("suc");
return mv;
}
特点:
- 传统的Spring MVC方式
- 可以同时设置视图名称和模型数据
- 适合需要向视图传递数据的场景
三、原生Servlet API方式
1. 直接响应JSON数据
//servlet
@RequestMapping("/test1")
public void test1(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/json;charset=utf-8");
String json = "{\"id\":1,\"name\":\"test1\"}";
response.getWriter().write(json);
}
2. 请求转发
//请求转发
@RequestMapping("/test2")
public void test2(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
System.out.println("test2");
String name = request.getParameter("name");
System.out.println(name);
request.setAttribute("password","123456");
request.getRequestDispatcher("/html/suc.html").forward(request,response);
}
@RequestMapping("/test3")
public void test3(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("test3");
String name = request.getParameter("name");
String password = (String)request.getAttribute("password");
System.out.println(name);
System.out.println(password);
}
3. 重定向
//重定向
@RequestMapping("/test4")
public void test4(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("test4");
response.sendRedirect("/qcby03/html/suc.html");
}
@RequestMapping("/test5")
public void test5(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("test5");
}
原生方式特点:
- 直接使用Servlet API
- 灵活性高,但代码较为繁琐
- 需要手动处理请求/响应对象
四、Spring MVC高级方式
1. 普通视图返回
//普通返回
@RequestMapping("/test6")
public String test6(){
return "/html/suc.html";
}
2. 请求转发(Spring MVC风格)
//请求转发
@RequestMapping("/test7")
public String test7(){
return "forward:/html/suc.html";
}
3. 重定向(Spring MVC风格)
//重定向
@RequestMapping("/test8")
public String test8(){
return "redirect:/html/suc.html";
}
Spring MVC方式特点:
- 代码简洁,易于维护
- 充分利用Spring MVC的特性
- 推荐使用的方式
五、JSON响应处理
1. 手动构建JSON响应
@RequestMapping("/test9")
@ResponseBody
public String test9(){
String json = "{\"id\":1,\"name\":\"test1\"}";
return json;
}
2. 对象自动转换为JSON
@RequestMapping("/test10")
@ResponseBody
public User test10(){
User user = new User();
user.setName("test10");
user.setPassword("123456");
return user;
}
JSON响应特点:
@ResponseBody
注解将返回值直接写入响应体- Spring MVC自动处理对象到JSON的转换
- 需要配置相应的消息转换器(如Jackson)
六、对比总结
方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
ModelAndView | 灵活,可传数据 | 代码稍显繁琐 | 传统Spring MVC项目 |
原生Servlet API | 灵活性极高 | 代码繁琐,耦合度高 | 需要精细控制请求响应的场景 |
Spring MVC简化方式 | 代码简洁,优雅 | 功能相对受限 | 大多数Spring MVC项目 |
@ResponseBody | JSON处理方便 | 需要配置转换器 | RESTful API开发 |
七、最佳实践建议
- 优先使用Spring MVC方式:代码更简洁,更易于维护
- RESTful API使用@ResponseBody:结合
@RestController
注解更佳 - 避免过度使用原生Servlet API:除非有特殊需求,否则尽量使用Spring MVC提供的高级特性
- 保持一致性:在项目中保持统一的风格
结语
通过本文的学习,相信大家对Spring MVC的各种请求处理方式有了更深入的理解。从原生Servlet API到Spring MVC的高级特性,我们可以看到框架的演进带来的便利性。
记住:选择合适的处理方式,可以让你的代码更加优雅和高效!