String method = req.getMethod();
String url = req.getRequestURI();
/* routes 정보를 가지고 온다. */
Routes routes = Routes.getInstance();
RouteVO vo = routes.get(method, url);
/* 해당 컨트롤러 접근 */
Class<?> controller = Class.forName(vo.getController());
Object instance = controller.newInstance();
/* 컨트롤러 구조 */
List<Class<?>> clazzes = new ArrayList<Class<?>>();
clazzes.add(instance.getClass()); /* controller */
clazzes.add(instance.getClass().getSuperclass()); /* extend */
/* request, response 인스턴스변수 호출 */
Field requestField = null; /* request */
Field responseField = null; /* response */
/* 클래스 파일을 검사한다. */
for(Class<?> clazz : clazzes)
{
/* 클래스에 인스턴스 변수를 모두 담는다. */
Field[] fields = clazz.getDeclaredFields();
/* 인스턴스변수를 검사한다. */
for(Field field : fields)
{
/* 응답, 전송 필드를 찾는다. */
if("request".equals(field.getName())) requestField = field;
if("response".equals(field.getName())) responseField = field;
/* 필드 정보의 값을 있는 경우 */
if(requestField != null && responseField != null)
{
/* 해당 필드의 setter를 찾아 메소드 선언을 한다. */
Method setRequest = clazz.getDeclaredMethod("setRequest", HttpServletRequest.class);
Method setResponse = clazz.getDeclaredMethod("setResponse", HttpServletResponse.class);
/* 수정 권한을 얻는다. */
setRequest.setAccessible(true);
setResponse.setAccessible(true);
/* 값을 넣는다. invoke */
setRequest.invoke(instance,req);
setResponse.invoke(instance,resp);
/* 더이상 찾을 필요 없음 */
break;
}
}
}
/* 메소드 실행 */
Method def = instance.getClass().getMethod(vo.getDef());
def.invoke(instance);
} catch (Exception e) {
log.severe("routes 정보에 문제가 발생했습니다.");
}