数据格式化和ModelAttribute注解的介绍

关于数据传递:

客户端传递数据到服务端:

1.使用普通的形式

A.传递简单的数据

如果是说你传递的数据的名称跟控制层中的形参的名称不一致的情况下需要使用

注解: @RequestParam()如果存在在注解的话,那么一定要传递对应的名称,除非设置required="false"

个人建议是保存名称一致

B.传递的数据为表单的数据

(1)使用普通的表单进行提交,那么你需要注意的是 name="类中的数据",如果是说我的类中有关联的类型那么name="role.role_id",表单中含有name属性才是传递数据

(2)使用Jquery中的表单序列化操作,该操作比较方便,但是如果是日后工作当中,会只用客户端传递JSON的数据形式的字符串

2.使用的是占位符

A.使用占位符操作,那么你一般情况下需要传递简单的数据,形式如下/sys/100/tomcat

控制层当中,一定为如下的格式 /sys/{id}/{name},并且对应的形参中一定要含有@PathVariable注解

B.其实占位符可以传递复杂的数据,但是一般情况下需要你知道如何这是正则表达式

服务端传递数据到客户端:

1.一共介绍了5种形式

(1)使用原生的二阶段用request进行传递数据,需要你再方法(HttpServletRequest)形式

(2)ModelAndView

(3)方法名(Map<String,Object> map)注意这些形参对进行实例化操作

(4)方法名(ModelMap modelMap)注意你可以使用 Ctrl+T的快捷键进行查看继承的关系

(5)方法名(Model model)

(6)返回客户端的数据为JSON的格式 

 JavaScript Object Navtion 轻量级的传输数据格式

XML 

2.关于在客户端显示数据的形式

A.使用EL表达式和JSTL标签

B.使用SpringMVC提供的标签

单独传递数据为日期


<h2>日期传递</h2>

<form action="client01" method="get">

<input type="text" name="mydate" placeholder="输入日期格式">

<input type="submit" value="提交日期数据">

</form>


一般情况下的,日期格式我们习惯于使用YYYY-MM-DD的形式
2012-12-12的这种形式,HTTP Status 400[数据转换失败]
@DateTimeFormat(pattern="yyyy-MM-dd")这种形式的话,那么你的客户端只能传递该种形式
疑问,我想让两种形式2016.01.01格式?


@RequestMapping("/client01")

public ModelAndView test01(@RequestParam(name="mydate") @DateTimeFormat(pattern="yyyy-MM-dd")Date date){

System.out.println(date);

return null;

}

单独传递数据为金钱


<h2>金钱传递</h2>

<form action="client02" method="get">

<input type="text" name="money" placeholder="输入金钱格式">

<input type="submit" value="提交金钱数据">

</form>


关于金钱,我们一般习惯于使用表示方法为:  1,123,000.00的形式,如果工作当中涉及到金钱操作的时候,一会使用的是为BigDecimal处理金钱,还有不能使用你了解的四舍五入,需要使用银行家的四舍五入方式


@RequestMapping("/client02")

public ModelAndView test02(@NumberFormat(pattern="#,###.##")Double money){

System.out.println(money);

return null;

}

疑问,我想让两种形式2016.01.01||2016-10-10||2014/12/12格式?

我们需要使用对数据的处理注解,@InitBinder?

我们介绍的实现方式,现在我们只是了解其使用方式:

当你有客户数据传递的时候,那么我会进入含有标注@InitBinder的方法中


package com.shxt.controller;

import java.awt.Component;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.beans.PropertyChangeListener;

import java.beans.PropertyEditor;

import java.beans.PropertyEditorSupport;

import java.io.UnsupportedEncodingException;

import java.util.Date;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.format.annotation.DateTimeFormat;

import org.springframework.format.annotation.NumberFormat;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.WebDataBinder;

import org.springframework.web.bind.annotation.InitBinder;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.servlet.ModelAndView;

import com.shxt.model.User;

@Controller//如果是你没有命名,那么id=类名的首字母小写

public class ClienDataController {

@RequestMapping("/client01")

public ModelAndView test01(@RequestParam(name="mydate") @DateTimeFormat(pattern="yyyy-MM-dd")Date date){//接收客户端数据,进入@InitBinder注解的方法内部

System.out.println(date);

return null;

}

@RequestMapping("/client02")

public ModelAndView test02(@NumberFormat(pattern="#,###.##")Double money){//接收客户端数据,进入@InitBinder注解的方法内部

System.out.println(money);

return null;

}

@RequestMapping("/client03")

public ModelAndView test03(){//没有接收客户端数据,不进入@InitBinder注解的方法内部

System.out.println("test03");

return null;

}

@RequestMapping("/client04")

public ModelAndView test04(User user){//接收客户端数据,进入@InitBinder注解的方法内部

System.out.println("test04");

return null;

}

@RequestMapping("/client05")

public ModelAndView test05(HttpServletRequest request){//没有接收客户端数据,不进入@InitBinder注解的方法内部

System.out.println("test05");

return null;

}

@RequestMapping("/client06")

public ModelAndView test06(Map<String,Object> map){//没有接收客户端数据,不进入@InitBinder注解的方法内部

System.out.println("test06");

return null;

}

@RequestMapping("/client07")

public ModelAndView test07(String shxt) throws UnsupportedEncodingException{

//如果是GET请求解决中文乱码问题,有两种方式:请自己总结一下

/*System.out.println("test07---->>"+

new String(shxt.getBytes("ISO8859-1"),"UTF-8"));*/

System.out.println("test07---->>"+shxt);

return null;

}

@InitBinder

//当客户端传递数据的时候,并且我的控制器中的方法要接收之前,会进入该标注的方法内部进行处理

public void shxt(WebDataBinder binder){

System.out.println("请注意观察该输入语句,在上面情况下输出?");

//String.class为客户端传递的数据要转换成形参所对应的那个类

binder.registerCustomEditor(String.class, new PropertyEditorSupport(){

//内部类-->>什么是Java内部类,如何使用

@Override

public void setAsText(String text) throws IllegalArgumentException {

System.out.println("客户端传递的数据为:"+text);

setValue(text+":齐天大圣");//重新赋值

}

});

}

}

配置工具类,进行对日期的解决方案


@InitBinder//当客户端传递数据的时候,并且我的控制器中的方法要接收之前,会进入该标注的方法内部进行处理

public void shxt(WebDataBinder binder){

binder.registerCustomEditor(Date.class, new PropertyEditorSupport(){

@Override

public void setAsText(String text) throws IllegalArgumentException {

setValue(DateUtils.parseDate(text));

}

});

}

针对于DateUtils的工具类,默认需要使用commons-lang-2.6.jar包的支持


//注意使用这种方式去实现,自己的工具类的方式?
//可以回去自己去实现继承Map接口,实现一个HashMap,很好玩
public class DateUtils extends org.apache.commons.lang.time.DateUtils {

private static String[] parsePatterns = {

"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",

"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",

"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};

 

介绍@ModelAttribute注解方式介绍

1.模拟情景,更新操作,如下图:

这情景模式,就产生如下的模拟代码:


JSP页面代码:
<h2>用户更新</h2>

<form action="user/update" method="post">

<input type="hidden" name="_method" value="put">

<input type="text" name="account" value="wukong">

<input type="text" name="user_id" value="1000">

<input type="submit" value="用户更新">

</form>


持久化类代码,省略getter和setter

public class User {

private Integer user_id;

private String user_name;

private String account;

private String password;


package com.shxt.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.WebDataBinder;

import org.springframework.web.bind.annotation.InitBinder;

import org.springframework.web.bind.annotation.ModelAttribute;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.servlet.ModelAndView;

import com.shxt.model.User;

@Controller

public class UserController {

@RequestMapping(value="/user/update",method=RequestMethod.PUT)

public ModelAndView update(User user){

System.out.println(user);

return null;

}

@RequestMapping("/shxt")

public ModelAndView test01(){

System.out.println("哈哈哈");

return null;

}

@ModelAttribute

public void init2(){

System.out.println("******");

}

@ModelAttribute

public void init1(Integer user_id){

System.out.println("======"+user_id);

}

@InitBinder//想想这个使用规则?

public void 数据(WebDataBinder binder){

System.out.println("四海兴唐");

}

}

问题:在控制台输出的结果是什么?

那么我们已经搞定了上面的代码,下面我们来进行改造,代码如下:


package com.shxt.controller;

import java.util.Map;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.ModelAttribute;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.servlet.ModelAndView;

import com.shxt.model.User;

@Controller

public class UserController {

@RequestMapping(value="/user/update",method=RequestMethod.PUT)

public ModelAndView update(@ModelAttribute(value="user_data")User user){

System.out.println(user);

return null;

}

@RequestMapping("/shxt")

public ModelAndView test01(){

System.out.println("哈哈哈");

return null;

}

@ModelAttribute

public void init2(){

System.out.println("******");

}

@ModelAttribute

public void init1(Integer user_id,Map<String,Object> map){

//System.out.println("======"+user_id);

if(user_id!=null){

//查询数据库,模拟通过主键查询数据库操作

System.out.println("我进来了");

User user = new User();

user.setUser_id(1000);

user.setAccount("wukong");

user.setPassword("123456");

user.setUser_name("悟空");

map.put("user_data",user);

}

}

}

时间: 2024-10-20 07:00:37

数据格式化和ModelAttribute注解的介绍的相关文章

SpringMVC数据格式化,介绍了解一下

7.3.数据格式化在如Web /客户端项目中,通常需要将数据转换为具有某种格式的字符串进行展示,因此上节我们学习的数据类型转换系统核心作用不是完成这个需求,因此Spring3引入了格式化转换器(Formatter SPI) 和格式化服务API(FormattingConversionService)从而支持这种需求.在Spring中它和PropertyEditor功能类似,可以替代PropertyEditor来进行对象的解析和格式化,而且支持细粒度的字段级别的格式化/解析. Formatter

SpringMVC框架下数据的增删改查,数据类型转换,数据格式化,数据校验,错误输入的消息回显

在eclipse中javaEE环境下: 这儿并没有连接数据库,而是将数据存放在map集合中: 将各种架包导入lib下... web.xml文件配置为 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/

【Spring学习笔记-MVC-9】SpringMVC数据格式化之日期转换@DateTimeFormat

作者:ssslinppp       1. 摘要 本文主要讲解Spring mvc数据格式化的具体步骤: 并讲解前台日期格式如何转换为java对象: 在之前的文章<[Spring学习笔记-MVC-8]SpringMVC之类型转换Converter>(对应链接: http://www.cnblogs.com/ssslinppp/p/4598102.html ) 中讲解了Spring MVC的类型转换,在此回顾下. 数据格式化,从本质上讲属于数据转换的范畴.Spring就是基于数据转换框架植入&q

springmvc在使用@ModelAttribute注解获取Request和Response会产生线程并发不安全问题(转)

springmvc在获取Request和Response有很多方式:具体请看:https://www.cnblogs.com/wade-luffy/p/8867144.html 产生线程问题的代码如下: public class BaseController { protected HttpServletRequest request; protected HttpServletResponse response; protected HttpSession session; @ModelAtt

@ModelAttribute注解的作用

@ModelAttribute注解的作用:1.放在方法上注解不带属性: 方法无返回值: 执行其他方法时,先执行该注解标记方法. 如果方法中有将一些属性放入model的操作,其他方法model中也会共享注解标注方法的model属性. 方法返回对象: 执行其他方法时,先执行该注解标注的方法. 如果有将属性放入model的操作,model中的数据也会共享 方法的返回值会自动装入model中,key值如果没有指定的话为返回对象类型的首字母小写.指定key的话给注解的value属性赋值即可.方法返回的值可

[安卓基础]011存储数据(中)——sqlite语法介绍

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; text-decoration: none; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: poin

springmvc--数据转换&amp;数据格式化&amp;数据校验

数据绑定流程如下: 1.springmvc主框架将servletRequest对象及目标方法的实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象 2.DataBinder调用装配在spring mvc上下文中的ConversionService组件进行数据类型转换,格式化工作,将servlet中的请求信息填充到入参对象中 3.调用Validator组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData对象 4.s

7、SpringMVC源码分析(2):分析HandlerAdapter.handle方法,了解handler方法的调用细节以及@ModelAttribute注解

从上一篇 SpringMVC源码分析(1) 中我们了解到在DispatcherServlet.doDispatch方法中会通过 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()) 这样的方式来执行request的handler方法. 先来分析一下ha.handle方法的调用过程:HandlerAdapter接口有一个抽象实现类AbstractHandlerMethodAdapter,在该抽象类中通过具体方法

Spring的@ModelAttribute注解

1. 一.绑定请求参数到指定对象 Java代码   public String test1(@ModelAttribute("user") UserModel user) 只是此处多了一个注解@ModelAttribute("user"),它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用.我们此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性. 如请求参数包含“?username=zhang&p