Hoon222y

[JSP & Servlet] 5장. JSP 기본 문법 본문

코딩/교육

[JSP & Servlet] 5장. JSP 기본 문법

hoon222y 2019. 1. 16. 20:22

Chap05 JSP 기본 문법
JSP 문서에 자바 코드를 삽입하는 방법(<% 사용, 액션 태그 사용)

5.1 주석
- JSP 주석은 문서 어디서나 사용할 수 있음
- JSP 문서 안에서 HTML 주석 사용할 수 있음
- HTML 주석은 브라우저에서 소스 보기 하면 보이지만, JSP 주석은 보이지 않음
- 클라이언트에게 전달될 때 전체 문서는 완전한 HTML 문서로 변하기 때문에 JSP 주석은 브라우저에서 확인할 수 없음
 [comment.jsp]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <script>
        // 자바스크립트 주석
        var myName = 'longlee';
        alert(myName);
    </script>
</head>
 
<body>
    <!———————  주석은 클라이언트에서   있습니다. ————> //HTML 주석
    <H2>JSP 주석 테스트</H2>
    <%—————— 이 주석은 클라이언트에서는 볼 수 없습니다.————%> //JSP 주석
</body>
</html>
cs

자바스크립트를 넣을 수 있고, 자바스크립트의 주석은 클라이언트에서 확인할 수 있음
서버단에서는 JSP 문서 안의 자바 코드만 실행되고 자바스크립트는 클라이언트 단에서 실행


5.2 지시어
- JSP 파일의 속성을 기술하는 JSP 문법으로 JSP 컨테이너에게 해당 페이지를 어떻게 처리해야 하는지 전달하기 위한 내용 담고 있음
- page, include, taglib으로 나뉘며, page 지시어는 필수
지시어는 <%@로 시작함

1) page 지시어
- 현재 JSP 페이지를 컨테이너에서 처리하는데 필요한 각종 속성을 기술하며 page 지시어를 여러 번 사용할 수 있다.


* page 지시어와 JSP 한글 처리
서버에서 JSP가 실행된 결과로 클라이언트에게 HTML 문서로 제공되므로 적당한 캐릭터셋을 지정해야 함
1. server.xml : 탐캣 서버의 서버 설정 파일인데 건드리지 않는 것이 좋음
2. pageEncoding 속성에서 정의 : JSP 문서가 서버에 저장될 때의 캐릭터셋 지정
실제로 실행된 결과로 클라이언트에게 제공되는 결과는 contentType의 charset으로 설정
(pageEncoding은 서버 저장 JSP의 캐릭터셋과 반환형이 다른 경우 사용. 사용할 일이 없음)
3. contentType 속성에서 정의 : 이것만 사용함


* page 지시어와 import
JSP 스크립트 부분에서 자바 클래스를 사용하는 경우 해당 클래스의 패키지에 대한 import 설정으로 기본적으로 자바에서와 동일함
import 구문 없이 패키지명을 포함하도록 풀 패스 네임(full path name)을 사용하는 방법도 있지만 불편함 예)new java.util.Date().toString()
컴마를 이용해 다수의 패키지 import 가능

* page 지시어와 session
- 세션은 웹 브라우저와 웹 서버가 지속적으로 클라이언트를 인식하려고 필요한 정보를 임시로 저장해두는 방법이다.  웹 브라우저와 웹 서버가 지속적인 클라이언트 인식을 위해 필요한 정보를 임시로 저장하는 방법으로 웹 사이트에 로그인하거나 장바구니 등을 구현할 때 사용됨

- 기본값이 true이므로 설정을 건들지 않는 것이 좋음

* page 지시어와 buffer
IO가 발생하는 순간에는 buffer가 필요함
JSP 페이지 데이터를 출력하기 위한 JspWriter 즉 out 내장객체의 버퍼 크기를 지정함
기본값은 8KB이며, 적절하게 설정해야 함. 버퍼가 너무 크거나 작으면 불편함
버퍼를 객체화한 객체가 out

* page 지시어와 autoFlush
버퍼를 자동으로 비울 것인지 지정하는 속성으로 기본값은 true

* page 지시어와 isThreadSafe
서블릿은 스레드로 동작하기 때문에 스레드로 인한 동기화 문제를 해결하기 위한 옵션
기본값은 true 

* page 지시어와 info
JSP에 대한 간단한 설명

* page 지시어와 errorPage, isErrorPage
오류가 발생했을 시 외부의 다른 JSP로 핸들링할 수 있도록 지정 -> 사용자에게 알려줌
errorPage는 현재 페이지에 오류 발생 시 호출할 페이지를 지정하는 속성
isErrorPage오류 처리를 위한 전용 페이지임을 알리는 속성


a.jsp에서 errorPage 속성을 이용해 error.jsp를 지정하면 에러가 발생하는 경우 자동으로 error.jsp가 실행됨. a.jsp에서 발생한 예외를 error.jsp에 넘겨주기 위해서는 <%@ page isErrorPage="true"로 설정되어 있어야 외부 jsp에서 발생한 예외가 exception이라는 내장 객체에 전달되고 사용할 수 있음

[ errorTest.jsp ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page contentType="text/html; charset=UTF-8" errorPage="error.jsp"
%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <TITLE>Error Test</TITLE></HEAD>
<body>
    <H2>Error 테스트 페이지</H2>
<%
    String str = "test";
    int i = Integer.parseInt(str);
%>
</body>
</html>
cs


[ error.jsp ] 

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 contentType="text/html; charset=UTF-8"
isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
    <title>ch05 : 에러페이지</title>
    <meta charset="UTF-8">
</head>
<body>
<center>
    <H2>처리중 문제가 발생했습니다</H2>
    <HR>
    <table>
    <tr bgcolor="pink"><td>
        관리자에게 문의해 주세요..<BR>
        빠른시일내 복구하겠습니다.
    <HR>
        <%= exception%>
    <HR>
    </td>
    </tr>
    </table>
</center>
</body>
</html>
cs


[ page 지시어의 contentType ] 

- 현재 JSP 페이지를 클라이언트에서 처리하기 위한 컨텐츠 유형을 지정

- <%@ page contentType="text.html; charset = UTF-8" %> 를 통해서 한글을 포함한 JSP 파일에서 정상적으로 한글 처리가 가능하다. 

 

[ page 지시어의 pageEncoding ] 

- 컨테이너에서 처리할 JSP 파일의 인코딩을 설정

 

* page 지시어의 extends

JSP가 서블릿으로 변환될 때 상속받을 슈퍼클래스를 지정할 수 있는 부분

 

2) include 지시어

- 현재 JSP 파일에 다른 HTML이나 JSP 문서를 포함하기 위한 기능을 제공한다. 

- 레이아웃은 영역 구분을 의미 (상단 header, 하단 footer, 좌측 side, 우측 contents)

여러 웹 페이지가 공통의 header, footer를 사용하며, 관련된 웹 페이지 간에 공통의 side를 갖고 있을 때 공통인 header를 변경하려면 다수의 페이지를 다 변경해야 하므로 관리 힘듬

따라서, 각 영역을 다 따로 구성하고, 클라이언트의 요청이 오면 동적으로 결합해서 하나의 완전한 HTML 문서를 만들어야 함

include : 외부의 JSP 문서를 불러다가 현재 JSP 문서에 복사 붙여넣기 하는 지시어

includeAction : 거의 유사한 기능 제공

- <%@ include file="포함할 파일_이름" %>

 

[ include_test.jsp ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page contentType="text/html; charset=UTF-8" errorPage="error.jsp" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <TITLE>ch05 : include 지시어 테스트 </TITLE></HEAD>
 
<body>
    <div align="CENTER"<!-- div는 영역 구분, align 센터는 바람직하지 않음 -->
    <h2> include 지시어 테스트</h2>
    <HR>
    <%@ include file="menu.jsp" %>
    <P>
    <table>
        <tr>
            <td><%@ include file="news.jsp" %></td>
            <td>&nbsp;</td<!-- built in entity : & 시작 ; 종료. 공백 나타냄  -->
            <td><%@ include file="shopping.jsp" %></td>
        </tr
    </table>
    </div>
</body>
</html>
cs

 

* news.jsp

1
2
3
4
<%@ page contentType="text/html; charset=UTF-8" errorPage="error.jsp" %>
[최신 뉴스]<HR>
2013.00.00 : 자바 웹 프로그래밍 전면 개정판 출간 !!! <BR>
2013.00.00 : 스프링프레임워크 적용 확산.<BR>
cs

 

* menu.jsp

1
2
<%@ page  contentType="text/html; charset=UTF-8" errorPage="error.jsp" %>
[게임] [쇼핑] [뉴스]
cs

 

* shopping.jsp

1
2
3
4
<%@ page contentType="text/html; charset=UTF-8" errorPage="error.jsp" %>
[쇼핑정보] 최신 인기 상품 정보 입니다.<HR>
1. 최신 스마트폰  <BR>
2. 10.1인치 최신 태블릿  PC <BR>
cs

 

 

* include 지시어 사용 시 주의점

JSP에서 작성 모든 것들은 _jspService( )로 들어감

JSP에서 만든 변수는 _jspService( )에서 선언한 변수와 같음

include 지시어는 copy & paste하기 때문에 include_test.jsp와 menu.jsp에서 같은 이름의 변수를 선언하게 되면 에러가 발생함

include 지시어를 사용하는 경우에 통합하는 JSP 문서에만 자바 코드를 삽입하는 것을 권장함

분리된 JSP 문서는 컨텐츠만 갖도록 해야 함

 

* shopping.jsp를 shopping.html로 변경

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
</head>
<body>
    [쇼핑정보] 최신 인기 상품 정보 입니다.<HR>
    1. 최신 스마트폰  <BR>
    2. 10.1인치 최신 태블릿  PC <BR>
</body>
</html>
cs

html 형식으로 변경해도 include_test.jsp를 동작시키면 글자가 깨짐

하지만 가장 큰 문제는 html 문서가 망가진다는 점임

include는 카피 앤 페이스트이기 때문에 html 문서 구조를 잡는 태그들이 2번씩 사용됨

따라서 분리된 문서는 컨텐츠만 갖고 있어야 함

include 지시어를 사용하는 경우 html 문서를 불러올 때 한글 처리가 안됨

따라서 html 문서는 include 지시어를 사용하면 안됨

 

3) taglib 지시어

- JSP 기능을 확장하기 위해 사용자 정의 태그를 만들어서 현재 JSP 문서에 등록시키는 경우 사용

 

5.4 선언

- JSP 페이지에서 메서드나 멤버변수를 선언하기 위한 구문이지만 요즘의 JSP 환경에서는 사용하지 않음

- <%!   %> 사이에서 선언을 한다. 

- JSP 문서 내에서 작성 모든 것들은 _jspService( ) 메서드 안으로 들어가기 때문에 JSP에서 선언한 변수는 멤버 변수가 되고, 메서드 안에서 다른 메서드를 선언하는 것은 자바 문법상 잘못된 것이므로 컴파일 에러 발생함

실제 요청을 처리하는 것은 태그로 분리해서 처리  /  동적인 화면을 구성하는 역할로만 수행

 

표현식

- 웹 페이지에 특정 표현을 위해 사용하며 산술식이나 문자열을 +로 연결하는것이 가능

- 코드 마지막에 세미콜론을 사용하지 않는다.

- <%= 표현식 %> 으로 사용한다. 


* MVC (Model View Controller)

각각 실제적인 작업 처리, 화면, 요청에 대한 처리 담당

client에게 요청이 들어오면 controller가 처리 -> 백 단에 있는 mode에게 위임 -> model이 실제 작업을 처리하고 controller에게 전달 -> 화면 구성을 위한 view 선정 -> view는 모델이 생성한 결과 데이터로 화면만 동적으로 생성하면 됨 -> view가 client에게 제공

model은 java bean, view는 JSP, controller는 servlet을 이용

프레임워크 : MVC 기술은 어렵기 때문에 쉽게 사용하기 위해 지원하는 역할

 

5.5 스크립트릿

- JSP 문서 내에서 자바 코드를 기술할 수 있는 부분으로 순수 자바 코드만 들어올 수 있다. 

- 스크립트릿을 사용해 과다하게 자바 코드를 삽입하는 것을 권장하지 않음

 

[  scriptlit2.jsp ] 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ page contentType="text/html; charset=UTF-8" errorPage="error.jsp"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>ch05 : 스크립트릿 테스트</title>
</head>
<body>
    <div align="center">
    <H2>스크립트릿 테스트1</H2>
    <HR>
    <%
        for(int i=1;i<10;i++) {
    %>
            <%=%> <BR>
    <%
        }
    %>
    </div>
</body>
</html>
cs


5.3 액션

- JSP 액션은 JSP 고유 기능으로 빈즈 클래스 연동 및 동적 페이지 관리를 위한 기능을 제공함

- JSP 페이지 간 흐름 제어/자바 애플릿(사용X) 지원/자바 빈즈 컴포넌트와 JSP 상호작용 지원

- XML 형태의 태그만 붙일 수 있으며, <jsp: action_name attribute = "value" /> 형태로 사용된다. 

 include 

 <jsp : include page = "xx.jsp" /> 

 다른 페이지를 현재 페이지에 포함시킨다.

 forward

 <jsp : forward page = "xx.jsp" /> 

 현제 페이지의 제어를 다른 페이지로 전달한다. 

 useBean

 <jsp : useBean scope= "page" id = "cls"

 class = "xx.myBean" /> 

 xx페키지의 myBean 클래스를 cls라는 이름으로 page 범위에서 사용한다.

 setProperty

 <jsp : setProperty name = "cls" 

 property = "xxx" /> 

 useBean으로 선언된 빈즈 클래스의 setxxx()메서드 호출

 getProperty

 <jsp : getProperty name = "cls" 

 property = "xxx" /> 

 useBean으로 선언된 빈즈 클래스의 ㅎetxxx()메서드 호출

 plugin

 

 

 param

 <jsp : param name = "user" value ="홍길동" /> 

 include, forward 액션에서 사용할 수 있는 파라미터 설정 

5.3.1 include 액션

- 다른 파일을 불러온다는 측면에서 include 지시어와 개념이 유사하지만 include 지시어는 해당 파일을 포함 시킨 후 컴파일을 하는 반면(카피 앤 페이스트로 한 번에 통합시키고 한 번만 실행)에 include 액션은 실행 시점에서 해당 파일을 호출하여 그 결과를 포함한다는 점이 차이점

- include 액션은 각각의 파일을 따로 컴파일 -> 동적인 페이지를 포함할 때 좋음

- include 지시어는 각각의 파일을 하나로 컴파일 -> 정적인 페이지를 포함시킬때 좋음


각각의 JSP 문서를 독립적으로 실행시킨 후에 결과만 가져다가 통합

각각의 JSP 문서에 자바 코드가 배치되어 있어도 문제가 되지 않음

 - <jsp:include page="포함될 파일_이름" />


jsp에서 사용할 수 있는 자바 태그 : include, JSTL, 커스텀 태그

액션 태그는 모두 jsp라는 네임스페이스에 포함되어 있음 -> jsp:태그명

jsp:param 액션을 이용해서 파라미터를 넘겨줄 수 있음 -> 필요한 정보를 넘겨줄 수 있음

request.getParameter를 이용해서 읽을 수 있음

 

* include_action.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <TITLE>ch05 :include action 테스트</TITLE></HEAD>
<body>
    <H2>include_action.jsp 에서footer.jsp 호출</H2>
    <HR>
    include_action.jsp 에서 출력한 메시지 입니다.<BR>
    <jsp:include page="footer.jsp">
        <jsp:param name="email" value="test@test.net" />
        <jsp:param name="tel" value="000-000-0000" />
    </jsp:include>
</body>
</html>
cs

 여기서 보면 include 액션은 변수를 전달 할 수 있다는 것을 볼 수 있다. jsp 파일을 포함하거나 forward 액션을 통해 다른 JSP로 forward 할 때 param 태그를 이용해 속성값을 전달 할 수 있다.  


[ footer.jsp ] 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page contentType="text/html; charset=UTF-8" errorPage="error.jsp"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <TITLE>ch05 :footer.jsp</TITLE></HEAD>
<body>
    footer.jsp 에서 출력한  메시지 입니다.
    <HR>
    <%= request.getParameter("email"%>,
    <%= request.getParameter("tel"%>
    <%
        out.println(request.getParameter("tel")); <!-- 버퍼를 객체화한 객체 out -->
    %>
</body>
</html>
cs

 각 JSP 문서에 <% String name = "longlee"; %>를 추가해도 정상적으로 동작함

include 액션은 단순 카피 앤 페이스트를 하는 것이 아니라 각 JSP 문서의 결과만 가져온다는 것을 확인할 수 있음

 

5.3.3 forward 액션

- include 액션과 비슷하지만 현재 페이지를 완전히 다른 페이지로 전환할 때 사용한다. 즉, include 액션은 메인 실행 파일이 다른 처리들을 포함하는 개념이지만 forward 액션은 페이지 제어권을 아예 넘긴다. 


브라우저가 서버에 요청을 보내면 서버의 controller가 받음(서블릿)

서블릿이나 JSP는 브라우저로부터 요청을 직접 받을 수 있음

브라우저에서 url로 나타낼 수 있는 대상은 웹 컨텐츠만 가능. 자바 클래스는 불가능

url로 직접 자바 클래스를 나타낼 수 없음

브라우저에서 url로 모델을 지정할 수 없음

 

요청은 controller에게 하는데, 응답은 view가 보냄 (forward)

JSP, 서블릿에서는 forward 기능 사용할 수 있음

컨트롤러가 요청에 대한 응답을 view에게 넘겨서 응답을 대신 넘겨줌

브라우저는 모름

 

브라우저에서 tomcat 서버의 A.jsp에 요청이 들어옴

A.jsp에 request와 response 객체를 생성해서 연결함

(요청을 객체화한 객체 request, 응답을 객체화한 객체 response)

실행하면서 결과를 buffer에 저장

<jsp:forward page="B.jsp"를 만나면 buffer를 비움

B.jsp에 request, response가 같이 넘어감(그래야 응답을 할 수 있음)

요청에 파라미터가 있는 경우 파라미터도 B.jsp에 같이 넘어감

B.jsp를 실행하면서 buffer을 채워서 브라우저에 응답을 보냄

 

A.jsp가 실행되는 중간에 버퍼가 차서 브라우저에 응답을 하게 되면 오류

브라우저에 응답이 된 이후에 forward 할 수 없음

브라우저는 하나의 jsp에서만 받을 수 있음

따라서 forward 액션을 사용하는 경우 버퍼를 채우기 전에 실행해야 함

즉 처음 부분에서 바로 forward 하는 것을 권장

 

forward와 더불어서 항상 같이 기억해야 하는 것 : redirect

 

* forward_action.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <TITLE>ch05 : forward action 테스트</TITLE></HEAD>
<body>
    <H2>forward_action.jsp 에서 footer.jsp 호출</H2>
    <HR>
    forward_action.jsp 의 모든 내용은 출력되지 않습니다.
    <%!
       int a = 10;
    %>
    <jsp:forward page="footer.jsp"<!-- 버퍼 초기화 후 footer.jsp로 넘어감 -->
        <jsp:param name="email" value="test@test.net" /<!-- -->
        <jsp:param name="tel" value="000-000-0000" />
    </jsp:forward>
</body>
</html>
cs

 

* footer.jsp

클라이언트 측에서 name 입력하면 forwarding을 하지 않아도 footer.jsp에서 출력이 가능함

1
2
3
4
5
6
<%@ page contentType="text/html; charset=UTF-8" %>
footer.jsp 에서 출력한  메시지 입니다.
<HR>
<%= request.getParameter("email"%>,
<%= request.getParameter("tel"%>
<%= request.getParameter("name"%>
cs


Comments