NameInfo.xml
---------------------------------------------------------
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">
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());
콜스텍이 늘어나는 것은 좋지 않음.
'개발' 카테고리의 다른 글
prepareStatement를 사용하는 이유 3가지,prepareStatement 사용법 (0) | 2016.07.05 |
---|---|
jsp,servlet 한글 인코딩 문제,request.getCharacterEncoding, uri 한글 깨질때 해결법 (0) | 2016.07.05 |
서블릿으로 Dispatchservlet 역할 구현하기-5 (0) | 2016.07.04 |
서블릿으로 Dispatchservlet 역할 구현하기-4(reflection) (0) | 2016.07.04 |
서블릿으로 Dispatchservlet 역할 구현하기-3 (reflection, method, invoke) (0) | 2016.07.04 |