一、@ResponseBody(重点)
1、作用
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式,一般用于json格式的数据
2、源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {
}
3、栗子
导入包默认使用jackson转化
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
集成fastjson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
配置转化器
<!-- 设置配置方案 -->
<mvc:annotation-driven>
<!-- 消息转化器 -->
<mvc:message-converters register-defaults="false">
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<!-- 加入支持的媒体类型:返回contentType -->
<property name="supportedMediaTypes">
<list>
<!-- 这里顺序不能反,一定先写text/html,不然IE下会出现下载提示 -->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
<property name="fastJsonConfig">
<bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
<property name="features">
<list>
<value>AllowArbitraryCommas</value>
<value>AllowUnQuotedFieldNames</value>
<value>DisableCircularReferenceDetect</value>
</list>
</property>
<!--配置特定的日期格式-->
<property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
@Controller
public class ResponseBodyController {
@RequestMapping("/body")
@ResponseBody
public Shop testResponseBody() {
Shop shop = new Shop();
shop.setShopId(1);
shop.setName("娃娃");
shop.setTitle("白天么么哒,晚上怕怕怕");
return shop;
}
}
@Data
public class Shop implements Serializable {
private Integer shopId;
private String name;
@JSONField
private String title;
// 指定日期格式
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date createDate;
}
JSONField
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface JSONField {
// 配置序列化和反序列化的顺序,1.1.42版本之后才⽀持
int ordinal() default 0;
// 指定序列化字段的名称
String name() default "";
// 指定字段的格式,对⽇期格式有⽤
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}
二、ModelAndView(了解)
1、作用
一般配合前后端不分离jsp技术中,用于封装需要响应到页面的数据和视图名字。常用使用在以下场景:
- 实现后台与前端页面数据交互(jsp或thymeleaf)
- 用于重定向与转发到指定页面
- 将获取的数据存储对应的作用域中继而渲染到页面
**注意: **一般要结合视图解析器类使用
2、核心概要
Model
Model 是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类。ModelMap又是LinkedHashMap的子类,可以用model来接收各种类型的数据,如果用来接收一组数据, 那么这个时候的model实际上是ModelMap。
view
对应视图的字符串,一般要配合ViewResolver视图转化器来使用
工作流程
当视图解释器解析ModelAndVIew是,其中model本生就是一个Map的实现类的子类。视图解析器将model中的每个元素都通过request.setAttribute(name, value);添加request请求域中。这样就可以在JSP页面中通过EL表达式来获取对应的值
3、常用api
ModelAndView
常见构造方法
构造方法 | 说明 |
---|---|
ModelAndView() | 无参构造方法 |
ModelAndView(String viewName) | 不需要传递数据 |
ModelAndView(String viewName, Map model) | 视图名称 将数据存储在Map中 |
常用的方法
方法返回值 | 说明 |
---|---|
addAllObjects(Map map) | 添加数据对象 |
addObject(Object modelObject) | 添加数据对象 |
addObject(String key,Object obj) | 添加键值对数据 |
void setViewName(String view) | 设置映射的视图字符串 |
void setView(View view) | 往ModelView中添加视图 |
clear() | 清除此ModelAndView对象的状态。 |
Model
在配置文件中注册视图转化类
<bean id="ViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 视图文件的前缀 -->
<property name="prefix" value="WEB-INF/page"></property>
<!-- 视图文件的后缀名 -->
<property name="suffix" value=".jsp" />
<!-- view是用什么显示,这里是jsp,-->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
</bean>
栗子
控制层
@Controller
public class ModelViewController {
@RequestMapping("/index")
public ModelAndView index() {
ModelAndView mv = new ModelAndView();
List<User> users = new ArrayList<>();
User user = new User();
// 添加集合
mv.addObject(users);
// 添加 pojo
mv.addObject(user);
mv.addObject("name", "admin");
// 也可以通过 ModelMap
// ModelMap modelMap = new ModelMap();
// modelMap.addAttribute(users);
// modelMap.addAttribute(user);
//modelMap.addAttribute("name", "admin");
// mv.addAllObjects(modelMap);
return mv;
}
}
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>${requestScope.get("name")}</p>
</body>
</html>
三、字符串视图(了解)
1、说明
通过字符串返回对应的视图名字,配合@Controller
**注意: ** 不要使用@RestController,会返回字符串
2、栗子
控制层
@Controller
public class ModelViewController {
@RequestMapping("/model")
public String modelAndString(Model model) {
model.addAttribute("name", "hello");
return "hello";
}
}
WEB-INF/jsp/hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>${requestScope.get("name")}</p>
</body>
</html>
四、重定向与转化(掌握)
1、重定向前缀(redirect:)
相当于”response.sendRedirect()”.这种方式外部特征就是浏览器地址栏最后显示的路径是转发后的新的路径
@Controller
public class ModelViewController {
@RequestMapping("/redirect")
public String redirect() {
// 站内重定向
return "redirect:/model";
// 站内重定向带参数
// return "redirect:/user/change/?uid=1"
// 站外重定向
// return "redirect:https://www.baidu.com";
// 站外重定向带参数 后面用户名
// return "redirect:https://api.github.com/users/zhangwei725"
// 站外重定向带参数2
// return "https://api.github.com/users/zhangwei725/repos?page=1&per_page=10"
}
}
2、转发前缀(forward:)
相当于request.getRequestDispatcher().forward(request,response)。只能站内转化
@Controller
public class ModelViewController {
@RequestMapping("/forward")
public String testForward(Model model) {
model.addAttribute("key", "转发");
return "forward:index";
}
}