2022년 6월 21일 화요일

JSP 6강 - 세션(Session)

 1. 세션이란?

클라이언트가 웹 브라우저를 통해 서버에 접속한 후, 용무를 처리하고, 웹 브라우저를 닫아 서버와의 접속을 종료하는 하나의 단위를 세션이라고 한다.

세션은 웹 브라우저를 실행할 때마다 새롭게 생성된다. 설정된 유지 시간 동안 유지되며, 유지 시간이 만료되기 전에 새로운 요청이 들어오면 수명이 계속 연장된다.

(예 - 은행 사이트는 보통 10분의 로그인을 유지하며 활동이 없으면 자동 로그아웃)

유지 시간 이전이라도 웹 브라우저를 닫으면 세션는 종료 된다.(탭 종료는 유지 됨)


2. 세션 설정, 확인, 삭제

1) 유지 시간 설정 방법 2가지

- /WEB-INF/web.xml 에서 설정법 

  <!-- 세션 유지 시간 설정(20분으로 설정) -->

  <session-config>

    <session-timeout>20</session-timeout>

  </session-config>

-JSP 파일에서 session 내장 객체가 제공하는 setMaxInactiveInterval()을 사용

<%

session.setMaxInactiveInterval(1800); //1800초로 설정, 30분

%>

2) 세션 확인법

<%@ page import="java.util.Date"%>

<%@ page import="java.text.SimpleDateFormat"%>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%

SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");  // 날짜 표시 형식


long creationTime = session.getCreationTime();  // 최초 요청(세션 생성) 시각

String creationTimeStr = dateFormat.format(new Date(creationTime));


long lastTime = session.getLastAccessedTime();  // 마지막 요청 시각

String lastTimeStr = dateFormat.format(new Date(lastTime));

%>

<html>

<head><title>Session</title></head>

<body>

    <h2>Session 설정 확인</h2>

    <ul>

        <li>세션 유지 시간 : <%= session.getMaxInactiveInterval() %></li>

        <li>세션 아이디 : <%= session.getId() %></li>

        <li>최초 요청 시각 : <%= creationTimeStr %></li>

        <li>마지막 요청 시각 : <%= lastTimeStr %></li>

    </ul>

</body>

</html>

3) 세션 삭제

세션은 웹 브라우저를 닫으면 종료되지만, 웹 브라우저 설정에서 모든 쿠키를 삭제해 세션을 삭제할 수도 있다.


3. 세션과 DB를 이용한 로그인 구현

1) 로그인 페이지 구현

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<html>

<head><title>Session</title></head>

<body>

<jsp:include page="../Common/Link.jsp" />

    <h2>로그인 페이지</h2>

    <span style="color: red; font-size: 1.2em;"> 

        <%= request.getAttribute("LoginErrMsg") == null ?

                "" : request.getAttribute("LoginErrMsg") %>

    </span>

    <%

    if (session.getAttribute("UserId") == null) {  // 로그인 상태 확인

        // 로그아웃 상태

    %>

    <script>

    function validateForm(form) {

        if (!form.user_id.value) {

            alert("아이디를 입력하세요.");

            return false;

        }

        if (form.user_pw.value == "") {

            alert("패스워드를 입력하세요.");

            return false;

        }

    }

    </script>

    <form action="LoginProcess.jsp" method="post" name="loginFrm"

        onsubmit="return validateForm(this);">

        아이디 : <input type="text" name="user_id" /><br />

        패스워드 : <input type="password" name="user_pw" /><br />

        <input type="submit" value="로그인하기" />

    </form>

    <%

    } else { // 로그인된 상태

    %>

        <%= session.getAttribute("UserName") %> 회원님, 로그인하셨습니다.<br />

        <a href="Logout.jsp">[로그아웃]</a>

    <%

    }

    %>

</body>

</html>

2) DB 연동

데이터를 주고 받기 위해서는 DTO 클래스와 테이블에 접근하기 위한 DAO 클래스를 만들어야 한다.

   - DTO(Data Transfer Object) 

계층 사이에서 데이터를 교환하기 위해 생성하는 객체.

별도의 로직 없이 속성(멤버 변수)와 그 속성을 접근하기 위한 게터/세터 메서드만 갖춘 객체.

   - DAO(Data Access Object) 

데이터베이스의 데이터를 접근하기 위한 객체. 보통 JDBC를 통해 구현하며, 하나의 테이블에서 수행할 수 있는 CRUD를 전담. (CRUD - 생성, 읽기, 갱신, 삭제)

--DTO 클래스 (DB와 동일하게 생성) --

package membership;


public class MemberDTO {

    // 멤버 변수 선언

    private String id;

    private String pass;

    private String name;

    private String regidate;


    // 멤버 변수별 게터와 세터

    public String getId() {

        return id;

    }

    public void setId(String id) {

        this.id = id;

    }

    public String getPass() {

        return pass;

    }

    public void setPass(String pass) {

        this.pass = pass;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getRegidate() {

        return regidate;

    }

    public void setRegidate(String regidate) {

        this.regidate = regidate;

    }

}

--DAO 클래스  --

package membership;

import common.JDBConnect;


public class MemberDAO extends JDBConnect {

    // 명시한 데이터베이스로의 연결이 완료된 MemberDAO 객체를 생성합니다.

    public MemberDAO(String drv, String url, String id, String pw) {

        super(drv, url, id, pw);

    }


    // 명시한 아이디/패스워드와 일치하는 회원 정보를 반환합니다.

    public MemberDTO getMemberDTO(String uid, String upass) {

        MemberDTO dto = new MemberDTO();  // 회원 정보 DTO 객체 생성

        String query = "SELECT * FROM member WHERE id=? AND pass=?";  // 쿼리문 템플릿

        try {

            // 쿼리 실행

            psmt = con.prepareStatement(query); // 동적 쿼리문 준비

            psmt.setString(1, uid);    // 쿼리문의 첫 번째 인파라미터에 값 설정

            psmt.setString(2, upass);  // 쿼리문의 두 번째 인파라미터에 값 설정

            rs = psmt.executeQuery();  // 쿼리문 실행

            // 결과 처리

            if (rs.next()) {

                // 쿼리 결과로 얻은 회원 정보를 DTO 객체에 저장

                dto.setId(rs.getString("id"));

                dto.setPass(rs.getString("pass"));

                dto.setName(rs.getString(3));

                dto.setRegidate(rs.getString(4));

            }

        }

        catch (Exception e) {

            e.printStackTrace();

        }

        return dto;  // DTO 객체 반환

    }

}

3) 로그인 처리 JSP 구현
<%@ page import="membership.MemberDTO"%>
<%@ page import="membership.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
// 로그인 폼으로부터 받은 아이디와 패스워드
String userId = request.getParameter("user_id"); 
String userPwd = request.getParameter("user_pw");  

// web.xml에서 가져온 데이터베이스 연결 정보
String oracleDriver = application.getInitParameter("OracleDriver");
String oracleURL = application.getInitParameter("OracleURL");
String oracleId = application.getInitParameter("OracleId");
String oraclePwd = application.getInitParameter("OraclePwd");

// 회원 테이블 DAO를 통해 회원 정보 DTO 획득
MemberDAO dao = new MemberDAO(oracleDriver, oracleURL, oracleId, oraclePwd);
MemberDTO memberDTO = dao.getMemberDTO(userId, userPwd);
dao.close();

// 로그인 성공 여부에 따른 처리
if (memberDTO.getId() != null) {
    // 로그인 성공
    session.setAttribute("UserId", memberDTO.getId()); 
    session.setAttribute("UserName", memberDTO.getName()); 
    response.sendRedirect("LoginForm.jsp");
}
else {
    // 로그인 실패
    request.setAttribute("LoginErrMsg", "로그인 오류입니다."); 
    request.getRequestDispatcher("LoginForm.jsp").forward(request, response);
}
%>

4. 로그아웃 처리
로그 아웃은 세션 영역에 저장된 로그인 관련 속성을 모두 지워주기만 하면 된다.
속성을 지우는 방법은 두 가지다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
// 방법 1: 회원 인증 정보 속성 삭제 
session.removeAttribute("UserId");
session.removeAttribute("UserName");

// 방법 2: 모든 속성 한꺼번에 삭제 
session.invalidate();

// 속성 삭제 후 페이지 이동 
response.sendRedirect("LoginForm.jsp");
%>

5. 쿠키 vs 세션

---쿠키---
저장 위치/형식 : 클라이언트 PC에 text로 저장
보안 : 클라이언트에 저장하여 보안에 취약
자원 속도 : 서버 자원을 사용하지 않으므로 세션보다 빠름
용량 : 용량의 제한이 있음
유지 시간 : 쿠키 생성 시 설정함, 설정된 시간이 경과 되면 삭제

---세션---
저장 위치/형식 : 웹 서버에 Object 타입으로 저장
보안 : 서버에 저장되기에 보안에 안전
자원 속도 : 서버 자원을 사용하여 쿠키보다 느림
용량 : 서버가 허용하는 한 제한이 없음.
유지 시간 : 서버의 web.xml에서 설정, 설정된 시간 내라도 동작이 있으면 삭제 되지 않고 유지


2022년 6월 20일 월요일

JSP 5강 - 데이터베이스

 1. JDBC 란?

자바로 데이터베이스 연결 및 관련 작업을 할 때 사용하는 API.

JDBC로 오라클을 이용하려면 JDBC 드라이버가 필요함.

드라이버를 설치하는 방법

1) WAS가 설치된 경로 하위의 lib폴더에 추가하기

2) 프로젝트의 WEB-INF 하위의 lib 폴더에 추가하기(배포시에 자동으로 추가되어 추천 방법)


2. 연결 관리 클래스 (기본 방법)

public class JDBConnect {

    public Connection con; // 데이터베이스와 연결을 담당

    public Statement stmt;  //인파라미터가 없는 정적 쿼리문을 실행할 때 사용

    public PreparedStatement psmt;  //인파라미터가 있는 동적 쿼리문 실행할 때 사용

    public ResultSet rs; //SELECT 쿼리문 결과를 저장할 때 사용


    // 기본 생성자

    public JDBConnect() {

        try {

            // JDBC 드라이버 로드

            Class.forName("oracle.jdbc.OracleDriver");


            //오라클 프로토콜@호스트명:포트번호:sid

            String url = "jdbc:oracle:thin:@localhost:1521:xe";  

            String id = "DB 접속 ID";

            String pwd = "DB접속 PW"; 

            con = DriverManager.getConnection(url, id, pwd); 


            System.out.println("DB 연결 성공(기본 생성자)");

        }

        catch (Exception e) {            

            e.printStackTrace();

        }

    }

    // 연결 해제(자원 반납 - 공통 방법)

    public void close() { 

        try {            

            if (rs != null) rs.close(); 

            if (stmt != null) stmt.close();

            if (psmt != null) psmt.close();

            if (con != null) con.close(); 


            System.out.println("JDBC 자원 해제");

        }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

}

3. 연결 관리 클래스 (2번의 개선 방법)

2번의 방법은 접속 정보가 코드에 입력되어 있어서 변경될 때마다 매번 컴파일을 해야 한다.

서버 환경은 web.xml에 입력하고 필요할 때마다 application 내장 객체를 통해 얻어와야 한다.

--------------------------WebContent/WEB-INF/web.xml -------------------------------

<!-- 오라클 데이터베이스 접속 정보 -->

  <context-param>

    <param-name>OracleDriver</param-name>

    <param-value>oracle.jdbc.OracleDriver</param-value>

  </context-param>

  <context-param>

    <param-name>OracleURL</param-name>

    <param-value>jdbc:oracle:thin:@localhost:1521:xe</param-value>

  </context-param>

  <context-param>

    <param-name>OracleId</param-name> 

    <param-value>오라클 ID</param-value>

  </context-param>

  <context-param>

    <param-name>OraclePwd</param-name>

    <param-value>오라클 암호</param-value>

  </context-param>

--------------------------WebContent/WEB-INF/web.xml -------------------------------

//위와 같이 입력 후 새로운 생성자로 구현

----------import 표시생략---------

import java.sql.DriverManager;


public class JDBConnect {

    public Connection con;

    public Statement stmt;  

    public PreparedStatement psmt;  

    public ResultSet rs;


    // web.xml에서 정보를 읽어와 이 생성자를 호출

    public JDBConnect(String driver, String url, String id, String pwd) {

        try {

            // JDBC 드라이버 로드

            Class.forName(driver);  


            // DB에 연결

            con = DriverManager.getConnection(url, id, pwd);


            System.out.println("DB 연결 성공(인수 생성자 1)");

        }

        catch (Exception e) {            

            e.printStackTrace();

        }

    }

}

4. 연결 관리 클래스 (3번의 개선 방법)

위의 방법은 web.xml에 입력한 후 내장 객체를 통해 가져왔으나, DB 접속 때마다 동일한 코드를 JSP에 반복해서 입력해야 한다. 컨텍스트 초기화 매개변수를 생성자에서 직접 가져올 수 있도록 정의 한다.

---- 생략-----

import java.sql.DriverManager;

public class JDBConnect {

    public Connection con;

    public Statement stmt;  

    public PreparedStatement psmt;  

    public ResultSet rs;

    // 세 번째 생성자

    public JDBConnect(ServletContext application) {

        try {

            // JDBC 드라이버 로드

            String driver = application.getInitParameter("OracleDriver"); 

            Class.forName(driver); 


            // DB에 연결

            String url = application.getInitParameter("OracleURL"); 

            String id = application.getInitParameter("OracleId");

            String pwd = application.getInitParameter("OraclePwd");

            con = DriverManager.getConnection(url, id, pwd);


            System.out.println("DB 연결 성공(인수 생성자 2)"); 

        }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

}

5. 연결 관리 클래스 (4번 방법을 커넥션 풀로 성능 개선)


4번의 방법은 요청이 있을 때마다 DB와 새로 연결 했다가 해제를 반복해야 한다.

빈번한 연결/해제는 시스템 성능에 영향을 미친다.

커넥션 풀이란 Connection 객체를 미리 생성해 pool에 넣어 놓고, 요청이 있을 때 이미 생성된 Connection 객체를 가져다 사용하고, 사용 완료된 객체는 pool에 반납하여 재사용하는 기법.

-------WAS의 JNDI를 통해 커넥션 풀을 사용하는 절차----

1) WAS(톰캣)이 시작할 때 server.xml 과 context.xml에 설정한 대로 커넥션 풀을 생성한다.

2) JSP 코드에서 JNDI 서버(WAS가 제공)로부터 데이터소스 객체를 얻어온다.

3) 데이터소스로부터 커넥션 객체를 가져온다.

4) DB 작업을 수행한다.

5) 모든 작업이 끝나면 커넥션 객체를 풀로 반환한다.

-------WAS의 JNDI를 통해 커넥션 풀을 사용하는 절차----

6. 커넥션 풀 설정

-- server.xml 변경 사항 --

    <Resource auth="Container"

              driverClassName="oracle.jdbc.OracleDriver" //JDBC 드라이버의 클래스명

              type="javax.sql.DataSource"  //데이터소스로 사용할 클래스명

              initialSize="0"  //풀의 최초 초기화 과정에서 미리 만들어 놓을 연결 개수

              minIdle="5" //최소한으로 유지할 연결 개수

              maxTotal="20" //동시에 사용할 수 있는 최대 연결 개수

              maxIdle="20" //풀에 반납할 때 최대로 유지될 수 있는 연결 개수

              maxWaitMillis="5000" //새로운 요청이 들어왔을 때 대기할 시간

              url="jdbc:oracle:thin:@localhost:1521:xe" //오라클 연결을 위한 URL

              name="dbcp_myoracle" //생성할 자원의 이름

              username=" 유저아이디"

              password="유저암호" />


--content.xml 변경 사항--

    <ResourceLink global="dbcp_myoracle" name="dbcp_myoracle" 

                  type="javax.sql.DataSource"/>

7. 커넥션 풀 동작

--import 생략--

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.DataSource;

public class DBConnPool {

    public Connection con;

    public Statement stmt;

    public PreparedStatement psmt;

    public ResultSet rs;


    // 기본 생성자

    public DBConnPool() {

        try {

            // 커넥션 풀(DataSource) 얻기

            Context initCtx = new InitialContext();

            Context ctx = (Context)initCtx.lookup("java:comp/env");

            DataSource source = (DataSource)ctx.lookup("dbcp_myoracle");


            // 커넥션 풀을 통해 연결 얻기

            con = source.getConnection();


            System.out.println("DB 커넥션 풀 연결 성공");

        }

        catch (Exception e) {

            System.out.println("DB 커넥션 풀 연결 실패");

            e.printStackTrace();

        }

    }


    // 연결 해제(자원 반납)

    public void close() {

        try {            

            if (rs != null) rs.close();

            if (stmt != null) stmt.close();

            if (psmt != null) psmt.close();

            if (con != null) con.close();  // 자동으로 커넥션 풀로 반납됨


            System.out.println("DB 커넥션 풀 자원 반납");

        }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

}

8. 위의  DB 연결 방법들 테스트 코드

<%@ page import="common.JDBConnect"%> 

<%@ page import="common.DBConnPool"%> 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<html>

<head><title>JDBC</title></head>

<body>

    <h2>JDBC 테스트 1</h2>

    <%

    JDBConnect jdbc1 = new JDBConnect(); 

    jdbc1.close(); 

    %>

    

    <h2>JDBC 테스트 2</h2>

    <%

    String driver = application.getInitParameter("OracleDriver"); 

    String url = application.getInitParameter("OracleURL");

    String id = application.getInitParameter("OracleId");

    String pwd = application.getInitParameter("OraclePwd");


    JDBConnect jdbc2 = new JDBConnect(driver, url, id, pwd); 

    jdbc2.close();

    %>

    

  <h2>JDBC 테스트 3</h2>

    <%

    JDBConnect jdbc3 = new JDBConnect(application); 

    jdbc3.close();

    %>

    

    <h2>커넥션 풀 테스트</h2>

    <%

    DBConnPool pool = new DBConnPool();

    pool.close();

    %>

</body>

</html>

2022년 6월 14일 화요일

JSP 4강 - 쿠키(Cookie)

 1. 쿠키란?

클라이언트의 상태 정보를 유지하기 위한 기술.

상태 정보를 키와 값 형태로 저장했다가 다음 요청 시 저장된 쿠키를 함께 전송

웹 서버는 브라우저가 전송한 쿠키로 부터 필요한 데이터를 읽어올 수 있음.

예) 로그인 아이디 저장, 게시글 조회수를 하루에 1회만 증가, 오늘 본 상품 기억 등등


2. 동작 메커니증

  1. 클라이언트가 서버에 요청을 보냄
  2. 서버가 쿠키를 생성하여 HTTP 응답 헤더에 실어 클라이언트에 전송
  3. 클라리언트는 쿠키를 받아 저장.
  4. 클라이언트는 다음번 요청 시 저장해둔 쿠키를 HTTP 요청 헤더에 실어 보냄
  5. 서버는 쿠키 정보를 읽어 필요한 작업을 수행
3. 속성과 API
  • 이름(name) : 쿠키를 구별하는 이름
  • 값(value) : 쿠키에 저장할 실제 데이터
  • 도메인(domain) : 쿠키를 적용할 도메인
  • 경로(path) : 쿠키를 적용할 경로
  • 유지 기간(max age) : 쿠키를 유지할 기간
4. 설정 메서드
  • void setValue(String value) - 쿠키값 설정
  • void setDomain(String domain) - 쿠키에 적용할 도메인 설정 
  • void setPath(String path) - 쿠키가 적용될 경로
  • void setMaxAge(int expire_seconds) - 쿠키가 유지될 기간을 초 단위로 설정
  • new Cookie(String name, String value) - 이름과 값을 받아 새로운 쿠키를 생성
5. 쿠키 정보를 읽는 메서드
  • String getName() - 쿠키의 이름을 반환
  • String getValue() - 쿠키의 값을 반환
  • String getDomain() - 쿠키가 적용되는 도메인을 반환
  • String getPath() - 쿠키의 적용 경로를 반환, 없다면 null 반환
  • int getMaxAge() - 쿠키의 유지 기간을 반환, 없다면 -1 반환

JSP 3강 - 내장 객체의 영역

1. 내장 객체의 영역이란?
각  객체가 저장되는 메모리의 유효 기간
  • page 영역 : 동일한 페이지에서만 공유됨, 페이지를 벗어나면 소멸
  • request 영역 : 하나의 요청에 의해 호출된 페이지와 포워드된 페이지까지 공유됨, 새로운 페이지로 요청(페이지 이동)하면 소멸.
  • session 영역 :  클라이언트가 처음 접속한 후 포워드나 페이지 이동 시에도 영역은 공유, 웹 브라우저를 닫으면 소멸. 
  • application 영역 : 한 번 저장되면 웹 애플리케이션이 종료될 때까지 공유, 서버를 셧다운 하면 소멸
범위의 크기 : application > session > request > page 

2. 내장 객체 사용법

 void setAttribute(String name, Object value)

  • 각 영역의 속성을 저장
  • 첫 번째 인수는 속성명, 두 번째 인수는 저장할 값
  • 값의 타입은 object이기에 모든 타입의 객체를 저장 가능
 Object getAttribute(String name)

  • 영역에 저장된 속성 값을 얻어온다.
  • object 로 자동 형 변환되어 저장되기에 원래 타입으로 형 변환 후 사용해야 한다.
void removeAttribute(String name)
  • 영역에 저장된 속성을 삭제
  • 삭제할 속성 명이 존재하지 않더라도 에러는 발생하지 않음.
3. 데이터 전송 객체(DTO) 란?
데이터를 저장하거나 전송하는데 쓰이는 객체.
자바빈즈 규약
  1. 자바빈즈는 기본 패키지 이외의 패키지에 속해야 한다
  2. 멤버 변수(속성)의 접근 지정자는 private로 선언해야 한다.
  3. 기본 생성자가 있어야 한다
  4. 멤버 변수에 접근할 수 있는 getter / setter 메서드가 있어야 한다.
  5. getter / setter 메서드의 접근 지정자는 public로 선언해야 한다.

2022년 5월 26일 목요일

JSP 02 내장 객체

 내장 객체 특징

  • 컨테이너가 미리 선언해 놓은 참조 변수를 이용해 사용
  • 별도의 객체 생성 없이 각 내장 객체의 메서드 사용
  • JSP 문서 안의 <% 스크립틀릿 %> 과 <%= 표현식 %> 에서만 사용 가능
  • <%! 선언부 %> 에서는 즉시 사용은 불가능, 매개변수로 전달 받아 사용 가능


request 객체 : 클라이언트가 전송한 요청 정보를 담고 있는 객체

  • 클라이언트와 서버에 대한 정보 읽기
  • 클라이언트가 전송한 요청 매개변수에 대한 정보 읽기
  • 요청 헤더 및 쿠키 정보 읽기


//GET 방식으로 요청
 <a href="./RequestWebInfo.jsp?eng=Hello&han=안녕"> 

//POST 방식으로 요청
<form action="RequestWebInfo.jsp" method="post">  
        영어 : <input type="text" name="eng" value="Bye" /><br />
        한글 : <input type="text" name="han" value="잘 가" /><br />
        <input type="submit" value="POST 방식 전송" />
</form>

//클라이언트와 서버의 환경 정보 읽기
<body>
    <ul>
        <li>데이터 전송 방식 : <%= request.getMethod() %></li>
        <li>URL : <%= request.getRequestURL() %></li>
        <li>URI : <%= request.getRequestURI() %></li>
        <li>프로토콜 : <%= request.getProtocol() %></li>
        <li>서버명 : <%= request.getServerName() %></li>
        <li>서버 포트 : <%= request.getServerPort() %></li>
        <li>클라이언트 IP 주소 : <%= request.getRemoteAddr() %></li>
        <li>쿼리스트링 : <%= request.getQueryString() %></li>
        <li>전송된 값 1 : <%= request.getParameter("eng") %></li>
        <li>전송된 값 2 : <%= request.getParameter("han") %></li>
    </ul>
</body>

내장 객체 - request
<body>
<%
<!--한글인 경우 깨지기에 다국어 지원하는 UTF-8로 설정 -->
request.setCharacterEncoding("UTF-8");  

<!--전송되는 값이 1개라면 getParameter -->
String id = request.getParameter("id");    
String sex = request.getParameter("sex");

<!-- 전송되는 값이 2개 이상이면 getParameterValues -->
String[] favo = request.getParameterValues("favo");  
String favoStr = "";

<!-- favo  값이 있으면 반복해서 하나의 문자열로 합침 -->
if (favo != null) {  
    for (int i = 0; i < favo.length; i++) {
        favoStr += favo[i] + " ";
    }
}
String intro = request.getParameter("intro").replace("\r\n", "<br/>");  
%>
<ul>
    <li>아이디 : <%= id %></li>
    <li>성별 : <%= sex %></li>
    <li>관심사항 : <%= favoStr %></li>
    <li>자기소개 : <%= intro %></li>
</ul>
</body>

요청 헤더 정보 출력하기
<body>
    <%
    Enumeration headers = request.getHeaderNames();  
    while (headers.hasMoreElements()) {  
        String headerName = (String)headers.nextElement();  
        String headerValue = request.getHeader(headerName); 
        out.print("헤더명 : " + headerName + ", 헤더값 : " + headerValue + "<br/>");
    }
    %>
    <p>이 파일을 직접 실행하면 referer 정보는 출력되지 않습니다.</p>
</body>

response 객체 : 요청에 대한 응답을 웹 브라우저로 보내는 역할
  • 페이지 이동을 위한 redirect
  • HTTP 헤더에 응답 헤더 추가

<body>
<%
<!--request 내장 객체로 전송된 매개 변수를 얻어옴-->
String id = request.getParameter("user_id");
String pwd = request.getParameter("user_pwd"); 

<!--회원 인증(테스용으로 하드 코딩)-->
if (id.equalsIgnoreCase("must") && pwd.equalsIgnoreCase("1234")) {
    <!--로그인 환영 페이지로 이동-->
    response.sendRedirect("ResponseWelcome.jsp");
}
else {
    <!--첫 화면으로 이동 + 로그인 실패 에러 출력-->
    request.getRequestDispatcher("ResponseMain.jsp?loginErr=1")
       .forward(request, response); 
}
%>
</body>

HTTP 헤더에 응답 헤더 추가, 수정하기  
<%
// 응답 헤더에 추가할 값 준비 
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm");
long add_date = s.parse(request.getParameter("add_date")).getTime(); 

java.sql.Date date2 = new java.sql.Date(add_date); 
System.out.println(date2);

int add_int = Integer.parseInt(request.getParameter("add_int"));
String add_str = request.getParameter("add_str");

// 응답 헤더에 값 추가(add), 수정(set)
response.addDateHeader("myBirthday", add_date);
response.addIntHeader("myNumber", add_int);
response.addIntHeader("myNumber", 1004); // 추가
response.addHeader("myName", add_str);
response.setHeader("myName", "안중근");  // 수정
%>
<html>
<head><title>내장 객체 - response</title></head>
<body>
    <h2>응답 헤더 정보 출력하기</h2>
    <%
    Collection<String> headerNames = response.getHeaderNames();
    for (String hName : headerNames) {
        String hValue = response.getHeader(hName);
    %>
        <li><%= hName %> : <%= hValue %></li>
    <%
    }   
    %>
    
    <h2>myNumber만 출력하기</h2>
    <%
Collection<String> myNumber = response.getHeaders("myNumber");
for (String myNum : myNumber) {
%>
<li>myNumber : <%= myNum %></li>
<%
}
%>
</body>
</html>

out 객체 : 스크립틀릿 내에서 변수를 브라우저에 출력해야 한다면 out 내장 객체 사용
<body>
    <%
    // 버퍼 내용 삭제하기
    out.print("출력되지 않는 텍스트");  // 버퍼에 저장  
    out.clearBuffer();  // 버퍼를 비움(윗 줄의 출력 결과 사라짐) 

    out.print("<h2>out 내장 객체</h2>");

    // 버퍼 크기 정보 확인
    out.print("출력 버퍼의 크기 : " + out.getBufferSize() + "<br>");
    out.print("남은 버퍼의 크기 : " + out.getRemaining() + "<br>"); 

    out.flush();  // 버퍼 내용 출력 
    out.print("flush 후 버퍼의 크기 : " + out.getRemaining() + "<br>");

    // 다양한 타입의 값 출력
    out.print(1);
    out.print(false);
    out.print('가');
    %>
</body>

application 객체 :  웹 애플리케이션당 1개만 생성되며 모든 JSP 페이지에서 접근 가능. 전반에서 사용하는 정보를 저장하거나, 서버의 정보 등을 얻어오는데 사용
<body>
    <h2>web.xml에 설정한 내용 읽어오기</h2>
    초기화 매개변수 : <%= application.getInitParameter("INIT_PARAM") %>

    <h2>서버의 물리적 경로 얻어오기</h2>
    application 내장 객체 : <%= application.getRealPath("/02ImplicitObject") %>

    <h2>선언부에서 application 내장 객체 사용하기</h2>
    <%!
    public String useImplicitObject() {
        return this.getServletContext().getRealPath("/02ImplicitObject");
    }
    public String useImplicitObject(ServletContext app) {
        return app.getRealPath("/02ImplicitObject");
    }
    %>
    <ul>
        <li>this 사용 : <%= useImplicitObject() %></li>
        <li>내장 객체를 인수로 전달 : <%= useImplicitObject(application) %></li>
    </ul>
</body>

exception 객체 :  오류명과 오류 메시지를 출력하는 객체
  • 404 에러 - 클라이언트가 요정한 경로에서 문서를 찾을 수 없음
  • 405 에러 - 허용되지 않은 메서드 처리할 컨트롤러가  없음
  • 500 에러 - 서버 내부 오류
<body>
<%
int status = response.getStatus();  // response 내장 객체로부터 에러 코드 확인

// 에러 코드에 따라 적절한 메시지 출력
if (status == 404) {
    out.print("404 에러가 발생하였습니다.");
    out.print("<br/>파일 경로를 확인해주세요.");
}
else if (status == 405) {
    out.print("405 에러가 발생하였습니다.");
    out.print("<br/>요청 방식(method)을 확인해주세요.");
}
else if (status == 500) {
    out.print("500 에러가 발생하였습니다.");
    out.print("<br/>소스 코드에 오류가 없는지 확인해주세요.");
}
%>
</body>

2강 전체 요약 
  • request 객체 -  클라이언트의 요청을 받거나 웹 브라우저에 대한 정보, 요청 헤더에 대한 정보를 읽을 때 사용
  • response 객체 - 요청에 대한 응답을 웹 브라우저로 보낼 때 사용. 페이지 이동이나 응답 헤더를 추가할 때도 사용
  • out  객체 - 변수 등의 값을 웹 브라우저에 출력할 때 사용
  • application 객체 - 웹 애플리케이션을  구성하는 모든 JSP 에서 접근 가능한 객체로, 웹 애플리케이션에 대한 설정값을  저장할 때 주로 사용
  • exception 객체 - 예외 처리를 위해 사용

JSP 01 기본

 게으름에.. -_-; 이제야 1강 요약 정리 해본다.

-JSP 특징- 

HTML 코드 안에서 필요한 부분만 자바 코드를 스크립트 형태로 추가

자주 쓰이는 기능을 내장 객체로 사용

처리된 결과를 보여주는 view를 만들 때 사용


-서블릿 특징-

자바 코드 안에서 전제 HTML 페이지 생성

변수 선언, 초기화에 반드시 선행

컨트롤러를 만들 때 사용


-JSP 파일 기본 구조-

지시어 : JSP 페이지를 자바 코드로 변환하는데 필요한 정보를 JSP 엔진에 알려줌 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"

    errorPage="IsErrorPage.jsp" %>

language :  스트립핑 언어(java)

contentType : 문서의 타입 (text/html; charset=UTF-8)

pageEncoding : 인코딩 방식 (UTF-8)

errorPage : 에러시 이동할 페이지 지정 (IsErrorPage.jsp)


<%@ include file = "IncludeFile.jsp" %>  

include :  외부 클래스 가져오기 (IncludeFile.jsp)


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8" isErrorPage="true"%>

isErrorPage : 현재 페이지가 에러 페이지임을 표시 (isErrorPage="true")


<%!  // 선언부(메서드 선언)

public int add(int num1 , int num2) {

    return num1 + num2;

}

%>

<html>

<head><title>스크립트 요소</title></head>

<body>

<%  // 스크립틀릿(자바 코드)

int result = add(10, 20);

%>

덧셈 결과 1 : <%= result %> <br />

덧셈 결과 2 : <%= add(30, 40) %>

</body>

</html>


2022년 5월 21일 토요일

JSP 공부 시작~~ 0강

예전에 다뤄봤던 JSP를 복습해보기로 한다.

스프링 부트 + AWS를 공부하고 나니 의외로 예전 버전인 스프링의 개념이 필요했다.

분명 썼던 거라도 오랫동안 사용하지  않으면 기억 손실로 복습이 필요하다.  ㅠㅠ

그래서 우선 JSP를 공부 할 때마다 이 곳에 각 강의 요약 정리를 올리고자 한다.

목표는 1일 2강이 목표이긴 하나... 변수가 생기면 늦을 수도 있다...

0강은 기본 셋팅 후에 남기는 글이다.


이번에 공부할 책은 "성낙현의 JSP 자바 웹 프로그래밍" 이다.

선택한 이유는 나름 최근에 나온 책이면서, 실무에서 가장 많이 쓴다는 버전으로 공부하기 때문이다.

셋팅 버전은 다음과 같다.

OS : 윈도우10

JDK : openjdk -11.0.2 

톰켓 :  9

이클립스 : 2020-09 윈도우 64비트


선 공부한 스프링부트 + AWS에서 책과 다르게 최신 버전으로 공부 했다가 오류 고치느라 고생한 경험으로 이번에는 책에 버전을 맞춰서 공부 하고자 한다..

JSP 요약 정리가 끝나면 스프링부트도 요약 정리해서 올릴 예정이다.