no image
[MySQL] 데이터 형식, 변수, 형 변환
이 글은 혼자 공부하는 SQL(저자 : 우재남)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다. 테이블을 만들 때는 데이터 형식을 설정해야 한다. 데이터 형식에는 크게 숫자형, 문자형, 날짜형이 있다. 또 세부적으로는 여러 개로 나뉘기도 한다. 이렇게 다양한 데이터 형식이 존재하는 이유는 실제로 데이터 형태가 다양하기 때문이다. 각 데이터에 맞는 데이터 형식을 지정함으로써 효율적으로 저장할 수 있다. 데이터 형식 정수형 정수형은 소수점이 없는 숫자, 즉 인원 수, 가격, 수량 등에 많이 사용된다. 정수형의 크기와 범위는 아래와 같다. 데이터 형식 바이트 수 숫자 범위 TINYINT 1 -128 ~ 127 SMALLINT 2 -32,768 ~ 32,767 INT 4 약 -21억 ~ +2..
2023.11.26
no image
[Java] char 타입을 정수 타입으로 변환
char num = '1'; int tmp = num; //자동 타입 변환 System.out.print(tmp); char num = '1'; System.out.print((int) num); //강제 타입 변환하여 출력 이렇게 문자 '1'을 자동 타입 변환을 하거나 강제 형 변환을 해서 출력을 하게되면 1이 출력이 되는것이 아니라 49가 출력이되어서 나온다. 위에서 49가 출력된 이유는 '1'은 아스키코드로 49이기 때문이다. 즉, 문자 '1'이 정수로 타입 변환이 될 때 아스키코드 49로 변환된 것이다. 이런 문제는 charAt()메소드를 사용할 때도 나타난다. String num = "12345"; for(int i = 0; i < num.length(); ++i) { int tmp = num...
2023.11.26
no image
[Java] 라빈-카프 문자열 탐색 알고리즘
https://coding-food-court.tistory.com/216 위 글에 있는 내용과 그림을 참고하였습니다. 다만, 코드에 오류가 있어서 수정하였습니다. 길이가 M인 전체 문자열에서 길이가 N인 문자열을 찾는다고 하면 시간 복잡도 O(M*N)인 알고리즘이다. 이렇게도 풀수는 있지만 시간 복잡도가 상당하다. 라빈-카프 문자열 탐색 알고리즘을 사용하면 시간 복잡도가 O(N)으로 감소한다. 라빈-카프의 원리 찾는 패턴의 길이만큼을 전체 문자열과 찾는 문자열의 해시 코드로 비교한다. 만약 전체 문자열과 찾는 문자열의 해시 코드가 일치한다면 하나씩 비교해가면서 정말로 맞는지 확인한다. 이렇게 한 번더 비교하는 이유는 해시 충돌때문이다. 해시 충돌 A = 0, B = 1, C = 2라고 하고 해시함수가 ..
2023.11.25
no image
[Java] 백준 1212번 문제 (8진수 2진수)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); String input = br.readLine(); String[] arr = {"000","001","010","011","100","101","110","111"}; for(int i = 0; i < input.length(); ..
2023.11.25
no image
[JSP] 세션(Session)
세션 네트워크 환경에서 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하기 위한 방법을 의미 세션은 서버 공간에 생성되므로 보안 유지에 유리하지만 데이터를 저장하기 위한 한계성에 대한 문제는 존재함 세션은 클라이언트의 요청에 따라 접속된 웹 서버와 가상으로 연결된 상태를 유지하도록 해 줌 세션에 의한 클라이언트 구분 세션은 웹 서버 공간에 생성되는 객체로 웹 브라우저마다 하나씩 존재 웹 서버와의 접속을 통해 생성된 세션은 네트워크 환경에서 여러 사용자 중 특정인에 대한 구분자의 역할을 수행 세션을 통해 접속된 웹 브라우저를 닫기 전까지는 웹페이지를 이동하더라도 사용자에 대한 정보가 웹 서버에 객체 상태로 저장되어 있으므로 사용자 정보를 지속적으로 활용할 수 있게 됨 세션과 쿠키 웹 브라우저에서 서버로 ..
2023.11.25
no image
[JSP] 쿠키(Cookie)
쿠키 쿠키는 사이트에 접속할 때 생성되는 정보를 담은 4KB 이하 크기의 임시 파일을 의미 네트워크 환경에서 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하기 위해 사용 세션과 다른 점은 로그인 상태 정보를 사용자 컴퓨터인 클라이언트에 저장된다는 부분(세션은 웹 서버에 저장) 쿠키는 불순한 의도로 복사되거나 해킹 등에 의해 개인 정보가 탈취될 수 있다는 보안상 취약한 단점 존재 쿠키에 의한 웹 브라우저 구분 쿠키는 클라이언트의 정보를 웹 브라우저에 저장하기 때문에 이후 웹 서버로 서비스를 요청할 경우 쿠키를 읽어 새로운 웹 브라우저인지 아니면 이전에 요청했던 웹 브라우저인지를 구별함 쿠키가 생성되면 웹 브라우저는 쿠키가 삭제되기 전까지 쿠키의 요청이 있을 때마다 웹 서버에게 쿠키를 제공 쿠키와 세션 ..
2023.11.24
no image
[JSP] 내장 객체
내장 객체란 JSP 페이지에서 사용할 수 있도록 JSP 컨테이너에 미리 정의된 객체 JSP 페이지가 서블릿 프로그램으로 번역될 때 JSP 컨테이너가 자동으로 내장 객체를 멤버 변수, 메소드 매개변수 등의 각종 참조 변수(객체)로 포함 JSP 페이지에 별도의 import문 없이 자유롭게 사용 가능 스크립틀릿 태그나 표현문 태그에 선언을 하거나 객체를 생성하지 않고도 직접 호출하여 사용 가능 내장 객체의 종류 내장 객체의 속성관리 JSP는 HTTP 프로토콜의 사용하는 웹 환경에서 구동되는 프로그램 HTTP는 비연결형으로 사용자가 서버에 특정 페이지를 요청하고 요청결과를 응답받으면 서버와의 연결이 끊기는 형태 예를 들어 게시판에 글을 작성하는 페이지에서 작성한 내용은 다른 jsp에서 처리해야 하고 서버는 방금..
2023.11.24
no image
[JSP] 스크립트 태그(Script Tag)
스크립트 태그 종류 스크립트 태그는 JSP 웹 페이지를 어떻게 처리할 것인지에 대한 페이지의 정보를 설정하여 웹 컨테이너인 아파치 톰캣에게 보낼 때 선언한다. 스크립트 태그의 종류는 아래와 같다. 디렉티브(지시문) 태그의 종류 디렉티브란 JSP 웹페이지에 대한 파일의 속성을 기술하는 지시문으로 JSP 컨테이너에 해당 웹페이지를 어떻게 처리해야 할 것인지를 전달하는 명령문을 의미한다. 디렉티브의 선언 위치는 일반적으로 JSP 웹페이지의 가장 상단에 선언한다. include 디렉티브 태그의 사용법 디렉티브 태그의 속성 종류
2023.11.24

이 글은 혼자 공부하는 SQL(저자 : 우재남)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


테이블을 만들 때는 데이터 형식을 설정해야 한다.

데이터 형식에는 크게 숫자형, 문자형, 날짜형이 있다.

또 세부적으로는 여러 개로 나뉘기도 한다.

이렇게 다양한 데이터 형식이 존재하는 이유는 실제로 데이터 형태가 다양하기 때문이다.

각 데이터에 맞는 데이터 형식을 지정함으로써 효율적으로 저장할 수 있다.

 

데이터 형식

정수형

정수형은 소수점이 없는 숫자, 즉 인원 수, 가격, 수량 등에 많이 사용된다.

정수형의 크기와 범위는 아래와 같다.

데이터 형식 바이트 수 숫자 범위
TINYINT 1 -128 ~ 127
SMALLINT 2 -32,768 ~ 32,767
INT 4 약 -21억 ~ +21억
BIGINT 8 약 -900경 ~ +900경

 

UNSIGNED 예약어를 사용하면, 음수를 표현했던 범위를 온전히 양수로 표현할 수 있다.

UNSIGNED 예약어는 모든 정수에 사용 가능하다.

 

문자형

문자형은 글자를 저장하기 위해 사용하며, 입력할 최대 글자수를 지정해야 한다.

데이터 형식 바이트 수
CHAR(개수) 1~255
VARCHAR(개수) 1~16383
문자형에는 BINARY, VARBINARY도 있지만 잘 사용하지 않는다.

CHAR는 고정길이 문자형이라고 부른다.

즉, 자릿수가 고정되어 있다.

예를 들어 CHAR(10)에 '가나다' 3글자만 저장해도 10자리를 모두 확보한 후에 앞에 3자리를 사용하고 뒤의 7자리는 낭비하게 된다.

이와 달리 VARCHAR는 가변길이 문자형으로, VARCHAR(10)에 '가나다' 3글자를 저장할 경우 3자리만 사용한다.

VARCHAR가 CHAR보다 공간을 효율적으로 운영할 수 있지만, MySQL 내부적으로 속도면에서는 CHAR로 설정하는 것이 조금 더 좋다.

 

대량의 데이터 형식

데이터 형식 바이트 수
TEXT 형식 TEXT 1~65,535
LONGTEXT 1 ~ 42억 9496만 7295
BLOB 형식 BLOB 1~65,535
LONGBLOB 1 ~ 42억 9496만 7295
TINYTEXT, MEDIUMTEXT, TINYBLOB, MEDIUMBLOB 등도 있지만 잘 사용하지 않는다.

 

실수형

실수형은 소수점이 있는 숫자를 저장할 때 사용한다.

데이터 형식 바이트 수  설명
FLOAT 4 소수점 아래 7자리까지 표현
DOUBLE 8 소수점 아래 15자리까지 표현

 

날짜형

날짜형은 날짜 및 시간을 저장할 때 사용한다.

데이터 형식 바이트 수 설명
DATE 3 날짜만 저장, YYYY-MM-DD 형식으로 사용
TIME 3 시간만 저장, HH:MM:SS 형식으로 사용
DATETIME 8 날짜 및 시간을 저장, YYYY-MM-DD HH:MM:SS 형식으로 사용

날짜 또는 시간을 입력할 때는 문자와 마찬가지로 작은 따옴표로 묶어줘야 한다.

 

변수

변수의 사용

SQL도 다른 일반적인 프로그래밍 언어처럼 변수를 선언하고 사용할 수 있다.

SET @myVar1 = 5 ;
SET @myVar2 = 4.25 ;
SELECT @myVar1 + @myVar2 ;

 

SET @txt = '가수 이름==> ' ;
SET @height = 166;
SELECT @txt , mem_name FROM member WHERE height > @height ;

 

PREPARE와 EXECUTE

아래의 코드는 오류가 발생한다.

SET @count = 3;
SELECT mem_name, height FROM member ORDER BY height LIMIT @count;

이유는 LIMIT에는 변수를 사용할 수 없기 때문이다.

이를 해결하는 것이 PREPARE와 EXECUTE이다.

PREPARE는 실행하지 않고 SQL 문만 준비해 놓고 EXECUTE에서 실행하는 방식이다.

SET @count = 3;
PREPARE mySQL FROM 'SELECT mem_name, height FROM member ORDER BY height LIMIT ?';
EXECUTE mySQL USING @count;
  1. PREPARE에서 SELECT LIMIT ? 문을 실행하지 않고 MySQL이라는 이름으로 준비만 해놓는다.
  2. EXECUTE로 mySQL에 저장된 SELECT문을 실행할 때, USING으로 물음표에 @count 변수에 값을 대입하는 것이다.

 

데이터 형 변환

문자형을 정수형으로 바꾸거나, 반대로 정수형을 문자형으로 바꾸는 것을 데이터의 형 변환이라고 부른다.

형 변환에는 직접 함수를 사용해서 변환하는 명시적 형 변환과 별도의 지시 없이 자연스럽게 변환되는 묵시적 형 변환이 있다.

 

함수를 이용한 명시적인 변환

데이터 형식을 변환하는 함수는 CAST(), CONVERT(), CAST(), CONVERT()는 형식만 다를 뿐 동일한 기능을 한다.

SELECT AVG(price) '평균 가격' FROM buy;

가격은 실수보다 정수로 표현하는 것이 좋다.

아래와 같이 CAST()나 CONVERT() 함수를 사용해서 정수로 표현할 수 있다.

CAST()나 CONVERT() 함수 안에 올 수 있는 데이터 형식은 CHAR, SIGNED, UNSIGNED, DATE, TIME, DATETIME 등이다.

SIGNED는 부호가 있는 정수, UNSIGNED는 부호가 없는 정수를 의미한다.

SELECT CAST(AVG(price) AS SIGNED)  '평균 가격'  FROM buy ;
-- 또는
SELECT CONVERT(AVG(price) , SIGNED)  '평균 가격'  FROM buy ;

 

날짜는 다양한 구분자를 날짜형으로 변경할 수도 있다.

SELECT CAST('2022$12$12' AS DATE);
SELECT CAST('2022/12/12' AS DATE);
SELECT CAST('2022%12%12' AS DATE);
SELECT CAST('2022@12@12' AS DATE);

 

SQL의 결과를 원하는 형태로 표현할 때도 사용할 수 있다.

가격(price)과 수량(amount)을 곱한 실제 구매액을 표시하는 SQL문은 아래와 같이 작성할 수 있다.

SELECT num, CONCAT(CAST(price AS CHAR), 'X', CAST(amount AS CHAR) ,'=' ) '가격X수량',
price*amount '구매액' 
FROM buy ;

가격과 수량은 정수지만, CAST() 함수를 통해 문자로 바꾸었다.

CONCAT() 함수는 문자를 이어주는 역할을 한다.

 

묵시적인 변환

SELECT '100' + '200' ; -- 문자와 문자를 더함 (정수로 변환되서 연산됨)

 

SELECT CONCAT('100', '200'); -- 문자와 문자를 연결 (문자로 처리)

 

SELECT CONCAT(100, '200'); -- 정수와 문자를 연결 (정수가 문자로 변환되서 처리)

char num = '1';
int tmp = num; //자동 타입 변환
System.out.print(tmp);
char num = '1';
System.out.print((int) num); //강제 타입 변환하여 출력

이렇게 문자 '1'을 자동 타입 변환을 하거나 강제 형 변환을 해서 출력을 하게되면 1이 출력이 되는것이 아니라 49가 출력이되어서 나온다.

 

위에서 49가 출력된 이유는 '1'은 아스키코드로 49이기 때문이다.

즉, 문자 '1'이 정수로 타입 변환이 될 때 아스키코드 49로 변환된 것이다.

 

이런 문제는 charAt()메소드를 사용할 때도 나타난다.

String num = "12345";
for(int i = 0; i < num.length(); ++i)
{
    int tmp = num.charAt(i);
    System.out.print(tmp);
}

이러한 코드를 실행해보면 출력값은 4950515253이 나온다.

'1' -> 49

'2' -> 50

'3' -> 51

'4' -> 52

'5' ->53

 

우리의 의도대로 문자 하나를 정수로 변환하려면 두 가지 방법이 존재한다.

  • 아스키 코드 사용('0'을 빼주기)
  • Character.getNumericValue() 메소드 사용

 

아스키 코드 사용('0'을 빼주기)

문자 '0'의 아스키 코드 값은 48이다.

위 예에서 말한것 처럼 '1'의 아스키코드는 49이므로 '1' - '0'을 하면 정수 1이되는 것이다.

char num = '1';
System.out.print(num - '0');

이렇게 하면 우리가 의도한대로 원하는 정수값이 출력이 된다.

 

Character.getNumericValue() 메소드 사용

Character 클래스의 getNumericValue() 정적 메소드를 사용하면 이 또한 우리가 의도한대로 원하는 정수값을 얻을 수 있다.

char num = '1';
System.out.print(Character.getNumericValue(num));

이 코드를 실행해보면 정상적으로 1이 출력되는 것을 확인할 수 있다.

https://coding-food-court.tistory.com/216

위 글에 있는 내용과 그림을 참고하였습니다.

다만, 코드에 오류가 있어서 수정하였습니다.


길이가 M인 전체 문자열에서 길이가 N인 문자열을 찾는다고 하면

시간 복잡도 O(M*N)인 알고리즘이다.

이렇게도 풀수는 있지만 시간 복잡도가 상당하다.

 

라빈-카프 문자열 탐색 알고리즘을 사용하면 시간 복잡도가 O(N)으로 감소한다.

 

라빈-카프의 원리

 

찾는 패턴의 길이만큼을 전체 문자열과 찾는 문자열의 해시 코드로 비교한다.

만약 전체 문자열과 찾는 문자열의 해시 코드가 일치한다면 하나씩 비교해가면서 정말로 맞는지 확인한다.

이렇게 한 번더 비교하는 이유는 해시 충돌때문이다.

해시 충돌
A = 0, B = 1, C = 2라고 하고 해시함수가 모두 더하는 해시함수라고 하면
ABC를 해시코드로 변환하면 3이된다.
ACB, BAC.. 등도 마찬가지로 3이된다.
이렇게 해시 충돌이 일어날 수 있기 때문에 한 번더 검사를 하는 것이다.

 

라빈-카프의 해시함수

S = 문자열, S[n]은 문자열 내의 n번째 문자, m은 문자열의 길이를 나타낸다.

 

 

라빈-카프 알고리즘은 한 칸씩 이동하면서 해시 코드를 비교하는데, 한 칸씩 이동할 때마다 해시함수를 구하면 시간 복잡도 O(N*M)인 알고리즘과 다를게 없다.

따라서 기존에 구했던 해시함수를 일부 재활용한다.

처음에 문자열의 해시 코드를 구한 뒤, 이후 한 칸씩 이동할 때는 버리게 되는 문자의 해시코드를 빼주고 새로 얻게되는 문자의 해시코드를 더해주는 방식이다.

위 그림에서 보는 것과 같이 새로운 문자의 해시코드를 계산할 때는 2를 곱해주어 한 칸씩 이동하는 효과를 줄 수가 있다.

 

또한, 해시 값을 구하는 과정에서 문자열이 너무 길어서 자료형의 범위값을 넘어서는 경우는 MOD(모듈러 연산)을 활용한다.

 

Java로 구현

모듈러 연산 X

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Main
{	
	static List<Integer> solve(String str, String pattern)
	{
		long strHash = 0, patternHash = 0; //해시 코드를 저장
		int power = 1; //2^0
		int strLen = str.length();
		int patternLen = pattern.length();
		
		List<Integer> idxList = new ArrayList<>();
		
		for(int i = 0; i < strLen - patternLen + 1; ++i) //최소한 찾는 문자열의 길이만큼의 루프를 돌아야 하기 때문에 + 1을 해줌
		{
			if(i == 0) //전체 문자열에 첫 탐색이라면
			{
				for(int j = 0; j < patternLen; ++j) //최초 해시 코드를 설정
				{
					//역순으로 해시 코드 값을 구해나감
					strHash = strHash + str.charAt(patternLen - 1 - j) * power; //전체 문자 해당 구간의 해시코드를 한 문자씩 구해나감
					patternHash = patternHash + pattern.charAt(patternLen - 1 - j) * power; // 찾는 문자의 해시코드를 한 문자씩 구해나감
					if (j < patternLen - 1) power *= 2; //2^0은 기존에 있었으므로, 찾는 문자의 길이 -1까지만
				}
			}
			else strHash = 2 * (strHash - (str.charAt(i - 1) * power)) + str.charAt(patternLen - 1 + i); //기존 해시코드에서 맨 앞 문자의 해시코드는 버리고, 추가되는 문자의 해시코드는 더한다.
			
			if(strHash == patternHash) //해당 구간에서 해시코드가 서로 일치한다면
			{
				boolean flag = true;
				for(int j = 0; j < patternLen; ++j) //한 문자씩 비교함
				{
					if(str.charAt(i + j) != pattern.charAt(j))
					{
						flag = false;
						break;
					}
				}
				if(flag) idxList.add(i); //모든 문자가 일치한다면 idxList에 찾는 문자열의 시작 인덱스를 추가
			}
		}
		return idxList;
	}
	
	public static void main(String[] args) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		String pattern = br.readLine();
        List<Integer> idxlist = solve(str, pattern);
        for(Integer value : idxlist) System.out.printf("찾는 문자열의 시작위치 : idx[%d]\n", value);
	}
}

 

모듈러 연산 O

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Main
{	
	static List<Integer> solve(String str, String pattern)
	{
		final int MOD = 100000007; //모듈러 연산을 위해
		long strHash = 0, patternHash = 0; //해시 코드를 저장
		int power = 1; //2^0
		int strLen = str.length();
		int patternLen = pattern.length();
		
		List<Integer> idxList = new ArrayList<>();
		
		for(int i = 0; i < strLen - patternLen + 1; ++i) //최소한 찾는 문자열의 길이만큼의 루프를 돌아야 하기 때문에 + 1을 해줌
		{
			if(i == 0) //전체 문자열에 첫 탐색이라면
			{
				for(int j = 0; j < patternLen; ++j) //최초 해시 코드를 설정
				{
					//역순으로 해시 코드 값을 구해나감
					strHash = (strHash + str.charAt(patternLen - 1 - j) * power) % MOD; //전체 문자 해당 구간의 해시코드를 한 문자씩 구해나감
					patternHash = (patternHash + pattern.charAt(patternLen - 1 - j) * power) % MOD; // 찾는 문자의 해시코드를 한 문자씩 구해나감
					if (j < patternLen - 1) power = (power * 2) % MOD; //2^0은 기존에 있었으므로, 찾는 문자의 길이 -1까지만
				}
			}
			else strHash = (2 * (strHash - (str.charAt(i - 1) * power % MOD)) + str.charAt(patternLen - 1 + i)) % MOD; //기존 해시코드에서 맨 앞 문자의 해시코드는 버리고, 추가되는 문자의 해시코드는 더한다.
			
			if(strHash == patternHash) //해당 구간에서 해시코드가 서로 일치한다면
			{
				boolean flag = true;
				for(int j = 0; j < patternLen; ++j) //한 문자씩 비교함
				{
					if(str.charAt(i + j) != pattern.charAt(j))
					{
						flag = false;
						break;
					}
				}
				if(flag) idxList.add(i); //모든 문자가 일치한다면 idxList에 찾는 문자열의 시작 인덱스를 추가
			}
		}
		return idxList;
	}
	
	public static void main(String[] args) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		String pattern = br.readLine();
        List<Integer> idxlist = solve(str, pattern);
        for(Integer value : idxlist) System.out.printf("찾는 문자열의 시작위치 : idx[%d]\n", value);
	}
}

문제설명

 

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main
{
	public static void main(String[] args) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		String input = br.readLine();
		String[] arr = {"000","001","010","011","100","101","110","111"};
		for(int i = 0; i < input.length(); ++i)
		{
			int tmp = input.charAt(i) - '0'; //'0'의 아스키코드 값은 48, 이렇게하면 원하는 정수를 얻을 수 있음
			sb.append(arr[tmp]);
		}
		if (input.equals("0")) System.out.print(0);
		else
		{
			while(sb.charAt(0) == '0') sb = new StringBuilder(sb.substring(1)); //0이 없어질때까지 0을 제거
			System.out.println(sb);
		}
	}
}

 

설명

  • 8진수를 2진수로 바꾸려면 아래와 같은 과정을 거친다.
    314 : 3->011, 1->001, 4->100
    합치면 011001100
  • 맨 앞의 수가 0이면 제거해줘야한다.
    즉, 11001100이어야 한다.
    만약 001100000 이런 이진수는 앞의 두 개의 0을 제거해줘야한다.
  • 0의 값이 들어오면 000이 출력되는 것이 아니라 0이 출력되어야 한다.

세션

  • 네트워크 환경에서 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하기 위한 방법을 의미
  • 세션은 서버 공간에 생성되므로 보안 유지에 유리하지만 데이터를 저장하기 위한 한계성에 대한 문제는 존재함
  • 세션은 클라이언트의 요청에 따라 접속된 웹 서버와 가상으로 연결된 상태를 유지하도록 해 줌

 

세션에 의한 클라이언트 구분

  • 세션은 웹 서버 공간에 생성되는 객체로 웹 브라우저마다 하나씩 존재
  • 웹 서버와의 접속을 통해 생성된 세션은 네트워크 환경에서 여러 사용자 중 특정인에 대한 구분자의 역할을 수행
  • 세션을 통해 접속된 웹 브라우저를 닫기 전까지는 웹페이지를 이동하더라도 사용자에 대한 정보가 웹 서버에 객체 상태로 저장되어 있으므로 사용자 정보를 지속적으로 활용할 수 있게 됨

 

세션과 쿠키

  • 웹 브라우저에서 서버로 접속할 때 쿠키 대신 세션을 사용하는 이유는 쿠키에 비해 세션이 보안에 강하기 때문임
  • 쿠키와 세션의 가장 큰 차이점은 웹 브라우저를 통해 서비스를 요청할 때 사용자의 정보가 저장되는 위치
  • 쿠키는 서버의 자원을 전혀 사용하지 않지만 세션은 서버의 자원을 사용함
  • 웹 서비스에 대한 요청 속도는 세션보다 쿠키가 더 빠르므로 쿠키와 세션의 선택은 주어진 개발 환경에 맞춰 사용하면 됨

 

세션 내장 객체 메소드

  • 웹 브라우저에서 웹 서버에게 서비스를 요청할 경우 요청한 웹 브라우저에 관한 정보를 저장하고 관리하는 역할을 수행
  • session 객체는 웹 브라우저당 1개의 세션이 할당되도록 하려면 page 디렉티브의 session 속성이 true로 설정되어 있어야 함

 

세션 생성

  • 세션을 생성할 때는 session 내장 객체의 setAttribute( ) 메소드를 사용하여 다음과 같이 생성

괄호 안에 매개 변수의 의미

  • name : 사용할 세션의 이름
  • value : 세션의 속성값

 

세션 정보 확인

단일 세션 정보

  • getAttribute( ) 메소드를 사용하여 세션에 저장된 하나의 세션 속성 이름에 대한 속성을 가져오려면 다음과 같이 선언

  • 주의해야 할 점은 getAttribute( ) 메소드의 반환 유형은 Object 형이므로 반드시 형 변환을 수행한 다음 사용해야 함
  • 괄호 안의 name 매개변수는 세션에 저장된 속성의 이름을 의미하며 name을 선언하지 않게 되면 null의 값을 반환해 줌

 

다중 세션 정보

  • getAttributeNames( ) 메소드를 사용하여 세션에 저장된 여러 개의 세션 속성 이름에 대한 속성을 가져오려면 다음과 같이 선언
  • getAttributeNames( ) 메소드의 반환 유형은 Enumeration 객체 타입이므로 page 디렉티브 태그의 import 속성을 사용하여 java.util.Enumeration을 설정해야 함

 

세션 유효 시간

유효시간 설정 방법

setMaxInactiveInterval( ) 메소드

  • 세션의 유효시간을 설정할 때 사용하는 session 내장 객체의 메소드
  • 메소드의 괄호 안에 정수의 값을 선언한 매개변수로 세션의 유효시간을 설정할 수 있음
  • 세션의 유효시간은 ‘초’ 단위이며 기본값은 1,800초(30분)로 설정되어 있음
  • 세션의 유효시간을 0 또는 음수의 값으로 설정하게 될 경우 유효시간이 없는 상태가 되므로 세션을 삭제 후에도 웹 서버에는 계속해서 남아있게 되어 메모리 부족 현상이 발생될 수 있으므로 주의해야 함

 

 

세션 삭제

단일 세션 삭제

removeAttribute( ) 메소드

  • 단일 세션 memberID를 삭제할 때 사용하는 session 내장 객체의 메소드로 다음과 같이 선언

 

다중 세션 삭제

invalidate( ) 메소드

  • 다중 세션을 삭제할 때 사용하는 session 내장 객체의 메소드로 다음과 같이 선언

 

예제

SessionLoginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body>
<center>
	<h2> 세션 로그인 </h2>
	<form action = "SessionLoginProc.jsp" method = "post">
		<table width = "400" border = "1">
			<tr height = "50">
				<td width="150" align="center"> 아이디 </td>
				<td width="250"> <input type = "text" name = "id"></td>
			</tr>
			<tr height = "50">
				<td width="150" align="center"> 패스워드 </td>
				<td width="250"> <input type = "password" name = "pass"></td>
			</tr>
			<tr height = "50">
				<td align="center" colspan = "2"><input type="submit" value = "로그인"></td>
			</tr>
		</table>
	</form>
</center>
</body>
</html>

 

SessionLoginProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body>
<%
	//세션이란 클라이언트가 아니라 서버 PC 메모리에 저장되는 것
	//웹 브라우저당 하나의 세션이 만들어진다.
	//그 세션이 웹 컨테이너(톰캣 서버)에 저장됨
	//브라우저가 종료되지 않는 이상 유지
	
	request.setCharacterEncoding("UTF-8");
	String id = request.getParameter("id");
	String pass = request.getParameter("pass");
	
	session.setAttribute("id", id); //세션 값 생성
	session.setAttribute("pass", pass); //세션 값 생성
	session.setMaxInactiveInterval(60*3);
%>
<h3>당신의 아이디는 <%= id %> 이고, 패스워드는 <%= pass %> 입니다.</h3>
<!-- <a href = "SessionLoginProc2.jsp?id=<%=id%>&pass=<%=pass%>">다음 페이지로 이동(get방식으로 넘김)</a> -->
<a href = "SessionLoginProc2.jsp">다음 페이지로 이동</a>
</body>
</html>

 

SessionLoginProc2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body>
<%
	request.setCharacterEncoding("UTF-8");
	//String id = request.getParameter("id");
	//String pass = request.getParameter("pass");
	String id = (String)session.getAttribute("id"); // 세션에 저장된 id값을 가져옴
	String pass = (String)session.getAttribute("pass"); //세션에 저장된 pass값을 가져옴
%>
<h3>당신의 아이디는 <%= id %> 이고, 패스워드는 <%= pass %> 입니다.</h3>
</body>
</html>

 

 

'Java Category > JSP' 카테고리의 다른 글

[JSP] JSP와 데이터베이스 연동  (2) 2023.11.27
[JSP] 액션 태그(Action tag)  (1) 2023.11.27
[JSP] 쿠키(Cookie)  (2) 2023.11.24
[JSP] 내장 객체  (2) 2023.11.24
[JSP] 스크립트 태그(Script Tag)  (1) 2023.11.24

쿠키

  • 쿠키는 사이트에 접속할 때 생성되는 정보를 담은 4KB 이하 크기의 임시 파일을 의미
  • 네트워크 환경에서 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하기 위해 사용
  • 세션과 다른 점은 로그인 상태 정보를 사용자 컴퓨터인 클라이언트에 저장된다는 부분(세션은 웹 서버에 저장)
  • 쿠키는 불순한 의도로 복사되거나 해킹 등에 의해 개인 정보가 탈취될 수 있다는 보안상 취약한 단점 존재

 

쿠키에 의한 웹 브라우저 구분

  • 쿠키는 클라이언트의 정보를 웹 브라우저에 저장하기 때문에 이후 웹 서버로 서비스를 요청할 경우
  • 쿠키를 읽어 새로운 웹 브라우저인지 아니면 이전에 요청했던 웹 브라우저인지를 구별함
  • 쿠키가 생성되면 웹 브라우저는 쿠키가 삭제되기 전까지 쿠키의 요청이 있을 때마다 웹 서버에게 쿠키를 제공

 

쿠키와 세션

  • 웹 브라우저에서 서버로 접속할 때 쿠키 대신 세션을 사용하는 이유는 쿠키에 비해 세션이 보안에 강하기 때문임
  • 쿠키와 세션의 가장 큰 차이점은 웹 브라우저를 통해 서비스를 요청할 때 사용자의 정보가 저장되는 위치
  • 쿠키는 서버의 자원을 전혀 사용하지 않지만 세션은 서버의 자원을 사용함
  • 웹 서비스에 대한 요청 속도는 세션보다 쿠키가 더 빠르므로 쿠키와 세션의 선택은 주어진 개발 환경에 맞춰 사용하면 됨

 

 

Cookie 클래스

  • 쿠키는 연결 상태가 없는 HTTP 프로토콜을 위해 접속된 상태를 그대로 유지할 때 필요
  • 쿠키는 웹 브라우저에 상태 정보를 저장하기 때문에 이후 웹 서버로 전송되는
    서비스 요청에는 쿠키가 가지고 있는 정보도 함께 포함되어 전송
  • Cookie 클래스는 쿠키 생성 및 관련 정보 등을 설정하기 위해 다양한 쿠키 관련 메소드를 제공

 

쿠키 생성 메소드

  • 쿠키를 생성하려면 Cookie 클래스의 Cookie( ) 메소드를 사용, 쿠키 생성 후
    쿠키를 설정할 때 반드시 response 내장 객체의 addCookie( ) 메소드를 사용
  • Cookie( ) 메소드 : 쿠키 생성(“쿠키이름”, “쿠키값”)
  • addCookie( ) 메소드 : 쿠키 설정(변수명)

 

 

쿠키 정보 메소드

  • getCookie( ) 메소드 : 쿠키 객체 가져오기
  • Cookie[ ] 변수명 : 여러 개의 쿠키 객체 가져오기

  • getName( ) 메소드 : 쿠키 이름 가져오기
  • getValue( ) 메소드 : 쿠키값 가져오기

 

 

쿠키 삭제

  • Cookie 클래스에서는 쿠키를 삭제하기 위한 별도의 기능을 제공하지 않기 때문에 쿠키를 삭제하려면 setMaxAge( ) 메소드를 사용하여 괄호 안에 정수의 값 0을 매개변수로 입력하여 유효시간이 만료됨에 따라 쿠키는 자동으로 삭제되도록 선언해야 함
  • 쿠키의 유효시간은 ‘초’ 단위이며 1시간을 설정하려면 setMaxAge(60 * 60)으로 선언
  • 쿠키의 이름이 userID이고 쿠키의 값이 u_id인 경우 setMaxAge( ) 메소드를
    사용하여 쿠키를 삭제하려면 다음과 같이 선언

 

예제

CookieLoginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body>
<%
	Cookie[] cookies = request.getCookies(); //쿠키들을 저장할 배열, 쿠키 가져오기
	String id = ""; //쿠키 값이 있다면 저장할 아이디 변수
	if(cookies != null) //쿠키가 없지 않다면
	{
		for(int i = 0; i < cookies.length; ++i)
		{
			if(cookies[i].getName().equals("id")) //쿠키의 이름이 id와 같다면
			{
				id = cookies[i].getValue(); //아이디 변수에 해당 쿠키의 키와 대응하는 값을 저장
				break;
			}
		}	
	}
%>
<center>
	<h2> 쿠키 로그인 </h2>
	<form action = "CookieLoginProc.jsp" method = "post">
		<table width = "400" border = "1">
			<tr height = "50">
				<td width="150" align="center"> 아이디 </td>
				<td width="250"> <input type = "text" name = "id" value="<%= id %>"></td>
			</tr>
			<tr height = "50">
				<td width="150" align="center"> 패스워드 </td>
				<td width="250"> <input type = "password" name = "pass"></td>
			</tr>
			<tr height = "50">
				<td align="center" colspan = "2"><input type="checkbox" name = "save" value="1"> 아이디 저장 </td>
			</tr>
			<tr height = "50">
				<td align="center" colspan = "2"><input type="submit" value = "로그인"></td>
			</tr>
		</table>
	</form>
</center>
</body>
</html>

 

CookieLoginProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body>
<%
	request.setCharacterEncoding("UTF-8");
	String save = request.getParameter("save"); //아이디 체크박스의 값을 불러옴
	String id = request.getParameter("id");
	
	if(save != null) // 아이디 체크 박스의 값이 null이 아니라면 쿠키 생성
	{
		Cookie cookie = new Cookie("id", id); //쿠키 생성, 생성자는 해시테이블과 같은 방식으로 key-value형식
		cookie.setMaxAge(60 * 10); //쿠키 유효시간 설정 -> 10분
		response.addCookie(cookie); //클라이언트 PC에 쿠키 값을 저장
		out.print("쿠키 생성 완료");
	}
%>
</body>
</html>

 

[JSP] 내장 객체

ReBugs
|2023. 11. 24. 03:08

내장 객체란

  • JSP 페이지에서 사용할 수 있도록 JSP 컨테이너에 미리 정의된 객체
  • JSP 페이지가 서블릿 프로그램으로 번역될 때 JSP 컨테이너가 자동으로 내장 객체를 멤버 변수, 메소드 매개변수 등의 각종 참조 변수(객체)로 포함
  • JSP 페이지에 별도의 import문 없이 자유롭게 사용 가능
  • 스크립틀릿 태그나 표현문 태그에 선언을 하거나 객체를 생성하지 않고도 직접 호출하여 사용 가능

 

내장 객체의 종류

 

내장 객체의 속성관리

  • JSP는 HTTP 프로토콜의 사용하는 웹 환경에서 구동되는 프로그램
  • HTTP는 비연결형으로 사용자가 서버에 특정 페이지를 요청하고 요청결과를 응답받으면 서버와의 연결이 끊기는 형태
    예를 들어 게시판에 글을 작성하는 페이지에서 작성한 내용은 다른 jsp에서 처리해야 하고 서버는 방금 글을 작성한 사람이 누구인지 모를 수 있음
  • JSP 에서  page, request, session, application 내장객체를 통해 서로 다른 페이지에서 처리된 값을 저장하고 공유하기 위한 방법을 제공
  • 이는 컨테이너 기반 프로그램의 특징 중 하나로 실제 프로그램 구현 시 매우 중요한 기법

https://javappo.tistory.com/215

  1. application은 모든 사용자가 공유하는 데이터를 저장할 수 있으며 톰캣이 종료될 때 까지 데이터를 유지할 수 있다(맨 위의 user1, user2 해당). 
  2. session의 경우 사용자마다 분리된 저장 영역이 있으며 Page1, Page2, Page3 모두에서 공유되는 정보를 관리할 수 있다. 물론 이 데이터는 각자 공유 영역에서 관리되며 사용자 간에는 공유되지 않는다. 
  3. 페이지 흐름이 Page1, Page2, Page3순으로 진행된다고 할 때, 한 페이지에서 다른 페이지로 데이터를 전달하려면 request 내장객체를 이용해야 한다.(맨 아래의 user1에 해당한다). page 마다 생성됨.

  • request, session, application 은 각각 생성 시점과 소멸시점이 다르며 이를 잘 이해하고 적절한 내장객체를 이용해야 한다.
  • 각각의 내장객체는 모두 getAttribute(), setAttribute() 메서드를 통해 속성을 저장하거나 가져올 수 있다.

reference : https://javappo.tistory.com/215

 

속성 처리 메소드의 종류

request, session, application

 

 

request

  • JSP 페이지에서 가장 많이 사용되는 기본 내장 객체
  • 웹 브라우저에서 서버의 JSP 페이지로 전달하는 정보를 저장
  • 폼 페이지로부터 입력된 데이터를 전달하는 요청 파라미터 값을 JSP 페이지로 가져 옴

 

예제

더보기

Requestjoin.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<h2>회원 가입</h2>
		<form action="RequestJoinProc.jsp">
			<table width="500" border="1">
				<tr height="50">
					<td width="150" align="center">아이디 </td>
					<td width="350" align="center">
						<input type="text" name="id" size="40" placeholder="id를 넣으세요">						
					</td>
				</tr>
		
				<tr height="50">
					<td width="150" align="center">패스워드</td>
					<td width="350" align="center">
						<input type="password" name="pass1" size="40"
						placeholder="비밀번호는 숫자와 영어만 넣어주세요">						
					</td>
				</tr>
				
				<tr height="50">
					<td width="150" align="center">패스워드 확인</td>
					<td width="350" align="center">
						<input type="password" name="pass2" size="40">						
					</td>
				</tr>
				
				<tr height="50">
					<td width="150" align="center">이메일</td>
					<td width="350" align="center">
						<input type="email" name="email" size="40">						
					</td>
				</tr>
				
				<tr height="50">
					<td width="150" align="center">전화 번호 </td>
					<td width="350" align="center">
						<input type="tel" name="tel" size="40">				
					</td>
				</tr>
				
				<tr height="50">
					<td width="150" align="center">당신의 관심 분야</td>
					<td width="350" align="center">
						<input type="checkbox" name="hobby" value="캠핑">캠핑&nbsp;
						<input type="checkbox" name="hobby" value="등산">등산&nbsp;
						<input type="checkbox" name="hobby" value="독서">독서&nbsp;
						<input type="checkbox" name="hobby" value="음악">음악&nbsp;				
					</td>
				</tr>
				
			   <tr height="50">
					<td width="150" align="center">당신의 직업은</td>
					<td width="350" align="center">
						<select name="job">
						<option value="교사">교사</option>
						<option value="의사">의사</option>
						<option value="변호사">변호사</option>
						<option value="기술사">기술사</option>
						</select>				
					</td>
				</tr>
				
				<tr height="50">
					<td width="150" align="center">당신의 연령은</td>
					<td width="350" align="center">
						<input type="radio" name="age" value="10">10대&nbsp;
						<input type="radio" name="age" value="20">20대&nbsp;
						<input type="radio" name="age" value="30">30대&nbsp;
						<input type="radio" name="age" value="40">40대&nbsp;			
					</td>
				</tr>
				
				<tr height="50">
					<td width="150" align="center">하고 싶은말</td>
					<td width="350" align="center">
							<textarea rows="5" cols="40" name="info"></textarea>	
					</td>
				</tr>
					
				<tr height="50">
					<td width="150" colspan="2">
						<input type="submit" value="회원 가입">	
						<input type="reset" value="취소">			
					</td>
				</tr>	
			</table>
		</form>	
	</center>
</body>
</html>

 

RequestjoinProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>	
<center>
<h2>회원 정보 보기</h2>

<% 
	//post방식으로 데이터가 넘어올때 한글이 깨질수 있기에 
    request.setCharacterEncoding("UTF-8");
	//각종 사용자로 부터 넘어온 데이터를 저장해줌
	String id    = request.getParameter("id");
	String pass1 = request.getParameter("pass1");
	String pass2 = request.getParameter("pass2");
	String email = request.getParameter("email");
	String  tel  = request.getParameter("tel");
	
	//[]열 타입으로 리턴 
	String [] hobby = request.getParameterValues("hobby");
	
	String job = request.getParameter("job");
	String age = request.getParameter("age");
	String info = request.getParameter("info");

	if(!pass1.equals(pass2)){
%>
	<script type="text/javascript">
		alert("비밀 번호가 틀립니다");
		history.go(-1);
	</script>	
<% 
	}
%>
	
<table width="400" border="1">
			<form action="RequestJoinProc.jsp">
			<table width="500" border="1">
				<tr height="50">
					<td width="150" align="center">아이디 </td>
					<td width="350" align="center"><%= id%>					
					</td>
				</tr>
				
				
				<tr height="50">
					<td width="150" align="center">이메일</td>
					<td width="350" align="center"><%= email%>						
					</td>
				</tr>
				
				<tr height="50">
					<td width="150" align="center">전화 번호 </td>
					<td width="350" align="center"><%= tel%>				
					</td>
				</tr>
				
				<tr height="50">
					<td width="150" align="center">당신의 관심분야</td>			
					<td width="350" align="center">
					<% 
					for(int i = 0;i<hobby.length;i++){
						out.write(hobby[i] +" ");
					}
					%>			
					</td>
				</tr>
				
				<tr height="50">
					<td width="150" align="center">직업은 </td>
					<td width="350" align="center"><%= job%>				
					</td>
				</tr>
				
				<tr height="50">
					<td width="150" align="center">전연령은</td>
					<td width="350" align="center"><%= age%>				
					</td>
				</tr>
				
				<tr height="50">
					<td width="150" align="center">하고 싶은말</td>
					<td width="350" align="center"><%= info%>				
					</td>
				</tr>

</table>
	
	
</center>
	
	
</body>
</html>

 

 

 

 

response

  • 페이지 이동 = 리다이렉션(redirection)
  • 사용자가 새로운 페이지를 요청할 때와 같이 페이지를 강제로 이동하는 것
  • 서버는 웹 브라우저에 다른 페이지로 강제 이동하도록 response 재장 객체의 리다이렉션 메소드를 제공
  • 페이지 이동 시에는 문자 인코딩을 알맞게 설정해야 함
response.sendRedirect("ResponseMain.jsp"); //해당 JSP 페이지로 이동
response.sendRedirect("ResponseMain.jsp?id="+id); //해당 JSP로 id라는 파라미터를 get방식으로 전송

 

응답 형식 지정 메소드

  • 컨텐츠 타입이나 문자셋에 대한 정보를 지정할 때 사용하는 메소드의 종류는 다음 표를 참조

 

응답 헤더 메소드

  • 헤더 정보나 쿠키 등에 대한 정보를 지정할 때 사용하는 메소드의 종류는 다음 표를 참조

 

페이지 이동 메소드

  • 웹 브라우저에서 지정한 특정 페이지로 이동할 때 사용하는 메소드의 종류는 다음 표를 참조

 

예제

더보기

ResponseSendredirect.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

<center>
	<h2>로그인 페이지 </h2>
		<form action= "ResponseLoginProc.jsp" method="post">
		<table width="400" border="1">
			<tr height = "60">
				<td align="center" width ="150">아이디</td>
				<td align="left" width= "250">
					<input type="text" name="id">
				</td>
			</tr>
			
			<tr height ="60">
				<td align = "center" width="150">패스워드</td>
				<td align = "left" width="250">
					<input type ="password" name="pass">
				</td>
			</tr>
			
			<tr height ="60">
				<td colspan = "2" align = "center">
					<input type ="submit" value="전송">
				</td>
			</tr>
		</table>
		</form>
	</center>
</body>
</html>

 

ResponseLoginProc.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h2>로그인 처리 페이지</h2>

<% 
	 request.setCharacterEncoding("EUC-KR");
	
	//임의적으로 id 와 pass를 설정 
	String dbid = "aaaa";
	String dbpass= "1234";
	
	//사용자로부터 넘어온 데이터를 입력받아줌 
	String id = request.getParameter("id");
	String pass = request.getParameter("pass");
	
	if(dbid.equals(id) && dbpass.equals(pass)){
		//아이디와 패스워드가 일치하니깐 메인 페이지를 보여주어야 합니다.
		response.sendRedirect("ResponseMain.jsp?id="+id);
	}else{
%>
	<script>
		alert("아이디와 패스워드가 일치 하지 않습니다");
		history.go(-1);
	</script>		
<% 		
	}
%>

</body>
</html>

 

ResponseMain.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<% 
		request.setCharacterEncoding("EUC-KR");
	%>
	
	<h2><%= request.getParameter("id")%> 님 반갑습니다</h2>
</body>
</html>

 

 

 

 

out

  • 웹 브라우저에 데이터를 전송하는 출력 스트림 객체
  • JSP 컨테이너는 JSP 페이지에 사용되는 모든 표현문 태그와 HTML, 일반텍스트 등을 out 내장 객체를 통해 웹 브라우저에 그대로 전달
  • 스크립틀릿 태그에 사용하여 단순히 값을 출려가는 표현문 태그(<%= ...%>)와 같은 결과를 얻을 수 있음

 

예제

스크립트 태그 종류

스크립트 태그는 JSP 웹 페이지를 어떻게 처리할 것인지에 대한 페이지의 정보를 설정하여 웹 컨테이너인 아파치 톰캣에게 보낼 때 선언한다.

 

스크립트 태그의 종류는 아래와 같다.

 

디렉티브(지시문) 태그의 종류

디렉티브란 JSP 웹페이지에 대한 파일의 속성을 기술하는 지시문으로 JSP 컨테이너에 해당 웹페이지를 어떻게 처리해야 할 것인지를 전달하는 명령문을 의미한다.

디렉티브의 선언 위치는 일반적으로 JSP 웹페이지의 가장 상단에 선언한다.

 

include 디렉티브 태그의 사용법

<%@ include file="포함될 파일의 url" %>

 

디렉티브 태그의 속성 종류