| 22 | @WebServlet("/myDispatcherServlet") // http://localhost/ch2/myDispatcherServlet?year=2021&month=10&day=1 |
| 23 | public class MyDispatcherServlet extends HttpServlet { |
| 24 | @Override |
| 25 | public void service(HttpServletRequest request, HttpServletResponse response) throws IOException { |
| 26 | Map map = request.getParameterMap(); |
| 27 | Model model = null; |
| 28 | String viewName = ""; |
| 29 | |
| 30 | try { |
| 31 | Class clazz = Class.forName("com.fastcampus.ch2.YoilTellerMVC"); |
| 32 | Object obj = clazz.newInstance(); |
| 33 | |
| 34 | // 1. main메서드의 정보를 얻는다. |
| 35 | Method main = clazz.getDeclaredMethod("main", int.class, int.class, int.class, Model.class); |
| 36 | |
| 37 | // 2. main메서드의 매개변수 목록(paramArr)을 읽어서 메서드 호출에 사용할 인자 목록(argArr)을 만든다. |
| 38 | Parameter[] paramArr = main.getParameters(); |
| 39 | Object[] argArr = new Object[main.getParameterCount()]; |
| 40 | |
| 41 | for(int i=0;i<paramArr.length;i++) { |
| 42 | String paramName = paramArr[i].getName(); |
| 43 | Class paramType = paramArr[i].getType(); |
| 44 | Object value = map.get(paramName); |
| 45 | |
| 46 | // paramType중에 Model이 있으면, 생성 & 저장 |
| 47 | if(paramType==Model.class) { |
| 48 | argArr[i] = model = new BindingAwareModelMap(); |
| 49 | } else if(paramType==HttpServletRequest.class) { |
| 50 | argArr[i] = request; |
| 51 | } else if(paramType==HttpServletResponse.class) { |
| 52 | argArr[i] = response; |
| 53 | } else if(value != null) { // map에 paramName이 있으면, |
| 54 | // value와 parameter의 타입을 비교해서, 다르면 변환해서 저장 |
| 55 | String strValue = ((String[])value)[0]; // getParameterMap()에서 꺼낸 value는 String배열이므로 변환 필요 |
| 56 | argArr[i] = convertTo(strValue, paramType); |
| 57 | } |
| 58 | } |
| 59 | |
| 60 | // 3. Controller의 main()을 호출 - YoilTellerMVC.main(int year, int month, int day, Model model) |
| 61 | viewName = (String)main.invoke(obj, argArr); |
| 62 | } catch(Exception e) { |
| 63 | e.printStackTrace(); |
| 64 | } |
| 65 | |
| 66 | // 4. 텍스트 파일을 이용한 rendering |
| 67 | render(model, viewName, response); |
| 68 | } // main |
| 69 | |
| 70 | private Object convertTo(Object value, Class type) { |
| 71 | if(type==null || value==null || type.isInstance(value)) // 타입이 같으면 그대로 반환 |