본문 바로가기

2018 공부/Studies

[JSP] JSP 기초 문법

출처 : JSP 웹 프로그래밍 입문 + 활용 (앤써북)


00. 자바 기본문법 구조

1. 패키지 (package): 자바 클래스를 하나의 패키지로 묶을 경우 다른 클래스에 있는 메소드 공유 가능

2. 클래스 (class): 자바프로그램의 기본 단위 /클래스=하나의 자바 프로그램

3. 멤버변수 (member variable): 클래스에 속하는 변수 / 클래스에 속한 모든 메소드에서 사용 가능

4. 메소드 (method): 클래스에 속하며 프로그램이 처리해야 할 코드 기술

5. 메인 메소드 (main method): 프로그램 실행할 때의 진입점 (Main method안의 코드를 가장 먼저 실행)

6. 지역 변수: 선언한 메소드 안에서만 유효한 변수 / 매개변수도 지역 변수에 속한다

7. 객체선언, 생성 : [클래스명 객체이름 = new 클래스명();] 방식으로 호출한다.



01. JSP의 Script

1-1. JSP Script의 이해

# 스크립트 요소 : JSP 페이지에서 자바를 삽입할 수 있는 기술 / JSP 프로그래밍에서 사용되는 문법의 표현 형태

> 선언문 (Declaration), 스크립트릿 (Scriptlet), 표현식 (Expression), 주석 (Comment)

# 간단한 스크립트 소스 (책 참고)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="EUC-KR">
        <title> JSP Script Example</title>
    </head>
        
    <body>
        <%! 
            String declaration = "Declaration";
        %>
        <%!
            public String Method(){
                return declaration;
            }
        %>
        <%
            String scriptlet="Scriptlet";
            String comment="Comment";
            out.println("내장객체를 이용한 출력 : " + scriptlet + "<p>");
        %>
        
        선언문의 출력1: <%=declaration %><p>
        선언문의 출력2: <%=Method() %><p>
        스크릿트릿의 출력: <%=scriptlet %><p>
        
        <!--JSP주석부분 -->
        <!--JSP 주석 1: <%=comment %> --><p>
        <%--JSP 주석2: <%=comment%> --%>
        <% /* 주석
            (여러줄 주석)
            */
        %>
        <%//주석 (한 줄 주석) %>
    </body>
</html>
cs


#결과

브라우저에서 해당 jsp 파일을 열면 위와 같은 결과가 나온다. 

브라우저에서 페이지 소스보기를 누르면 아래와 같은 결과가 나온다.

사용자의 요청을 받아 동적으로 HTML을 생성하여 브라우저로 전송하며, 그 결과를 클라이언트에게 전송한다. 

이 때 아래 결과와 같이 순수 HTML코드만 클라이언트에게 보여진다. 



02. 선언문 (Declaration)

#선언문: JSP에서 사용될 변수나 메소드를 선언하는 영역

> 선언문 내에서 선언된 변수는 멤버 변수(Memer Variable)이다. 멤버 변수는 클래스 안에 선언해야 하며 <데이터 형 + 변수 명> 의 형태를 가진다.

> 사용 방식: <%! 멤버변수 및 메소드 선언 영역 %>

1
2
3
4
        <%! 
            String declaration = "Declaration";
        %>
 
cs

2-1. 멤버변수 선언

선언문에서 선언된 변수는 JSP 페이지가 서블릿으로 변환되면 서블릿 클래스의 멤버변수가 된다.

변수 선언: 데이터 형 + 변수 명 

초기화해주지 않으면 JVM (Java Virtual Machine)이 int형은 0, string형은 null을 default 값으로 가진다.

2-2. 메소드 선언

선언문에서 선언된 메소드는 일반적인 형태의 메소드로 선언된다.

메소드는 함수와 같이 특정 동작을 수행한 이후 값을 return하거나 값을 가공하여 저장한다.

#메소드 선언 소스

1
2
3
4
5
6
<%!
        public String Method(){
            return declaration;
        }
%>
 
cs



03. 스크립트릿 (Scriptlet)

#스크립트릿: JSP 페이지가 서블릿으로 변환될 때 _jspService (Tomcat 기준) 메소드 안에 선언되는 요소 / JSP 페이지 내에 코드 조각을 담고 있다

스크립트릿에서 선언된 변수는 지역 변수이며 메소드 선언은 할 수 없다. 지역 변수는 초기화를 반드시 해줘야 한다. 

>사용 방식 : <% 자바코드 삽입 %>

1
2
3
4
5
6
<%
        String scriptlet="Scriptlet";
        String comment="Comment";
        out.println("내장객체를 이용한 출력 : " + scriptlet + "<p>");
%>
 
cs


JSP 페이지와 서블릿으로 변환된 자바 코드를 비교하면 선언문에서 선언된 변수는 자바 클래스 영역에서 선언이 되고,

스크립트릿에서 선언된 변수는 자바 메소드 안에 선언이 된다.

선언문의 변수들은 JSP 페이지 전체에서 접근할 수 있는 변수들이며,  JSP 페이지 내에서 메소드가 필요하다면 반드시 선언문에서 선언해야 한다. 

3-1. 스크립트릿의 활용

#스크립트릿 요소 소스 (책 참고)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="EUC-KR">
        <title> Scriptlet Example</title>
    </head>
        
    <body>
        <%
            float f=2.3f;
            int i= Math.round(f);
            java.util.Date date=new java.util.Date();
        %>
        실수 f의 반올림값? <%=%><p>
        현재 날짜와 시간은? <%=date.toString() %>
    </body>
</html>


-Math.round() : 실수 값을 반올림하여 정수 값을 반환 해 주는 메소드

-date.toString() : date 객체가 가지고 있는 날짜와 시간을 string 타입으로 출력한다


#결과

#선언문과 스크립트릿의 차이점?

선언문: 메소드를 선언하거나 변수를 선언할 때 필요하다. -> 이 때 선언되는 변수는 "멤버변수" -> JSP 페이지 어디에서든 사용

스크립트릿 : 변수 선언할 때 사용한다. -> 이 때 선언되는 변수는 "지역변수"



04. 표현식 (Expression)

#표현식: 동적인 JSP 페이지를 브라우저로 표현하기 위한 요소

변수를 출력하거나 메소드의 결과 값을 브라우저에 출력한다.

>사용 방식: <%= 변수 혹은 메소드%>

1
2
<%=declaration %>
<%=Method() %>
cs

4-1. 표현식의 활용

#표현식 요소 소스 (책 참고) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="EUC-KR">
        <title> Expression Example </title>
    </head>
        
    <body>
        <%!
            String name[]={"Java","JSP","Android","Struts"};
        %>
        
        <table border ="1" width ="200">
        <%
            for (int i=0;i<name.length;i++){%>
            <tr><td><%=i%></td>
            <td><%=name[i] %></td>
            </tr>
            <%}
        %>
        </table>
    </body>
</html>
cs

-String name[]: name이라는 배열 선언한 후 4개의 값을 할당

-for (int i=0;i<name.length;i++) : i=0으로 초기화한 후 배열의 길이만큼 루프돌려 값을 출력


#결과

조건문 (if/else)는 표현식으로 사용할 수 없다. 오로지 결과 값을 결과로서 출력할 수 있을 뿐이다.

단, 삼항 연산자(A? B:C)는 표현식에서 사용가능하다. 삼항 연산자는 값을 반환하기 때문이다. 



05. 주석 (Comment)

#주석: 프로그램 실행 결과에 직접적으로 영향을 주진 않지만 개발자들이 소스 설명 처리를 위해 사용하는 스크립트 요소

>HTML 형식의 주석: 

1
<!-- hello <%=name%> -->
cs

사용자 브라우저에서 소스 보기를 통해 확인할 수 있는 주석. 

만일 name="Mori"였다면, 소스 보기를 통해 <!--hello Mori --> 코드를 확인할 수 있다.

>JSP 형식의 주석:

1
<%-- hello <%=name%> --%>
cs

JSP 소스에서만 사용되며 브라우저 소스 보기를 통해서도 확인할 수 없다.

HTML 형식의 주석은 서블릿 파일 변환 시 주석 안에 있는 표현식을 컴파일하고 전체 출력물이 주석으로 처리된다.

JSP 형식의 주석은 주석 안에 있는 표현식을 무시해 버리므로 name 변수 값이 없더라도 에러가 나지 않는다.

>스크립트 요소의 주석: 

1
2
<%=name /* COMMENT */ %>
<%//1 line comment %>
cs

스크립트릿 혹은 선언문에서 사용되는 스크립트 언어가 지원하는 주석 표기

단, 표현식에서 표현은 없고 주석만 있다면 컴파일 에러가 발생한다.



06. 기본 제어문

6-1. if-else (조건 분기문)

가장 일반적으로 많이 사용되며 특정한 조건에 의해 코드 실행을 조정할 수 있다.

#예제 (책 참고)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
    <head>
        <meta charset="EUC-KR">
        <title> If-else Example </title>
    </head>
        
    <body>
        <form method=POST action="if.jsp">
        
        이름: <input type="text" name="name"><p>
        좋아하는 색깔: <select name="color">
                <option value="blue" selected> 파란색 </option>
                <option value="red"> 빨간색</option>
                <option value="orange"> 주황색</option>
                <option value="etc"> 기타</option>
        </select><p>
        <input type="submit" value"보내기">
        
        </form>
    </body>
</html>
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="EUC-KR">
        <title>If-else Example</title>
    </head>
    
    <body>
        <%! 
            String msg;
        %>
        <%
            String name=request.getParameter("name");
            String color=request.getParameter("color");
            
            if(color.equals("blue")){
                msg="파란색";
            }else if(color.equals("red")){
                msg="빨간색";
            }else if(color.equals("orange")){
                msg="주황색";
            }else{
                color="white";
                msg="기타색";
            }
        %>
    <body bgcolor=<%=color %>>
    <b><%=name %></b>님이 좋아하는 색깔은 <b><%=msg %></b>입니다.
 
    </body>
</html>
cs

1) if.html


2) if.jsp 

-15,16 : if.html에서 입력한 name, color 값을 스크립트릿에서 string 형으로 리턴받는다.


#결과

브라우저에 if.html 실행 결과를 출력한다. 

이름/좋아하는 색깔 선택 후 제출을 누르면 if.jsp 실행결과를 확인할 수 있다. 


6-2. for (반복문)

JSP 페이지의 스크립트 요소에 사용하여 반복적인 내용을 출력할 수 있다. 

#예제 (책 참고) : 1~10까지의 수의 합을 구하는 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="EUC-KR">
        <title>For Example</title>
    </head>
    
    <body>
        1에서 10까지의 합은?<p>
        <% 
            int i,sum=0;
            for(i=1;i<=10;i++){
                if(i<10){
        %>
            <%=(i + " +"%>
        <%
            }else{
                out.println(i+ " = ");
                }//else문
            sum+=i;
            }//for문 
        %>
        <%=sum %>
    </body>
</html>
cs

- for문 중간에 브라우저 출력을 위해 <&=(i+" +")%>를 사용하였고, 이 때문에 for문과 if-else문이 끝나기 전에 스크립트릿을 닫았다.


#결과

6-3. while (반복문)

조건을 검사한 후 참인 조건은 실행문을 반복적으로 수행하고, 거짓인 조건은 while문을 빠져나온다.

while문의 조건이 항상 참이라면 무한루프된다. 

#예제 (책 참고)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html>
    <head>
        <meta charset="EUC-KR">
        <title> While Example </title>
    </head>
        
    <body>
        <h3>While Example</h3>
        <form method=GET action="while.jsp">
        
        반복하고 싶은 문구: <input type="text" name="text"><p>
        반복하고 싶은 횟수: <input type="text" name="num"<p>
        <input type="submit" value"보내기">
        
        </form>
    </body>
</html>
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="EUC-KR">
        <title>While Example</title>
    </head>
    
    <body>
        <%
            request.setCharacterEncoding("EUC-KR");
            String text=request.getParameter("text");
            int num=Integer.parseInt(request.getParameter("num"));
            int count=0;
            while (num>count){
        %>
        <b><%=text%></b><br/>
        <%
            count++;
            }
        
        %>
    </body>
</html>
cs

1) while.html 


2) while.jsp 

-request.setCharacterEncoding("EUC-KR"); : while.jsp는 요청 정보에 대한 문자 인코딩 설정 해줘야 한다. 한글은 EUC-KR로 설정한다.

-int num=Integer.parseInt(request.getParameter("num")); : num은 while.html에서 정수 값이지만 페이지 간 통신을 통해 전달 받은 값은 문자열로 넘어오기 때문에 parseInt() 메소드를 통해 정수 값으로 반환시켜준다. 


#결과

브라우저에 while.html의 결과를 출력한다. 

while.jsp의 실행화면 확인가능