实现功能
表单请求传递的数据,格式为以下格式的日期时间数据。
(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.测试结果