Preface
이번 장에선 액션 태그의 사용 방법을 공부했다.
지금껏 JSP 코드는 다른 언어들에 비해 굉장히 지저분하다고 생각했었는데,
액션 태그를 사용하니 직관성과 가독성이 조금은 좋아진 것 같다.
대부분 이전 장에서 다뤘던 내용들이라 특별히 어렵고 헷갈리는 부분은 없었다.
또, 월요일 기말고사를 끝으로 이번 학기를 모두 마쳤다.
별다른 문제가 없다면 8월에 졸업할 예정이다.
1. 액션 태그란?
- 액션 태그(Action Tag): JSP의 표준 태그로, 페이지 사이에서 이동을 제어하거나 자바빈을 생성할 때 주로 사용
1) 특별한 선언 없이 <jsp:태그명 /> 형태로 사용한다.
2) 웹 브라우저에서 소스 보기를 해도 보이지 않는다.
- 액션 태그의 특징
1) XML 문법을 따른다.
2) 반드시 종료 태그를 사용해야 한다.
3) 액션 태그 사이에 주석을 사용할 수 없다.
4) 액션 태그에 속성값을 부여할 때는 표현식(<%= %>)을 사용할 수 있다.
- 액션 태그의 분류
1) <jsp:include>: 외부 파일을 현재 파일에 포함시킨다.
2) <jsp:forward>: 다른 페이지로 요청을 넘긴다.
3) <jsp:useBean>. <jsp:setProperty>, <jsp:getProperty>: 자바빈즈를 생성하고 값을 설정/추출한다.
4) <jsp:param>: 다른 페이지로 매개변수를 전달한다.
- 내장 객체의 영역
1) page 영역: 동일한 페이지에서만 공유
2) request 영역: 하나의 요청에 의해 호출된 페이지와 포워드된 페이지까지 공유
3) session 영역: 클라이언트가 처음 접속한 후 웹 브라우저를 닫을 때까지 공유
4) application 영역: 한 번 저장되면 웹 애플리케이션이 종료될 때까지 유지
2. <jsp:include>
- <jsp:include> 액션 태그: 외부 JSP 파일을 현재 JSP 파일로 포함시킨다.
- include 지시어와 <jsp:include> 액션 태그의 차이
지시어 | 액션 태그 | |
형식 | <%@ include file="포함할 파일 경로" %> | <jsp:include page="포함할 파일 경로" /> |
표현식 | 표현식 사용 불가 | 표현식 사용 가능 |
포함 방식 | 페이지 자체를 현재 페이지에 포함시킨 후 컴파일 진행 | 실행의 흐름을 포함시킬 페이지로 이동시킨 후 실행한 결과를 현재 페이지에 포함 |
변수 | 포함시킨 파일에서 생성한 변수 사용 가능 | 포함시킨 파일에서 생성한 변수 사용 불가 |
page 영역 | 공유됨 | 공유되지 않음 |
request 영역 | 공유됨 | 공유됨 |
- 지시어를 통한 inlcude: 페이지를 원본 그대로 현재 페이지에 포함시킨 후 컴파일
→ JSP 코드만 서로 다른 페이지로 모듈화 하는 것이므로 동일한 페이지로 인식된다.
- 액션 태그를 통한 inlude: 포함시킬 페이지로 요청의 흐름이 이동되어 컴파일을 진행한 후 결과물을 현재 페이지에 삽입
1) 웹 서버에서 컴파일된 JSP 코드는 모두 HTML 형태로 변환된다.
→ 포함시킬 페이지에서 생성한 변수를 현재 페이지에서 사용할 수 없다.
2) 서로 다른 페이지로 인식되므로 page 영역을 공유할 수 없다.
3. <jsp:forward>
- <jsp:forward> 액션 태그: 해당 태그를 만나기 전까지의 모든 출력을 제거하고 포워드할 페이지로 요청을 전달한다.
1) 해당 페이지 지시어에서 buffer="none"으로 설정하면 포워드를 사용할 수 없다.
2) 이동된 페이지와 request 영역을 공유한다.
→ page 영역은 공유되지 않는다.
3) URL이 변경되지 않는다.
4. <jsp:useBean>, <jsp:setProperty>, <jsp:getProperty>
- <jsp:useBean> 액션 태그: 자바빈즈를 생성하거나 설정할 때 사용한다.
- 자바빈즈(JavaBeans): 자바로 작성한 소프트웨어 컴포넌트
→ 특정 규약을 따르는 자바 클래스이다.
1) 디폴트 패키지 이외의 패키지에 속해야 한다.
2) 멤버 변수(속성)의 접근 지정자는 private으로 선언한다.
3) 기본 생성자가 있어야 한다.
4) 멤버 변수에 접근할 수 있는 getter, setter 메서드가 있어야 한다.
5) getter, setter 메서드의 접근 지정자는 public으로 선언한다.
- <jsp:useBean> 형식
1) scope의 값을 생략하면 page 영역이 지정된다.
2) input 태그의 name 값이 사용할 클래스의 멤버 변수 이름과 같아야 한다.
→ 폼값은 항상 input 태그의 name 속성에 지정한 이름을 통해 전송된다.
<jsp:useBean id="자바빈즈 이름" class="사용할 패키지와 클래스명" scope="저장될 영역" />
- <jsp:setProperty> 형식
1) name: <jsp:useBean>의 id 속성에 저장한 자바빈즈의 이름을 지정
2) property="*"(와일드카드)으로 설정하면 form의 하위 요소와 일치하는 바바빈즈의 모든 속성에 사용자가 전송한 값이 설정된다.
→ value 속성을 생략할 수 있다.
<jsp:setProperty name="자바빈즈 이름" property="속성명(멤버 변수)" value="설정할 값" />
- <jsp:getProperty> 형식
<jsp:getProperty name="자바빈즈 이름" property="속성명(멤버 변수" />
- web.xml의 필터를 통한 한글 인코딩 문제 해결
<filter>
<filter-name>SetCharEncoding</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5. <jsp:param>
- <jsp:param> 액션 태그: 다른 페이지에 값을 전달해주는 액션 태그이다.
→ 전달할 수 있는 값은 String 뿐이므로, 다른 타입의 객체를 전달할 땐 내장 객체의 영역을 이용해야 한다.
- 메인 페이지의 코드
1) 포워드되는 페이지로 한글을 전달할 땐 반드시 포워드시키는 최초 페이지에서 인코딩 처리를 해야 한다.
→ 이미 web.xml에 필터를 설정했으므로 생략할 수 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String pValue = "방랑시인";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="person" class="common.Person" scope="request"></jsp:useBean>
<jsp:setProperty property="name" name="person" value="김삿갓" />
<jsp:setProperty property="age" name="person" value="56" />
<jsp:forward page="ParamForward.jsp?param1=김병연">
<jsp:param value="경기도 양주" name="param2" />
<jsp:param value="<%=pValue%>" name="param3" />
</jsp:forward>
</body>
</html>
- 포워드되는 페이지의 코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="person" class="common.Person" scope="request"></jsp:useBean>
<h2>포워드된 페이지에서 매개변수 확인</h2>
<ul>
<li><jsp:getProperty name="person" property="name" /></li>
<li>나이: <jsp:getProperty name="person" property="age" /></li>
<li>본명: <%=request.getParameter("param1")%></li>
<li>출생: <%=request.getParameter("param2")%></li>
<li>특징: <%=request.getParameter("param3")%></li>
</ul>
<jsp:include page="inc/ParamInclude.jsp">
<jsp:param value="강원도 영월" name="loc1" />
<jsp:param value="김삿갓면" name="loc2" />
</jsp:include>
</body>
</html>
- 인클루드되는 페이지의 코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h2>인클루드된 페이지에서 매개변수 확인</h2>
<%=request.getParameter("loc1")%>에
<%=request.getParameter("loc2")%>이 있습니다.
∴ <jsp:param>을 이용하면 인클루드하거나 포워드한 페이지로도 매개변수를 전달할 수 있다.
'JSP > 성낙현의 JSP 자바 웹 프로그래밍' 카테고리의 다른 글
JSP, Oracle을 사용한 회원제 게시판(페이징 O) (0) | 2023.06.19 |
---|---|
JSP, Oracle을 사용한 회원제 게시판(페이징 X) (0) | 2023.06.16 |
세션(Session) (2) | 2023.06.08 |
데이터베이스(DB) (2) | 2023.06.07 |
쿠키(Cookie) (0) | 2023.06.04 |
댓글