2021. 05. 28(金)TIL


JSP


JSP内蔵オブジェクト


JSPファイルを変換して生成されるJavaクラスのjspService(リクエスト、レスポンス)メソッドで定義されるJSP組み込みオブジェクト.
public final class main_jsp extends HttpJspBase {
  // main_jsp 설계도로 main_jsp객체를 생성한 후 초기화 작업의 수행을 위해 사용되는 메소드
  public void _jspInit() {
  }

  // main_jsp 설계도로 생성한 main_jsp객체가 폐기되기 전에 수행할 작업을 구현하기 위해 사용되는 메소드
  public void _jspDestroy() {
  }

  // main.jsp에 대한 요청이 접수될 때마다 실행되는 메소드
  // Tomcat은 요청이 접수되면 HttpServletRequest(요청객체), HttpServletResponse(응답객체)를
  // 생성한 다음 모든 요청메세지를 요청객체에 담는다.
  // Tomcat은 요청메세지를 분석해서 main.jsp에 대한 요청이면, main_jsp 설계도로 생성한 객체의
  // _jspService(request, response)를 실행한다.
  // 그리고, _jspService(request, response)를 실행할 때, 미리 생성해둔 요청객체와 응답객체를 매개변수 전달한다.
  public void _jspService(HttpServletRequest request, HttpServletResponse response)
      throws IOException, ServletException {

    // JSP의 내장객체를 참조할 참조변수를 선언한다.///////////////////////////////////////////////////////
    PageContext pageContext;	 // JSP 페이지에 대한 정보를 가지는 객체다.
    HttpSession session = null;	 // 클라이언트에 대한 정보를 가지는 객체다.
    ServletContext application;	 // 웹애플리케이션 프로젝트에 대한 정보를 가지는 객체다.
    ServletConfig config;	 // 서블릿의 설정정보를 가지는 객체다.
    JspWriter out = null;	 // 텍스트컨텐츠(text, html, xml, json) 클라이언트에게 보내는 객체다.
    Object page = this;		 // 현재 생성된 이 객체를 참조한다.
   
    // JSP의 내장객체를 생성/획득해서 위에서 선언한 참조변수에 대입한다.//////////////////////////////////////
    pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
    application = pageContext.getServletContext();
    config = pageContext.getServletConfig();
    // - 요청메세지에 세션아이디가 포함되어 있지 않으면 새로운 세션객체를 생성하고, 그 세션객체를 참조하게 한다.
    //   * 새로 생성한 세션객체의 세션아이디를 클라이언트에게 응답으로 보낸다.
    // - 요청메세지에 세션아이디가 포함되어 있으면, 세션아이디에 해당하는 세션객체를 찾아서 그 세션객체를 참조하게 한다.
    // - 요청메세지에 세션아이디가 포함되어 있지만, 세션아이디에 해당하는 세션객체가 없으면, 새로운 세션객체를 생성하고,
    //   그 세션객체를 참조하게 한다.
    //   * 새로 생성한 세션객체의 세션아이디를 클라이언트에게 응답으로 보낸다.
    // - 즉, JSP에서 session은 null이 아니다.
    // - 결론 
    // 		- session에는 요청을 접수한 클라이언트 전용의 세션객체가 항상 연결된다.
    //         	- 세션객체에 정보를 저장하면, 그 세션객체의 주인(클라이언트)만 활용할 수 있다.
    //         	- 세션객체에는 이 세션객체의 주인인 클라이언트의 정보(아이디, 이름)를 저장해 둔다.
    //         	- 클라이언트의 요청이 접수될 때 마다, 그 클라이언트 전용의 세션객체가 session으로 참조되고,
    //            추가적인 작업없이도 세션객체에 보관된 사용자정보를 활용해서 지금 요청한 클라이언트를 식별할 수 있다.
    session = pageContext.getSession();	
    out = pageContext.getOut();
     
    // JSP 파일의 내용이 여기에 추가된다/////////////////////////////////////////////////////////////////
    // JSP 파일의 스크립틀릿, 표현식에서는 JSP의 내장객체를 참조하고 있는 참조변수들을 사용해서
    // JSP 내장객체를 직접 사용할 수 있다.
    // 	- 사용가능한 내장객체 : request, response, pageContext, session, application, config, out, page
    //  - 자주 사용되는 내장객체 : request, response, session 정도만 자주 사용된다.
    <%
	// 요청객체(HttpServletRequest)를 참조하는 request를 사용하기
	String id = request.getParameter("id");
        String password = request.getParameter("password");

	// 세션객체(HttpSession)를 참조하는 session를 사용하기
        // 1. 클라이언트를 식별할 수 있는 정보를 그 클라이언트 전용의 세션객체에 보관하기
	//    - 사용자 인증이 완료된 클라이언트에 대해서, 해당 클라이언트의 User정보를 session객체에 담기
	//      session.setAttribute("USER", user);
	// 2. 클라이언트의 요청이 접수되었을 때 해당 클라이언트가 누구인지 알아내기
	//    - session은 언제나 요청을 접수한 클라이언트 전용의 세션객체를 참조하고 있다.
	//      User loginedUser = (User) session.getAttribute("USER");
        //      String userId = loginedUser.getId();

        // 응답객체(HttpServletResponse)를 참조하는 response를 사용하기
        response.sendRedirect("../main.jsp");
    %>
  }
}

JSPの属性とスキャン


ツールバーの

  • 属性はオブジェクト(値)です.
  • プロパティは、ビューで表現する情報です.
  • JSPは4種類のオブジェクトを提供し、属性(値、オブジェクト)を格納することができる.
  • オブジェクト範囲属性PageContextページオブジェクトHttpServertRequestオブジェクトHttpSessionセッションオブジェクトServertContextアプリケーションオブジェクト
  • 属性関連API
    保存
  • 属性:void set属性(String name,Object value)
  • クエリー
  • プロパティ:オブジェクトgetAttribute(String name)
  • 削除
  • プロパティ:void removeAttribute(String name)
  • スキャン

  • 属性(値、オブジェクト)を共有できる有効範囲を指します.
  • 属性(値、オブジェクト)を上記4つのオブジェクトのどの位置に格納するかによって、格納される属性(値、オブジェクト)の使用範囲や生存時間が異なります.
  • これはスコプフと呼ばれています.
    -顕微鏡の種類
    - Page Scope
    -PageContextに格納されている属性の有効範囲.
    -同じJSP内でのみ属性を共有できます.
    - Request Scope
    -HttpServertRequestに保存されている属性の有効範囲.
    -クライアント要求の処理中に属性を共有できます.
    -foward、include方式を使用すると、リクエストオブジェクトに格納されているプロパティを複数のjspページで共有できます.
    -モデル2の開発では、モデルが取得したデータをビューに転送する際に主に使用する有効範囲.
    -クライアントの要求処理が完了すると(応答が完了すると)、保存された属性も消失します.要求オブジェクトが消失するためです.
    -属性を管理する必要はありません.(メモリの問題を心配する必要はありません.)
    - Session Scope
    -HttpSessionに保存されている属性の有効範囲.
    -セッション・オブジェクトの保持中に、セッション・オブジェクトに格納されている属性(値、オブジェクト)を異なるJSPページで共有することもできます.
    -セッション・オブジェクトが期限切れになった場合(ブラウザをログアウトまたはシャットダウンした場合)にも保存されている属性が消えます.
    -セッション・オブジェクトは、ブラウザ(クライアント)ごとにオブジェクトを作成するため、セッション・プロパティ(値、オブジェクト)として保存されているオブジェクトは、クライアントにのみ適用されます.
    -セッション・オブジェクトのプロパティとして保存されるのは、個人情報のみです.
    - Application Scope
    -ServletContextに格納されている属性の有効範囲.
    -Webサーバランタイム(Webアプリケーションランタイム)サーブレットContextオブジェクトに格納されている属性(値、オブジェクト)は、すべてのJSP、すべてのテンプレート、すべてのフィルタ、およびすべてのユーザーによって共有できます.
  • プロパティとscopeの関係
  • 홍길동이 브라우저1을 사용하고 있다.
    - 브라우저1은 SESS1 세션객체의 세션아이디를 가지고 있다.
    - 요청1(JSP1의 실행을 요청하는 요청)이 처리되고 있는 동안
    	- REQ1과 응답객체가 생성됨
    	- JSP1의 _jspService(request, response)가 실행됨
    		- JSP의 내장객체가 모두 준비됨
    		  * pageContext <- PAGE1
    		  * request <- REQ1
    		  * response <- 응답객체
    		  * session <- SESS1
    		  * application <- APP
    		- JSP1 스크립틀릿, 표현식에서는 
    		  * PAGE1, REQ1, SESS1, APP에 속성(값 혹은객체)를 저장하거나, 저장된 속성(값 혹은 객체)를 사용할 수 있다.
    	- 요청1에 대한 응답이 완료됨
    		- _jspService(request, response)가 종료됨
    		   * PAGE1객체 소멸
    		- REQ1, 응답객체 소멸
    		- SESS1과 APP는 계속 유지됨
    		   * JSP1에서 SESS1과 APP에 속성(값, 객체)를 저장했다면 다른 JSP에서 사용할 수 있음
    	 
    
    김유신이 브라우저2를 사용하고 있다.
    - 브라우저2는 SESS2 세션객체의 세션아이디를 가지고 있다.
    - 요청3(JSP3의 실행을 요청하는 요청)이 처리되고 있는 동안
    	- REQ3과 응답객체가 생성됨
    	- JSP3의 _jspService(request, response)가 실행됨
    	  * pageContext <- PAGE3
    	  * request <- REQ3
    	  * response <- 응답객체
     	  * session <- SESS2
    	  * application <- APP
    	- JSP3 스크립틀릿, 표현식에서는
    	  * PAGE3, REQ3, SESS2, APP에 속성 저장, 속성 사용 가능
    	- JSP4로 내부이동이 발생함.
    	  * JSP3의 _jspService(request, response)가 종료됨
    	    * PAGE3은 소멸됨
    	- JSP4의 _jspService(request, response)가 실행됨
    	  * pageContext <- PAGE4
    	  * request <- REQ3 (JSP3가 사용했던 요청객체다)
    	  * response <- 응답객체 (JSP3가 사용했던 요청객체다)
     	  * session <- SESS2
    	  * application <- APP
    	- JSP4 스크립틀릿, 표현식에서는
    	  * PAGE4, REQ3, 응답객체, SESS2, APP에 속성 저장, 속성 사용 가능
    	  * REQ3를 JSP3와 JSP4가 같이 사용하게 됨
    	  * JSP3에서 REQ3에 속성(값 혹은 객체)을 저장했다면, JSP4에서 사용 가능
       	  * 즉, 다른 JSP에게 업무로직 수행결과로 획득된 데이터를 전달하는게 가능해짐
    	  * 데이터 전달에 세션이나 애플리케이션 객체를 사용하지 않는 이유는 세션객체나 애플리케이션 객체는
                계속 유지되는 객체이기 때문에 그 객체에 저장된 데이터도 계속 유지됨(메모리 부족 문제가 발생할 수 있기 때문)
    	  * 그에 비해 요청객체는 응답이 완료되면 즉시 사라지는 객체이기 때문에 
                다른 JSP에 값을 전달하기 위해서 요청객체를 사용하면 JSP에서 값 사용해서 표현하고 응답을 제공하고 나면
                요청객체도 사라지고, 요청객체에 저장된 데이터도 사라짐(메모리 부족 문제가 발생하지 않음)

    ダイレクトおよび転送


  • Redirect
  • void response.sendRedirect(String url)
  • で指定されたurlを再要求する応答をクライアントに送信します.

  • Forward
  • requestDispatcherオブジェクトが提供する方法により、前方の内部移動を行うことができる.
  • RequestDispatcher request.クライアント要求を指定したパスに送信するrequestDispatcherオブジェクトを返します.
  • RequestDispatcherの主な方法
  • void forward(ServletRequest req, ServletResponse resp)
    内部は
  • RequestDispatcherオブジェクトで指定したパスに移動します.要求オブジェクトと応答オブジェクトを内部移動先JSP/サーバに渡して共有する.
  • void include(ServletRequest req, ServletResponse resp)
  • 応答で指定されたパスを含むJSP.