一起写框架-MVC框架-基础功能-Date类型数据绑定(七)
实现功能
表单请求传递的数据,格式为以下格式的日期时间数据。
(1):yyyy-MM-dd hh:mm:ss
(2):yyyy-MM-dd
执行方法可以使用Date类型接收。
实现思路
1.获得表单字符串。判断是否符合Date的格式。使用DataFormat转成成Date。
实现代码
1.原来数据绑定的代码都堆在ControllerRelolver,这样导致ControllerRelolver臃肿了。所以创建一个DataBind数据绑定类,将数据绑定的代码移进里面。
package ioc.webmvc.impl; import java.lang.reflect.Parameter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import ioc.webmvc.annotation.Param; public class DataBind {
/**
* 绑定作用域对象
* @param typeClass
* @param request
* @param response
* @param session
* @param application
* @return
*/
public static Object bindScope(Class<?> typeClass, HttpServletRequest request, HttpServletResponse response,
HttpSession session, ServletContext application) {
if (ServletRequest.class.isAssignableFrom(typeClass)) {
return request;
} else if (ServletResponse.class.isAssignableFrom(typeClass)) {
return response;
} else if (HttpSession.class.isAssignableFrom(typeClass)) {
return session;
} else if (ServletContext.class.isAssignableFrom(typeClass)) {
return application;
}
return null;
} /**
* 绑定基础数据类型
*
* @param typeClass
* @param parameter
* @param request
* @return
*/
public static Object bindBasicData(Class<?> typeClass, Parameter parameter, HttpServletRequest request) {
Param param = parameter.getAnnotation(Param.class);
if (param == null) {
throw new RuntimeException("自定义参数没有使用@Param注解绑定");
}
System.out.println(param.value());
// 获得参数值
String parameterValue = request.getParameter(param.value()); if (String.class.isAssignableFrom(typeClass)) {
// 4.判断基础数据类型的String类型
return request.getParameter(param.value());
} else if (Long.class.isAssignableFrom(typeClass)) {
// 5.判断基础数据类型的Long类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Long.valueOf(parameterValue);
} } else if (Integer.class.isAssignableFrom(typeClass)) {
// 6.判断基础数据类型的Integer类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Integer.valueOf(parameterValue);
} } else if (Double.class.isAssignableFrom(typeClass)) {
// 7.判断基础数据类型的Double类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Double.valueOf(parameterValue);
} } else if (Float.class.isAssignableFrom(typeClass)) {
// 8.判断基础数据类型的Float类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Float.valueOf(parameterValue);
} } else if (Boolean.class.isAssignableFrom(typeClass)) {
// 9.判断基础数据类型的Boolean类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Boolean.valueOf(parameterValue);
} } else if (Character.class.isAssignableFrom(typeClass)) {
// 10.判断基础数据类型的Character类型
if (parameterValue != null && !"".equals(parameterValue)) {
String s = new String(parameterValue);
return s.toCharArray()[0];
} } else if (Short.class.isAssignableFrom(typeClass)) {
// 11.判断基础数据类型的Short类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Short.valueOf(parameterValue);
} } else if (Byte.class.isAssignableFrom(typeClass)) {
// 12.判断基础数据类型的Byte类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Byte.valueOf(parameterValue);
}
} else if (long.class.isAssignableFrom(typeClass)) {
// 5.判断基础数据类型的long类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Long.valueOf(parameterValue);
} else {
return 0;
} } else if (int.class.isAssignableFrom(typeClass)) {
// 6.判断基础数据类型的int类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Integer.valueOf(parameterValue);
} else {
return 0;
} } else if (double.class.isAssignableFrom(typeClass)) {
// 7.判断基础数据类型的double类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Double.valueOf(parameterValue);
} else {
return 0.0;
} } else if (float.class.isAssignableFrom(typeClass)) {
// 8.判断基础数据类型的float类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Float.valueOf(parameterValue);
} else {
return 0.0f;
} } else if (boolean.class.isAssignableFrom(typeClass)) {
// 9.判断基础数据类型的boolean类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Boolean.valueOf(parameterValue);
} else {
return true;
} } else if (char.class.isAssignableFrom(typeClass)) { // 10.判断基础数据类型的char类型
if (parameterValue != null && !"".equals(parameterValue)) {
String s = new String(parameterValue);
return s.toCharArray()[0];
} else {
return ' ';
} } else if (short.class.isAssignableFrom(typeClass)) {
// 11.判断基础数据类型的short类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Short.valueOf(parameterValue);
} else {
return 0;
} } else if (byte.class.isAssignableFrom(typeClass)) { // 12.判断基础数据类型的byte类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Byte.valueOf(parameterValue);
} else {
return 0;
} }
return null; } /**
* 绑定日期类型,默认支持的格式为: 1.yyyy-mm-dd hh:mm:ss 2.yyyy-mm-dd
*
* @param typeClass
* @param parameter
* @param request
* @return
*/
public static Object bindDate(Class<?> typeClass, Parameter parameter, HttpServletRequest request) {
if (Date.class.isAssignableFrom(typeClass)) { // 10.判断基础数据类型的char类型
Param param = parameter.getAnnotation(Param.class);
System.out.println("--绑定字段名 :" + param.value());
String parameterValue = request.getParameter(param.value());
String pattern = null; if (parameterValue != null && !"".equals(parameterValue)) {
if (parameterValue.lastIndexOf(":") > 0) {
pattern = "yyyy-MM-dd hh:mm:ss";
} else {
pattern = "yyyy-MM-dd";
}
SimpleDateFormat format = new SimpleDateFormat(pattern); try {
return format.parse(parameterValue);
} catch (ParseException e) {
e.printStackTrace();
}
} }
return null;
} }
2.修改ControllerRelolver类的绑定参数的方法getparameterObjects
private Object[] getparameterObjects(Parameter[] parameters) {
// 1.创建设置一个参数对象的数组,参数的格式和参数类型的个一致
Object[] parameterObjects = new Object[parameters.length];
//2.根据参数的类型,将对于的对象填在对象数组中
for(int i=0;i<parameters.length;i++){
Class<?> typeClass = parameters[i].getType();
//3.根据判断方法参数的类型和我们制定的4个作用是否是父子类关系。如果是就赋值
//---绑定域对象request,reponse,session,application
Object scopeData = DataBind.bindScope(typeClass, request, response, session, application);
//---绑定基础数据类型------------------------------
if(scopeData!=null){
parameterObjects[i]=scopeData;
continue;
}
Object basicData = DataBind.bindBasicData(typeClass, parameters[i], request);
if(basicData!=null){
parameterObjects[i]=basicData;
continue;
}
//---绑定日期格式-------
Object dateData =DataBind.bindDate(typeClass, parameters[i], request);
if(dateData!=null){
parameterObjects[i]=dateData;
continue;
}
//---绑定数组数据
Object arrayData = DataBind.bindArray(typeClass, parameters[i], request);
if(arrayData!=null){
parameterObjects[i]=arrayData;
continue;
}
}
return parameterObjects;
}
测试代码
1.测试目录

1.测试页面代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
用户注册
<form action="${pageContext.request.contextPath }/register.do" method="post">
用户名:<input name="username" type="text" /><br/>
密码: <input name="password" type="text" /><br/>
年龄: <input name="age" type="text" /><br/>
出生日期: <input name="date" type="date"><br/>
<input type="submit" value="注册">
</form>
</body>
</html>
2.测试的Controller代码
/**
* 注册页面
* @param username
* @param password
* @return
*/
@RequestMapping(value = "/register")
public String register(@Param("username") String username,@Param("password") String password ,@Param("age") long age,HttpServletRequest request,@Param("date") Date date){
System.out.println("用户名:"+username+",密码:"+password+",年龄"+age);
System.out.println(request.getRequestURI());
System.out.println(date);
return "redirect:/register.jsp";
}
3.测试结果

一起写框架-MVC框架-基础功能-Date类型数据绑定(七)的更多相关文章
- 手写Spring MVC框架(一) 实现简易版mvc框架
前言 前面几篇文章中,我们讲解了Spring MVC执⾏的⼤致原理及关键组件的源码解析,今天,我们来模仿它⼿写⾃⼰的mvc框架. 先梳理一下需要实现的功能点: tomcat加载配置文件web.xml: ...
- 自己动手写PHP MVC框架
自己动手写PHP MVC框架 来自:yuansir-web.com / yuansir@live.cn 代码下载: https://github.com/yuansir/tiny-php-framew ...
- 手写Spring MVC框架(二) 实现访问拦截功能
前言 在上一篇文章中,我们手写了一个简单的mvc框架,今天我们要实现的功能点是:在Spring MVC框架基础上实现访问拦截功能. 先梳理一下需要实现的功能点: 搭建好Spring MVC基本框架: ...
- 学习如何写PHP MVC框架(1) -- 路由
说到PHP开发web,自然离不开开发框架,开发框架为我们提供了灵活的开发方式,MVC层分离,业务解耦等... 第一篇先来简单点的,说说MVC框架的路由功能... 一般的单入口框架路由都是这样的结构: ...
- 从零开始写C# MVC框架之--- 配置log4日志
在框架中配置日志分2步,一个是在帮助项目Zy.Utilities--Zy.Utility.Core中新建log类,封装写入日志方法,还需要在Zy.Utility.Core添加 log4net 的引用 ...
- 从零开始写C# MVC框架之--- 项目结构
框架总分2个项目:Web开发项目.帮助类项目 (ZyCommon.Zy.Utilities) 1.ZyCommon,是Web开发项目结构.新建一个空解决方案,再建Data.Service.ZyWeb解 ...
- 自己写一个java的mvc框架吧(五)
自己写一个mvc框架吧(五) 给框架添加注解的支持 一段废话 上一章本来是说这一章要写视图处理的部分,但是由于我在测试代码的时候需要频繁的修改配置文件,太麻烦了.所以这一章先把支持注解的功能加上,这样 ...
- PHP学习笔记,自己动手写个MVC的框架
最新在大家自己的博客的过程中,发现各种开源的博客系统都或多或少的用起来别扭.于是想动手自己写个博客系统.既然写,就想好好写.那就先写个MVC框架.一点一点来.写的过程中有很多想法.还希望大家能够多多指 ...
- MVC框架的插件与拦截器基础
自制MVC框架的插件与拦截器基础 上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以 ...
随机推荐
- topN 算法 以及 逆算法(随笔)
topN 算法 以及 逆算法(随笔) 注解:所谓的 topN 算法指的是 在 海量的数据中进行排序从而活动 前 N 的数据. 这就是所谓的 topN 算法.当然你可以说我就 sort 一下 排序完了直 ...
- 干了这杯Java之Vector
Vector实现了AbstractList抽象类和List接口,和ArrayList一样是基于Array存储的 Vector 是线程安全的,在大多数方法上存在synchronized关键字 //Vec ...
- win10 uwp 截图 获取屏幕显示界面保存图片
本文主要讲如何保存我们的屏幕显示的,保存为图片,也就是截图,截我们应用显示的. UWP有一个功能,可以截图,RenderTargetBitmap 我们首先写一个Grid,我们需要给他名字,我这里给他S ...
- win10 uwp 切换主题
本文主要说如何在UWP切换主题,并且如何制作主题. 一般我们的应用都要有多种颜色,一种是正常的白天颜色,一种是晚上的黑夜颜色,还需要一种辅助的高对比颜色.这是微软建议的,一般应用都要包含的颜色. 我们 ...
- ubuntu下codeblocks安装与中文化
什么是Code::Blocks Code::Blocks是一个免费.开源.跨平台的集成开发环境,使用C++开发,并且使用wxWidgets做为GUI库.Code::Blocks使用了插件架构,其功能可 ...
- zookeeper 笔记-机制的特点
zookeeper的getData(),getChildren()和exists()方法都可以注册watcher监听.而监听有以下几个特性: 一次性触发(one-time trigger) 当数据改变 ...
- 从零使用Python测试。Testing Using Python.
0. 写在前面 本人使用Python测试已有多年,略有些皮毛经验.每次有新员工入职,都会从头教一遍如何入门上手使用Python进行测试.趁这段有空,整理成文档,也好方便后续新员工学习.文章如有不妥之处 ...
- MQTT——连接报文
学习MQTT协议.如果只是看了相关文档就认为可以了.那是一个错误的观念.笔者为了能更好的去理解MQTT协议.看了不少相关的开源Broker的项目.可惜这些项目一般都是不完全的.不过从这些项目中笔者至少 ...
- C++ UI资源
最近又来搞界面了,现把这几天收集到的资料汇总下,方便今后慢慢学习! Duilib: Duilib是一个Windows下免费开源的DirectUI界面库,由于简约易扩展的设计以及稳定高效的实现被各大互联 ...
- 什么是Echarts?Echarts如何使用?
什么是Echarts? Echarts--商业级数据图表 商业级数据图表,它是一个纯JavaScript的图标库,兼容绝大部分的浏览器,底层依赖轻量级的canvas类库ZRender,提供直观, ...