후루꾸
124
2018-01-12 22:27:14
4
331

jsp 기초 질문드립니다...


----------------------------listcommend.java-------------------------------

public void execute(HttpServletRequest request, HttpServletResponse response) {

BDao dao = new BDao();

ArrayList<BDto> dtos = dao.AllList();

request.setAttribute("dtos", dtos);

}


----------------------------frontcontroller.java-------------------------------

if (com.equals("/list.do")) {

commend = new BListCommend();

commend.execute(request, response);

viewPage = "list.jsp";

}


RequestDispatcher d = request.getRequestDispatcher(viewPage);

d.forward(request, response);




MVC2 모델 게시판 공부중입니다.

게시판 목록을 뿌려주는 소스인데요.


listcommend.java에서 request에 등록시킨 정보를

frontcontroller.java로 가져오고 그걸 다시 list.jsp로 가져가서 뿌려주는데, 



frontcontroller.java 에서는 RequestDispatcher를 통해서 list.jsp로 request정보를 보내주잖아요

그런데 listcommend.java 에서 frontcontroller.java로 어떻게 request정보가 넘어가는건지 잘모르겠습니다..


commend.execute(request, response) 메소드 실행시킬때 frontcontroller의 request, response를 변수로 넘겨주면서 그곳에    등록되는 건가....


0
0
  • 답변 4

  • 진격의거인
    230
    2018-01-13 00:17:27 작성 2018-01-13 00:23:07 수정됨

    listcommend에서 frontcontroller로 넘기는게 아니구요.


    frontcontroller에서 request레퍼런스(주소값이 있으므로)를 listcommend에 넘기고

    listcommend의 execute()안에서는 frontcontroller로부터 넘어온 request레퍼런스에 다이렉트로 꽂아주는겁니다.


    즉, listcommned와 frontcontroller는 서로 호출 관계가 다를 뿐 같은 HttpServletRequest객체(request레퍼런스)를 참조하는겁니다

    마지막 줄이 맞습니다


    jsp라기보단 java기초라고 하는게 적절할 것 같습니다


    추가적으로 클래스명의 맨 앞은 대문자인 것이 좋은데,

    import시 path인지 class인지 확실하게 알 수 있습니다

    1
  • 후루꾸
    124
    2018-01-13 00:27:36 작성 2018-01-13 00:32:13 수정됨

    만약 int a 같은 변수를 함수로 넘겨주면, 그 함수 안에서만 작동하기 때문에 따로 return을 해줘야하잖아요.

    request는 주소를 참조하기 때문에 return을 해주지 않아도 되는건가요?..


    기본형 매개변수와, 참조형 매개변수를 제가 잘 이해를 못하고 있는거같네여..ㅋ

    0
  • 진격의거인
    230
    2018-01-13 00:41:05 작성 2018-01-13 00:46:58 수정됨

    Wrapper Class와 매치되는, Primitive Type(int, char, float, double 등)을 제외한 모든 클래스의 변수(정확히는 레퍼런스)는 주소값이 넘어갑니다.


    request 레퍼런스의 타입은 HttpServletRequest이며 이는 클래스입니다.

    따라서, 주소값이 넘어갑니다. 지정된 주소값에 대해 직접적으로 메서드를 호출하므로,

    결국 같은 인스턴스를 상대로 핸들링하는 것이죠


    좀 더 깊이 들어가자면

    소스 중에서

    Clazz clazz = new Clazz();

    와 같은 소스가 있다고 한다면


    clazz는 레퍼런스(변수)

    new Clazz()의 결과로는 Clazz의 인스턴스 입니다.


    clazz와 new Clazz()의 결과로 나온 인스턴스는 메모리 상에서 저장되는 위치가 다릅니다.

    clazz는 레퍼런스일 뿐 실제 인스턴스가 아닙니다.

    실제 인스턴스라면 Clazz clazz; 와 같이 해도 사용이 가능해야하죠.  이상태에서 접근하면 널포인터가 뜹니다.


    '레퍼런스'라고 하는 이유는 주소값을 가지기 때문입니다.

    new Clazz()는 인스턴스를 반환하는 것이 아니라, 메모리 상에 클래스의 타입에 맞게 값들을 넣은 후(보통 이 형상을 인스턴스라고함) 이에 대한 주소값을 반환합니다


    자바를 공부하다보면 이런말이 나옵니다.

    '스택 영역에는 지역변수가 들어가며, 힙 영역에는 동적 메모리를 위한 영역이다'


    clazz는 지역변수에 속하여 스택 영역에 할당이 되고,

    Clazz의 인스턴스(new Clazz()의 결과)는 동적 메모리 할당이기 떄문에 힙 영역에 들어갑니다.


    그리고 clazz의 내용은 이 힙 영역의 메모리를 가리킵니다.

    그래서 '레퍼런스'라고 하는겁니다.


    서로 다른 두 클래스가 특정 클래스에 대한 레퍼런스를 각각 가지고 있고,

    이 두개의 레퍼런스는 같은 힙영역의 주소값을 가리키므로

    같은 인스턴스를 가리킵니다.


    그래서 '다이렉트로 꽂아준다'라고 표현한겁니다

    결론은, return 하지 않아도 됩니다

    1
  • 후루꾸
    124
    2018-01-13 00:53:23

    아.............또다른 깨우침을 얻게 해주셔서 정말 감사드려요. 정말 감사드립니다ㅠㅠ 복많이받으세요

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.