1. JSP 액션의 종류
-> JSP 액션은 JSP 고유 기능으로 빈즈 클래스 연동 및 동적 페이지 관리를 위한 기능을 제공함
-> <jsp:action_name attribute="value" /> 형태를 가짐
-> 주로 사용하는 액션은 useBean, get/setProperty 이며 자바 클래스와의 연동을 위해 사용함
-> 액션(Action)은 JSP 주요 구성요소 중 하나로 다음과 같은 기능을 지원한다.
- JSP 페이지간 흐름제어
- 자바 애플릿 지원
- 자바 빈즈 컴포넌트와 JSP 상호작용 지원
-> 특히 useBean 액션은 JSP에서 자바 빈즈 클래스와의 연동을 지원해주는 액션으로 잘 알아 둘 필요가 있다.
-> include 액션은 단순히 페이지를 포함하는 것 뿐만 아니라 파라미터를 포함될 페이지로 전달 하는 것이 가능함
ex) <jsp:param name="user" value="홍길동" />
액션 |
사용 예 |
기능 |
include |
<jsp:include page="xx.jsp" /> |
다른 페이지를 현재 페이지에 포함시킨다. |
forward |
<jps: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으로 선언된 빈즈 클래스의 getxxx()메서드를 호출한다. |
plugin |
<jsp:plugin type="applet/bean" code="class"> </jsp:plugin> |
애플릿이나 빈즈 클래스를 플러그인 형태로 로딩한다. |
param |
<jsp:param name="user" value="홍길동" /> |
include, forward 액션에서 사용할 수 있는 파라미터를 설정한다. |
1.2. include 액션
-> include 액션은 다른 파일을 불러온다는 측면에서 include 지시어와 개념이 유사
-> include 지시어는 해당 파일을 포함시킨 후 컴파일 하는 것에 비해, include 액션은 실행 시점에서 해당 파일을 호출하여 그 결과를 포함한다는 점에서 차이가 있음
-> 동적으로 파일들을 핸들링 하기 때문에 과도한 사용은 성능상에 문제를 줄 수 있음
-> include 액션은 동적인 페이지를 포함시킬 경우에 사용하는 것이 좋고, include 지시어는 잘 바뀌지 않는 정적인 페이지를 포함 할 때 사용하는 것이 좋다.
ex)
<jsp:include page="포함할 파일_이름" />
사용 예
ex)
<jsp:include page="footer.jsp">
<jsp:param name="email" value="test@test.net" />
<jsp:param name="tel" value="000-000-0000" />
</jsp:include>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>include action 테스트</title>
</head>
<body>
<H2>include_action.jsp 에서 footer.jsp 호출</H2>
<HR>include_action.jsp 에서 출력한 메시지입니다.
<BR>
<jsp:include page="footer.jsp">
<jsp:param value="jg555@naver.com" name="email"/>
<jsp:param value="010-9996-0865" name="tel"/>
</jsp:include>
</body>
</html>
1.3. forward 액션
-> forward 액션은 include 액션과 사용법은 유사하지만 요청 페이지를 다른 페이지로 전환할 때 사용한다.
-> response 내장객체의 sendRedirect()와 유사 하지만 포워드된 페이지에 파라미터를 전달 할 수 있다는 점에서 차이가 있다.
-> 브라우저 URL 창에는 최초 요청 페이지가 표시 되기 때문에 처리 페이지 정보를 숨기거나 MVC 패턴의 컨트롤러와 같이 특정 기능 수행 후 다른 페이지로 이동해야 하는 경우 유용하게 사용할 수 있다.
ex)
<jsp:forward page="포워딩할 파일_이름" />
사용 예)
<jsp:forward page="footer.jsp" />
<jsp:param name="email" value="test@test.net" />
<jsp:param name="tel" value="000-000-0000" />
</jsp:forward>
1.4. useBean 액션
-> 액션의 가장 중요한 부분이다.
-> 기본 표기방법이다.
-> 사용법
ex)
<jsp:useBean id="변수_이름" class="빈즈 클래스_이름"/>
<jsp:setProperty name="변수_이름" property="속성_이름"/>
<jsp:getProperty name="변수_이름" property="속성_이름"/>
-> useBean 액션은 빈즈 클래스를 사용하기 위한 구문이며 class 에 지정된 자바 빈즈 클래스를 id 라는 이름으로 사용할 수 있도록 해준다.
-> get/setProperty 액션은 브라우저에서 빈즈 클래스의 멤버 변수로 값을 저장하거나 가져오기 위한 구문 이다.
-> get/setProperty는 빈즈 클래스의 getter/setter 메서드와 연동된다.
2. 선언과 표현식
2.1. 선언
-> JSP 페이지에서 메서드나 멤버변수를 선언하기 위한 구문
-> JSP 가 서블릿으로 변환된 자바 코드에서는 모든 내용이 _jspService() 메서드에 들어가기 때문에 JSP 에서 선언한 변수는 로컬변수가 되고 메서드 안에서 다른 메서드를 선언하는 자바 문법상 잘못된 것이므로 컴파일 에러가 발생하게 됨.
-> <%! %>는 JSP 페이지에서 이러한 제약 사항 없이 멤버변수와 메서드 선언을 가능하게 함.
-> 구조적으로 JSP 에서 자바 코드를 사용하는 것은 권장되지 않기 때문에 선언문의 사용 역시 권장되지 않음.
ex)
<%!
//멤버변수 선언이나 메서드 선언이 올 수 있다.
String str = "test";
public boolean check() {
retrun false;
}
%>
2.2. 표현식
-> 표현식(Expression)은 이미 여러 소스를 통해 많이 살펴본 것처럼 <%= %>를 사용해서 간단한 데이터 출력이나 메서드 호출 등에 이용한다.
-> 코드 마지막에 ‘;(세미콜론)’을 사용하지 않는다는 것에 주의하도록 한다.
-> 표현식은 결국 out.println() 으로 변환되기 때문에 out.println()의 인자로서 적합한 형태로 사용해야 함.
-> 메서드 호출, 변수출력, 사칙연산 및 문자열 결합 등이 가능하다.
-> 표현식 보다는 표현언어(Expression Lanugage) 사용을 권장한다.
ex)
메서드 호출 : <%= calculator() %>
변수 출력 : <%= result %>
사칙 연산과 문자열결합 : <%= "i+2"="+(i+2)+"입니다" %>
3. 스크립트릿
3.1. 스크립트릿 개념
-> 스크립트릿(Scriptlet) 은 JSP 문서 내에서 자바 코드를 기술할 수 있는 부분으로 JSP의 가장 큰 특징 중 하나.
-> 초기 JSP 발전에 큰 기여를 하였으나 지금은 JSP내에서 스크립트릿 사용은 권장되지 않음.
-> JSP 내에서 화면과 프로그램이 섞여 있으면 유지보수가 힘들고 디자이너들과의 협업이 어려움.
-> MVC 패턴에 따라 웹 프로그램을 개발하게 되면 JSP는 View의 역할을 하게 되고 표현언어, JSTL, 커스텀 태그 라이브러리, JSP 빈즈가 주로 사용된다.
-> 그러나 JSP의 가장 큰 특징이며 유용한 부분이기도 하므로 자유자재로 사용할 수 있어야 함.
-> UI(AWT, Swing 등)을 제외한 거의모든 자바 클래스 라이브러리를 사용한 프로그래밍이 가능함.
ex)
<% // 로컬 변수 선언이나 프로그램 로직이 올 수 있다.
String str = "test";
for (int i=0; i < 10; i++)
out.println(i);
%>
기본 객체(implicit object)
• 웹 프로그래밍에 필요한 기능을 제공
• JSP에서 별도 선언 없이 사용 가능
• 주요 기본 객체
– request : 요청 정보를 구할 때 사용
– response : 응답과 관련된 설정(헤더, 쿠키 등) 시 사용
– out : 직접 응답을 출력할 때 사용
– session : 세션 관리에 사용
request 기본 객체 - 주요 정보 제공 메서드
메서드 |
리턴 타입 |
설명 |
getRemoteAddr() |
String |
웹 서버에 연결한 클라이언트의 IP 주소를 구한다. 게시판이나 방명록 등에서 글 작성자의 IP 주소가 자동으로 입력되기도 하는데, 이때 입력되는 IP 주소가 바로 이 메서드를 사용하여 구한 것이다. |
getMethod() |
String |
웹 브라우저가 정보를 전송할 때 사용한 방식을 구한다. |
getRequestURI() |
String |
웹 브라우저가 요청한 URL에서 경로를 구한다. |
getContextPath() |
String |
JSP 페이지가 속한 웹 어플리케이션의 컨텍스트 경로를 구한다. |
getServerName() |
String |
연결할 때 사용한 서버 이름을 구한다. |
getServerPort() |
int |
서버가 실행중인 포트 번호를 구한다. |
request 기본 객체 - 주요 정보 제공 메서드
<%@ page contentType = "text/html; charset=utf-8"%>
<html>
<head><title>클라이언트 및 서버 정보</title></head>
<body>
클라이언트IP = <%= request.getRemoteAddr() %> <br>
요청정보길이 = <%= request.getContentLength() %> <br>
요청정보 인코딩 = <%= request.getCharacterEncoding() %> <br>
요청정보 컨텐트타입 = <%= request.getContentType() %> <br>
요청정보 프로토콜 = <%= request.getProtocol() %> <br>
요청정보 전송방식 = <%= request.getMethod() %> <br>
요청 URI = <%= request.getRequestURI() %> <br>
컨텍스트 경로 = <%= request.getContextPath() %> <br>
서버이름 = <%= request.getServerName() %> <br>
서버포트 = <%= request.getServerPort() %> <br>
</body>
</html>
request 기본 객체
메서드 |
리턴타입 |
설명 |
getParameter(String name) |
String |
이름이 name인 파라미터의 값을 구한다. 존재하지 않을 경우 null을 리턴한다. |
getParameterValues(String name) |
String[] |
이름이 name인 모든 파라미터의 값을 배열로 구한다. 존재하지 않을 경우 null을 리턴한다. |
getParameterNames() |
java.util.Enumeration |
웹 브라우저가 전송한 파라미터의 이름을 구한다. |
getParameterMap() |
java.util.Map |
웹 브라우저가 전송한 파라미터의 맵을 구한다. 맵은 <파라미터 이름, 값> 쌍으로 구성된다. |
<%@ page contentType = "text/html; charset=utf-8"%>
<html>
<head><title>폼 생성</title></head>
<body>
폼에 데이터를 입력한 후 '전송' 버튼을 클릭하세요.
<form action="viewParameter.jsp" method="post">
이름: <input type="text" name="name" size="10"> <br>
주소: <input type="text" name="address" size="30"> <br>
좋아하는 동물:
<input type="checkbox" name="pet" value="dog">강아지
<input type="checkbox" name="pet" value="cat">고양이
<input type="checkbox" name="pet" value="pig">돼지
<br>
<input type="submit" value="전송">
</form>
</body>
</html>
------------------------------------------------------------------------------------------------
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.Enumeration" %>
<%@ page import="java.util.Map" %>
<%
request.setCharacterEncoding("euc-kr");
%>
<html>
<head><title>요청 파라미터 출력</title></head>
<body>
<b>request.getParameter() 메서드 사용</b><br>
name 파라미터 = <%= request.getParameter("name") %> <br>
address 파라미터 = <%= request.getParameter("address") %>
<p>
<b>request.getParameterValues() 메서드 사용</b><br>
<%
String[] values = request.getParameterValues("pet");
if (values != null) {
for (int i = 0 ; i < values.length ; i++) {
%>
<%= values[i] %>
<%
}
}
%>
<p>
<b>request.getParameterNames() 메서드 사용</b><br>
<%
Enumeration paramEnum = request.getParameterNames();
while(paramEnum.hasMoreElements()) {
String name = (String)paramEnum.nextElement();
%>
<%= name %>
<%
}
%>
<p>
<b>request.getParameterMap() 메서드 사용</b><br>
<%
Map parameterMap = request.getParameterMap();
String[] nameParam = (String[])parameterMap.get("name");
if (nameParam != null) {
%>
name = <%= nameParam[0] %>
<%
}
%>
</body>
</html>
----------------------------------------------------------------------------------
request.getParameter() 메서드 사용 name 파라미터 = 1234 address 파라미터 = 567856
request.getParameterValues() 메서드 사용 dog cat pig
request.getParameterNames() 메서드 사용 address pet name
request.getParameterMap() 메서드 사용 name = 1234
○ Get 방식 (METHOD) / POST 방식 (METHOD)
-> 파라미터를 전송하는 방식
- GET : 쿼리문자열로 전송
- POST : 요청 몸체 데이터로 전송
ex1) GET방식 전송
GET /chap03/viewParameter.jsp?name=cbk&address=seoul HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ... Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ko-kr,
ex2) POST방식 전송
POST /chap03/viewParameter.jsp HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ko; rv:1.9.0.3) ...
...
Content-Type: application/x-www-form-urlencoded
Content-Length: 22
name=cbk&address=seoul
ex3) http://localhost:8080/chap02/viewParameter.jsp?name=cbk&address=seoul&pet=cat
request.getParameter() 메서드 사용 name 파라미터 = cbk address 파라미터 = seoul request.getParameterValues() 메서드 사용 cat request.getParameterNames() 메서드 사용 address pet name request.getParameterMap() 메서드 사용 name = cbk
파라미터 값의 인코딩/디코딩
-> 하는 이유는 웹브라우저에서는 인코딩이 되어있는 상태 (우리가알수없는문자) 하지만 웹서버(WAS)에서는 우리가볼수있는
형태로 출력 되어야 하기 때문이다.
-> JSP에서 파라미터 로딩 시 인코딩 지정 필요
ex)
<% request.setCharacterEncoding("euc-kr"); String name = request.getParameter("name"); %>
GET 방식으로 전달되는 파라미터 값을 맞게 가져오는 방법
-> server.xml 수정
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443“ useBodyEncodingForURI=“true” />
-> server.xml 수정
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443“ URIEncoding=“euc-kr” />
request 기본 객체 - 요청 헤더 정보 읽기
메서드 |
리턴 타입 |
설 명 |
getHeader(String name) |
String |
지정한 이름의 헤더 값을 구한다. |
getHeaders(String name) |
java.util.Enumeration |
지정한 이름의 헤더 목록을 구한다. |
getHeaderNames() |
java.util.Enumeration |
모든 헤더의 이름을 구한다. |
getIntHeader(String name) |
int |
지정한 헤더의 값을 정수 값으로 읽어 온다. |
getDateHeader(String name) | long | 지정한 헤더의 값을 시간 값으로 읽어 온다. |
<%@ page contentType = "text/html; charset=utf-8"%>
<%@ page import = "java.util.Enumeration" %>
<html>
<head><title>헤더 목록 출력</title></head>
<body>
<%
Enumeration headerEnum = request.getHeaderNames();
while(headerEnum.hasMoreElements()) {
String headerName = (String)headerEnum.nextElement();
String headerValue = request.getHeader(headerName);
%>
<%= headerName %> = <%= headerValue %> <br>
<%
}
%>
</body>
</html>
response 기본 객체
-> 웹 브라우저에 전송하는 응답 정보 설정
-> 주요 기능
- 헤더 정보 입력
- 리다이렉트 처리
response 기본 객체 - 헤더 설정 메서드
메서드 |
리턴 타입 |
설명 |
addDateHeader(String name, long date) |
void |
name 헤더에 date를 추가한다. date는 1970년 1월 1일 이후 흘러간 시간을 1/1000초 단위로 나타낸다. |
addHeader(String name, String value) |
void |
name 헤더에 value를 값으로 추가한다. |
addIntHeader(String name, int value) |
void |
name 헤더에 정수 값 value를 추가한다. |
setDateHeader(String name, long date) |
void |
name 헤더의 값을 date로 지정한다. date는 1970년 1월 1일 이후 흘러간 시간을 1/1000초 단위로 나타낸다. |
setHeader(String name, String value) |
void |
name 헤더의 값을 value로 지정한다. |
setIntHeader(String name, int value) |
void |
name 헤더의 값을 정수 값 value로 지정한다. |
<%
response.setHeader(“Pragma”, “No-cache”);
response.setHeader(“Cashe-Control”, “No-cache”);
response.addHeader(“Cashe-Control”, “No-cache”);
response.setDateHeader(“Expires”, 1L);
%>
리다이렉트 (Redirect)
-> 특정 페이지로 이동하라고 웹 브라우저에 응답
과정
1. 웹브라우저 ->a.jsp (요청보냄)
2. a.jsp -> 웹브라우저 (b.jsp로 리다이렉트 하라고 지정함)
3. 웹브라우저 -> b.jsp (b.jsp를 요청함)
ex1)
<%@ page contentType="text/html; charset=utf-8"%>
<%
String id = request.getParameter("memberId");
if (id.equals("madvirus")) {
response.sendRedirect("index.jsp");
} else {
%>
<html>
<head><title>로그인에 실패</title></head>
<body>
잘못된 아이디입니다.
</body>
</html>
<%
}
%>
-------------------------------------------------------------------------------------------
잘못된 아이디 라고 돌아온다.
-------------------------------------------------------------------------------------------
ex2)
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head><title>첫페이지 예제</title></head>
<body>
인덱스 페이지.
</body>
</html>
-------------------------------------------------------------------------------------------
ex3)
<%@ page import = "java.net.URLEncoder" %>
<%@ page pageEncoding="euc-kr" %>
<%
String value = "자바";
String encodedValue = URLEncoder.encode(value, "euc-kr");
response.sendRedirect("index.jsp?name=" + encodedValue);
%>
'IT일반과목 > JSP' 카테고리의 다른 글
20180829 집공부9 (0) | 2018.08.29 |
---|---|
20180827 집공부7 문제풀기 (0) | 2018.08.27 |
20180826 집공부5 <지시어2> (0) | 2018.08.26 |
20180825 집공부4 (0) | 2018.08.25 |
20180825 집공부3 <지시어1포함> (0) | 2018.08.25 |