一起写框架-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框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以 ...
随机推荐
- open() close()
open() 方法可以查找一个已经存在或者新建的浏览器窗口. 语法: window.open([URL], [窗口名称], [参数字符串]) 每个参数必须用引号 参数说明: URL:可选参数,在窗口中 ...
- SQL查询和删除重复字段的内容
--例如: id NAME VALUE 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c pp 7 c pp 8 c iii --id是主键 --要求得到这样的结果 id ...
- DevOps之域名
唠叨话 关于德语噢屁事的知识点,仅提供精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. 域名系统DNS(Domain Name System) 关于域名,知识与技能的层次(知道.理解.运用) ...
- winPcap编程之不用回调方法捕获数据包(五 转)
这一次要分析的实例程序跟上一讲非常类似(“打开适配器并捕获数据包”),略微不同的一点是本次将pcap_loop()函数替换成了pcap_next_ex()函数.本节的重点也就是说一下这两个函数之间的差 ...
- cocos2dx - 伤害实现
接上一节内容:cocos2dx - 生成怪物及AI 本节主要讲如何通过创建简单的矩形区域来造成伤害 在小游戏中简单的碰撞需求应用box2d等引擎会显得过于臃肿复杂,且功能不是根据需求定制,还要封装,为 ...
- 框架应用 : Spring MVC - 开发详述
软件开发中的MVC设计模式 软件开发的目标是减小耦合,让模块之前关系清晰. MVC模式在软件开发中经常和ORM模式一起应用,主要作用是将(数据抽象,数据实体传输和前台数据展示)分层,这样前台,后台,数 ...
- web前端上传图片的几种方法
1.表单上传 最传统的图片上传方式是form表单上传,使用form表单的input[type=”file”]控件,打开系统的文件选择对话框,从而达到选择文件并上传的目的. form表单上传 表单上传需 ...
- win10 UWP RSS阅读器
RSS简易信息聚合(也叫聚合内容)是一种RSS基于XML标准,在互联网上被广泛采用的内容包装和投递协议.RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使 ...
- HashMap工作原理 和 HashTable
原文链接: Javarevisited 翻译: ImportNew.com - 唐小娟 译文链接: http://www.importnew.com/7099.html 你用过HashMap吗 譬如H ...
- 服务端事件EventSource揭秘
服务端推 服务端推,指的是由服务器主动的向客户端发送消息(响应).在应用层的HTTP协议实现中,"请求-响应"是一个round trip,它的起点来自客户端,因此在应用层之上无法实 ...