一起写框架-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框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以 ...
随机推荐
- ZOJ-2091-Mean of Subsequence (反证法的运用!!)
http://blog.csdn.net/u014355480/article/details/40862041 ZOJ2091 题意:其实就是找后几个数的平均值的最大值!! (贪心策略!要找对) k ...
- Java基础语法(下篇)
Java基础语法(下篇) 内容概要: (1)函数的定义 (2)函数的特点 (3)函数的应用 (4)函数的重载 ...
- zookeeper curator选主(Leader)
在分布式系统设计中,选主是一个常见的场景.选主是一个这样的过程,通过选主,主节点被选择出来控制其他节点或者是分配任务. 选主算法要满足的几个特征: 1)各个节点均衡的获得成为主节点的权利,一旦主节点被 ...
- java.security.InvalidKeyException: Illegal key size
今天遇到一个奇怪的问题. 自己做的加签验签功能已经没有问题了,本地测试通过,同事放到服务器上测试也没问题. 然后我将包放到自己搭建的环境上,会报这样一个错误: java.security.Invali ...
- win10 uwp 保存用户选择文件夹
如果我们每次把临时处理的文件保存,都要让用户选择一次,用户会不会觉得uwp垃圾?如果我们每次打开应用,都从某个文件读取,而这个文件不在应用目录和已知的目录,那么每次都需要用户选择,用户会不会觉得uwp ...
- ~.NET下国际化i18n简单示例
因业务需要,后台站点需要出一个国际化的解决方案,偷懒后用微软自带资源文件暂时解决.废话不多说,进入正题. 第一步:在项目菜单下选择添加国际化资源文件夹. 第二部:添加完毕之后,添加各语言版本下的资源信 ...
- go基础编程 day-2
Go的常亮 关键字: Const Go常亮的多个定义: // 定义常亮的关键字 const // 定义多个常亮 const( PI = 3.14 const1 = " const2 = co ...
- 在WebBrowser控件使用js调用C#方法
有时我们需要在WebBrowser控件中嵌入了网页,然后通过html页面调用后台方法,如何实现呢?其实很简单,主要有三步: 在被调用方法所属的类上加上[ComVisible(true)]标签,意思就是 ...
- <c:forEach items="${list}" var="tt" varStatus="status"> 的相关大小长度
<c:forEach items="${list}" var="tt" varStatus="status"> ${status ...
- 开发手机APP的神器 --- ionic
前 言 在如今的生活中,手机已经与我们的生活紧紧的联系在了一起.而手机APP更是其中,重要的一环.今天,影子就为大家介绍一种开发手机APP的超级神器---ionic. ioni ...