目录

响应数据和结果视图

返回值分类

字符串

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 指定响应结果:

  1. 使用 request 转向页面

    1
    
    request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
    
  2. 通过 response 页面重定向

    1
    
    response.sendRedirect("testRetrunString")
    
  3. 通过 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请求

  1. 引入js文件到webapp目录下js目录下

  2. 编写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;
}