4日目JSPサーブレット

24337 ワード

韓日

  • ServletContext
  • クッキー
  • DB接続(MySQL)
  • 接続プール
  • データソース
  • ServletContext


  • サーブレットContextクラスは、Tomcatコンテナの実行時にコンテキスト(Webアプリケーション)ごとにサーブレットContextオブジェクトを作成します.

  • Tomcatコンテナを閉じると、サーブレットContextオブジェクトも消えます.

  • 使用シヨウ:getServiceletContext()に戻るgetServiceletContext()

  • セッション、リクエスト、差異
    セッションはブラウザによって個別に管理されますが、コンテキストは1つしかありません.したがって、ブラウザが異なる場合でもセッションは共有されます.
    リクエストは、そのリクエストがあるページでのみ使用/保存されます.(他のページでリクエストを使用するには、順方向プロシージャが必要です)
  • Controller.java Servlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    					// getContextPath: Context의 주소를 표시함
    	ServletContext context = getServletContext(); // 현재 이 어플리케이션의 context객체 리턴
    		
    	// context에 저장한 hits를 가져옴 
    	Integer hits = (Integer)context.getAttribute("hits");
    		 		// (Integer): getAttribute는 object를 리턴하기때문에 int형으로 변환해줌
    		
    	// 가져온 hits에 값이 없을 경우(=최초호출시 값이 없음) 
    	if(hits == null) hits = 0;	// hits를 0으로 초기화
    	else hits++;			// hits에 저장된 값이 있을 경우 +1 해줌
    
    	context.setAttribute("hits", hits); // hits라는 속성값을 context에 저장
    		
    	// context에 저장된 hits를 출력
    	PrintWriter out = response.getWriter();
    	out.println("Hits: "+ hits);
    	
    	// ServletContext: 톰캣 컨테이너 실행 시 각 웹 어플리케이션(컨텍스트)마다 하나의 객체를 생성함. 톰캣컨테이너가 종료되면 같이 소멸됨.
    	// 세션은 브라우저별로 따로 관리되지만 컨텍스트는 브라우저가 달라도 공유됨. 리퀘스트는 그 요청에서만 사용됨
    	}
    ~を参照~
  • セッション、リクエスト、コンテキストのプロパティ値を取得する場合は、getAttributeを使用します.
    =>getAttributeは属性値を返しますので、最初に保存したオブジェクトに変換する必要があります.(String、Integerなど)
  • アドレスウィンドウにデータを入力するときにgetParameterを使用します.
  • Cookie(Cookie)

  • Cookieはブラウザに格納する(ユーザが直接表示できる=>セキュリティが悪い)
  • .
  • サーバとブラウザとの間でテキストデータ
  • を交換する.
  • サイトあたり最大20個の
  • を格納
  • NameとValueのペア(名前と値は文字列)
  • ジェネレータ:Cookie(String name,String value)
  • を使用:
    まず作成者+オブジェクトに名前と値を保存する->オブジェクト名を作成します.Cookieの保存時間をsetMaxAgent(秒)->レスポンスに設定します.addCookie(オブジェクト名)を使用して、オブジェクトの情報をCookieの
  • に保存する.
    Cookies.java Servlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	PrintWriter out = response.getWriter(); // 프린터객체생성
    		
    	out.println("<html>");
    		
    	Cookie[] cookies = request.getCookies(); // 쿠기배열 생성
    		
    	if (cookies == null) {
    		// 쿠키배열에 값이 null값일 경우
    		out.println("쿠키없음<br/>"); // 쿠키없음 출력
    	} else {
    		// 쿠키배열에 값이 있을 경우 
            	//=> 반복문을 이용해 배열이 끝날때까지 각 이름과 값을 name과 value에 저장해 같이 출력
    		for (Cookie retrievedCookie : cookies) {
    			String name = retrievedCookie.getName();
    			String value = retrievedCookie.getValue();
    				
    			out.println(name+" = "+value+"<br/>");
    		}
    	}
    	// user, Son의 이름과 값을 가진 c1쿠키를 생성
    	Cookie c1 = new Cookie("user", "Son");
    	Cookie c2 = new Cookie("user2", "Kim");
    		
    	c1.setMaxAge(300);	// 쿠키의 유효시간: 300초
    	c2.setMaxAge(300);
    	response.addCookie(c1);	// c1을 쿠키에 저장
    	response.addCookie(c2);
    	out.println("Cookie save.<br/>");
    	out.println("<html>");
    	}
    =>ランタイムは、最初のランタイムCookie配列に何もないため「Cookieなし」が出力されますが、リフレッシュすると生成されたc 1、c 2の名前と値が出力されます

    セッションとCookie(セッションクッキー)

  • セッション:サーバに格納
    セッションidはサーバ側によって自動的に生成される.ユーザーは変更できません.
    サーバ側に保存することで、セキュリティが向上
    JSPセッションは、各ユーザのブラウザに1つ作成されます.同じpcのブラウザが異なる場合は、
  • として保存されます.
  • Cookie:クライアントのブラウザに格納
    個人のローカルに格納され、ユーザーが直接表示するのに不利=>ハッカーなどのセキュリティ
    3日目のセッション参照
  • Cookieとセッションの概念

    データベース接続(MySQL)

  • ドライバはデータベースによって異なります(Oracle、MySQLなど)が、実装に使用されるJDBCインタフェースは共通の
  • です.
    ドライバ
  • の挿入
    1)項目を入れる:各項目のwebcontent/WEB-INF/libを入れる
    2)Tomcatプログラムを入れる:C:プログラムファイルApacheソフトウェアベースTomcat 9.0lib
    =>よく使うなら猫に置いた方が便利です.アイテムに入れる必要はありません.
    ロードコード:Class.forName(「JDBCドライバ名」)
  • 接続プール


  • コンセプト:(DB接続が1つしかない場合は順番に処理)
    複数の接続がある場合、クライアントが要求すると接続が貸与され、処理が終了すると接続が返されpoolに保存されます.

  • 使用目的:JavaでDBに直接接続し、ユーザーがドライバのロード、コネクタオブジェクトの作成、接続、終了を要求するたびに、コネクタプールの使用を簡素化します.

  • 接続プールの設定:WebContent/META-INF/context.xmlへの書き込み
    Context.xml
  • <?xml version="1.0" encoding="UTF-8"?>
    <Context>
    <Resource name="jdbc/webshop" auth="Container" type="javax.sql.DataSource"
                   maxActive="20" maxIdle="5" maxWait="10000"
                   username="사용자명" password="패스워드" driverClassName="com.mysql.jdbc.Driver"
                   url="jdbc:mysql://localhost:3306/사용할DB이름?useSSL=false"/>
    </Context>
    =>username DBを使用するユーザー名を入力し、passwordはそのユーザーのパスワードを入力します.(DBに予め設定されているように)
    urlに使用するDBのアドレスを入力し、DB名の後ろにある?usessl=falseは、SSL設定を使用しないことを示します.
    Connect.JAva(servlet)doGetメソッド
    response.setContentType("text/html; charset=utf-8"); // 한글설정(서블릿으로 한글출력하려면 필요)
    PrintWriter out = response.getWriter();
    
    Connection conn = null;	// 톰캣에 커넥터를 추가해줬으므로 Connection을 사용할수있음
    
    try {
    	// 0. 드라이버 로딩 (생략가능. JDK6버전 이하는 반드시 필요)
    	Class.forName("com.mysql.jdbc.Driver");
    	// 1. DB연결
    	conn = DriverManager.getConnection( 	// DB주소(SSL속성은 번거로우니 꺼줌), 유저id, 비밀번호
    			"jdbc:mysql://localhost:3306/webshop?useSSL=false", "root", "1234");
    	
    } catch (SQLException e) {
    	// DB를 찾지 못했을때 발생하는 예외
    	out.println("DB에 연결 실패...");
    	return;
    } catch (ClassNotFoundException e) {
    	// 드라이버를 못찾을때 발생하는 예외
    	out.println("드라이버 클래스를 찾을 수 없습니다.");
    	return;
    }
    // 실패없이 여기까지 내려오면 성공
    out.println("DB연결 테스트 완료!");
    
    try {
    	conn.close(); // conn종료
    } catch (SQLException e) {
    	out.println("DB연결 종료과정에서 에러발생...");
    }

    データソース

  • 接続プールを管理するオブジェクト.
    コネクタオブジェクトの借用と返却は、データソースインタフェースによって実現されます.
    ここで、ResourceのアドレスはContextです.xmlのリソースurlと同じである必要があります.
  • DatasourceDemo.java(servlet)
    // context.xml의 <Resource>와 연결해줌
    @Resource(name="jdbc/webshop")
    private DataSource ds; // 데이터소스 ds로 DB연결
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	response.setContentType("text/html; charset=utf-8"); // 한글설정(서블릿으로 한글출력하려면 필요)
    	PrintWriter out = response.getWriter();
    	
    	Connection conn = null;	// 톰캣에 커넥터를 추가해줬으므로 Connection을 사용할수있음
    	
    	try {
    		conn = ds.getConnection(); // DB연결
    		
    	} catch (SQLException e) {
    		out.println("DB에 연결 실패...");
    		e.printStackTrace();
    		return;
    	} 
    	out.println("DB연결 테스트 완료!");
    	
    	try {
    		conn.close(); // 실제로는 conn을 닫는것 대신에 connection을 connection pool로 보냄(요청이 올때까지 대기중인 커넥션풀로 보낸다는뜻) 
    	} catch (SQLException e) {
    		out.println("DB연결 종료과정에서 에러발생...");
    	}
    }

    ConnectionPoolとDataSourceを使用したデータベース接続の例


    上のコネクタプールで作成した接続.xmlとConnectテンプレート、データソースで作成されたDatasourceDemoテンプレート.
    この3つのページを作成した場合は、例を実行します.

    =>DB接続するとこんな画面になります.