实现功能

表单请求传递的数据,格式为以下格式的日期时间数据。

(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类型数据绑定(七)的更多相关文章

  1. 手写Spring MVC框架(一) 实现简易版mvc框架

    前言 前面几篇文章中,我们讲解了Spring MVC执⾏的⼤致原理及关键组件的源码解析,今天,我们来模仿它⼿写⾃⼰的mvc框架. 先梳理一下需要实现的功能点: tomcat加载配置文件web.xml: ...

  2. 自己动手写PHP MVC框架

    自己动手写PHP MVC框架 来自:yuansir-web.com / yuansir@live.cn 代码下载: https://github.com/yuansir/tiny-php-framew ...

  3. 手写Spring MVC框架(二) 实现访问拦截功能

    前言 在上一篇文章中,我们手写了一个简单的mvc框架,今天我们要实现的功能点是:在Spring MVC框架基础上实现访问拦截功能. 先梳理一下需要实现的功能点: 搭建好Spring MVC基本框架: ...

  4. 学习如何写PHP MVC框架(1) -- 路由

    说到PHP开发web,自然离不开开发框架,开发框架为我们提供了灵活的开发方式,MVC层分离,业务解耦等... 第一篇先来简单点的,说说MVC框架的路由功能... 一般的单入口框架路由都是这样的结构: ...

  5. 从零开始写C# MVC框架之--- 配置log4日志

    在框架中配置日志分2步,一个是在帮助项目Zy.Utilities--Zy.Utility.Core中新建log类,封装写入日志方法,还需要在Zy.Utility.Core添加 log4net 的引用 ...

  6. 从零开始写C# MVC框架之--- 项目结构

    框架总分2个项目:Web开发项目.帮助类项目 (ZyCommon.Zy.Utilities) 1.ZyCommon,是Web开发项目结构.新建一个空解决方案,再建Data.Service.ZyWeb解 ...

  7. 自己写一个java的mvc框架吧(五)

    自己写一个mvc框架吧(五) 给框架添加注解的支持 一段废话 上一章本来是说这一章要写视图处理的部分,但是由于我在测试代码的时候需要频繁的修改配置文件,太麻烦了.所以这一章先把支持注解的功能加上,这样 ...

  8. PHP学习笔记,自己动手写个MVC的框架

    最新在大家自己的博客的过程中,发现各种开源的博客系统都或多或少的用起来别扭.于是想动手自己写个博客系统.既然写,就想好好写.那就先写个MVC框架.一点一点来.写的过程中有很多想法.还希望大家能够多多指 ...

  9. MVC框架的插件与拦截器基础

    自制MVC框架的插件与拦截器基础 上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以 ...

随机推荐

  1. windown快速安装xgboost

    记录xgboost的快速安装方式,该方式适合pyhton3.5/3.6版本. 系统: win10 64bit python版本:3.6 1. 下载xgboost编译好的whl包 下载路径为:http: ...

  2. SQL中游标的用法

    游标:是用来对表从上下每行循环取值,将值连接成为字符串.例子:对 pubs 数据库的dbo.titles 表.1.取得表中的总价格:select sum(price) from dbo.titles2 ...

  3. Python自学笔记-paramiko模块(Mr serven)

    文章出处:http://www.cnblogs.com/wupeiqi/articles/5095821.html SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: #!/u ...

  4. ZOJ2401 Zipper 双塔式 DP

    遇到双塔DP,写一下. flag是为了避免memset多次导致的时间浪费. #include<cstdio> #include<cstdlib> #include<ios ...

  5. HTML与标记属性

    网站部分:UI:AI.PS 前端:html.css.js 网站:是一个存放在网络服务器上的完整信息的集合体.由域名.空间服务器.网站程序.数据库等组成.由多个网页以一定的方式连接在一起,成为一个整体. ...

  6. Android 发展史

    1. 概述 http://zh.wikipedia.org/wiki/Android# 2. Android版本发布表 Time Code name Version API level  2014年1 ...

  7. Scrapy架构及其组件之间的交互

    最近在学Python,同时也在学如何使用python抓取数据,于是就被我发现了这个非常受欢迎的Python抓取框架Scrapy,下面一起学习下Scrapy的架构,便于更好的使用这个工具. 一.概述 下 ...

  8. 如何开发webpack plugin

    继上回介绍了如何开发webpack loader 之后.趁热打铁,来继续看下webpack另一个核心组成:plugin. 下面也和loader一样,让我们一起从基本的官方文档着手看起. loader和 ...

  9. ASP.NET Core 认证与授权[3]:OAuth & OpenID Connect认证

    在上一章中,我们了解到,Cookie认证是一种本地认证方式,通常认证与授权都在同一个服务中,也可以使用Cookie共享的方式分开部署,但局限性较大,而如今随着微服务的流行,更加偏向于将以前的单体应用拆 ...

  10. win10 UWP Controls by function

    Windows的XAML UI框架提供了很多控件,支持用户界面开发库.其中一些有可视化,一些布局. 一些控件例子:https://github.com/Microsoft/Windows-univer ...