优化controller
controller 中的所有方法有共同点,可以抽取出来处理,设置成公用,优化方法中的内容
FruitController 中的所有方法都需求进行重定向或转发,统一交给中央控制器处理
-
中央控制器调用了 FruitController 中的方法,只需要设置返回值,就能将任务交给中央控制器
-
//response.sendRedirect("fruit.do"); return "redirect:fruit.do"; //super.processTemplate("edit",request,response); return "edit";
-
中央控制器对返回的字符串进行处理,再执行重定向或转发
-
// controller 组件中的方法调用,接收方法返回值为 Object 对象 Object returnObj = method.invoke(controllerBeanObj, request, response); // Object 对象转为 String 字符串 -- 重定向或转发 // 视图处理 String methodReturnStr = (String)returnObj; if(methodReturnStr.startsWith("redirect:")){ // 比如,redirect:fruit.do // 截取子串:fruit.do 进行重定向 String redirectStr = methodReturnStr.substring("redirect:".length()); response.sendRedirect(redirectStr); }
-
FruitController 不再需要调用重定向或转发的方法,因此不需要再继承 ViewBaseServlet
FruitController 中的所有方法都需求从请求中获取参数 request.getParamter(...)
统一在中央控制器中获取 request 的参数,直接将参数传入 FruitController 的方法中
private String add(HttpServletRequest request) throws IOException {
request.setCharacterEncoding("UTF-8");
String fname = request.getParameter("fname");
Integer price = Integer.parseInt(request.getParameter("price")) ;
Integer fcount = Integer.parseInt(request.getParameter("fcount"));
String remark = request.getParameter("remark");
Fruit fruit = new Fruit(0,fname , price , fcount , remark ) ;
fruitDAO.addFruit(fruit);
return "redirect:fruit.do";
}
-
private String add(String fname, Integer price, Integer fcount, String remark) throws IOException { Fruit fruit = new Fruit(0,fname , price , fcount , remark ) ; fruitDAO.addFruit(fruit); return "redirect:fruit.do"; }
中央控制器中统一获取请求参数
-
中央控制器通过反射得到 Controller 中要调用的方法,方法对象类有各种方法可以通过方法对象获取方法需要传入的参数信息,根据得到的参数信息创建存放参数值的数组,最后在方法调用时传入数组即可。
-
// 获取当前方法的参数数组,返回参数数组 比如,parameters[0] = "java.lang.String oper" Parameter[] parameters = method.getParameters();
-
for(int i = 0; i < parameters.length; i++){ Parameter parameter = parameters[i]; // "java.lang.String oper" // getName 方法可以获取参数名 oper,再通过 request.getParameter 方法,从请求中根据参数名获取具体值 String parameterName = parameter.getName(); //先判断参数名是否为 request response session 如果是则直接赋值 if ("request".equals(parameterName)) { parameterValues[i] = request; }else if ("response".equals(parameterName)){ parameterValues[i] = response; }else if ("session".equals(parameterName)){ parameterValues[i] = request.getSession(); }else{ //从请求中获取参数值 String parameterValue = request.getParameter(parameterName); // 将具体的值 oper = update 存入 parameterValues 数组中 parameterValues[i] = parameterValue; } } // parameterValues 存放当前方法需要传入的所有参数值
-
在调用方法直接将 parameterValues 作为参数传入方法即可
-
// 接收方法返回值为 Object 对象 Object returnObj = method.invoke(controllerBeanObj, parameterValues);
常见错误
-
argument type mismatch
-
//从请求中获取参数值 String parameterValue = request.getParameter(parameterName);
-
从请求中获取的参数值都被转为 String 类型,如果原参数是 Integer fid 就会出现类型不匹配
-
因此需要提前获取参数的类型,如果类型不是 String 需要类型转换后存储
-
获取类型,判断,按类型转换
-
//从请求中获取参数值 String parameterValue = request.getParameter(parameterName); // 将具体的值 oper = update 存入 parameterValues 数组中 parameterValues[i] = parameterValue; //获取参数类型,如果是不同类型,则进行转换后再覆盖存储 if ("java.lang.Integer".equals(parameter.getType().getName()) && parameterValue != null) { parameterValues[i] = Integer.parseInt(parameterValue); }
-