功能實現 需求:根據表單的欄位名,如果和參數的變數名一致,並且類型相容,那麼將數據自動封裝到對應的自動上。 包括的支持的數據類型有: 1.基礎數據類型:long、int、double、float、char、byte、boolean、short 2.基礎數據類型的包裝類:Long、Integer、Do ...
功能實現
需求:根據表單的欄位名,如果和參數的變數名一致,並且類型相容,那麼將數據自動封裝到對應的自動上。
包括的支持的數據類型有:
1.基礎數據類型:long、int、double、float、char、byte、boolean、short
2.基礎數據類型的包裝類:Long、Integer、Double、Float、Character、Byte、Boolean、Short
3.字元串類型:String
這裡有一個難點,由於低於JDK1.8的JDK是不支持直接獲得參數名的。即使高於JDK1.8.也需要在編譯時,添加`-parameters`參數或者啟用調試模式`-g`。(麻煩)
JDK不支持,只能通過讀取class 位元組碼來獲得參數名。有興趣的朋友自己看看asm 這個框架。
實現思路
- 本教案直接使用註解綁定的方法來實現。通過參數的註解來綁定表單欄位與方法參數列表的參數。只要自定義的參數,統一使用註解@Param來綁定
實現步驟
- 聲明一個註解@Param,用於綁定方法參數和表單參數的關係
1 package ioc.webmvc.annotation; 2 3 import java.lang.annotation.Documented; 4 import java.lang.annotation.ElementType; 5 import java.lang.annotation.Retention; 6 import java.lang.annotation.RetentionPolicy; 7 import java.lang.annotation.Target; 8 9 /** 10 * 11 * @author ranger 12 * @date 2017-11-09 13 * 14 */ 15 @Retention(RetentionPolicy.RUNTIME) 16 @Target(value={ElementType.METHOD,ElementType.PARAMETER}) 17 @Documented 18 public @interface Param { 19 20 /** 21 * 指定表單參數的對應的欄位名 22 * @return 23 */ 24 String value() default "" ; 25 26 27 }
2.修改ControllerRelolver類的getparameterObjects方法。讓其判斷參數列表,將表單值賦予對應的@Param的參數
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 Class<?> typeClass = parameters[i].getType(); 7 //3.根據判斷方法參數的類型和我們制定的4個作用是否是父子類關係。如果是就賦值 8 //---判斷ServletAPI的對象request,reponse,session,application 9 if(ServletRequest.class.isAssignableFrom(typeClass)){ 10 parameterObjects[i]=this.request; 11 }else if(ServletResponse.class.isAssignableFrom(typeClass)){ 12 parameterObjects[i]=this.response; 13 }else if(HttpSession.class.isAssignableFrom(typeClass)){ 14 parameterObjects[i]=this.session; 15 }else if(ServletContext.class.isAssignableFrom(typeClass)){ 16 parameterObjects[i]=this.application; 17 18 } 19 //-----增加對象基礎數據類型已經包裝類的判斷------- 20 else if (String.class.isAssignableFrom(typeClass)) { 21 //4.判斷基礎數據類型的String類型 22 Param param = parameters[i].getAnnotation(Param.class); 23 System.out.println(param.value()); 24 parameterObjects[i]=request.getParameter(param.value()); 25 }else if (Long.class.isAssignableFrom(typeClass)) { 26 //5.判斷基礎數據類型的Long類型 27 Param param = parameters[i].getAnnotation(Param.class); 28 System.out.println(param.value()); 29 String parameter = request.getParameter(param.value()); 30 if(parameter!=null&&!"".equals(parameter)){ 31 parameterObjects[i]=Long.valueOf(parameter); 32 }else{ 33 parameterObjects[i]=null; 34 } 35 36 }else if (Integer.class.isAssignableFrom(typeClass)) { 37 //6.判斷基礎數據類型的Integer類型 38 Param param = parameters[i].getAnnotation(Param.class); 39 System.out.println(param.value()); 40 String parameter = request.getParameter(param.value()); 41 if(parameter!=null&&!"".equals(parameter)){ 42 parameterObjects[i]=Integer.valueOf(parameter); 43 }else{ 44 parameterObjects[i]=null; 45 } 46 47 }else if (Double.class.isAssignableFrom(typeClass)) { 48 //7.判斷基礎數據類型的Double類型 49 Param param = parameters[i].getAnnotation(Param.class); 50 System.out.println(param.value()); 51 String parameter = request.getParameter(param.value()); 52 if(parameter!=null&&!"".equals(parameter)){ 53 parameterObjects[i]=Double.valueOf(parameter); 54 }else{ 55 parameterObjects[i]=null; 56 } 57 58 }else if (Float.class.isAssignableFrom(typeClass)) { 59 //8.判斷基礎數據類型的Float類型 60 Param param = parameters[i].getAnnotation(Param.class); 61 System.out.println(param.value()); 62 String parameter = request.getParameter(param.value()); 63 if(parameter!=null&&!"".equals(parameter)){ 64 parameterObjects[i]=Float.valueOf(parameter); 65 }else{ 66 parameterObjects[i]=null; 67 } 68 69 }else if (Boolean.class.isAssignableFrom(typeClass)) { 70 //9.判斷基礎數據類型的Boolean類型 71 Param param = parameters[i].getAnnotation(Param.class); 72 System.out.println(param.value()); 73 String parameter = request.getParameter(param.value()); 74 if(parameter!=null&&!"".equals(parameter)){ 75 parameterObjects[i]=Boolean.valueOf(parameter); 76 }else{ 77 parameterObjects[i]=null; 78 } 79 80 }else if (Character.class.isAssignableFrom(typeClass)) { 81 //10.判斷基礎數據類型的Character類型 82 Param param = parameters[i].getAnnotation(Param.class); 83 System.out.println(param.value()); 84 String parameter = request.getParameter(param.value()); 85 if(parameter!=null&&!"".equals(parameter)){ 86 String s=new String(parameter); 87 parameterObjects[i]=s.toCharArray()[0]; 88 }else{ 89 parameterObjects[i]=null; 90 } 91 92 }else if (Short.class.isAssignableFrom(typeClass)) { 93 //11.判斷基礎數據類型的Short類型 94 Param param = parameters[i].getAnnotation(Param.class); 95 System.out.println(param.value()); 96 String parameter = request.getParameter(param.value()); 97 if(parameter!=null&&!"".equals(parameter)){ 98 parameterObjects[i]=Short.valueOf(parameter); 99 }else{ 100 parameterObjects[i]=null; 101 } 102 103 }else if (Byte.class.isAssignableFrom(typeClass)) { 104 //12.判斷基礎數據類型的Byte類型 105 Param param = parameters[i].getAnnotation(Param.class); 106 System.out.println(param.value()); 107 String parameter = request.getParameter(param.value()); 108 if(parameter!=null&&!"".equals(parameter)){ 109 parameterObjects[i]=Byte.valueOf(parameter); 110 }else{ 111 parameterObjects[i]=null; 112 } 113 114 }else if (long.class.isAssignableFrom(typeClass)) { 115 //5.判斷基礎數據類型的long類型 116 Param param = parameters[i].getAnnotation(Param.class); 117 System.out.println(param.value()); 118 String parameter = request.getParameter(param.value()); 119 if(parameter!=null&&!"".equals(parameter)){ 120 parameterObjects[i]=Long.valueOf(parameter); 121 }else{ 122 parameterObjects[i]=0; 123 } 124 125 }else if (int.class.isAssignableFrom(typeClass)) { 126 //6.判斷基礎數據類型的int類型 127 Param param = parameters[i].getAnnotation(Param.class); 128 System.out.println(param.value()); 129 String parameter = request.getParameter(param.value()); 130 if(parameter!=null&&!"".equals(parameter)){ 131 parameterObjects[i]=Integer.valueOf(parameter); 132 }else{ 133 parameterObjects[i]=0; 134 } 135 136 }else if (double.class.isAssignableFrom(typeClass)) { 137 //7.判斷基礎數據類型的double類型 138 Param param = parameters[i].getAnnotation(Param.class); 139 System.out.println(param.value()); 140 String parameter = request.getParameter(param.value()); 141 if(parameter!=null&&!"".equals(parameter)){ 142 parameterObjects[i]=Double.valueOf(parameter); 143 }else{ 144 parameterObjects[i]=0.0; 145 } 146 147 }else if (float.class.isAssignableFrom(typeClass)) { 148 //8.判斷基礎數據類型的float類型 149 Param param = parameters[i].getAnnotation(Param.class); 150 System.out.println(param.value()); 151 String parameter = request.getParameter(param.value()); 152 if(parameter!=null&&!"".equals(parameter)){ 153 parameterObjects[i]=Float.valueOf(parameter); 154 }else{ 155 parameterObjects[i]=0.0f; 156 } 157 158 }else if (boolean.class.isAssignableFrom(typeClass)) { 159 //9.判斷基礎數據類型的boolean類型 160 Param param = parameters[i].getAnnotation(Param.class); 161 System.out.println(param.value()); 162 String parameter = request.getParameter(param.value()); 163 if(parameter!=null&&!"".equals(parameter)){ 164 parameterObjects[i]=Boolean.valueOf(parameter); 165 }else{ 166 parameterObjects[i]=true; 167 } 168 169 }else if (char.class.isAssignableFrom(typeClass)) { 170 171 //10.判斷基礎數據類型的char類型 172 Param param = parameters[i].getAnnotation(Param.class); 173 System.out.println(param.value()); 174 String parameter = request.getParameter(param.value()); 175 if(parameter!=null&&!"".equals(parameter)){ 176 String s=new String(parameter); 177 parameterObjects[i]=s.toCharArray()[0]; 178 }else{ 179 parameterObjects[i]=' '; 180 } 181 182 }else if (short.class.isAssignableFrom(typeClass)) { 183 //11.判斷基礎數據類型的short類型 184 Param param = parameters[i].getAnnotation(Param.class); 185 System.out.println(param.value()); 186 String parameter = request.getParameter(param.value()); 187 if(parameter!=null&&!"".equals(parameter)){ 188 parameterObjects[i]=Short.valueOf(parameter); 189 }else{ 190 parameterObjects[i]=0; 191 } 192 193 }else if (byte.class.isAssignableFrom(typeClass)) { 194 195 //12.判斷基礎數據類型的byte類型 196 Param param = parameters[i].getAnnotation(Param.class); 197 System.out.println(param.value()); 198 String parameter = request.getParameter(param.value()); 199 if(parameter!=null&&!"".equals(parameter)){ 200 parameterObjects[i]=Byte.valueOf(parameter); 201 }else{ 202 parameterObjects[i]=0; 203 } 204 205 } 206 207 } 208 return parameterObjects; 209 }
測試代碼
1.測試代碼目錄
2.測試頁面
<%@ 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 type="submit" value="註冊"> </form> </body> </html>
3UserController修改
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){ 9 System.out.println("用戶名:"+username+",密碼:"+password+",年齡"+age); 10 System.out.println(request.getRequestURI()); 11 return "redirect:/register.jsp"; 12 }
4.測試結果