Spring MVC-转发和重定向&数据绑定

Spring MVC

JSP 页面的转发和重定向

Spring MVC 默认以转发的形式响应 JSP,可以手动设置为重定向。

@RequestMapping("test")
public String test(){
	return "redirect:/test.jsp";
}

转发

@RequestMapping("test")
public String test(){
	return "forward:/test.jsp";
}
@RequestMapping("test")
public String test(){
	return "test";
}

Spring MVC 数据绑定

  • 基本数据类型
@RequestMapping("/int")
@ResponseBody
public String intTest(@RequestParam("id") int num){
  return "num:"+num;
}
  • 包装类
@RequestMapping("/package")
@ResponseBody
public String packageTest(Integer num){
  return "num:"+num;
}
  • 数组
@RequestMapping("/array")
@ResponseBody
public String arrayTest(String[] name){
  for (String str:name){
    System.out.println(str);
  }
  return name.toString();
}
  • POJO
@RequestMapping("/pojo")
@ResponseBody
public String pojoTest(User user){
    return user.toString();
}
  • List

自定义包装类

package com.southwind.entity;

import java.util.List;

public class UserList {
    private List<User> users;

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }
}
@RequestMapping("/list")
@ResponseBody
public String listTest(UserList userList){
  for(User user:userList.getUsers()){
    System.out.println(user);
  }
  return "ok";
}
<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-08-15
  Time: 21:00
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/data/list" method="post">
        <input type="text" name="users[0].id"/><br/>
        <input type="text" name="users[0].name"/><br/>
        <input type="text" name="users[1].id"/><br/>
        <input type="text" name="users[1].name"/><br/>
        <input type="text" name="users[2].id"/><br/>
        <input type="text" name="users[2].name"/><br/>
        <input type="submit"/>
    </form>
</body>
</html>

JSON

pom.xml

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.18</version>
</dependency>

springmvc.xml

<mvc:annotation-driven>
  <!-- 消息转换器 -->
  <mvc:message-converters register-defaults="true">
    <!-- fastjson -->
    <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"></bean>
  </mvc:message-converters>
</mvc:annotation-driven>

JSP

<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-08-15
  Time: 21:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
    <script type="text/javascript">
        $(function(){
            var user = {
                "id":1,
                "name":"张三"
            };
            $.ajax({
                url:"/data/json",
                data:JSON.stringify(user),
                type:"POST",
                contentType:"application/json;charset=UTF-8",
                dataType:"text",
                success:function(data){
                    alert(data);
                }
            })
        });
    </script>
</head>
<body>

</body>
</html>

Handler

@RequestMapping("/json")
@ResponseBody
public String json(@RequestBody User user){
  System.out.println(user);
  return user.toString();
}

Spring MVC 视图解析

业务数据的绑定是指将业务数据绑定给 JSP 域对象,并且在客户端进行展示。

pageContext、request、session、application

业务数据的绑定是由 ViewResolver 完成。

Spring MVC 提供了以下几种方式绑定业务数据:

  • Map
  • Model
  • ModelAndView
  • @SessionAttribute
  • @ModelAttribute

业务数据绑定到 request 域对象

Map

Spring MVC 在内部使用 Model 接口存储业务数据,在调用业务方法之前会创建一个隐含对象作为业务数据的存储容器。设置业务方法的入参为 Map 类型,Spring MVC 会将隐含对象的引用传递给入参。

开发者可以对模型中的所有数据进行管理,包括访问和添加、修改、删除。开发者只需要在业务方法处添加 Map 类型的入参,方法体中便可以通过对入参的操作来完成业务数据的添加。

@RequestMapping("/map")
public String mapTest(Map<String,User> map){
    User user = new User();
    user.setId(1);
    user.setName("张三");
    map.put("user",user);
    return "show";
}

Model

与 Map 类似,业务方法通过入参来完成业务数据的绑定。

@RequestMapping("/model")
public String modelTest(Model model){
    User user = new User();
    user.setId(1);
    user.setName("张三");
    model.addAttribute("user",user);
    return "show";
}

HttpServletRequest

@RequestMapping("/request")
public String request(HttpServletRequest request){
  User user = new User();
  user.setName("李四");
  user.setId(2);
  request.setAttribute("user",user);
  return "show";
}

ModelAndView

与 Map、Model 不同的是,ModelAndView 不但包含了业务数据,同时也包含了视图信息,将视图和业务数据进行了整合,封装成一个对象,如果使用 ModelAndView 来处理业务数据,业务方法的返回值必须是 ModelAndView 对象。

业务方法中对 ModelAndView 进行两个操作:

  • 填充业务数据
  • 绑定视图信息
@RequestMapping("/modelAndView")
public ModelAndView modelAndView(){
  User user = new User();
  user.setId(3);
  user.setName("王五");
  ModelAndView modelAndView = new ModelAndView();
  modelAndView.addObject("user",user);
  modelAndView.setViewName("show");
  return modelAndView;
}
@RequestMapping("/modelAndView2")
public ModelAndView modelAndView2(){
    User user = new User();
    user.setId(11);
    user.setName("小明");
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("user",user);
    View view = new InternalResourceView("/show.jsp");
    modelAndView.setView(view);
    return modelAndView;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值