目录

Java-Spring-MVC-2

Java Spring MVC (2)

常见的Request Controller 和 Response Controller 的区别

用餐厅点餐来理解

想象你去一家餐厅吃饭:

  • Request Controller(接单员) :负责处理你的点餐请求,记录你的口味、桌号等信息。
  • Response Controller(厨师+服务员) :根据你的需求制作菜品,并把热乎乎的菜端到你桌上。

它们的核心区别

  • Request Controller :专注 接收并解析用户请求 (比如拿参数、查Cookie、读Session)。
  • Response Controller :专注 构造并返回响应数据 (比如返回网页、JSON数据、设置状态码)

第一部分:RespController - 响应处理中心

(相当于快递包装流水线)

1. 地址导航员(返回页面)

@RequestMapping("/r1")
public String returnPage(){
    return "/index.html"; 
}

作用 :引导用户访问指定网页

示例 :类似点击网页导航链接

访问地址

响应结果 :显示服务器上的index.html网页文件

2. 文字快递员(返回纯文本)

@ResponseBody
@RequestMapping("/r2")
public String returnData(){
    return "我是前端需要的数据"; 
}

作用 :向浏览器直接发送文字内容

示例 :手机收到验证码短信

响应头 :Content-Type: text/plain

响应内容 :直接显示返回的字符串原文

3. HTML零件供应商

@ResponseBody
@RequestMapping("/r3")
public String returnHTML(){
    return "<h1>我是一级标题</h1>";
}

作用 :发送HTML片段让浏览器渲染

示例 :网购时的商品描述模块

响应头 :Content-Type: text/html

前端显示 :显示为带样式的标题文字

4. 强制纯文本模式

@ResponseBody
@RequestMapping(value = "/r4", produces = "text/plain")
public String returnTEXT(){
    return "<h1>我是一级标题</h1>";
}

作用 :强制浏览器以纯文本处理内容

示例 :收到代码截图文档

响应头 :Content-Type: text/plain

前端显示 :显示原始代码文本 <h1>...

5. JSON数据专员

(需要UserInfo类支持)

@ResponseBody
@RequestMapping("/r5")
public UserInfo returnJSON(){
    return new UserInfo(1, "zhangsan");
}

作用 :发送结构化数据

示例 :接收用户信息表单

响应头 :Content-Type: application/json

响应内容

{"id":1, "name":"zhangsan"}

6. 异常状态标注员

@ResponseBody
@RequestMapping("/r6")
public UserInfo setStatus(HttpServletResponse response){
    response.setStatus(400);
    return new UserInfo(1, "zhangsan");
}

第二部分:RequestController  - 需求处理中心

1. 问询接待员(基础参数接收)

示例请求

访问:

响应结果 :接收参数手机

2. 多重接待窗口

@RequestMapping("/r2")
public String r2(String name, String password) {
    return "usrname" + name + "password" + password;
}

示例请求

访问:

响应结果 :username张三 password123456

3. 数字检查员(包装类)

@RequestMapping("/r3")
public String r3(Integer age) {
    return "age" + age;
}

特点

  • 允许空值(如访问时不带age参数)
  • 示例空请求响应:age null

4. 强制数字模式

@RequestMapping("/r4")
public String r4(int age) {
    return "age" + age;
}

特点

  • 基本类型必须有值
  • 空请求时默认返回 age 0

5. 对象收集员

@RequestMapping("/r5")
public String r5(UserInfo userInfo) {
    return "userInfo" + userInfo.toString();
}

使用方式

访问:

参数自动装配 :转换为UserInfo对象

6. 参数改装员

@RequestMapping("/r6")
public String r6(@RequestParam("q") String keyword) {
    return "keyword" + keyword;
}

示例请求

访问:

功能 :把参数q映射到keyword变量

7. 批量收货员

@RequestMapping("/r7")
public String r7(String[] arr) {
    return "arr" + Arrays.toString(arr);
}

示例请求

访问:

响应结果 :arr [苹果, 香蕉]

8. 路径解析员

@RequestMapping("/article/{type}/{articleId}")
public String article(@PathVariable String type, 
                      @PathVariable Integer articleId) {
    return "articleId" + articleId+"type"+type;
}

示例请求

访问:

响应结果 :articleId1001 typetech

9. 包裹接收员(文件上传)

@RequestMapping("r12")
public String r12(@RequestPart("file11") MultipartFile file) {
    file.transferTo(new File("C:\\temp\\"+file.getOriginalFilename()));
    return "文件上传成功";
}

使用方式 :使用Postman等工具上传文件

表单字段名 :file11

保存路径 :C盘temp目录

10. 会员卡收集员

@RequestMapping("/r13")
public String r13(HttpServletRequest request) {
    Cookie[] cookies = request.getCookies();
    return "返回cookie成功";
}

功能 :查看浏览器携带的所有Cookie

11. 精准会员卡读取器

@RequestMapping("/r14")
public String r14(@CookieValue("java")String java) {
    return "Cookie中java的值:"+java;
}

要求 :浏览器必须携带名为java的Cookie

12. 储物柜管理员(Session操作)

@RequestMapping("/setSession")
public String setSession(HttpServletRequest request) {
    HttpSession session = request.getSession();
    session.setAttribute("userName", "zhangsan");
    return "设置session成功";
}

效果

创建类似保险箱的会话存储空间,通过Cookie自动关联用户

13. 储物柜检查员(会话验证)

@RequestMapping("/getSession3")
public String getSession3(@SessionAttribute("userName") String userName){
    return "登录用户为" + userName;
}

使用场景对比表

功能需求对应控制器典型方法示例
需要给浏览器返回网页RespControllerreturnPage() (/r1)
开发RESTful API接口RequestControllerreturnJSON()(/r5)
用户登录状态保持RequestControllersetSession()相关方法
处理复杂的表单参数RequestControllerr5(UserInfo对象接收)
需要控制响应头信息RespControllersetHeader() (/r7)
上传用户头像文件RequestControllerr12()文件上传方法
移动端接口开发RequestController所有带@RestController的方法