1、响应的本质
-
请求转发与请求重定向
2、Spring MVC 支持的响应的种类
-
大致上分为两类:一类是“页面”即响应的最终效果(客户端看到的)是“页面跳转”、另一类是“数据”。
-
Spring MVC 中实现响应为“页面(页面跳转)”的方案有:
1、Controller 中的方法返回值为java.lang.String
,返回“逻辑视图名”(请求转发、请求重定向均可)。
2、使用原生的 Servlet API 实现(请求转发、请求重定向均可)。
3、Controller 中的方法返回值为org.springframework.web.servlet.ModelAndView
,在 ModelAndView 的对象中设置“逻辑视图名”以及需要在视图中渲染的数据(虽然 ModelAndView 也可以支持“请求重定向”,但是因为其可以“携带数据”,所以多数情况下,ModelAndView 为“请求转发”)。 -
Spring MVC 中实现响应为“数据”的方案有:
1、纯字符串(不常用)
2、JSON(常用)
3、页面响应
3.1、返回字符串(逻辑视图名)
- 访问
http://localhost:8080/web4/jsp/one
,响应给客户端的是经过“视图解析器”处理的 JSP 页面。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyRequestController {
@GetMapping("/jsp/one")
public String pageResponse() {
return "one"; // 请求转发
}
}
- 请求转发与请求重定向:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyRequestController {
@GetMapping("/jsp/one")
public String pageResponse() {
return "forward:one"; // 请求转发
}
}
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyRequestController {
@GetMapping("/jsp/one")
public String pageResponse() {
return "redirect:one"; // 请求重定向
}
}
3.2、ModelAndView
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyRequestController {
@GetMapping("/jsp/one")
public ModelAndView pageResponse() {
ModelAndView modelAndView = new ModelAndView(); // 方法体中 new 一个 ModelAndView 对象
modelAndView.setViewName("one"); // /one.jsp
modelAndView.addObject("name", "Jack");
return modelAndView;
}
}
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyRequestController {
@GetMapping("/jsp/one")
public ModelAndView pageResponse(ModelAndView modelAndView) {
// 方法参数中的 ModelAndView 类型可以直接使用
modelAndView.setViewName("one"); // /one.jsp
modelAndView.addObject("name", "Jack");
return modelAndView;
}
}
- @SessionAttributes 注解:ModelAndView 中的数据,默认是在 Request 域中,如果希望将放入 ModelAndView 对象中的数据也放入 Session 域中,当然可以使用原生 Servlet API,Spring MVC 提供了
@SessionAttributes
注解,在将数据放入 ModelAndView 的同时,也放入 Session 域中。
4、数据响应
4.1、JSON
4.1.1 @ResponseBody
-
该注解可以使用在 Controller 的类上,也可以使用在其中的方法上。
-
该注解的含义是,将方法的返回值写入 HTTP 响应报文的报文主体中。
-
在 Jackson 依赖和在配置文件中配置
<mvc:annotation-driven/>
,两者配合下,方法的返回值如果是对象的话,会自动转化为 JSON 字符串写入 HTTP 响应报文主体中。
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
public class User {
private Integer id;
private String name;
}
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
public class MyRequestController {
@GetMapping("/json/data")
// @ResponseBody
public User jsonResponse() {
return new User(1, "张三");
}
}
SpringMVC-9
4.1.2、@RestController
- 该注解相当于 @Controller 与 @ResponseBody 联合,使用在类上。
网友评论