병갈이 블록

홈페이지2 - 서블릿 구성도 본문

IT(Old)/JSP 실습 과정 기록

홈페이지2 - 서블릿 구성도

woojang 2017. 7. 23. 19:13

일단 서블릿을 구성한다.

1. MainServlet - 

2. nromServlet - /nrom/*

3. VipServlet - /vip/*

4. AdminServlet - /admin/*

5. ErrorServlet - /error/*


이렇게 서블릿을 구성한다.

일단 서버를 구동하면 1번이 동작하고 /norm/main으로 포워딩한다.

그러면 2번이 동작하고 /norm/ 이후의 키워드에 따라 적절한 핸들러를 매칭한다.

3번은 회원 전용페이지를 위한 서블릿이다.

4번은 운영진 전용페이지를 위한 서블릿이다.

5번은 에러 발생시 연결할 서블릿이다.


회원 가입을 위한 테이블 및 스키마를 생성한다.



1. 문제 발생. include-prelude로 메인 탑 페이지를 인크루드 시켰다.

/nrom/*형태로 인크루드를 시키니 에러가 계속 발생한다.

파일 경로를 원위치 시켜봤는데도 변함이 없는걸로 봐서는 URL매핑에 관한 문제인 듯 하다.

해결.

jsp-config 설정에서 url-pattern은 루트를 기준으로 실제경로를 입력해줘야 한다.

서블릿 URL매핑은 접속 경로로 동작할 서블릿이 결정이 되는 듯 한데, 

이녀석은 초반에 클래스를 생성해야하는 정보인지라 매핑할 파일의 위치 혹은 폴더의 위치를 입력해줘야 하는 것 같다.

or

아예 컨택스트 경로를 EL변수에 넣어 절대경로로 입력하는 것이다.

상대경로로 입력 시, 페이지의 중첩에 따라 꼬일수 있는 여지가 있으리라 생각이 된다.


2. 사진을 링크를 걸었는데 출력이 되지 않는다. 경로를 어떻게 해야하는건가..

해결했다. 절대경로를 입력해야 했다.

근데 늘 절대경로를 수정할 수는 없는 일 아닌가?

프로퍼티 파일을 읽어오던 코드가 떠올랐다.

request의 서블릿 컨텍스트의 리얼패스를 사용하여 /WEB-INF/ 이하의 파일에 대한 실제 경로를 구한다.

스크립트릿으로 자바코드에서 했던 작업을 동일하게 한다.(2줄이면 됨...)

그리고 필요한 실제경로를 문자열로 받아둔 뒤 표현식으로 img태그의 src속석에 넣는다.

자, 이렇게 되면 프로젝트의 위치가 바뀌더라도 파일의 실제경로를 jsp페이지에서 읽어와 넣기때문에

경로변경의 문제도 해결이 된다. 흠!!!!!!!!!!!!


3. 주소가 중첩되어 전송이 되어 에러가 생성된다.

../nomr/main에서 norm/main을 누르니 ../norm/norm/main이 되어 오류가 발생한다.

일단 컨택스트경로/A/B로 들어오게 되면, A까지가 현재폴더. B는 현재 명령어가 된다.

즉, A라는 폴더에 들어와 있는 셈이다. 이때 a/b로 전송한다는 것은 현재 A폴더 안에있는 a폴더의 b를 찾는 것이다.

폴더의 개념으로 생각하자.


4. 한번씩 경로의 에러가 발생한다.

분명 프로퍼티의 값들도 다 정상이고 경로도 정상인데 왜 핸들러 매핑이 되지 않을까...

프로퍼티 파일 중간에 없는 핸들러를 지정을 해 두었다.

근데 그 이후의 파일이 핸들러 매핑이 안되는것 같아 임시로 핸들러를 만들고 다시 구동을 했더니

접속이 된다.

프로퍼티파일의 값은 임의로 정하면 안된다. 존재하는 핸들러를 매핑해야한다.

일부가 에러발생 요인이 되면 다른것들에도 영향을 준다.


5. rs를 close하는데 계속 널 예외가 난다.

아...왜그럴까, 하다가 예제를 만들었던 걸 다시 보니, 객체가 널이 아닐때만 close처리를 하도록 해두었더라?

try-catch문도 해뒀고...

안그래도 만들면서 '왜 Util클래스를 따로 만들어서 close를 하는거?' 하는 생각이 들었었는데, 

이 예외상황을 보며 깨닫게 되었다. 자원을 반환하는 작업도 은근 까다롭기에...


6. 회원가입으로 넘어가질 않는다.

간단한 문제이긴 했다. Map객체를 비었는지 비교할때 비교연산자를 사용해서 나타난 문제였다.

Map객체나 컬렉션 객체의 경우 .isEmpty()메서드를 이용해서 데이터가 있는지 없는지를 확인하자.


7. 회원가입 후 데이터까지 나오는데 여기서 해결해야 할 문제 두가지.

왜 rank프로퍼티의 값이 비교되지 않는가?

왜 날짜가 엉망으로 나오는가? (이거는 여기 자료로 확인해보기. -> 클릭 )

Comments