분류 전체보기

JSP 내장 객체

서블릿 컨테이너의 웹 브라우저 요청 처리 방법

1. 사용자가 선택한 링크에 의해 웹 브라우저로부터 들어온 요청(HTTP request)을 컨테이너가 받아들입니다.

2. 컨테이너는 요청한 서블릿을 위해 HttpServletRequest와 HttpServletResponse 객체를 생성합니다. HttpServletRequest 객체는 폼 파라메터 정보를 가지고 있습니다.

3. 서블릿은 스레드를 만들어서 서비스할 준비를 합니다.

4. 서블릿 컨테이너는 request 객체와 response 객체를 인자로 스레드에게 전달합니다.

5. 컨테이너는 service() 메서드를 호출하여 6. GET 방식으로 처리할 지 POST 방식으로 처리할 결정합니다. doGet() 메서드나 doPost() 메서드를 호출하여 동적인 HTML 문서를 response 객체에 담아서 전송합니다.

request 객체
(javax.servlet.http.HttpServletRequest)

웹 브라우저로부터 전송받은 HTTP request message의 HTTP Header 부분과 HTTP Body 부분의 정보를 보관하고 있는 객체입니다.

request parameter 처리 메서드들

public String getParameter(String name)
요청 파라메터 name에 할당된 값을 리턴합니다.
public Enumeration getParameterNames()
요청에 사용된 모든 파라메터 이름을 리턴합니다.
public String[] getParameterValues(String name)
지정된 파라메터 이름에 대한 값들을 리턴합니다. CGI Form 에서 같은 name 속성으로 지정된 값들은 이 메서드를 사용하여 읽어낼 수 있습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration" %>
<!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>파라메터 정보 읽기</title>
</head>
<body>
<h1>파라메터 정보 읽기</h1>
<p>
<%= request.getQueryString()%><br />
<%
Enumeration<String> paraNames = request.getParameterNames();

while (paraNames.hasMoreElements()) {
	String paraName = paraNames.nextElement();
%>
	<strong><%= paraName %></strong>:
	<%= request.getParameter(paraName) %><br />
<%
}
%>
</p>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("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>Checkbox 데이터</title>
</head>
<body>
<h1>취미 선택</h1>
<form method="post" action="<%= request.getRequestURL() %>">
<input type="checkbox" id="chk1" name="hobby" value="축구" />
<label for="chk1">축구</label>
<input type="checkbox" id="chk2" name="hobby" value="배구" />
<label for="chk2">배구</label>
<input type="checkbox" id="chk3" name="hobby" value="농구" />
<label for="chk3">농구</label><br />
<input type="checkbox" id="chk4" name="hobby" value="바둑" />
<label for="chk4">바둑</label>
<input type="checkbox" id="chk5" name="hobby" value="낚시" />
<label for="chk5">낚시</label>
<input type="checkbox" id="chk6" name="hobby" value="등산" />
<label for="chk6">등산</label><br />
<input type="submit" value="전송" />
</form>
<% if (request.getParameter("hobby") != null) { %>
<p>
당신이 선택한 취미 :
	<% boolean toggle = false; %>
	<% for (String value : request.getParameterValues("hobby")) { %>
		<% if (toggle) out.println(", "); else toggle = true; %>
		<%= value %>
	<% } %>
</p>
<% } %>
</body>
</html>

HTTP 헤더와 관련한 메서드들

public String getHeader(String headerName)
HTTP 요청 헤더에 지정된 headerName의 값을 리턴합니다.
public Enumeration getHeaderNames()
HTTP 요청 헤더에 지정된 모든 헤더의 이름을 리턴합니다.
public Enumeration getHeaders(String headerName)
HTTP 요청 헤더에 포함된 모든 값들을 리턴합니다.
public int getIntHeaders(String headerName)
HTTP 요청 헤더에 지정된 headerName의 값을 int 형으로 리턴합니다.
public long getDateHeader(String headerName)
HTTP 요청 헤더에 포함된 headerName의 값을 1970년 1월 1일 0시 0분을 기준으로 한 현재까지의 밀리초를 리턴합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="java.util.Enumeration" %>
<!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>Request 정보 확인 예</title> </head> <body> <h1>Header 정보들</h1> <p> <%= request.getMethod() %> <%= request.getRequestURL() %> <%= request.getProtocol() %><br /> <% Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); %> <%= headerName %>: <%= request.getHeader(headerName) %><br /> <% } %> </p> </body> </html>
<%@ page import="java.util.Enumeration" %>
<%
request.setCharacterEncoding("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>POST 방식</title>
</head>
<body>
<form method="post" action="jsp_request_ex03.jsp">
<label for="user">사용자</label>
<input type="text" id="user" name="user" /><br />
<label for="passwd">암호</label>
<input type="password" id="passwd" name="passwd" /><br />
<input type="submit" value="전송" /><input type="reset" value="취소" />
</form>
<% if (request.getParameterNames() != null) { %>
<p>
	<%
	Enumeration<String> parameters = request.getParameterNames();
	while (parameters.hasMoreElements()) {
		String parameter = parameters.nextElement(); %>
		<%= parameter %>: <%= request.getParameter(parameter) %><br />
	<% } %>
</p>
<% } %>
</body>
</html>

세션과 관련한 메서드들

public HttpSession getSession()
요청을 시도한 클라이언트에 지정된 HttpSession 객체를 리턴합니다. 만일 이전에 생성된 HttpSession 객체가 존재하지 않으면 새로운 세션 객체를 생성합니다.
public HttpSession getSession(boolean create)
create의 값이 true인 경우 이전에 생성된 HttpSession 객체가 존재하지 않으면 새로운 세션 객체를 생성합니다. false인 경우 null을 리턴합니다.
public String getRequestedSessionId()
요청을 시도한 클라이언트의 세션 id를 리턴합니다.
public boolean getRequestedSessionIdValid()
요청에 포함된 세션 id가 유효 여부를 리턴합니다.
isRequestedSessionIdFromCookie()
요청에 포함된 클라이언트의 세션 id가 쿠키로 전달되었는지 여부를 리턴합니다.
isRequestedSessionIdFromURL()
요청에 포함된 클라이언트의 세션 id가 URL에 포함되었는지 결과를 리턴합니다.

쿠키와 관련된 메서드

public Cookie[] getCookies()
클라이언트의 요청에 포함된 쿠키를 리턴합니다.

요청에 포함된 URL/URI와 관련한 메서드들

public String getRequestURI()
요청에 포함된 URL에서 URI 문자열을 리턴합니다.
public String getQueryString()
요엋에 포함된 쿼리 문자열을 리턴합니다.
public String getMethod()
요청에 포함된 요청 방식을 리턴합니다.

인코딩과 관련한 메서드

public void setCharacterEncoding(String encoding)

CGI Form을 통해 전달된 파라메터 값들을 일괄적으로 인코딩을 지정하는 메서드입니다. 톰캣에서는 4 버전부터 사용되고 있으며 다음 코드의 대신 사용합니다.

String name = request.getParameter("name");
if (name != null)
	name = new String(name.getBytes("8859_1"), "euc-kr");

웹 브라우저로부터 전송된 파라메터는 기본적으로 "ISO 8859-1"로 인코딩되기 때문에 한글 사용시 서버측으로 전송된 파라메터의 인코딩을 "EUC-KR"이나 "UTF-8"로 인코딩을 다시 변환해 주어야 한글이 제대로 서버로 전송됩니다.

response 객체
(javax.servlet.http.HttpServletRespose)

요청을 시도한 클라이언트로 전송할 응답 메시지를 저장하고 있는 객체입니다.

public void addCookie(javax.servlet.http.Cookie cookie)
쿠키를 응답 헤더에 추가합니다. 클라이언트는 이 응답을 받으면 지정된 쿠키를 저장하게 됩니다.
public boolean containsHeader(String headerName)
응답 헤더에 지정된 headerName의 포함 여부를 리턴합니다.
public void sendRedirect(String location) throws IOException
지정된 location으로 요청을 재전송합니다. 웹 브라우저의 주소창의 주소가 변경됩니다.
pulbic String encodeURL(String url)
현재 요청을 사용한 클라이언트가 쿠키를 지원할 경우 파라메터로 받은 URL을 그대로 문자열로 리턴하고 쿠키를 지원하지 않을 경우 URL에 세션 id를 쿼리 문자열로 추가한 URL을 리턴합니다. 세션이 유지된 클라이언트의 세션 id를 전송하려는 경우 URL Rewriting 기법을 사용할 수 있도록 지원합니다.
public String encodeRedirectedURL(String url)
세션이 유지된 클라이언트의 세션 id를 쿠키를 지원하지 않는 브라우저로 전달하기 위해 URL에 세션 id를 쿼리 문자열로 추가하여 리턴합니다.
public void setStatus(int status_code)
HTTP 응답 상태 코드를 설정합니다. 웹 서버가 자동으로 설정하는 응답 코드를 프로그래머가 의도적으로 변경할 수 있도록 합니다.
public void sendError(int status_code) throws IOException
setStatus()와 비슷하지만 서버측 에러 상황을 클라이언트로 전송하기 위해 HTTP 응답 헤더에 상태 코드를 설정합니다.
public void sendError(int status_code, String message) throws IOException
서버측 에러의 상태 코드와 설명 메시지를 함께 설정합니다.
public void setHeader(String headerName, String value)
HTTP 응답 헤더에 프로그래머가 지정한 헤더 정보를 설정합니다.
public void setDateHeader(String headerName, long dateMil)
1970년 1월 1일 0시 0분 0초를 기준으로 밀리초 경과된 날짜를 헤더 정보로 설정합니다.
public void setIntHeader(String headerName, int intValue)
int 값을 헤더 정보로 설정합니다. "Expires"와 같이 숫자 값을 가지는 헤더 정보 설정에 사용합니다.

HTTP 통신 개요

웹 서버의 역할

간단히 설명하면 웹 브라우저의 요청(request)를 받아 요청된 HTML 문서를 해당 경로에서 찾아서 결과를 응답(response)합니다.

HTTP 프로토콜

요청(Request)의 주요 구성 요소

HTTP 메서드

일반적으로 사용하는 GET, POST외에 HEAD, TRACE, PUT, DELETE, CONNECT가 있습니다.

URL

형식은 프로토콜명://서버명 또는 IP주소/경로 와 같이 사용합니다. 프로토콜로는 http, ftp, mailto, telnet, archie, gopher 등 다양한 프로토콜들이 존재하며 현재는 http와 ftp, mailto 등만이 사용됩니다.

폼 파라메터(Form Parameters)

URL에 이어 물음표(?)이후에 딸려 오며 '속성=속성값' 형식으로 사용됩니다. 여러 속성쌍을 사용할 경우는 '&'로 연결합니다.

응답(Response)의 주요 구성 요소

상태 코드

웹 서버는 웹 브라우저에 의해 요청된 HTML문서의 존재 유무, 접근 가능 여부에 따른 응답 코드를 응답에 실어 보냅니다. 1xx, 2xx, 3xx, 4xx, 5xx이 사용됩니다.

컨텐츠 타입(MIME types)

웹 문서인 HTML문서는 멀티미디어 데이터를 함께 전송하므로 해당 데이터의 타입을 MIME 타입으로 표시하여 웹 브라우저가 올바르게 표시할 수 있도록 합니다.

컨텐츠

컨텐츠 타입에 의해 지정된 데이터를 웹 브라우저에게 전달합니다.

GET과 POST

GET

GET은 가장 일반적인 요청 방법으로 URL에 속성쌍을 함께 실어 서버로 전송합니다. 웹 브라우저의 주소창에서 서버로 전송하는 속성쌍을 확인할 수 있습니다. 요청 메세지의 요청 헤더 부분에 속성쌍을 끼워넣어 전송하기 때문에 전송 길이에 제약을 받습니다.

POST

POST는 요청 메세지의 요청 헤더가 아닌 요청 메세지의 몸체 부분에 추가하여 전송합니다. 전송 길의의 제약을 받지 않고 GET과 달리 브라우저의 주소창에서 확인이 불가능합니다.

CGI(Common Gateway Interface)

펄(Perl)이나 C언어로 작성한 프로그램을 웹 서버가 실행 할 수 있도록 만들어진 규약입니다.

JSP의 제어문

이 강의에 사용되는 WAS;Web Application Server는 Tomcat 6.0이고 JDK 6 환경에서 실행을 하고 있습니다. Tomcat은 Jsper와 Catalina라는 두 부분으로 구성되어 있으며 우리가 작성한 JSP 문서는 Jsper에 의해 Java 소스(서블릿)로 번역되고 다시 Catalina에 의해 JRE 환경에서 서블릿이 실행이 됩니다. 지난번 강의노트에서 설명한대로 JSP 문서는 선언문과 스크립틀릿, 그리고 표현식으로 실행 코드들 작성할 수 있습니다. 그중 스크립틀릿의 경우 Java 소스를 직접 JSP 코드에 끼워넣는 방식으로 코딩을 하게 되며 이 스크립틀릿 블럭은 변환없이 그대로 서블릿 코드에 포함됩니다. 따라서 서블릿 소스를 컴파일할 경우 JRE의 버전에 따라 Java 문법의 지원 정도도 결정되게 됩니다. 예를 들면 향상된 for 문의 경우 JRE 5.0 이상에서만 사용할 수 있게 됩니다. 그러나 서블릿과 JSP 문법의 경우 Tomcat의 버전에 따라 지원되는 버전이 달라집니다.

결론은 Servlet과 JSP의 문법은 Tomcat의 버전에 스크립틀릿 블럭내의 Java 문법은 JRE의 버전에 영향을 받는다는 것입니다.

조건문

if ~ else 문

switch ~ case 문

반복문

while문

do ~ while문

for문

for each문(향상된 for문)

package net.jeongsam;

public class ZipData {
	private Integer seq;
	private String zipCode;
	private String sido;
	private String gugun;
	private String dong;
	private String bunji;
	
	public Integer getSeq() {
		return seq;
	}
	public void setSeq(Integer seq) {
		this.seq = seq;
	}
	public String getZipCode() {
		return zipCode;
	}
	public void setZipCode(String zipCode) {
		this.zipCode = zipCode;
	}
	public String getSido() {
		return sido;
	}
	public void setSido(String sido) {
		this.sido = sido;
	}
	public String getGugun() {
		return gugun;
	}
	public void setGugun(String gugun) {
		this.gugun = gugun;
	}
	public String getDong() {
		return dong;
	}
	public void setDong(String dong) {
		this.dong = dong;
	}
	public String getBunji() {
		return bunji;
	}
	public void setBunji(String bunji) {
		this.bunji = bunji;
	}
}
package net.jeongsam;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Properties;

public class ZipManager {
	private final int DEFAULT_ROWS = 10;
	
	private Connection getConnection()
			throws ClassNotFoundException, SQLException, IOException {
		
		BufferedReader reader = new BufferedReader(new FileReader("C:\\secret.txt"));
		Properties prop = new Properties();
		prop.load(reader);
		String url = "jdbc:mysql://127.0.0.1/example";
		Class.forName("com.mysql.jdbc.Driver");
		
		return DriverManager.getConnection(url, prop);
	}
	
	public ArrayList<ZipData> getZipList(int page, int rows)
			throws ClassNotFoundException, SQLException, IOException {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		ArrayList<ZipData> zipTable = new ArrayList<ZipData>();
		int offset = (page - 1) * rows;
		
		String sql = "SELECT seq, zipcode, sido, gugun, dong, bunji ";
		sql += "FROM ziptable ";
		sql += "LIMIT " + offset + "," + rows;
		
		try {
			conn = getConnection();
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			
			while (rs.next()) {
				ZipData zipData = new ZipData();
				zipData.setSeq(rs.getInt(1));
				zipData.setZipCode(rs.getString(2));
				zipData.setSido(rs.getString(3));
				zipData.setGugun(rs.getString(4));
				zipData.setDong(rs.getString(5));
				zipData.setBunji(rs.getString(6));
				
				zipTable.add(zipData);
			}
		} finally {
			if (rs != null) {
				rs.close();
				rs = null;
			}
			
			if (stmt != null) {
				stmt.close();
				stmt = null;
			}
			
			if (conn != null) {
				conn.close();
				conn = null;
			}
		}
		return zipTable;
	}
	
	public ArrayList<ZipData> getZipList(int page)
			throws ClassNotFoundException, SQLException, IOException {
		return getZipList(page, DEFAULT_ROWS);
	}
	
	public static void main(String[] args) {
		ZipManager zipMgr = new ZipManager();
		try {
			java.util.Iterator<ZipData> iZipTable = 
					zipMgr.getZipList(1).iterator();
			while (iZipTable.hasNext()) {
				ZipData zipData = iZipTable.next();
				System.out.println(zipData.getSido() + " " +
						zipData.getGugun() + " " +
						zipData.getDong() + " " +
						zipData.getBunji());
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@page import="net.jeongsam.ZipManager, net.jeongsam.ZipData"%>
<%@page import="java.util.List, java.util.Iterator"%>
<%
ZipManager zipMgr = new ZipManager();
List<ZipData> zipTable = zipMgr.getZipList(1);
Iterator<ZipData> iZipTable = zipTable.iterator();
%>
<!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=EUC-KR">
<title>우편번호 표시</title>
</head>
<body>
<table>
<thead>
<tr>
<th>일련번호</th><th>우편번호</th><th>주소</th>
</tr>
</thead>
<tbody>
<%
while (iZipTable.hasNext()) {
	ZipData zipData = iZipTable.next();
%>
<tr>
<td><%= zipData.getSeq() %></td><td><%= zipData.getZipCode() %></td>
<td><%= zipData.getSido() %> <%= zipData.getGugun() %> <%= zipData.getDong() %>
<%= zipData.getBunji() %>
</td>
</tr>
<% } %>
</tbody>
</table>
</body>
</html>

JSP 태그

주석

JSP는 HTML 스타일과 Java 스타일의 주석을 함께 사용합니다. JSP가 태생적으로 HTML에 끼어넣는 형식으로 코딩할 수 있도록 작성된 언어라는 점을 감안하면 당연한 일이라고 볼 수 있을 것 같습니다.

<!-- 주석 -->

HTML의 주석을 활용하여 주석을 달 수 있습니다. 물론 JSP의 주석은 아니고 HTML의 주석을 빌어다 사용하는 겁니다. HTML 코드이기 때문에 사용자에게 전달되어서 소스보기로 내용을 확인할 수 있습니다. 따라서 이 주석은 별로 권할 만한 것이 못되는 것 같습니다.

<%-- 주석 --%>

JSP 고유의 주석이라고 할 수 있습니다. JSP는 일단 서블릿으로 변환이 되는데 이 과정에서 주석은 무시합니다. 당연히 서블릿에 포함되지 않으므로 사용자에게 전달되지도 않습니다.

/* 주석 */

스크립틀릿 코드에서 사용할 수 있는 것으로 스크립틀릿이 Java 코드를 직접 JSP 코드에 포함시키는 것이므로 Java의 주석과 동일한 특성을 가집니다.

//

/* ... */ 주석과 마찬가지로 스크립틀릿 코드에서 사용 가능한 Java 스타일의 주석입니다.

JSP 지시어(Directive)

JSP 컨테이너에게 해당 페이지의 처리 정보를 알려주는 역할을 합니다. JSP 컨테이너는 해당 JSP 페이지를 서블릿으로 변환하기에 앞서 지시어들의 속성과 속성값을 참조합니다.

page 지시어

JSP 문서에 대한 정보를 속성을 이용하여 정의합니다.

속성명 설명 디폴트값
info JSP 문서를 설명하기 위한 문자열을 기술하기 위해 사용합니다. 없음
language JSP 문서내에서 사용할 스크립트 언어를 지정합니다. 현재는 java만이 유일한 속성값이며, 현재 자바7.0의 개발 목표가 다중 언어를 지원하는 것을 포함하고 있으므로 향후 다양한 언어의 사용이 가능하리라 생각됩니다. java
contentType JSP 문서가 클라이언트(웹 브라우저)로 전송할 응답(response)을 MIME(Multipurpose Internet Mail Extension) 형식으로 지정합니다. text/html;charset=ISO-8859-1
extends JSP 문서가 서블릿으로 변환될 때 해당 서블릿이 상속받은 부모 클래스를 지정합니다.  
import JSP 문서 내에서 사용할 클래스의 패키지을 등록합니다. Java의 import문과 동일합니다. Java와 달리 콤마(,)로 구분하여 여러 패지지 이름을 등록할 수 있습니다.  
session HTTP 프로토콜은 기본적으로 stateless protocol로 클라이언트가 HTML 문서를 요청(request)할 때마다 매번 새로운 접속을 합니다. 그렇기 때문에 로그인 상태를 유지한다던지 하는 작업은 원래 불가능합니다. 그래서 요청을 한 클라언트의 정보를 유지할 수 있도록 세션이라는 방법을 사용하고 이를 '세션 관리(session management)'라고 합니다. session 지시어는 이 세션의 유지를 여부를 알려주는 것으로 기본값은 "true"로 설정되어 있습니다. 세션의 유지를 위해 내장된 'session'이라는 객체를 사용합니다. "false"로 지정하면 'session' 객체를 사용하지 않으며 프로그래머가 직접 HttpSession 클래스를 이용하여 세션을 관리하여야 합니다 true
buffer JSP 문서는 서블릿으로 변환되며 서블릿이 실행된 결과를 JspWriter 객체인 내장 객체 out을 이용하여 write()나 print() 메서드로 출력을 합니다. buffer는 out 객체의 출력 버퍼의 크기를 지정하는 것으로 기본값은 "8kb"로 설정되어 있습니다. 8kb
autoFlush buffer 속성과 관련이 있으며 버퍼가 채워졌을 때 자동으로 출력을 할 것인지를 지정합니다. 기본적으로 버퍼가 채워지면 자동으로 클라이언트에게 출력을 내보냅니다. true
isThreadSafe 서블릿이 동시에 여러 클라이언트의 요청을 처리할 수 있는지를 지정합니다. true
errorPage 예외가 발생하면 해당 예외를 처리할 웹 페이지를 지정합니다.  
isErrorPage JSP 문서를 에러 페이지로 지정합니다. false
pageEncoding JSP 문서의 문자셋 인코딩 형식을 지정합니다. contentType에도 인코딩을 지정할 경우 동일해야 합니다. 일반적으로 contentType이나 pageEncoding 중 하나에만 지정합니다. ISO-8859-1

include 지시어

공통으로 사용되는 JSP 문서 부분을 코드 단편으로 저장해 두었다가 필요할 때 삽입시켜서 사용할 수 있도록 합니다. 서블릿으로 변환되기 전에 진행되기 때문에 결국은 삽입된 JSP 문서가 하나의 서블릿으로 변환됩니다. 그렇기 때문에 삽입할 JSP 문서 조각은 page 지시어의 contentType 속성이 중복되지 않도록 신경써야 합니다. contentType은 문서에서 한 번만 사용할 수 있는 속성이기 때문입니다. 그리고 앞서 설명한 것처럼 include가 실행되는 시점은 서블릿 변환 전에 소스 차원에서 이뤄지므로 다음과 같이 사용할 수 없습니다.

<@ include file="<%= mypage %>" %>

taglib 지시어

커스텀 태그 사용시에 사용하는 지시어 입니다.

스크립트 요소

JSP 문서에 Java 코드나 표현식 태그 등을 삽입하기 위해 사용합니다.

선언문(declarations)

변수나 메서드를 선언하기 위해 사용합니다. Java에서 클래스에 선언하는 멤버 변수나 메서드를 선언하는 것과 같은 의미입니다.

스크립틀릿(scriptlets)

Java 코드를 삽입하여 사용할 수 있습니다. 선언문과 비슷하나 선언문에 선언된 변수는 멤버 변수로 선언되지만 스크립틀릿 내에서 선언된 변수는 _jspService() 메서드의 지역 변수로 선언됩니다. 스크립틀릿 내의 모든 코드는 서블릿으로 변환될 때 _jspService() 메서드의 코드로 변환됩니다.

표현식(expressions)

JSP 문서 내에 직접 출력할 내용을 포함시킬 때 사용합니다.

+ Recent posts