Spring接收数据,传递数据

前提配置

POM

  
         <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>

applicationContext


     <context:component-scan base-package="controller"/>
<mvc:annotation-driven/>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>

接收数据

接收数据:从B(Browser)浏览器这一端,传递数据给S(Server)服务端。

数据来源

​ 有以下几个地方

  • url查询字符串:/calc/add?id=100&name=cj -> [id:100],[name:cj]

  • cookie

  • 表单(Form)

  • 路径变量(Path Variable) /calc/add/a/b ->a,b 这2个值

  • 等等

Spring mvc接收数据的形式

Spring自动会帮我们把数据接收,并转换为方法的参数。

数据绑定

Http协议里面的数据都是字符串类型,所以spring mvc帮我们自动绑定的时候,一般都会这么3个任务要做

  • 类型转换:把字符串转换为方法参数的类型

  • 数据校验

  • 数据绑定:给我们设定的对象赋值。

    • 简单类型:比如string,int,float等

    • 复杂类型:就是自定义的POJO:比如UserInfo

接收数据的做法

  • 自动

  • @RequestParam

  • @PathVariable

RequestParam

此注解有2个比较有用的属性,

  • required:表明是否必须给参数赋值

  • defaultValue:如果数据来源里面没有此参数的值,那么就采用默认值。

PathVariable

在控制器方法中这样声明

 @RequestMapping("/data")
public class DataReceiveController{
@RequestMapping("/first/{name}")
public void receive(UserInfo userInfo,
@RequestParam(defaultValue = "1") int id, @PathVariable("name") String xx){
System.out.println(userInfo);
System.out.println(id);
System.out.println(xx);
}
}

输入下面的url访问

http://localhost:8080/data/first/abc?id=7

那么路径变量name的值就是abc

绑定到集合(List,Set,Map)

特殊的类型

比如下面这些

  • HttpServletRequest

  • HttpSession

  • HttpServletResponse

所有支持的类型

传递数据给视图

一般的方法有这么几种

  • 利用ModelAndView

  • 利用隐式的模型对象,Model,ModelMap,Map<String,Object>

  • 原生的API,比如HttpServletRequest,HttpSession

  • @ModelAttribute传递

  • @SessionAttribute

  • RedirectAttributes传递

ModelAndView传递数据


 @RequestMapping("/passBasic")
public ModelAndView basic(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
modelAndView.addObject("a", "aaa");
modelAndView.addObject("b", "bbb"); return modelAndView;
}

在index.jsp里面就可以这样取数据,默认数据是放在请求作用域里


 <h1>a: ${a}</h1>
<h1>b: ${b}</h1>

Model,ModelMap,Map<String,Object>

 @RequestMapping("/pass1")
public String pass1(Model model, ModelMap modelMap,Map<String,Object> map){
modelMap.addAttribute("a", "aaa");
return "index";
}

在视图里面就可以这样取值,上面的数据仍然是放置在请求作用域的,而且三个类型赋值的都是同一个对象,通过调试模式可以看到对象是什么。


 <h1>aaaa: ${a}</h1>

@ModelAttribute

@ModelAttribute的本质作用就是把数据放到隐式模型对象中

细分的话,可以分为两种,一种是作用在方法参数上,一种是作用在普通的方法上

作用在参数上

  @RequestMapping("/pass2")
public String pass2(@ModelAttribute("b") String b,ModelMap modelMap){
System.out.println("---pass2: " + b);
return "index";
}

意思就是好把参数b的数据,以“b”(ModelAttribute指定的值)为键存放到隐式模型对象中,这样视图中就可以取到了。

 <h1> ${b}</h1>

作用在普通方法上

 @ModelAttribute("b")
public UserInfo getUserInfo(){
UserInfo ui = new UserInfo();
ui.setId(100);
ui.setName("100aa");
return ui;
}

其含义是每次调用请求处理方法时,这个方法都会在请求处理方法执行前得到执行,并把userinfo对象以键“b" 存放到隐式模型数据中

然后在jsp页面里面就可以取值了 (作业:验证我这句话的正确性)

 <h1>${af}</h1>

基于这些信息,布置下面的作业

  • 添加多个@ModelAttribute修饰的方法,执行顺序会是怎么样的?

  • ModelAttribute修饰的方法的修饰符可以为private吗?

  • 其方法能返回void吗?

  • 其方法能添加参数,并且Spring mvc会自动注入值吗?

@ SessionAttribute

其作用就是从HttpSession中取值,并赋值给参数,比如下面的代码就是从HttpSession中取出键为session的数据,并自动绑定到name上。

   @RequestMapping("/get")
public String get( @SessionAttribute("session") String name){
// session.getAttribute()
System.out.println("get session--" + name);
return "index";
}

RedirectAttributes

默认情况下 它的一个重要功能就是把数据临时放置到Session中,重定向一次后就会从session中删除。

下面是代码,请求/redirect时,通过addFlashAttribute方法会临时把数据放置到session中。

   @RequestMapping("/redirect")
public String redirect(RedirectAttributes redirectAttributes){
redirectAttributes.addAttribute("aa", "add attribute");
redirectAttributes.addFlashAttribute("af","add flash");
return "redirect:/redirect2";

}
重定向这个方法后,仍然可以取出af的值。
 @RequestMapping("/redirect2")
public String redirect2(ModelMap model){
System.out.println("----已经重定向了。" + model.get("af"));
return "redirect:/redirect3";
}

重定向到这个方法时,已经不能从session中取值了。(作业:如果这个方法加一个Model类型作为参数,里面可以看到af的值吗?)


 @RequestMapping("/redirect3")
public String redirect3 (){
return "index3";
}

然后在index3.jsp里面也就无法取得数据了。

作业

作业:理解ModelAttribute

通过地址/abc,下面的代码能在视图中取到值吗?


 @RequestMapping("/abc")
public String redirect3 (){
return "index3";
}
@ModelAttribute("b")
public UserInfo getUserInfo(){
UserInfo ui = new UserInfo();
ui.setId(100);
ui.setName("100aa");
return ui;
}

jsp


 <h1>${b.name}</h1>

作业 找出赋值给Model,ModelMap,Map<String,Object> 的对象的类名

作业:自学@SessionAttributes

作业:完成update与查询操作(可以用数据库,也可以不用数据库)

Spring接收数据,传递数据的更多相关文章

  1. spring跨重定向传递数据

    spring跨重定向传递数据 为何要重定向? 作用之一:防止表单重复提交 如何重定向? // 在控制器方法返回的视图名称中,以redirect:开头的String不是用来查找视图的,而是用来指导浏览器 ...

  2. cocos2d JS 自定义事件分发器(接收与传递数据) eventManager

    简而言之,它不是由系统自动触发,而是人为的干涉 较多情况用于传递数据 var _listener1 = cc.EventListener.create({ event: cc.EventListene ...

  3. 探究Spring Boot中的接收参数问题与客户端发送请求传递数据

    结合此篇参考Spring框架学习笔记(9)--API接口设计相关知识及具体编码实现 在使用Spring Boot进行接收参数的时候,发现了许多问题,之前一直都很忙,最近才稍微有空研究一下此问题. 网上 ...

  4. EF5+MVC4系列(7) 后台SelectListItem传值给前台显示Select下拉框;后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式(ViewDate,TempDate,ViewBag,Model (实际是ViewDate.Model传值))

    一:后台使用SelectListItem 传值给前台显示Select下拉框 我们先来看数据库的订单表,里面有3条订单,他们的用户id对应了 UserInfo用户表的数据,现在我们要做的是添加一个Ord ...

  5. MVC系列学习(五)-传递数据 与 接收数据

    1.控制器向视图传递数据 a.使用ViewData b.使用ViewBag c.使用Model 方式二: d.使用TempData 2.为什么在控制器中设置了一些属性,在视图中可以接受 3.Actio ...

  6. Spring之跨重定向请求传递数据

    摘要 在开发场景中,大部分数据都是使用请求转发(forward)进行传递,而使用重定向(redirect)传递数据可能比较少. 那么问题来了:请求中的数据生命周期存活时间只在一个请求转发(reques ...

  7. Spring 跨重定向请求传递数据

    在处理完POST请求后, 通常来讲一个最佳实践就是执行一下重定向.除了其他的一些因素外,这样做能够防止用户点击浏览器的刷新按钮或后退箭头时,客户端重新执行危险的POST请求. 在控制器方法返回的视图名 ...

  8. Spring Batch : 在不同steps间传递数据

    参考文档: How can we share data between the different steps of a Job in Spring Batch? Job Scoped Beans i ...

  9. 使用axios向后端传递数据,后端接收不到?

    开始使用axios的时候,按照官网的例子请求后端接口,遇到了后端接收不到数据的情况. 翻看了文档也没找到解决方法.先来了解下基本的axios 想要使用axios,需要先安装 npm install a ...

随机推荐

  1. 24-python基础-python3-浅拷贝与深拷贝(2)

    4.copy 模块的 copy()和 deepcopy()函数   在处理列表和字典时,尽管传递引用常常是最方便的方法,但如果函数修改了传入的列表或字典,可能不希望这些变动影响原来的列表或字典.要做到 ...

  2. 单链表的java实现

    class LNode { public LNode next; public int data; } class Lianbiao { private static LNode head = new ...

  3. termcap - 终端功能数据库

    描述 DESCRIPTION termcap 数据库是一个过时 (obsolete) 工具,用来描述以字符为单位的终端和打印机的功能.它之所以被保留,是为了兼容古老的程序:新程序应当使用 termin ...

  4. dubbo-源码阅读之服务订阅

    配置例子 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://w ...

  5. 【学术篇】The Xuanku Inversion Magic学习笔记

    退役之前写的 然后因为退役就咕咕咕了... 后来发现数学考试能用的到个鬼就发布出来了QwQ 主要是方便自己没登录的时候查阅... 显然子集什么的是没有学会的QwQ 所以学OI的话不要看本文!!!!!& ...

  6. rabbitMQ 问题

    1.有时候在学习或者测试的时候,发现我在一个EXCHANGE  上面绑定了多个通道,这些通道的ROUTING_KEY 各不相同.但是从发送端 发到EXCHANGE 时,却在别的通道上面也收到了该消息, ...

  7. python_django_类视图的第一次忐忑碰触!!!

    我们Django学到这里,基础知识阶段是已经完成了!! 在我们前面接触到的视图都是基于函数的视图函数我们可以称它为FBV,而今天我们新接触的就是视图函数的另一类CBV:基于类的视图函数,我们这里拓展这 ...

  8. spring framework三个版本的下载包区别

    docs:该文件夹下包含Spring的相关文档.开发指南及API参考文档:dist:该文件夹下包含Spring jar包.文档.项目等内容:schema:里面包含了Spring4所用到的xsd文件:

  9. Android VideoView无法播放网络视频

    今天学习Android播放视频和音频,其中在练习播放视频的时候无法播放网络视频,网络视频是别人发布在网上的,但是把视频放在本地是可以的,最后推测是没有开放网络的访问权限的问题,果然开放了之后就能正常访 ...

  10. CSIC_716_20191213【内置函数exec、元类】

    In memory of the more than 300 thousand Chinese murdered exec( 字符类型的代码,全局变量,局部变量 ).其中,全局变量和局部变量可以写成字 ...