4日目JSPサーブレット
24337 ワード
韓日
ServletContext
サーブレットContextクラスは、Tomcatコンテナの実行時にコンテキスト(Webアプリケーション)ごとにサーブレットContextオブジェクトを作成します.
Tomcatコンテナを閉じると、サーブレットContextオブジェクトも消えます.
使用シヨウ:getServiceletContext()に戻るgetServiceletContext()
セッション、リクエスト、差異
セッションはブラウザによって個別に管理されますが、コンテキストは1つしかありません.したがって、ブラウザが異なる場合でもセッションは共有されます.
リクエストは、そのリクエストがあるページでのみ使用/保存されます.(他のページでリクエストを使用するには、順方向プロシージャが必要です)
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は属性値を返しますので、最初に保存したオブジェクトに変換する必要があります.(String、Integerなど)
Cookie(Cookie)
まず作成者+オブジェクトに名前と値を保存する->オブジェクト名を作成します.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のブラウザが異なる場合は、
個人のローカルに格納され、ユーザーが直接表示するのに不利=>ハッカーなどのセキュリティ
3日目のセッション参照
データベース接続(MySQL)
ドライバ
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と同じである必要があります.
// 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接続するとこんな画面になります.
Reference
この問題について(4日目JSPサーブレット), 我々は、より多くの情報をここで見つけました https://velog.io/@0829kuj/jsp서블릿-4일차テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol