SpringMVC基础2 --- 数据请求和响应

数据请求

RequestMapping注解

作用:建立请求URL和处理方法之间的对应关系

应用:可以作用在方法和类上

1. 作用在类上:第一级的访问目录

2. 作用在方法上:第二级的访问目录

3. 细节:路径可以不编写 / 表示应用的根目录开始

属性:

1. path :指定请求路径的url

2. value :value属性和path属性是一样的

3. mthod :指定该方法的请求方式

我们先来做一个简单的数据请求测试

我们以之前配置MVC时的测试为例(可以回看上一节配置介绍),我们在controller层下的HelloController类里写一个方法,并为其加RequestMapping注解

@RequestMapping("/test")
    public String test(){
        System.out.println("测试成功");
        return "suc";
    }

 

 数据请求成功,此时RequestMapping注解仅作用在方法上,所以我们请求时只需1级路径,当我们将RequestMapping注解同时作用在类上时

 我们想要访问到test方法就需要二级路径

 

 接下来我们看一下RequestMapping的请求参数绑定,我们通过form表单进行数据提交,

(1). 绑定机制

1. 表单提交的数据都是k=v格式的 username=haha&password=123

2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的

3. 要求:提交表单的name和参数的名称是相同的

(2). 支持的数据类型

1. 基本数据类型和字符串类型:提交表单的name和参数的名称是相同的

2. 实体类型(JavaBean):提交表单的name和JavaBean中的属性名称需要一致;如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name

3. 集合数据类型(List、map集合等)

我们在model层创建两个实体类:User和Account:

public class Account {
    private Double money;
    }
public class User {
    private String username;
    private Integer age;
    private Account account;
    private List<Account> accounts;
    }

我们在index页面用form表单提交数据,我们先写最基本的username和age

<h1>请求参数绑定入门程序</h1>
    <form action="/MVCClass2/user/run1" method="get">
        <input type="text" name="username"/><br/>
        <input type="text" name="age"/><br/>
        <input type="submit"/>
    </form>

在controller层接收数据

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping(value = "/run1")
    public String run1(String username,Integer age){
        System.err.println(username);
        System.err.println(age);
        return "suc";
    }

}

 

 接下来我们通过对象的方式进行数据传递和接收,这里只需要改一下后台接收的入参即可

@RequestMapping("/run1")
    public String save1(User user){
        System.out.println(user.toString());
        return "suc";
    }

然后我们来传递特殊属性,实体类型和集合类型,后台接收数据无需改变,都是通过user对象接收,我们只需修改form表单的内容即可。

<h1>请求参数绑定入门程序(存在list集合)</h1>
    <form action="/user/save3" method="post">
        <input type="text" name="username"/><br/>
        <input type="text" name="age"/><br/>
        <input type="text" name="account.money"/><br/>
        <input type="text" name="accounts[0].money"/><br/>
        <input type="text" name="accounts[1].money"/><br/>
        <input type="submit"/>
    </form>

数据响应

首先看最传统的数据响应,使用ModelAndView,当访问save3时数据便会直接返回到suc页面。

@RequestMapping("/save3")
public ModelAndView save3(){
    System.out.println("执行了...");
    // 创建mv对象
    ModelAndView mv = new ModelAndView();
    // 把一些数据,存储到mv对象中
    mv.addObject("msg","用户名或者密码已经存在");
    // 设置逻辑视图的名称
    mv.setViewName("suc");
    return mv;
}

第二种是使用servlet的请求转发和重定向机制

通过设置ServletAPI , 不需要视图解析器 .

1、通过HttpServletResponse进行输出

2、通过HttpServletResponse实现重定向

3、通过HttpServletResponse实现转发

@Controller
@RequestMapping(path = "/role") // 一级请求路径
public class RoleController {

    @RequestMapping("/t1")
    public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
        rsp.getWriter().println("Hello,Spring BY servlet API");
    }

    @RequestMapping("/t2")
    public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
        rsp.sendRedirect("/MVCClass2/html/suc.html");
    }

    @RequestMapping("/t3")
    public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
        //转发
        req.setAttribute("msg","hello");
        req.getRequestDispatcher("/html/suc.html").forward(req,rsp);
    }

}

第三种是通过SpringMVC来实现转发和重定向 - 无需视图解析器;

测试前,需要将视图解析器注释掉

@Controller
@RequestMapping(path = "/role") // 一级请求路径
public class RoleController {

    @RequestMapping("/t1")
    public String test1(){
        //转发
        return "/html/suc.html";
    }

    @RequestMapping("/t2")
    public String test2(){
        //转发二
        return "forward:/html/suc.html";
    }

    @RequestMapping("/t3")
    public String test3(){
        //重定向
        return "redirect:/html/suc.html";
    }

}

接下来我们使用ResponseBody响应json数据

首先导入相关依赖

<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>

index.html页面代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
    <script>
        // 页面加载
        $(function(){
            // 单击事件
            $("#btn").click(function(){
            // 发送ajax的请求
                $.ajax({
                    type: "post",
                    url: "/MVCClass2/user/save6",
                    data:{username:"haha",age:"20"},
                    success:function(d){
                        // 编写很多代码
                        alert(d.username+" ‐ "+d.age);
                    }
                });
            });
        });
    </script>
</head>
<body>
<h3>异步的数据交互</h3>
<input type="button" value="ajax交互" id="btn">
</body>
</html>

controller层接收数据和响应,当我们使用@ResponseBody注解时,前台请求之后便不会跳转页面,而是返回一个json字符串数据

@RequestMapping("/save6")
@ResponseBody
public  User save6(User user){
    System.out.println(user);
    // 模拟,调用业务层代码
    user.setUsername("hello");
    user.setAge(100);
    // 把user对象转换成json,字符串,再响应。使用@ResposeBody注解 response.getWriter().print()
    return user;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值