2014-12-15 2 views
-4

내 질문은 this code에서 온다.doGet 메서드 내에서 doPost 메서드를 호출하는 것이 맞습니까?

즉, 그것은 수행합니다

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException 
{  
    response.setContentType("text/html;charset=UTF-8"); 
    PrintWriter out = response.getWriter(); 
    try 
    { 
     out.println("<html>"); 
     out.println("<head>"); 
     out.println("<title>Hi World</title>"); 
     out.println("</head>"); 
     out.println("<body>"); 
     out.println("<h1> Hello World </h1>"); 
     doPost(request,response); // <<--- ??? 
     out.println("</body>"); 
     out.println("</html>");  
    } 
    finally 
    { 
     out.close(); 
    } 
} 

나는 그냥 샘플 코드 알고있다. 그러나이 경우에 나는 초보자이며 이걸 "doGet 안에 doPost"로 만들었는데, 왜냐하면 나는 그것을 읽고 OK라고 생각하기 때문이다 : 이것을하는 데있어서의 문제점은 무엇인가? 그것은 불충분하다 (좋은 이유없이 서버를 두 번 치는 것)? 서버에서 불필요한 요청을 실행합니까? 너무 많은 불필요한 코드 (doPost와 doGet 메소드 모두)? 그것입니까 utterly nonsense? 또는이를 수행하는 시나리오가 합리적 일 수 있습니까?

+0

, 옵션 코드를 복제하는 중입니다 (낭비, 오류가 발생하기 쉬운), 다른 하나를 호출하거나 (쉬운 방법), 둘 다 처리하는 도우미 메서드를 만들 수 있습니다 (장기적으로). – Compass

+0

어떤 이유에서든 똑같은 일을하기 위해 둘 다 필요하다면, 다른 *을 호출하고 다른 것을 호출하지만 다른 것을 호출하는 것은 의미가 있습니다. 그러나 위에서 한 일을하는 것은 끔찍한 일입니다. 다른 사람들이 다른 것을 호출하기 전후에 다른 것을하고있는 것뿐만 아니라 서블릿에 HTML을 인쇄하는 것도 나쁘다. – developerwjk

답변

1

먼저 doPostdoGet이고, 방법은입니다.

당신은 서버를 타격하지 않을

이 (가 이유없이 두 번 서버를 타격) ineficient입니다. 방법을 호출하고 있습니다. 그것은 별도의 메소드 foo(..)을 작성하고 호출하는 것과 같을 것입니다.

doPostdoGet (및 기타)은 특정 요청 유형을 처리하기위한 진입 점을 제공하여 수명을 단순화하려는 서블릿 API의 일부입니다.

두 핸들러가 똑같은 일을하는 경우 동일한 코드를 반복하지 마십시오. 한 가지 방법을 쓰고 다른 방법에서 호출하십시오. 또는 더 나은 방법은 논리를 완전히 다른 방법으로 추출하여 두 방법 모두에서 호출하는 것입니다. 서블릿 컨테이너의


흐름 (YMMV는) :

  1. 서버는 소켓 연결을 받아들입니다.
  2. 서버가 요청을 처리 할 스레드를 전달합니다.
  3. 스레드는 요청 헤더와 본문을 구문 분석하고 ServletRequestServletResponse 개체를 준비합니다.
  4. 스레드가 서블릿/필터 경로를 결정합니다. (이것은 사용자의 Servlet이 적절하다고 판단하는 곳입니다.)
  5. 스레드는 HttpServlet#service(..)을 호출합니다.
  6. 해당 호출은 하위 유형의 적절한 doXYZ 메소드에 위임합니다.
  7. 스택은 호출이 완료됨에 따라 되 감고 스레드는 요청을 정리하고 응답을 커밋합니다.
0

클라이언트 (브라우저)는 서버 코드에서 호출하는 메소드를 알지 못합니다.

이 경우 의 중복을 피하기 위해 doPost()의 코드를 다시 사용합니다.

문제는 doPost()에 몇 개의 문자열이 첨부되어 있습니다. 이 경우 응답 헤더가 변경됩니다. 이것은 항상 작동하지 않습니다. 서버 코드가 응답을 보내기 시작한 경우 헤더 필드로 변경된 내용이 자동으로 무시됩니다. 따라서 출력 버퍼가 있고 버퍼가 충분히 길면 코드가 작동합니다. 작은 변경으로 예기치 않게 코드가 중단되고 이해하기 어렵게 될 수 있습니다.

더 나은 해결책은 코드를 doGet()doPost()이라는 헬퍼 메서드로 분할하는 것입니다.

사실 이전 코드에서는 서블릿 API와 코드 사이에 추상화 레이어가있었습니다. 내 코드는 헤더 필드와 출력을위한 Writer에 대한 맵을 얻습니다. 이렇게하면 코드를 테스트하는 것이 쉬웠습니다 (Writer에 첫 번째 문자를 쓴 후 put()을 호출 할 때 예외를 throw하는 것으로지도를 전환하는 것과 같이).

0

것은 다른 사람이 이미 쓴 설명하기 위해이 문제를 해결할 수있는 가장 간단한 방법입니다 : 당신의 웹 애플리케이션은 대부분 GET 및 게시물 모두 동일한 않는 경우

doGet(...) { 
    processRequest(...); 
} 

doPost(...) { 
    processRequest(...); 
} 

processRequest(...) { 
    ... 
} 
관련 문제