一起写框架-MVC框架-基础功能-Date类型数据绑定(七)
2017-11-16 14:44
344 查看
实现功能
表单请求传递的数据,格式为以下格式的日期时间数据。(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框架-基础功能-简单数据类型参数绑定(六)
- 一起写框架-MVC框架-基础功能-ServletAPI的动态绑定(五)
- 一起写框架-MVC框架-基础功能-环境搭建(二)
- 一起写框架-MVC框架-基础功能-DispacherServlet控制器的实现(三)
- 一起写框架-MVC框架-基础功能-实现forward和redirect的跳转(四)
- SpringMVC 自动绑定数据 - DATE多个类型格式 的数据绑定
- JDK框架简析--java.lang包中的基础类库、基础数据类型
- 我们一起学ABAP (02)~基础语法与数据类型,输出到屏幕
- 数据绑定-将时间戳转换为Date类型yyyy-MM-dd
- 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持组件注解限制(七)
- WPF 绑定以基础数据类型为集合的无字段名的数据源
- 一起谈.NET技术,教你30秒打造强类型ASP.NET数据绑定
- 一起写框架-Ioc内核容器的实现-基础功能-组件注解支持自定义的对象名(九)
- Java基础:Java Date数据类型
- JavaEE_Mybatis_SpringMVC_整合开发_数据绑定_int/Integer等 基础类型自动拆装包中的小问题
- 一起谈.NET技术,强类型ASP.NET数据绑定改进版
- 一起谈.NET技术,强类型ASP.NET数据绑定改进版之第2版
- vue.js--基础 事件结合双向数据绑定实现todolist,增加和删除功能
- 一起写框架-Ioc内核容器的实现-基础功能-getBean(五)
- Java基础:Java Date数据类型