본문 바로가기

개발

서블릿으로 Dispatchservlet 역할 구현하기-6

NameInfo.xml

- <rot>
- <mapping exClass="member.do" getClassName="UserController">
  <metho exMethod="create" getMethodName="createMember" />
  <metho exMethod="delete" getMethodName="deleteMember" />
  </mapping>
- <mapping exClass="book.do" getClassName="BookController">
  <metho exMethod="create" getMethodName="createbook" />
  </mapping>
  </rot>

---------------------------------------------------------

DispatcherServlet.java 소스의 일부

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
  String controllerName;
  String method; 
  String check;
  
  check = request.getRequestURI();
  check = getClassDoName(check);
  
  mMap = getXMLClassNameMap(mRot.getMappings(),check);
  controllerName = checkClassName(mMap,check);

  method = request.getParameter("method");
  method = checkMethodName(mMap.getMethod(),method);

  try {
   Class Controller = Class.forName(controllerName);   
   Constructor constructor = Controller.getDeclaredConstructor();
   Object object = Controller.newInstance();
   Method[] classMthd = Controller.getDeclaredMethods();
   
            for (int i = 0; i < classMthd.length; i++) {
             Method fld = classMthd[i];
             if(fld.getName().equals(method)){
              Method mth = classMthd[i];
                    mth.invoke(object);
             }
             }
  }
     catch (Throwable e) {
           System.err.println(e);
     }
 } 

​-------------------------------------

Rot.java

@Root
public class Rot {
 @ElementList(inline=true)
    private List<Mapping> mappings;

 public List<Mapping> getMappings() {
  return mappings;
 }

 public void setMappings(List<Mapping> mappings) {
  this.mappings = mappings;
 }

--------------------------------------​

​Metho.java

public class Metho{
 @Attribute
 private String exMethod;
 @Attribute
 private String getMethodName;

 public String getExMethod() {
  return exMethod;
 }
 public void setExMethod(String exMethod) {
  this.exMethod = exMethod;
 }
 public String getGetMethodName() {
  return getMethodName;
 }
 public void setGetMethodName(String getMethodName) {
  this.getMethodName = getMethodName;
 }
}

--------------------------------------​

Mapping.java

@Root(name ="mapping")
public class Mapping{
 
 @Attribute
 private String exClass;
 @Attribute
 private String getClassName;
 @ElementList(inline=true)
 private List<Metho> method;
 
 public List<Metho> getMethod() {
  return method;
 }
 public void setMethod(List<Metho> method) {
  this.method = method;
 }
 public String getExClass() {
  return exClass;
 }
 public void setExClass(String exClass) {
  this.exClass = exClass;
 }
 public String getGetClassName() {
  return getClassName;
 }
 public void setGetClassName(String getClassName) {
  this.getClassName = getClassName;
 }
}

-------------------------------------------

UserController.java

​public class UserController {
 UserController(){
  System.out.println("mc call");
 }
 
 public void createMember(){
  System.out.println("user read call");
 }
 public void deleteMember(){
  System.out.println("user delete call");
 }
}


​xml에서 설정한것 처럼

<mapping exClass="member.do" getClassName="UserController">

  <metho exMethod="create" getMethodName="createMember" />

member.do일때 UserController로 create일때 createMember로 리플렉션을 이용해서 호출이 된다.

<문제 1-1> simpleframework를 하면서 xml파일을 설정에 맞게 스스로 만들어야 했고 xml 양식을 일단 만들어 놓고 클래스로 받으려 하니 단순히 하나하나 받는 것은 문제가 없었는데 메소드와 클래스를 여러개 받을려고 'List<클래스이름'을 중첩해서 쓰니 문제가 발생했다.

(해결 1-1) 클래스를 먼저 만들고 그것에 맞는 xml을 생성했더니 훨씬 더 쉬워지고 직관적으로 만들 수 있었음.

---> 역직렬화

 

<문제 1-2> element 두 개만 쓰려고 했더니 읽어 오지 못함.

 

 

 

 

 

(해결 1-2) 제일 위에 모든 것을 포함하는 것이 있어야함.

---> Root 노드 추가

 

 

 

<문제 2> xml을 만들고 났더니 attribute에 java.util.list라는 속성이 추가 되어있었음.클래스나 매소드를 여러개 받아오려면 @ElementList가 꼭 필요한데 java.util.list는 불필요한 속성임.

(해결 2) framework 설명서에 (inline=true)로 쓰면 생략할수 있음.

 

<문제 3-1> Rot클래스를 지역변수로 설정했더니 리턴 할 경우에나 알맞은 값을 찾아내려고 할 때 이런저런 애로사항이 발생함.

<문제 3-2> 파일을 읽어올 때(ReadXMLinfo) 메소드를 썻는데 한번만 실행하고 싶음. doGet에 쓰려고 했으나 그러면 한번만 실행이 안됨.

(해결 3) Rot클래스를 멤버변수 생성자를 사용했더니 한번만 실행되고 파싱작업도 한번만 됨.

 

<개선사항> 

메소드를 각 역할에 따라 좀 더 세세하게 분리.

- DispatcherServlet이 너무 크다는 생각 알아서 invoke만 해주면 되는데 xml도 읽고 너무 많은 역할을 하고 있음.

서블릿에서 파일입출력을 쓰면 파일을 이클립스 폴더에서 읽어옴이것을 워크스페이스에 있는 클래스에서 읽어오기 위해 멀 바꿔야 할까.

- ReadXMLinfo 메소드인데 첫글자가 대문자.

- check = request.getRequestURI(); check = getClassDoName(check);

check = getClassDoName(request.getRequestURI());

콜스텍이 늘어나는 것은 좋지 않음.