봉봉의 개인 블로그
2017-06-12-E 본문
게시판 예제 분석하기
index~insert form 까지
먼저 여기까지의 화면을 분석하겠다.
먼저 index.jsp 파일을 만들고 안을 아래와 같이 적어줍니다.
여기서 index 를 실행하게 되면 /board/BoardWrite.bo 를 요청합니다.
/board/BoardWrite.bo 는 WebContent 파일안에 WEB-INF 파일안에 web.xml 파일을 보면
위 파일과 같이 ~.bo 라고 요청을 하게 되면 미리 맵핑 되어있는 net.board.BoardFrontController 로 이동하게 됩니다.
그럼 servlet 인 BoardFrontController.java 를 살펴보면
위와 같이 코드가 작성이 되어있다 여기서 먼저 index.jsp 에서는 get 방식으로 요청하엿기때문에
48번줄에 있는 doget 메서드가 호출됩니다. 여기서는 이제 받아온 request와 response 를 다시 매개변수 값으로 입력하여 doprocess 를 호출합니다. 호출된 doprocess는 String 타입의 RequestURI 변수 안에는 request 안에 getrequestURI 메서드의 값을 담고 (전체 경로)
contextPath 변수 안에는 request 안에 getcontextPath 메서드의 값을 담고 (프로젝트경로까지)
command 변수 안에는 RequestURI 변수 안에 담긴 값을 substring 해서 담아줄겁니다 substring 의 즉 contextPath 의 길이부터 끊어서 담아줍니다 .이렇게 하게 되면
이런식으로 콘솔차엥 뜨게 됩니다. 그후 만약 command 의 값이 81~147번까지의 문에 만약 command 안에 값이 일치하는 if 문이나 else if 문이 있으면 그 문이 실행됩니다 지금은 command 안에 /board/BoardWrite.bo 가 담겨있으므로 81~85번까지의 if 문이 실행됩니다.81번 if 문에서는 ActionForward 생성자를 통해 생성된 객체의 주소값을 forward 안에 담습니다 여기서 ActionForward 는 아래와 같이 적혀잇습니다.
이제 forward 주소값을 찾아가서 setRedirect 메서드를 통해서 false 값을 매개변수값으로 입력해 호출하고 호출된 setRedirect 에서는 받은 매개변수를 전역변수안에 set 합니다.
그후 다시 컨트롤러 에서 다시 forward 안에 setPath 를 통해서 ./qna_board_write.jsp 값을 set 해줍니다.
그후 if문이 끝나고 151~166번까지의 문이 실행됩니다.151번문에서 만약 forward 의 값이 null 이 아니면 그안에 if 또는 else 문이 실행됩니다 만약 forward.isRedirect 의 값이 만약 ture 면 if 문이 실행되어 response 하게 되고 만약 false 값이면 else 문이 실행되어 forwarding 하게 됩니다. 지금 set 된 값은 false 이기 때문에 else 문이 실행되고 157번문에서와 같이 RequestDispatcher 타입으로 변수 dispathcher 를 선언하고 그안에 request안에 getRequestDispatcher 메서드호출시 매개변수 값으로 forward.getPath() 의 값을 담아 이동할 경로에 대한 요청에 대한 경로를 담아줍니다
그후 161 번문에서와같이 dispathcher 담긴 요청 주소로 forward 를 할것인데 넘겨줄 forward 의 값은 request 와 response를 넘겨줍니다 그럼 여기서 이동하는 경로는./qna_board_write.jsp 이므로 qna_board_write.jsp 만든다음 아래와 같이 적어줍니다.
적어주고 index.jsp 를 다시 실행하게 되면
이런식의 화면이 뜨게 되는것이다.
insert pro 까지
이제 입력처리까지 해볼것이다 먼저 입력 화면에서 데이터를 입력하고 등록을 눌러줍니다. 그럼
qna_board_write.jsp 에서 15문에 보면 요청을 할때 ./BoardAddAction.bo 로 요청을 하고 post 방식으로 요청하고 잇다 그러면 ~.bo 방식으로 요청하고 잇기 때문에 다시 BoardFrontController 로 가게 되는것이다.
그럼 servlet 인 BoardFrontController.java 를 살펴보면 (위쪽에 적혀있다) dopost 가 호출되고 그안에 다시 doprocess호출시 request 와 response를 매개변수값으로 받아 실행됩니다 다시 doprocess 는 아까와 같은 역활을 합니다 ( 위쪽에 적혀있다)
그후 command 의 값이 /board/BoardAddAction.bo 이므로 104번에 있는 else if 문이 실행됩니다.
그러면 여기서 먼저 BoardAddAction 생성자를 통해 생성된 객체의 주소값을 action 에 담습니다
그후 forward 안에는 action안에 execute메스드 실행하고 리턴된 값을 forward 안에 담아줍니다.
BoardAddAction.java 클래스 안을 살펴보면
이렇게 적혀있습니다 일단 먼저 11번 줄을 살펴보면 BoardAddAction 클래스는 Action이라는 인터페이스를 상속받습니다.
Action 인터페이스 안에는
이런식으로 추상 메서드를 가집니다.
다시 BoardAddAction.java 클래스로 돌아와서 보면 Action 인터페이스를 상속받고 그안에는 execute 라는 추상 메서드가 있기때문에 재구현하여 사용하여야합니다.
그래서 BoardAddAction.java클래스 안에는 오버라이딩된 execute 메서드가 재정의 되어있다.
재정의 되어잇는 execute 메서드를 중요 부위만 살펴보면
27번 문에서는 realFolder 안에는 파일을 업로드된 파일을 저장할 하드 디스크에 대한 곳을담고잇다
그후 33~39번문은 MultipartRequest 타입으로 생성자 호출시 매개변수 값으로 request , realFolder, fileSize,인코딩,new DefaultFileRenamePolicy() 를 매개변수 값으로 하여 생성된 객체의 주소값이 multi 변수 안에 담습니다
그후 boarddata 안에 set 메서드를 통해 각각의 데이터를 set 하는데 multi 주소값안에 getParameter를 통해 각각의 키값에 맞는 값을 set 하게 됩니다 그후 boarddao 주소값 안에 boardInsert메서드 호출시 boarddata값을 매개변수 값으로 입력받아 메서드가 실행됩니다.boarddao 안에 boardInsert 메서드를 살펴보면
이런식으로 되어있다. 여기서 insert에 관한 메서드 이다 .
이제 insert 메서드 에서 리턴받은 값을 result 에 담고 그 값이 만약 false면 if 문이 실행되고 아니면
forward 안에 setRedirect 안에 ture 값을 set 하고 또 setPath 를 통해서 ./BoardList.bo 값을 set 한다음 forward 객채의 주소값을 호출한곳으로 리턴해줍니다 호출한 곳인 컨트롤러로 다시 가게 되면 위 화면에서와 같이 151~166번까지의 문이 다시 실행됩니다.
list 까지
위에 insertpro 까지에서 BoardAddAction.java 안에서 forward.setPath 에서 경로 자체가 ./BoardList.bo 값을 set 하고 컨트롤러에서 151~166 번문 안에 152줄의 if 문이 실행 되었을때 response 했을때 ./BoardList.bo 값으로 다시 요청하엿기 때문에 ~.bo 형식으로 요청하엿기떄문에 다시 컨트롤러로 다시 돌아오게 됩니다. 요청방식은 디폴트 값인 get 으로 요청하엿기 때문에 doget 이 실행되고 위에서 설명햇듯이 doprocess 가 호출되고 다시 command 안에 ./BoardList.bo값이 들어가있기 때문에 컨트롤러 안에 132번 else if 문이 실행되게 됩니다. 먼저
BoardListAction객체의 주소값을 action 안에 담습니다 그후 BoardListAction.java 클래스를 살펴보면
이런식으로 되어있습니다 설명을 조금 하자면 먼저
24번줄에서 listcount 안에 boarddao 주소값안에 getListCount 메서드의 리턴값을 담습니다
boarddao 주소값안에 getListCount 메서드를 살펴보면
위 사진과 같이 선언되어있다. 여기선 DB를 연결한후 쿼리로 카운트의 숫자를 구한다음 인트타입의 변수 x 에 담아 호출한곳으로 리턴합니다. 즉 BoardListAction에 execute 로 다시 리턴됩니다. 리턴된 변수 x 의 값은 다시 listcount 안에 담기고
25번줄에서와 같이 boardlist 안에 boarddao 주소값안에 getBoardList 메서드 호출시 매개변수 값으로 page 와 limit 의 값을 받아 메서드가 실행됩니다.
boarddao 주소값안에 getBoardList 메서드를 살펴보면
위와 같이 되어있다.설명을 하자면
startrow 는 읽기 시작할 row 번호 이다 즉 1 , 11, 21 ,31 같은 번호이고
endrow 는 읽을 마지막 row 번호 이다 즉 10, 20, 30, 40 같은 번호이다 게시글의 숫자라고 생각하면된다.
여기서 page 는 게시글을 10개씩 담고 있는 페이지의 숫자라고 생각하면된다.
String 타입의 board_list_sql 안에 쿼리문을 담고
75번줄에서 쿼리를 준비한후 쿼리를 실행한다음 select 의 결과 값을들을 다시
BoardBean 타입의 객체 board 안에 객체의 주소값을 할당하고 board 에 할당된 주소값안에 데이터를 set 할때 db안에서 데이터를 get 해서 list 안에 board의 주소값을 추가해줍니다. 그후 list 배열 을 리턴해줍니다 호출한곳으로 다시 호출한 곳인 BoardListAction 으로 가서 maxpage 와 startpage endpage 를 구해줍니다.
그후 request 영역에 set 해줍니다 page maxpage startpage endpage 등을 셋한다음
forward 객체를 생성후 그안에 데이터를 set 한다음 forwoard 객체의 주소값을 리턴해줍니다 .
그후 컨트롤러 부분에서 151 번~ 166번문에 맞는 문이 실행되어
request,response 의 값이 forwarding 되므로 아래와 같은 jsp 화면에서 뿌려줄수 있게 됩니다.
'학원에서 배운것들 > TEA - E' 카테고리의 다른 글
2017-07-03-Java Annotations(어노테이션) (0) | 2017.07.03 |
---|---|
2017-06-13-E (0) | 2017.06.13 |
2017-06-05-E (0) | 2017.06.06 |
2017-05-30-E (0) | 2017.05.31 |
2017-05-29-E (0) | 2017.05.31 |