본문 바로가기

IT일반과목/JSP

20180826 집공부6 <액션,객체,리다이렉트>

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