zoukankan      html  css  js  c++  java
  • 一起写框架-MVC框架-基础功能-Date类型数据绑定(七)

    实现功能

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

    (1)yyyy-MM-dd hh:mm:ss

    (2)yyyy-MM-dd

    执行方法可以使用Date类型接收。

    实现思路

    1.获得表单字符串。判断是否符合Date的格式。使用DataFormat转成成Date。

    实现代码

    1.原来数据绑定的代码都堆在ControllerRelolver,这样导致ControllerRelolver臃肿了。所以创建一个DataBind数据绑定类,将数据绑定的代码移进里面。

      1 package ioc.webmvc.impl;
      2 
      3 import java.lang.reflect.Parameter;
      4 import java.text.ParseException;
      5 import java.text.SimpleDateFormat;
      6 import java.util.Date;
      7 
      8 import javax.servlet.ServletContext;
      9 import javax.servlet.ServletRequest;
     10 import javax.servlet.ServletResponse;
     11 import javax.servlet.http.HttpServletRequest;
     12 import javax.servlet.http.HttpServletResponse;
     13 import javax.servlet.http.HttpSession;
     14 
     15 import ioc.webmvc.annotation.Param;
     16 
     17 public class DataBind {
     18     /**
     19      * 绑定作用域对象
     20      * @param typeClass
     21      * @param request
     22      * @param response
     23      * @param session
     24      * @param application
     25      * @return
     26      */
     27     public static Object bindScope(Class<?> typeClass, HttpServletRequest request, HttpServletResponse response,
     28             HttpSession session, ServletContext application) {
     29         if (ServletRequest.class.isAssignableFrom(typeClass)) {
     30             return request;
     31         } else if (ServletResponse.class.isAssignableFrom(typeClass)) {
     32             return response;
     33         } else if (HttpSession.class.isAssignableFrom(typeClass)) {
     34             return session;
     35         } else if (ServletContext.class.isAssignableFrom(typeClass)) {
     36             return application;
     37         }
     38         return null;
     39     }
     40 
     41     /**
     42      * 绑定基础数据类型
     43      * 
     44      * @param typeClass
     45      * @param parameter
     46      * @param request
     47      * @return
     48      */
     49     public static Object bindBasicData(Class<?> typeClass, Parameter parameter, HttpServletRequest request) {
     50         Param param = parameter.getAnnotation(Param.class);
     51         if (param == null) {
     52             throw new RuntimeException("自定义参数没有使用@Param注解绑定");
     53         }
     54         System.out.println(param.value());
     55         // 获得参数值
     56         String parameterValue = request.getParameter(param.value());
     57 
     58         if (String.class.isAssignableFrom(typeClass)) {
     59             // 4.判断基础数据类型的String类型
     60             return request.getParameter(param.value());
     61         } else if (Long.class.isAssignableFrom(typeClass)) {
     62             // 5.判断基础数据类型的Long类型
     63             if (parameterValue != null && !"".equals(parameterValue)) {
     64                 return Long.valueOf(parameterValue);
     65             }
     66 
     67         } else if (Integer.class.isAssignableFrom(typeClass)) {
     68             // 6.判断基础数据类型的Integer类型
     69             if (parameterValue != null && !"".equals(parameterValue)) {
     70                 return Integer.valueOf(parameterValue);
     71             }
     72 
     73         } else if (Double.class.isAssignableFrom(typeClass)) {
     74             // 7.判断基础数据类型的Double类型
     75             if (parameterValue != null && !"".equals(parameterValue)) {
     76                 return Double.valueOf(parameterValue);
     77             }
     78 
     79         } else if (Float.class.isAssignableFrom(typeClass)) {
     80             // 8.判断基础数据类型的Float类型
     81             if (parameterValue != null && !"".equals(parameterValue)) {
     82                 return Float.valueOf(parameterValue);
     83             }
     84 
     85         } else if (Boolean.class.isAssignableFrom(typeClass)) {
     86             // 9.判断基础数据类型的Boolean类型
     87             if (parameterValue != null && !"".equals(parameterValue)) {
     88                 return Boolean.valueOf(parameterValue);
     89             }
     90 
     91         } else if (Character.class.isAssignableFrom(typeClass)) {
     92             // 10.判断基础数据类型的Character类型
     93             if (parameterValue != null && !"".equals(parameterValue)) {
     94                 String s = new String(parameterValue);
     95                 return s.toCharArray()[0];
     96             }
     97 
     98         } else if (Short.class.isAssignableFrom(typeClass)) {
     99             // 11.判断基础数据类型的Short类型
    100             if (parameterValue != null && !"".equals(parameterValue)) {
    101                 return Short.valueOf(parameterValue);
    102             }
    103 
    104         } else if (Byte.class.isAssignableFrom(typeClass)) {
    105             // 12.判断基础数据类型的Byte类型
    106             if (parameterValue != null && !"".equals(parameterValue)) {
    107                 return Byte.valueOf(parameterValue);
    108             }
    109         } else if (long.class.isAssignableFrom(typeClass)) {
    110             // 5.判断基础数据类型的long类型
    111             if (parameterValue != null && !"".equals(parameterValue)) {
    112                 return Long.valueOf(parameterValue);
    113             } else {
    114                 return 0;
    115             }
    116 
    117         } else if (int.class.isAssignableFrom(typeClass)) {
    118             // 6.判断基础数据类型的int类型
    119             if (parameterValue != null && !"".equals(parameterValue)) {
    120                 return Integer.valueOf(parameterValue);
    121             } else {
    122                 return 0;
    123             }
    124 
    125         } else if (double.class.isAssignableFrom(typeClass)) {
    126             // 7.判断基础数据类型的double类型
    127             if (parameterValue != null && !"".equals(parameterValue)) {
    128                 return Double.valueOf(parameterValue);
    129             } else {
    130                 return 0.0;
    131             }
    132 
    133         } else if (float.class.isAssignableFrom(typeClass)) {
    134             // 8.判断基础数据类型的float类型
    135             if (parameterValue != null && !"".equals(parameterValue)) {
    136                 return Float.valueOf(parameterValue);
    137             } else {
    138                 return 0.0f;
    139             }
    140 
    141         } else if (boolean.class.isAssignableFrom(typeClass)) {
    142             // 9.判断基础数据类型的boolean类型
    143             if (parameterValue != null && !"".equals(parameterValue)) {
    144                 return Boolean.valueOf(parameterValue);
    145             } else {
    146                 return true;
    147             }
    148 
    149         } else if (char.class.isAssignableFrom(typeClass)) {
    150 
    151             // 10.判断基础数据类型的char类型
    152             if (parameterValue != null && !"".equals(parameterValue)) {
    153                 String s = new String(parameterValue);
    154                 return s.toCharArray()[0];
    155             } else {
    156                 return ' ';
    157             }
    158 
    159         } else if (short.class.isAssignableFrom(typeClass)) {
    160             // 11.判断基础数据类型的short类型
    161             if (parameterValue != null && !"".equals(parameterValue)) {
    162                 return Short.valueOf(parameterValue);
    163             } else {
    164                 return 0;
    165             }
    166 
    167         } else if (byte.class.isAssignableFrom(typeClass)) {
    168 
    169             // 12.判断基础数据类型的byte类型
    170             if (parameterValue != null && !"".equals(parameterValue)) {
    171                 return Byte.valueOf(parameterValue);
    172             } else {
    173                 return 0;
    174             }
    175 
    176         }
    177         return null;
    178 
    179     }
    180 
    181     /**
    182      * 绑定日期类型,默认支持的格式为: 1.yyyy-mm-dd hh:mm:ss 2.yyyy-mm-dd
    183      * 
    184      * @param typeClass
    185      * @param parameter
    186      * @param request
    187      * @return
    188      */
    189     public static Object bindDate(Class<?> typeClass, Parameter parameter, HttpServletRequest request) {
    190         if (Date.class.isAssignableFrom(typeClass)) {
    191 
    192             // 10.判断基础数据类型的char类型
    193             Param param = parameter.getAnnotation(Param.class);
    194             System.out.println("--绑定字段名 :" + param.value());
    195             String parameterValue = request.getParameter(param.value());
    196             String pattern = null;
    197 
    198             if (parameterValue != null && !"".equals(parameterValue)) {
    199                 if (parameterValue.lastIndexOf(":") > 0) {
    200                     pattern = "yyyy-MM-dd hh:mm:ss";
    201                 } else {
    202                     pattern = "yyyy-MM-dd";
    203                 }
    204                 SimpleDateFormat format = new SimpleDateFormat(pattern);
    205 
    206                 try {
    207                     return format.parse(parameterValue);
    208                 } catch (ParseException e) {
    209                     e.printStackTrace();
    210                 }
    211             }
    212 
    213         }
    214         return null;
    215     }
    216 
    217 
    218 
    219 }

     2.修改ControllerRelolver类的绑定参数的方法getparameterObjects

     1 private Object[] getparameterObjects(Parameter[] parameters) {
     2         // 1.创建设置一个参数对象的数组,参数的格式和参数类型的个一致
     3         Object[] parameterObjects = new Object[parameters.length];
     4         //2.根据参数的类型,将对于的对象填在对象数组中
     5         for(int i=0;i<parameters.length;i++){
     6             
     7             Class<?> typeClass = parameters[i].getType();
     8             //3.根据判断方法参数的类型和我们制定的4个作用是否是父子类关系。如果是就赋值
     9             //---绑定域对象request,reponse,session,application
    10             Object scopeData = DataBind.bindScope(typeClass, request, response, session, application);
    11             //---绑定基础数据类型------------------------------
    12             if(scopeData!=null){
    13                 parameterObjects[i]=scopeData;
    14                 continue;
    15             }
    16             Object basicData = DataBind.bindBasicData(typeClass, parameters[i], request);
    17              if(basicData!=null){
    18                     parameterObjects[i]=basicData;
    19                     continue;
    20              }
    21             //---绑定日期格式-------
    22             Object dateData =DataBind.bindDate(typeClass, parameters[i], request);
    23              if(dateData!=null){
    24                     parameterObjects[i]=dateData;
    25                     continue;
    26             }
    27             //---绑定数组数据
    28             Object arrayData = DataBind.bindArray(typeClass, parameters[i], request);
    29             if(arrayData!=null){
    30                 parameterObjects[i]=arrayData;
    31                 continue;
    32             }
    33             
    34         }
    35         return parameterObjects;
    36     }

    测试代码

    1.测试目录

    1.测试页面代码

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10     用户注册
    11      <form action="${pageContext.request.contextPath }/register.do" method="post">
    12        用户名:<input name="username" type="text" /><br/>
    13        密码:  <input name="password" type="text" /><br/>
    14        年龄:    <input name="age" type="text" /><br/>
    15      出生日期:   <input name="date" type="date"><br/>
    16          <input type="submit" value="注册">
    17      </form>
    18 </body>
    19 </html>

    2.测试的Controller代码

     1     /**
     2      * 注册页面
     3      * @param username
     4      * @param password
     5      * @return
     6      */
     7     @RequestMapping(value = "/register")
     8     public String register(@Param("username") String username,@Param("password") String password ,@Param("age") long age,HttpServletRequest request,@Param("date") Date date){
     9         System.out.println("用户名:"+username+",密码:"+password+",年龄"+age);
    10         System.out.println(request.getRequestURI());
    11         System.out.println(date);
    12         return "redirect:/register.jsp";
    13     }

    3.测试结果

  • 相关阅读:
    linux用户管理初级(上)
    定时任务实战
    linux定时任务
    Linux 命令行基础(一)
    Linux 操作系统发展历程及系统版本选择
    Linux文件的权限
    Linux硬连接和软连接
    Linux 文件的属性
    linux 正则表达式
    centos7 设置时间同步
  • 原文地址:https://www.cnblogs.com/zhuyuejiu/p/7821608.html
Copyright © 2011-2022 走看看