Springmvc数据回显实现原理实例解析

数据回显就是当用户数据提交失败时,自动填充好已经输入的数据,一般来说,如果是使用Ajax来做数据提交,基本上是没有数据回显这个需求的,但是如果通过表单做数据提交,那么数据回显就非常必要了。

简单数据类型数据回显

简单数据类型,实际上框架在这里没有提供任何形式的支持,就是我们自己手动配置。加入提交的 Student 数据不符合要求,那么重新回到添加 Student 页面,并且预设之前已经填好的数据。

首先我们先来改造一下 student.jsp 页面:

<form action="/addstudent" method="post">
  <table>
    <tr>
      <td>学生编号:</td>
      <td><input type="text" name="id" value="${id}"></td>
    </tr>
    <tr>
      <td>学生姓名:</td>
      <td><input type="text" name="name" value="${name}"></td>
    </tr>
    <tr>
      <td>学生邮箱:</td>
      <td><input type="text" name="email" value="${email}"></td>
    </tr>
    <tr>
      <td>学生年龄:</td>
      <td><input type="text" name="age" value="${age}"></td>
    </tr>
    <tr>
      <td colspan="2">
        <input type="submit" value="提交">
      </td>
    </tr>
  </table>
</form>

在接收数据时,使用简单数据类型去接收:

@RequestMapping("/addstudent")
public String addStudent2(Integer id, String name, String email, Integer age, Model model) {
  model.addAttribute("id", id);
  model.addAttribute("name", name);
  model.addAttribute("email", email);
  model.addAttribute("age", age);
  return "student";
}

这种方式,相当于框架没有做任何工作,就是我们手动做数据回显的。此时访问页面,服务端会再次定位到该页面,而且数据已经预填好。

实体类数据回显

简单数据类型的回显,实际上非常麻烦,因为需要开发者在服务端一个一个手动设置。如果使用对象的话,就没有这么麻烦了,因为 SpringMVC 在页面跳转时,会自动将对象填充进返回的数据中。

<form action="/addstudent" method="post">
  <table>
    <tr>
      <td>学生编号:</td>
      <td><input type="text" name="id" value="${student.id}"></td>
    </tr>
    <tr>
      <td>学生姓名:</td>
      <td><input type="text" name="name" value="${student.name}"></td>
    </tr>
    <tr>
      <td>学生邮箱:</td>
      <td><input type="text" name="email" value="${student.email}"></td>
    </tr>
    <tr>
      <td>学生年龄:</td>
      <td><input type="text" name="age" value="${student.age}"></td>
    </tr>
    <tr>
      <td colspan="2">
        <input type="submit" value="提交">
      </td>
    </tr>
  </table>
</form>

注意,在预填数据中,多了一个 student. 前缀。这 student 就是服务端接收数据的变量名,服务端的变量名和这里的 student 要保持一直。服务端定义如下:

@RequestMapping("/addstudent")
public String addStudent(@Validated(ValidationGroup2.class) Student student, BindingResult result) {
  if (result != null) {
    //校验未通过,获取所有的异常信息并展示出来
    List<ObjectError> allErrors = result.getAllErrors();
    for (ObjectError allError : allErrors) {
      System.out.println(allError.getObjectName()+":"+allError.getDefaultMessage());
    }
    return "student";
  }
  return "hello";
}

注意,服务端什么都不用做,就说要返回的页面就行了,student 这个变量会被自动填充到返回的 Model
中。变量名就是填充时候的 key。如果想自定义这个 key,可以在参数中写出来 Model,然后手动加入 Student 对象,就像简单数据类型回显那样。

另一种定义回显变量别名的方式,就是使用 @ModelAttribute 注解。

ModelAttribute

@ModelAttribute 这个注解,主要有两方面的功能:

  • 在数据回显时,给变量定义别名
  • 定义全局数据

定义别名

在数据回显时,给变量定义别名,非常容易,直接加这个注解即可

@RequestMapping("/addstudent")
public String addStudent(@ModelAttribute("s") @Validated(ValidationGroup2.class) Student student, BindingResult result) {
  if (result != null) {
    //校验未通过,获取所有的异常信息并展示出来
    List<ObjectError> allErrors = result.getAllErrors();
    for (ObjectError allError : allErrors) {
      System.out.println(allError.getObjectName()+":"+allError.getDefaultMessage());
    }
    return "student";
  }
  return "hello";
}

这样定义完成后,在前端再次访问回显的变量时,变量名称就不是 student 了,而是 s:

<form action="/addstudent" method="post">
  <table>
    <tr>
      <td>学生编号:</td>
      <td><input type="text" name="id" value="${s.id}"></td>
    </tr>
    <tr>
      <td>学生姓名:</td>
      <td><input type="text" name="name" value="${s.name}"></td>
    </tr>
    <tr>
      <td>学生邮箱:</td>
      <td><input type="text" name="email" value="${s.email}"></td>
    </tr>
    <tr>
      <td>学生年龄:</td>
      <td><input type="text" name="age" value="${s.age}"></td>
    </tr>
    <tr>
      <td colspan="2">
        <input type="submit" value="提交">
      </td>
    </tr>
  </table>
</form>

定义全局数据

假设有一个 Controller 中有很多方法,每个方法都会返回数据给前端,但是每个方法返回给前端的数据又不太一样,虽然不太一样,但是没有方法的返回值又有一些公共的部分。可以将这些公共的部分提取出来单独封装成一个方法,用 @ModelAttribute 注解来标记。

例如在一个 Controller 中 ,添加如下代码:

@ModelAttribute("info")
public Map<String,Object> info() {
  Map<String, Object> map = new HashMap<>();
  map.put("username", "javaboy");
  map.put("address", "www.javaboy.org");
  return map;
}

当用户访问当前 Controller 中的任意一个方法,在返回数据时,都会将添加了 @ModelAttribute 注解的方法的返回值,一起返回给前端。@ModelAttribute 注解中的 info 表示返回数据的 key。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解SpringMVC如何进行数据回显

    基本介绍 数据回显:模型数据导向视图(模型数据 ---> Controller ---> 视图) 说明:SpringMVC在调用方法前会创建一个隐含的模型对象,作为模型数据的存储容器(隐含模型) 一.ModelAndView @RequestMapping(method = RequestMethod.POST) public ModelAndView createUser(User user) { userService.createUser(user); ModelAndView mav

  • 解决layui数据表格Date日期格式的回显Object的问题

    有属性: private Date createtime; 但是回显的时候,显示{ Object object },想要转换成字符串格式显示. layui中显示: 在对应的实体类中添加属性:private String createtimestr; 然后添加对应的set/get方法,但是方法处理的是createtime 但是在Mybatis-plus框架映射时,数据库表里面又没有该字段,获取数据的时候会报异常,unknown field "createtimestr" in table

  • layui实现下拉复选功能的例子(包括数据的回显与上传)

    一.layui下拉复选实现的背景:实现一个管理员拥有多个权限 二. 具体实现: //依赖资源 <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/src/layui-formSelects-master/dist/formSelects-v4.css" rel="external nofollow" /> &

  • Android TableLayout数据列表的回显清空实现思路及代码

    复制代码 代码如下: //数据列表的回显 public void shujuList(){ List<Customer> customerList = dao.findALL(); TableLayout tl = (TableLayout) findViewById(R.id.tlLayout); Log.i(">>>", String.valueOf(tl.getChildCount())); int j = tl.getChildCount(); i

  • layui表格数据复选框回显设置方法

    layui2.3版本,本身并不带有复选框回显功能,那么需要从源头解决此事,F12代码调试,找到与复选框关联的地方发现: 我们只需要在渲染数据回调时找到每个复选框根据数据的不同来设置回显. layui这里有一个坑,设置class属性后会造成二次点击效果,千万不要手动修改class属性,那么应该怎么办呢? 每次**点击**其中一个复选框时都会增加一个class属性,第二次点击又会给删除: table.render({ elem: '#LAY_table_topic', url: '/admin/to

  • Android开发之完成登陆界面的数据保存回显操作实例

    本文实例讲述了Android开发之完成登陆界面的数据保存回显操作.分享给大家供大家参考,具体如下: LoginActivity.java: package com.example.login; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.text.TextUtils; import android.view.Menu; import android.view

  • vue组件表单数据回显验证及提交的实例代码

    最近项目需要到vue开发单页面,所以就研究一下表单数据的回显,验证及提交如何用vue组件的方式实现. 代码如下: <template> <div class="index"> <!--header-bar></header-bar--> <div style="margin:20px;"> <div class="item"> <p>住户名称:</p>

  • 解决element ui select下拉框不回显数据问题的解决

    最近在做一个项目,项目的后端是地址: https://github.com/wangyuanjun008/wyj-springboot-security.git 前端地址是 https://github.com/wangyuanjun008/wyj-vue-security.git ,使用的前端语言是vue,使用webpack构建vue-cli全家桶 在项目中用到 el-select 时遇到一个问题,就是在编辑表单时,下拉框的不显示数据,前台代码如下: <el-select v-model=&quo

  • Springmvc数据回显实现原理实例解析

    数据回显就是当用户数据提交失败时,自动填充好已经输入的数据,一般来说,如果是使用Ajax来做数据提交,基本上是没有数据回显这个需求的,但是如果通过表单做数据提交,那么数据回显就非常必要了. 简单数据类型数据回显 简单数据类型,实际上框架在这里没有提供任何形式的支持,就是我们自己手动配置.加入提交的 Student 数据不符合要求,那么重新回到添加 Student 页面,并且预设之前已经填好的数据. 首先我们先来改造一下 student.jsp 页面: <form action="/adds

  • Python中getpass模块无回显输入源码解析

    本文主要讨论了python中getpass模块的相关内容,具体如下. getpass模块 昨天跟学弟吹牛b安利Python标准库官方文档的时候偶然发现了这个模块.仔细一看内容挺少的,只有两个主要api,就花了点时间阅读了一下源码,感觉挺实用的,在这安利给大家. getpass.getpass(prompt='Password: ', stream=None) 调用该函数可以在命令行窗口里面无回显输入密码.参数prompt代表提示字符串,默认是'Password: '.在Unix系统中,strea

  • MySQL InnoDB锁类型及锁原理实例解析

    目录 锁 共享锁 排他锁 意向锁 记录锁 间隙锁 临键锁 死锁 死锁产生条件 行锁发生死锁 表锁发生死锁 锁的释放 事务阻塞 死锁的避免 锁的日志 行锁的原理 不带任何索引的表 带主键索引的表 带唯一索引的表 结论 1.表必定有索引 2.唯一索引数据行加锁,主键索引同样被锁 锁 锁是用来解决事务对数据的并发访问的问题的.MyISAM支持表锁,InnoDB同时支持表锁和行锁. 表加锁语法: lock tables xxx read; lock tables xxx write; unlock ta

  • hashset去除重复值原理实例解析

    Java中的set是一个不包含重复元素的集合,确切地说,是不包含e1.equals(e2)的元素对.Set中允许添加null.Set不能保证集合里元素的顺序. 在往set中添加元素时,如果指定元素不存在,则添加成功.也就是说,如果set中不存在(e==null?e1==null:e.queals(e1))的元素e1,则e1能添加到set中. 下面以set的一个实现类HashSet为例,简单介绍一下set不重复实现的原理: package com.darren.test.overide; publ

  • Java等待唤醒机制原理实例解析

    这篇文章主要介绍了Java等待唤醒机制原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 线程的状态 首先了解一下什么是线程的状态,线程状态就是当线程被创建(new),并且启动(start)后,它不是一启动就进入了执行状态(run),也不是一直都处于执行状态. 这里说一下Java 的Thread类里面有一个State方法,这个方法里面涵盖了6种线程的状态,如下: public enum State { // 尚未启动的线程的线程状态.

  • Spring核心容器IOC原理实例解析

    这篇文章主要介绍了Spring核心容器IOC原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一 .BeanFactory Spring Bean 的创建是典型的工厂模式,这一系列的 Bean 工厂,也即 IOC 容器为开发者管理对象 间的依赖关系提供了很多便利和基础服务.最基本的 IOC 容器接口 BeanFactory,来看一下它的源码: public interface BeanFactory { //对 FactoryBean

  • sql注入报错之注入原理实例解析

    目录 前言 0x01 0x02 0x03 总结 前言 我相信很多小伙伴在玩sql注入报错注入时都会有一个疑问,为什么这么写就会报错?曾经我去查询的时候,也没有找到满意的答案,时隔几个月终于找到搞清楚原理,特此记录,也希望后来的小伙伴能够少走弯路 0x01 我们先来看一看现象,我这里有一个users表,里面有五条数据: 然后用我们的报错语句查询一下: select count(*),(concat(floor(rand()*2),(select version())))x from users g

  • 基于layui的下拉列表的数据回显方法

    静态网页+layui渲染 html代码 <div class="layui-form-item"> <label class="layui-form-label">选择框</label> <div class="layui-input-block"> <select id="t" name="quiz2"> <option value=&qu

  • 详解关于element级联选择器数据回显问题

    element级联选择器数据回显问题 对于前端小菜鸡来说,被这个问题也是困扰了好久.也是百度的方法. 表单部分代码: <el-form-item label="部门名称:" prop="deptId"> <el-cascader placeholder="请选择部门" :props="depShowType" :options="deptData" filterable change-on

随机推荐