SpringMVC(4)request和response

返回值分类

字符串

controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。 指定逻辑视图名,经过视图解析器解析为 jsp 物理路径: /WEB-INF/pages/xxxx.jsp

jsp代码

<a href="user/testString">返回响应</a>

控制器代码

@Controller
@RequestMapping("user")
public class HelloController {
    @RequestMapping("/testString")
    public String testString(){
        System.out.println("testString方法执行了");
        return "success";
    }
}

输出结果

在页面上显示user对象,模拟从数据库中查到User对象,需要借助Model,在jsp页面开启表达式支持,

编写User实体类

package com.ben.domain;

import java.io.Serializable;

/**
 * @ClassName: User
 * @author: benjamin
 * @version: 1.0
 * @description: TODO
 * @createTime: 2019/08/10/16:07
 */

public class User implements Serializable {
    String username;
    String password;
    Integer age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

编写控制器代码

 @RequestMapping("/testString")
    public String testString(Model model){
        System.out.println("从数据库中查找数据了");
        User user = new User();
        user.setUsername("小强");
        user.setPassword("123");
        user.setAge(18);
        model.addAttribute("user",user);
        System.out.println("testString方法执行了");
        return "success";
    }

编写解析后的success.jsp代码

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>执行成功</h1>
    ${user.username}
</body>
</html>

输出结果

void

控制器方法

@RequestMapping("/testVoid")
public void testVoid(Model model){
    System.out.println("testVoid方法执行了");
}

jsp代码

<a href="user/testVoid">testVoid方法</a>

可以看到,对于无返回值的控制器方法,它找到的是默认请求路径.jsp

借用Servlet中的API,在controller 方法形参上可以定义 request 和 response,使用 request或response 指定响应结果;

  1. 使用request重定向页面;

  2. 通过 response 页面重定向;

  3. 通过 response 指定响应结果,直接响应json

代码如下:

@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{
    // 使用request重定向页面;
    request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
//        // 重定向
//        response.sendRedirect(request.getContextPath()+"/index.jsp");
//
//        // 直接进行响应
//        // 设置中文乱码
//        response.setCharacterEncoding("UTF-8");
//        response.setContentType("text/html;charset=UTF-8");
//        response.getWriter().print("您好");
//        return;

}

ModelAndView对象

ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。

该对象有两个方法:

addObject(String attributeName, Object attributeValue):添加对象到模型中;

setViewName(String viewName):用于设置逻辑视图名称,视图解析器会根据名称前往指定的视图;

jsp页面

<a href="user/testModelAndView">testModelAndView</a>

控制器代码

@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(Model model){
    ModelAndView mv = new ModelAndView();
    System.out.println("testString方法执行了");
    System.out.println("从数据库中查找数据了");
    User user = new User();
    user.setUsername("小强");
    user.setPassword("123");
    user.setAge(18);
    //把user对象存储到mv对象中,也会把user对象存入到request对象中
    mv.addObject("user",user);
    // 跳转到哪个页面
    mv.setViewName("success");
    return mv;
}

转发和重定向

forward请求转发

controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。

需要注意的是,如果用了 formward: 则路径必须写成实际视图 url,不能写逻辑视图。它相当于“request.getRequestDispatcher("url").forward(request,response)” 。使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。

redirect重定向

contrller 方法提供了一个 String 类型返回值之后, 它需要在返回值里使用:redirect:

举例:

@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
    System.out.println("testForwardOrRedirect方法执行了...");
    // 请求的转发
     return "forward:/WEB-INF/pages/success.jsp";
    // 重定向
//        return "redirect:/index.jsp";
}

ResponseBody响应json数据

该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的
数据如: json,xml 等,通过 Response 响应给客户端

  1. web app下创建新的js文件夹,引入jquery

  2. 在springmvc.xml中配置,哪些静态资源不拦截

    mvc:resources标签:配置哪些资源不过滤

    1. location元素表示webapp目录下的包下的所有文件
    2. mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b
    <!-- 设置静态资源不过滤 -->
    <mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 -->
    <mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 -->
    <mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->
    
  3. 编写jsp页面代码,编写发送ajax函数

    <script src="js/jquery.min.js"></scrpt>
    
        <script>
            // 页面加载,绑定单击事件
            $(function(){
                $("#btn").click(function(){
                    // alert("hello btn");
                    // 发送ajax请求
                    $.ajax({
                        // 编写json格式,设置属性和值
                        url:"user/testAjax",
                        contentType:"application/json;charset=UTF-8",
                        data:'{"username":"hehe","password":"123","age":30}',
                        dataType:"json",
                        type:"post",
                        success:function(data){
                            // data服务器端响应的json的数据,进行解析
                            alert(data);
                            alert(data.username);
                            alert(data.password);
                            alert(data.age);
                        }
                    });
    
                });
            });
    
        </script>
    <body>
    
        <br/>
    
        <button id="btn">发送ajax的请求</button>
    </body>
    </html>
    
  4. 获取请求体的数据

    @RequestMapping("/testAjax")
    public @ResponseBody String testAjax(@RequestBody String body){
        System.out.println("testAjax方法执行了...");
        System.out.println(body);
        return "success";
    }
    
  5. 使用RequestBody注解把Json字符串转为JavaBean对象。发送的key值和javaBean中的属性名相同,则框架自动封装,需要导入三个jar包

    /**
     * JSON -JavaBean; JavaBean->JSON
     * @param user
     */
    @RequestMapping("/testAjax")
    // @ResponseBody User 将User对象转为字符串
    public @ResponseBody User testJson(@RequestBody User user) {
        System.out.println("testAjax方法执行了...");
        System.out.println(user);
        // 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
        // 做响应,模拟查询数据库
        user.setUsername("haha");
        user.setAge(40);
        // 做响应
        return user;
    }
    

json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
posted @ 2019-08-13 21:57  伊万夫斯基  阅读(403)  评论(0编辑  收藏  举报