返回值分类
字符串
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
1
2
3
4
5
6
|
//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
@RequestMapping("/testReturnString")
public String testReturnString() {
System.out.println("AccountController 的 testReturnString 方法执行了。。。。");
return "success";
}
|
void
Servlet 原始 API 可以作为控制器中方法的参数:
1
2
3
4
|
@RequestMapping("/testReturnVoid")
public void testReturnVoid(HttpServletRequest request, HttpServletResponse response)
throws Exception {
}
|
在 controller 方法形参上可以定义 request 和 response,使用 request 或 response 指定响应结果:
-
使用 request 转向页面
1
|
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
|
-
通过 response 页面重定向
1
|
response.sendRedirect("testRetrunString")
|
-
通过 response 指定响应结果, 例如响应 json 数据:
1
2
3
|
response.setCharacterEncoding("utf-8" );
response.setContentType(" application/json;charset=utf -8");
response.getWriter().write("json 串" );
|
ModelAndView
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
该对象中有两个重要方法:
1
2
3
4
5
6
7
8
9
10
11
|
// getModelMap() 和在常用注解里讲到的Model对象是同一个
public ModelAndView addObject(String attributeName, @Nullable Object attributeValue) {
getModelMap().addAttribute(attributeName, attributeValue);
return this;
}
// 设置逻辑视图名称,视图解析器会根据名称前往指定的视图
public void setViewName(@Nullable String viewName) {
this.view = viewName;
}
|
转发和重定向
foward转发
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。我们也可以写成:
1
2
3
4
5
|
@RequestMapping("/testClean")
public String testClean(SessionStatus sessionStatus) {
sessionStatus.setComplete();
return "forward:/WEB-INF/pages/ok.jsp";
}
|
需要注意的是,如果用了 formward:
则路径必须写成实际视图 url,不能写逻辑视图。它 相当于 “request.getRequestDispatcher(“url”).forward(request,response)” 。使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。
redirect重定向
contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用: redirect:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@RequestMapping("/testPut")
public String testPut(Model model) {
model.addAttribute("username", "张三");
model.addAttribute("password", "123");
model.addAttribute("age", 20);
return "ok";
}
@RequestMapping("/testClean")
public String testClean(SessionStatus sessionStatus) {
sessionStatus.setComplete();
return "redirect:testPut";
}
|
它相当于“response.sendRedirect(url)”。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。
ResponseBody响应json数据
配置静态资源不拦截
DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而 不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置
1
2
3
4
5
6
7
8
9
|
<!--
处理静态资源
静态页面,如html,css,js,images可以访问
效果类似下面:
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/img/" mapping="/img/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
-->
<mvc:default-servlet-handler/>
|
配置json风格入参与出参
引入json依赖
1
2
3
4
5
|
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.24</version>
</dependency>
|
添加fastjson转换器
在spring-servlet.xml中添加如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<mvc:annotation-driven>
<!--如果要使用json风格入参和出参,需要配置jackson或者fastjson, fastjson除了pom中添加依赖外还要添加转换器
否则会报org.springframeework.wdb.HttpMeediaTypeeNotSupportEdException: Content-type:‘application/json;charset=UTF-8’ can not supported
-->
<mvc:message-converters register-defaults="false">
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html; charset=UTF-8</value>
<value>application/json; charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
|
使用ajax模拟json请求
-
引入js文件到webapp目录下js目录下
-
编写index.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>员工</title>
<%--注意此处一定要写成标签对--%>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
// 页面加载
// 绑定点击事件
$(function () {
$("#btn").click(function () {
$.ajax({
url: "param/testJson",
contentType: "application/json;charset=UTF-8",
data: '{"username":"张三","password":123}',
dataType: "json",
type: "post",
success: function (data) {
alert(data);
alert(data.username);
}
});
});
});
</script>
</head>
<body>
<button id="btn">发送ajax请求</button>
</body>
</html>
|
后端接受json入参与返回json数据
1
2
3
4
5
6
|
@RequestMapping("/testJson")
public @ResponseBody
Account testJson(@RequestBody Account body) {
body.setUsername("李四");
return body;
}
|