[ITWILL : JSP]영역객체 안에서 사용하는 속성(Attribute), 링크이동 방법별 전달가능한 영역(scope)

ITWILL학원 : 15강 JSP기초 BY 정규태강사

1. 영역객체 안에서 사용하는 속성(Attribute)

속성(Attribute)을 저장해서 사용.

사용형태 2가지

  • 해당영역객체.setAttribute("이름", 값)
  • 해당영역객체.getAttribute("이름")
1
2
3
4
5
6
7
//html페이지
<fieldset>
<form action="jsp페이지.jsp" method="get">
<label>아이디 : </label><input type="text" name="id">
<input type="submit" value="submit">
</form>
</fieldset>

페이지객체에서 setAttribute(“이름”, 값)를 통해 생성하고 getAttribute(“이름”)를 통해 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//jsp페이지
<h1>내장객체(pageContext, request, session, application)생성</h1>
<%
pageContext.setAttribute("p", "pageContext 값있음!");
request.setAttribute("req", "request 값있음!");
session.setAttribute("ses", "session 값있음!");
application.setAttribute("app", "application 값있음!");


<h1>내장객체 (pageContext, request, session, application)출력</h1>
pageContext 내장객체의 값 : <%=pageContext.getAttribute("p")%><br>
request 내장객체의 값 : <%=request.getAttribute("req")%><br>
session 내장객체의 값 : <%=session.getAttribute("ses")%><br>
application 내장객체의 값 : <%=application.getAttribute("app")%><br>
%>

2. 링크이동 방법별 전달가능한 영역(scope)

공통적으로 아래 4가지 방식들은 session,application, 파라미터를 저장/전달가능하다.

자바스크립트, JSP(sendRedirect), 액션태그 방식은 서로 같이 사용불가.

2-1. a태그로 이동시

사용가능한 영역은 4가지영역(pageContext,request,session,application) 중에 session, application영역의 값 공유가능하다.

1
<a href="scopeProPro.jsp"> scopeProPro.jsp로 페이지이동 ... </a>

만약 파라미터의 값도 저장하고 전달하고 싶다면 어떻게 하면될까?
표현식을 이용하면 된다.
파라미터까지 전달이 가능하다.

1
<a href="scopeProPro.jsp?id=<%=id%>"> scopeProPro.jsp 페이지로 이동 ... </a>

즉, a태그(링크) 이동시 session,application 영역의 값을 공유가능.
파라미터의 값도 저장/전달 가능하다(get 방식)
HTML이기에 파라미터를 가져갈때 표현식을 사용하면된다.

2-2. js에서 location.href사용하여 이동시

자바스크립트 이동시 session,application 영역의 값을 공유가능.
파라미터의 값도 저장/전달 가능하다(get 방식)
HTML이기에 파라미터를 가져갈때 표현식을 사용하면된다.

1
2
3
4
<script type="text/javascript">
alert("자바스크립트로 scopeProPro.jsp 페이지로 이동")
location.href="scopeProPro.jsp?id=<%=id%>&pw=1234";
</script>

2-3. 내장객체 response 이동시

session,application 영역의 값을 공유가능.
파라미터의 값도 저장/전달 가능하다(get 방식).
파라미터를 가져갈때 표현식이 아닌

1
2
3
4
5
6
7
<%
//response.sendRedirect("이동할 페이지 주소");
response.sendRedirect("scopeProPro.jsp");

//파라메터 추가로 같이 공유하는 방법
response.sendRedirect("scopeProPro.jsp?id="+id+"&pw=1234");
%>

아이디가 한글일때는 왜 물음표가 나타날까요?
response.sendRedirect()전까지는 한글이 안깨지다가 response.sendRedirect()명령어부터 한글이 깨진다.
데이터를 인코딩해서 보내야한다. 인코딩에는 여러 방식이 있는데 response.sendRedirect()는 한글데이터를 처리하지못하는 인코딩방식이다.
response객체안에 전달되는 콘텐츠타입을 바꿔서 해야하는데 그걸 하려면 서블릿을 이용해야해서 서블릿배우면 알수있다.

2-4. 액션태그 forward 이동시(p222)

html태그이지만 jsp동작을 할수있게 만들어진 특수한 기능을 가지고 있다.
액션태그 : jsp페이지에서 자바, 스크립트코드없이 다른 페이지로 이동하는 기능이 있다.
서블릿, 객체(자바빈)에 접근할수있는 방법이 액션태그이다.
원래 페이지에 의해 생성된 request객체와 response객체가 그대로 넘어간다.

즉, session,application 그리고 request 영역 더불어 파라미터값까지 공유가능.

1
2
3
4
5
6
7
<jsp:forward page="scopeProPro.jsp" /> 

또는

<jsp:forward page="scopeProPro.jsp">
<jsp:param name="pw" value="<%=a %>" /> <!--표현식사용가능 -->
</jsp:forward>

액션태그는 포워딩이 일어난다.

  • forwarding (포워딩)이란
    • 이동하는 페이지의 주소는 변경 X, 페이지의 내용만 변경.
    • 중요 request객체와 response객체를 가지고 이동가능

따라서 액션태그는 이동하는 페이지의 주소는 변경되지않고 페이지의 내용만 변경되는 희안한 태그이면서 request객체와 response객체를 가지고 이동한다.

그런데 주소를 변경안하는 기능이 왜 필요할까?
MVC패턴개발방식에서 꼭 필요하다.
웹서핑중에 jsp파일명을 주소창에서 본 적이 있는가?
아마 없을 것이다. 보안을 위해서 .jsp파일을 절대 공개하지않는다.
따라서 가상주소를 사용해야하는데 그 가상주소를 사용할때 액션태그 forward가 필요하다

[ITWILL : JSP]영역객체scope

ITWILL학원 : 14강 JSP기초 BY 정규태강사

참고로 교재는 p209부터임.

1. 영역객체(scope)

영역 객체(Scope) , 속성(Attribute)

내장객체 (8+1)중에서 해당 유효한 범위안에서 데이터를 서로 공유할수있는 객체
이때, 그 공유되는 범위를 ‘영역(Scope)’라고한다. 그때의 공유되는 값 ‘속성(Attribute)’라고한다.

영역 영역처리 객체
page pageContext
request request
session session
application application

왼쪽의 영역을 처리하기 위해서는 오른쪽의 객체를 사용해야한다.
내장객체 8가지 중에서 위의 4가지들은 서로 데이터를 공유할 수 있다.
page에서 application으로 영역이 내려올수록 영역의 범위/크기가 커진다.

1. page 영역 : 해당 페이지가 클라이언트에 정보를 제공하는 동안

해당 페이지가 클라이언트에 정보를 제공하는 동안 페이지 영역이라는 공간에서 데이터를 주고받을 수 있다.

  • pageContext 객체사용가능 : JSP페이지 정보를 저장하는 객체

  • 사용 : 다른 내장객체를 호출하거나, 페이지흐름제어하거나, 에러데이터 처리할 때 주로 사용한다

2. request 영역 : 클라이언트 요청이 처리되는 동안

여러개의 페이지를 이동할때 정보를 저장해서 사용
page 영역과 request영역 차이
request영역은 주소창에 주소를 치는 동안의 영역이다.

  • request 객체사용가능 : 페이지 요청시 정보를 처리하는 객체

  • 사용 : 페이지 이동시 주로 사용한다.

3. session 영역 : 세션이 유지되는 동안 (브라우저당 세션 1개씩 생성이되고 기본값은 30분)

예를 들어 크롬창을 키는 순간부터 30분동안 세션에 정보가 저장된다.

  • session 객체사용가능 : 하나의 웹 브라우저가 정보를 유지하기위한 시간동안 사용되는 객체

  • 사용 : 사용자인증처리에서 주로 사용한다.

4. application 영역 : 웹 애플리케이션이 실행되고있는 동안

즉 서버가 실행중일때의 영역이다.
서버의 설정정보나 자원에 대한 정보, 애플리케이션실행시 발생하는 이벤트정보등이 저장된다.
4가지영역중 가장 큰 영역이다

  • application 객체사용가능 : 웹 애플리케이션의 Context 정보를 처리객체

  • 사용 : 홈페이지 방문자수 카운트 등에 주로 사용한다.

[패스트캠퍼스python] 부트스트랩을 이용한 회원가입페이지만들기, csrf token

[패스트캠퍼스python] 부트스트랩을 이용한 회원가입페이지만들기, csrf token

파이썬 인강 자기계발 챌린지 31회차 미션
부트스트랩을 이용해 회원가입페이지를 만들어보자

1. 부트스트랩 설정

앱 아래에 만들어놓은 templates폴더안에 register.html 파일을 생성한다.
그 뒤 부트스트랩 홈페이지로 이동한다.

  1. head태그안에 부트스트랩 CSS를 복붙한다.
  2. head태그안에 부트스트랩 JS를 복붙한다.
  3. head태그안에 아래 기본 meta코드를 복붙한다.
1
2
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

또는

  1. 위의 3단계를 생략하고 부트스트랩 Starter template를 복붙해도 된다!




2. Bootstrap’s form styles 적용하기.

부트스트랩 컴포넌즈 폼에서 form태그를 복붙해온뒤 센터정렬이라든지 커스터마이징을 할수있다.
부트스트랩의 기본 폼스타일은 아래 이미지와 같다.
딱 심플 그자체!

기본 폼 스타일에서 커스터마이징을 해보자.
input태그를 추가하여 비밀번호 확인을 만들 수 있다.
input태그를 추가한 후 python manage.py runserver명령어를 입력한 뒤 주소창에 register/를 추가입력해주면 커스터마이징한 웹페이지가 나타난다.




3. html페이지를 view에 연결하기

부트스트랩으로 만든 html페이지를 view에 연결을 해줘야한다.
앱 아래의 views.py파일에서 아래 코드를 입력한다.

view는 항상 request라는 매개변수를 받기때문에 입력을 해주어야한다.

1
2
3
4
from django.shortcuts import render

def register(request):
return render(request, 'register.html') #따옴표안에 연결하고싶은 파일의 경로입력




4. url설정

  1. 앱 하위에 urls.py파일을 생성한 뒤 아래 코드를 입력해준다
    register는 3번에서 만든 views안의 register함수를 연결해준 것이다.
1
2
3
4
5
6
7
from django.urls import path
from . import views

urlpatterns = [
path('register/', views.register),
#register는 views안의 register함수에 연결하겠다는 의미
]
  1. 프로젝트폴더의 동일한 이름으로 자동생성된 파일 하위의 urls.py를 클릭한다.
    urls.py에서 path('앱명/', include('앱명.urls')) 한줄을 추가한다.
    추가한 뒤 전체코드는 아래와 같다.
1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('앱명/', include('앱명.urls'))
]
  1. python3 manage.py runserver 실행.
    잘 연결되었는지 확인을 위해 python3 manage.py runserver를 실행한다.




5. csrf_token

장고를 이용하면 꼭 넣어야하는 코드이고 항상 form태그 안에 위치해야한다.
form의 겨우 데이터를 서버에 전달하는 역할을 하는데 우리 사이트에서 우리 서버로 데이터를 전송하는 것은 문제될것이 없으나 피싱범죄를 목적으로 자신의 웹사이트에서 전송을 하는 경우가 있다.
이를 방지하기 위해, 즉 크로스도메인을 막기위해 암호화된 키를 숨겨놓는다.

참고링크 : CORS 크로스 도메인 이슈와 해결방법

이 코드를 {% csrf_token %}입력을 해놓으면 장고가 알아서 암호화된 키를 생성하고 키검증까지 자동으로 해준다.

1
2
3
<form method="POST" action=".">
{% csrf_token %}
</form>

여기서 action값을 생략하거나 점(.)을 입력하면 현재페이지 action이 진행된다.
실제 사용예시는 아래와 같다. form태그 밑에 위치하면 된다!

[ITWILL : JAVA]배열과 함께쓰는 메서드

ITWILL학원 : 10강 JAVA BY 윤미영강사

1. for each문

향상된 for문인 for each문은 기존 for문과 비교해서 초기값과 증감식을 사용하지 않으며 배열이 가지고 있는 요소들을 특정 변수로 바로 할당해서 사용할 수 있게한다

1
2
3
for(데이터타입 변수명 : 반복할 배열명/컬렉션){
//반복할 문장
}

이 반복문은 내부적으로 배열의 인덱스 0번부터 배열의 길이만큼을 반복한다.

  • 장점 : 전체적으로 for문을 훨씬 간결히 작성할 수 있다.

  • 단점

    • 인덱스를 사용하지않고 사용불가능.
    • 반복 처리할 범위를 지정불가능.
  • 결론 : 따라서 인덱스를 써야하거나 특정범위를 반복해야하는 경우는 전통적인 for문을 쓰고 아닐 경우 for each를 쓰면 된다

아래 for문과 for each문의 예시를 보자.
랜덤한 짝수를 3개를 뽑은 뒤 그 합을 구해보자.

랜덤한 짝수 3개뽑기는 index를 사용해야하기때문에 for each를 쓸 수 없다.
뽑은 짝수합을 구하는 경우 index도 필요없고 특정범위반복도 필요없기때문에 for each를 쓰면 한결 간결해진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int[] evendatas = new int[3];

//랜덤한 짝수 3개 뽑기
for(int i=0;i<evendatas.length;i++){
evendatas[i] = rd.nextInt(8)+1;
if(evendatas[i]%2 !=0){
evendatas[i] = evendatas[i]+1;
}
System.out.print(evendatas[i]+"\t");
}

//뽑은 짝수합구하기
evenSum = 0;
for(int data : evendatas){
evenSum+=data;
}
System.out.print("랜덤한 짝수의 합 : "+evenSum);

2. 배열 데이터의 정렬

배열과 같은 자료구조에 대해서는 정렬에 대한 요구사항이 빈번하다.
정렬을 구현하기 위한 알고리즘은 버블 정렬, 선택 정렬, 삽입 정렬 등 여러가지 방식이 있다.

Arrays.sort() 오름차순정렬

Arrays클래스 API를 이용하기 위해 import java.util.Arrays;해줘야한다.
만약 문자열을 관리하는 배열이 파라미터로 들어온다면 대문자->소문자의 사전순으로 정렬한다.

1
2
3
4
5
6
7
8
9
10
int[] data = {5, 7, 2, 9, 1};
Arrays.sort(data);

//정렬 후 출력
for(int x : data){
System.out.print(x + "\t");
}

//출력값
1 2 5 7 9

3. 배열 데이터의 출력 : Arrays.toString(arr)

배열데이터를 출력하기 위해서 for문을 이용해도 되지만 Arrays클래스 API를 이용하여 출력할수있다.
Arrays.toString(arr)사용하기 위해서는 import를 먼저 해야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String [] arr1 = {"JAVA", "is", "Not", "bad"};
Arrays.sort(arr1);

//배열출력1 : for each이용
for(String s :arr1){
System.out.print(s + "\t");
}
//배열출력2 : Arrays클래스 API이용
System.out.println(Arrays.toString(arr1));


// 출력값
JAVA Not bad is
[JAVA, Not, bad, is]

4. Arrays 로또 만들기

배열에 무작위 숫자로 구성된 로또를 만들고 정렬 후 출력하는 게임을 만들어보자.
로또는 1~45사이의 숫자로 구성되며 6개의 숫자를 랜덤으로 뽑느다.
그리고 모든 숫자의 중복 x.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int[] selected = new int[6]; //로또를 저장할 배열
int[] fullBall = new int[45]; //모든 공의 정보를 가지고 있는 배열

int cnt= 0;
Random rd = new Random();
while(cnt < 6){ //총 6개의 공을 선택할 조건
int index = rd.nextInt(45); //0~44사이의 정수
int ball = fullBall[index];
if(ball ==0){ //중복체크
selected[cnt] = index +1;
fullBall[index] = -1;
cnt ++;
}
}
Arrays.sort(selected);
System.out.println(Arrays.toString(selected));
}
  1. random.nextInt(n)
    이는 0~(n-1)개의 정수를 랜덤하게 생성한다.
    그렇다면 여기선 random.nextInt(45)이므로 0~44사이의 랜덤한 정수를 생성하게된다.
    왜그럴까?
    selected된 공은 index에서 +1해주기때문이다
    if문을 보자.
    랜덤으로 index가 0이 걸리면 선택된 공은 1이되고
    랜덤으로 index가 44가 걸리면 선택된공은 45가된다.

  2. ball if문으로 중복체크
    ball = 0이 참이면 이 fullBall[index]가 한번도 뽑힌적이 없는 숫자라는 의미이다.
    그리고 선택되어지고 selected[cnt] = index +1을 준다.
    그리고 이미 뽑힌 수는 -1로 값을 준다.
    그렇게되면 다음번에 또 뽑혔을때 -1이기때문에 거짓이 되어 selected가 되지않는다.

1
2
3
예를 들어
fullBall[2]가 처음뽑혔으면 if문이 참이므로 selected[1]가 되고 로또숫자는 3이다.
그리고 난 뒤 fullBall[2] = -1로 바뀌어서 다음번에 뽑혀도 if문에서 거짓으로 팅겨나간다

5. System.arraycopy()

배열은 한 번 생성되면 메모리의 연속성때문에 그 크기를 변경할 수 없다.
하지먼 프로그래밍을 하다 보면 처음 예상했던 데이터의 개수보다 더 많은 데이터를 관리해야할 경우가 있다.
이를 예방하기위해 처음부터 배열의 크기를 크게 지정해버린다면 불필요한 메모리를 낭비하는 꼴이다.

필요에 따라 배열의 길이를 늘이기 위해서는 기존배열의 길이를 늘일수는 없고
배열의 길이 큰 새로운 배열은 만들고 기존 데이터를 복사해 넣은 다음 새로운 데이터를 추가해야한다.

첫번째 방법 : for문과 Arrays.toString()이용

1
2
3
4
5
6
7
8
9
int[] source = {1,2,3};
int[] newSource = new int[7]; //원하는 배열길이만큼의 숫자입력

for(int i=0; i<source.length; i++){
newSource[i] = source[i];
}System.out.println(Arrays.toString(newSource));

//출력값
[1, 2, 3, 0, 0]

두번째 방법 : System.arraycopy()와 Arrays.toString()이용

System.arraycopy(기존배열명, 카피할데이터인덱스, 새로운배열명, 데이터붙여넣을시작인덱스, source.length);

아래처럼 데이터붙여넣을시작인덱스에 2를 넣었기때문에 출력값은 인덱스2번부터 [0, 0, 1, 2, 3, 0, 0]부터 붙여넣기가 된다.
만약 0을 넣었다면 출력값은 인덱스0번부터 [1, 2, 3, 0, 0, 0, 0]이 된다.

1
2
3
4
5
6
7
int[] source = {1,2,3};
int[] newnewSource2 = new int[7] //원하는 배열길이만큼의 숫자입력
System.arraycopy(source, 0, newnewSource2, 2, source.length);
System.out.println(Arrays.toString(newnewSource2));

//출력값
[0, 0, 1, 2, 3, 0, 0]

5. Integer.parseInt(파라미터)

GUI환경에서 가장 잘 사용하는 메서드이다.
정수의 형태인 파라미터를 int로 변경해 리턴한다.
만약 파라미터가 정수형태가 아닐 경우 NumberFormatException 에러가 난다.

[ITWILL : JSP]JAVA DATATYPE, Integer.parseInt(문자열), 동일한 파라미터의 값을 가지는 데이터가 여러개있을 경우 변수로 가져오기

ITWILL학원 : 14강 JSP기초 BY 정규태강사

1. JAVA DATA TYPE 자바데이터타입

기본형 8가지를 기억하면 나머지는 전부다 참조형이다.

1. 기본형 :8가지

    1. boolean : 1byte
    1. char : 2byte
    1. byte : 1byte
    1. short : 2byte
    1. int : 4byte
    1. long : 8byte
    1. float : 4byte
    1. double : 8byte

2. 참조형 : 엄청 많음

  • String
  • Scanner
  • 등등

2. 형변환

1. 묵시적 형변환

메모리공간의 크기가 작은 곳에서 큰 곳으로 자동변환.

  • 예시 : int(4바이트) -> double(8바이트) 자동으로 변환되는 것을 말한다

누가 자동으로 형변환을 해줄까?
정답은 컴파일러!!
문제가 없기때문에 컴파일러가 자동으로 형변환을 해준다.

2. 명시적 형변환

메모리공간의 크기가 큰 곳에서 작은 곳으로 변환.

왜 컴파일러가 자동으로 형변환을 해주지않을까?
메모리공간의 차이로 데이터손실이 발생하기때문에 자동형변환을 해주지않는다.

  • 예시
    인티저.파스인트(스트링)
    Integer.parseInt(문자열)은 문자열을 정수형(int)로 변경해준다.
1
2
3
4
5
6
7
8
// 이전페이지에서 정보를 받아오기
System.out.println("입력숫자 : " + request.getParameter("num")); //콘솔에서 출력
out.println("입력하신 숫자는 " + request.getParameter("num")); //html화면에서출력

//form태그에서 get방식으로 정보를 전달할시 모든 데이터는 string타입으로 변경되어 전달되기때문에
//숫자데이터 출력을 원하면 형변환Integer.parseInt()해줘야한다
int num = Integer.parseInt(request.getParameter("num"));
정수형값 : <%=num %> <br>

3. 파라미터값 한글처리

form get방식과 달리 post방식을 사용하면 한글이 깨지는 문제가 발생한다.
따라서 body태그 바로 밑에 파라미터 한글처리 코드가 필요하다.

1
2
3
4
<!-- form post방식을 사용하면 한글이 깨지는 문제가 발생하기때문에 파라미터 한글처리 코드가 필요하다  -->
<%
request.setCharacterEncoding("UTF-8");
%>

4. 동일한 파라미터의 값을 변수로 가져오기

사용자가 radio박스를 클릭하면 해당 데이터를 변수로 가져올수있다.

request.getParameter("") : 큰따옴표안에 name속성을 넣으면된다.

정보를 입력하는 페이지는 아래와 같이 radio버튼을 만들어놓았다.

1
2
3
4
5
6
7
<form action="정보출력페이지.jsp" method="post" name="fr">
<label>성별 : </label>
<input type="radio" name="gender" value="womyn"> 여성
<input type="radio" name="gender" value="men"> 남성

<input type="submit" value="제출">
</form>

정보를 출력하는 페이지는 아래와 같이 코딩하면 된다.

1
2
3
4
5
6
7
8
9
<h1>변수가져오기</h1>
<%
String gender = request.getParameter("gender");
%>

<h1>사용자정보출력</h1>

입력하신 정보를 아래에서 확인해주세요
성별은 <%=gender %>입니다 <br>

5. 동일한 파라미터의 값을 가지는 데이터가 여러개있을 경우

일반적으로 4번방법을 이용하면되지만 checkbox처럼 중복데이터가 가능한 경우는 어떻게 해야할까?
동일한 파라미터의 값을 가지는 데이터가 여러개있을 경우 배열을 통해서 데이터를 저장해야한다.

사용자가 몇개를 선택할지 모르지만 변수로 가져오고 싶다면 request.getParameterValues("")을 이용한다.

request.getParameterValues("") : 큰따옴표안에 name속성을 넣으면된다.

정보를 입력하는 페이지는 아래와 같이 checkbox버튼을 만들어놓았다.

1
2
3
4
5
6
7
8
<form action="정보출력페이지.jsp" method="post" name="fr">
<label>취미 : </label>
<input type="checkbox" name="hobby" value="game"> 게임
<input type="checkbox" name="hobby" value="movie"> 영화감상
<input type="checkbox" name="hobby" value="workout"> 운동

<input type="submit" value="제출">
</form>

정보를 출력하는 페이지는 아래와 같이 코딩하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<h1>변수가져오기</h1>
<%
// String hobby = request.getParameter("hobby");
//중복데이터 변수로 가져오기 불가능. 첫번째꺼데이터만 출력가능
//동일한 파라미터의 값을 가지는 데이터가 여러개있을 경우 배열을 통해서 저장해야한다.
String[] hobbyarr = request.getParameterValues("hobby"); //중복데이터 변수로가져오기가능
%>

<h1>사용자정보출력</h1>

취미는
<%
if(hobbyarr == null){ //취미를 선택 안한경우 처리
out.println("선택안함");
}else{
for(int i=0;i<hobbyarr.length;i++){
%>
<%=hobbyarr[i] %>
<%
}
}
%>
입니다<br>

[ITWILL : JSP]JSP 주석과 JSP directive, JSP 스크립트 요소

ITWILL학원 : 13강 JSP기초 BY 정규태강사

jsp는 html과 java를 합쳐서 사용하는 것이기때문에 주석을 두가지를 사용할 수 있다.

1. JSP주석 <%– – %>

%로 시작하는 주석은 jsp주석이다. 이는 엘리먼트요소이다.
html 주석문과 <!– –> 과 차이점은 html주석은 개발자도구에서 보이지만 JSP주석은 개발자도구에서 보이지않는다.

1
2
HTML주석 : <!-- <h1>에이치티엠엘yo!</h1> --!> 
JSP주석 : <%-- <h1>제이에스피yo!</h1> --%>

2. JSP가 어떻게 JAVA와 연결되어있을까?

연결성을 알기 위해서 아래 경로를 찾아가보자.

경로 : D:\JAVA저장경로.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\JSP7\org\apache\jsp\JSP1

해당 폴더에는 내가 생성한 적 없는 아래 파일 두개가 들어가있다.

  • 파일명.java
  • 파일명.class

해당 폴더안에 .java파일을 열어보면 내가 만들었던 .jsp파일이 내부적으로 .java파일을 생성하고 그 뒤 .class파일을 실행시키는 방식으로 연결되어있다.
이런 .java파일을 서블릿이라고 부른다.

즉, 내가 .jsp파일을 만들면 컴파일러가 알아서 서블릿이라는 형태인 .java파일을 만들고 그 뒤 .class파일을 실행시킨다.

3. JSP 디렉티브(directive)

jsp 디렉티브(directive)는 jsp페이지가 실행될때 필요한 정보를 지정하는 것이다.
jsp페이지는 사용자가 페이지를 요청할때 실행된다.
<%@ 내용내용블라블라 %> 형태로 사용한다.
크게 3가지 지시어가 존재한다.

1. JSP 디렉티브(directive)의 page지시어 속성

아래는 page예시이다.

  1. import
1
2
3
<%@ page import="java.util.*" %>

<%-- import란 외부로부터 다른 파일(클래스/객체)가져와서 추가해서 지정할수있다. --%>
  1. contentType

사용자의 요청을 응답할때 응답할 페이지의 MIME타입을 지정하기위한 속성이다.
따라서 css나 aac오디오, azw전자책등등 다양한 종류의 페이지타입을 만들수있다.

contentType 종류

1
<%@ page contentType="text/html; %>

5. JSP 스크립트 요소

JSP 스크립트요소에는 총 3가지가 있다.

  1. 선언문 : 변수, 매서드(함수)를 선언해서 사용한다.
  2. 스크립틀릿 : 자바코드를 작성(변수와 매서드 사용가능)해서 사용한다.
  3. 표현식 : 화면에 출력할 내용을 작성하여 사용한다.

1. 선언문

선언문 형태 : <%! %>
변수, 매서드(함수)를 선언해서 사용하기때문에 배열은 생성할수없다. 배열을 생성하고싶으면 스크립틀릿안에 써야한다.
멤버변수(전역변수)형태로 사용가능.

1
2
3
4
5
6
<%!
//자바코드를 사용해서 변수,메서드 사용(전역변수)
public void Method(){
System.out.println("안녕하세요");
}
%>

2. 스크립틀릿

스크립틀릿 형태 : <% %>
자바코드를 작성(변수와 매서드 사용가능)해서 사용한다.
지역변수형태로만 사용가능.

1
2
3
4
5
6
7
8
<%
//java
System.out.println(name);
System.out.println(a);

// html 영역의 출력
out.print("안녕하세요(html)");
%>

3. 표현식

표현식 형태 : <%= 자바의 값 %>
화면에 출력할 내용을 작성하여 사용한다.
즉 표현식은 값 또는 자바변수의 값을 화면에 출력가능한 코드이다.

1
2
3
4
5
6
7
<%
for (int i=0; i<strArr.length; i++){
%>
<%= i%>는 <%= strArr[i]%> <br>
<%
}
%>

표현식으로 테이블만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%
String[] strArr = new String[5];
strArr[0] = "java";
strArr[1] = "jsp";
strArr[2] = "web";
strArr[3] = "DB";
strArr[4] = "spring";
%>

<table border="1">
<tr>
<td>인덱스</td><td>값</td>
</tr>

<%
for(int i=0;i<strArr.length;i++){
%>
<tr>
<td><%=i %></td><td><%=strArr[i] %></td>
</tr>
<%
}
%>

4. 선언문과 스크립틀릿 차이

선언문은 전역변수로 사용가능하지만 스크립틀릿은 지역변수로만 사용가능하다.
자주 사용할 것은 선언문보다 스크립틀릿이다.