[JSP] 액션태그

예지성준·2024년 6월 13일
0

액션태그

  • 액션 태그는 서버나 클라이언트에게 어떤 행동을 하도록 명령하는 태그

  • 스크립트 태그, 주석, 디렉티브 태그와 함게 JSP 페이지를 구성하는 태그

  • 커스텀 태그의 일종

  • 액션 태그는 JSP 페이지에서 페이지와 페이지 사이를 제어하거나(forward), 다른 페이지의 실행 결과 내용을 현재 페이지에 포함하거나(include), 자바빈즈(javaBeans)등의 다양한 기능을 제공

  • XML 형식 <jsp:... />를 사용합니다. 액션 태그는 반드시 끝나는 태그 />로 마무리해야 합니다.

액션태그의 종류

1. forward 액션 태그의 기능과 사용법

<jsp:forward page="이동할 페이지 - JSP, html, text, servlet 경로" />
- 페이지 이동은(주소이동) 아님 -> 버퍼의 치환임 / 버퍼를 통제함

  • 기존 출력 버퍼를 취소, page에 정의된 경로의 출력 결과물을 버퍼에 출력하고 비운다.

HttpServletResponse

🔼응답헤더에 Location 추가 -> 페이지 이동

버퍼: 임시메모리

버퍼에 ex01.jsp이라는 결과물이 담겨있는데
출력하다가 jsp의forward를 만나면 기존 쌓여있던 버퍼를 비워버린다. forward에 정의된 페이지쪽의 내용을 교체해버림!

  • JSP 컨테이너는 JSP 페이지에서 forward 액션 태그를 만나면 그 전까지 출력 버퍼에 저장되어 있던 내용을 모두 삭제하고 forward 액션 태그에 설정된 페이지로 프로그램 제어가 이동한다.

ex01 -> 02 페이지 이동아님
ex03 -> 02 페이지 이동

🔽🔽

응답코드 302(임시이동) 페이지 이동!

2. include 액션 태그의 기능과 사용법

  • 페이지 추가 / 버퍼의 통제
  • 버퍼를 비우지 않음
  • include 액션 태그는 include 디렉티브 태그처럼 JSP 페이지의 특정 영역에 외부 파일의 내용을 포함하는 태그
  • include 액션 태그는 forward 액션 태그처럼 외부 파일을 포함한다는 점이 비슷하지만 포함된 외부 파일이 실행된 후 현재 JSP 페이지로 제어를 반환한다는 것이 가장 큰 차이점
    <jsp:include page="추가될 페이지">

👩‍🏫참고)
ServletRequest내
RequestDispatcher
->forward(): 버퍼를 치환
->include(): 버퍼를 추가
메서드 존재

  • 서블릿 내에서는 <jsp:forward/> <jsp:include page=".."/>태그들을 사용 못하기 때문에(태그는 jsp에서) RequestDispatcher로 해당 메서드들을 사용한다.

페이지 이동 = 주소이동
-> Location이 바뀌어있어야함
HttpServletResponse안에 sendRedirect를 이용해서 Location을 변경시킬 수 있다.

M - Model
V(View) - JSP 담당
:처리 결과 응답(화면출력)
C(Controller) - Servlet 담당
: 사용자의 요청이 들어오는 곳
역할분담

컨트롤러쪽에서 처리하고 처리 결과는 서블릿을 통해야지만 view에서 출력이 된다.

처리 결과는 뷰에서 출력

//서비스 처리 부분은 서블릿을 통해야지만 처리 결과가 나오는 구조이다. -> doGet메서드가 실행 되어야지만!!! 처리되겠죠?!
처리 결과는 뷰가 출력

서블릿을 거치치 않고 jsp로 접근되어 출력되기때문에 처리완료가 뜨지않는다.

💥서블릿 내에서만 접근하도록!!!! jsp파일에 직접 접근 하도록 하면 안된다.
-> webapp폴더는(경로 /) 서블릿 외부에서 접근 가능
-> WEB-INF폴더는 설정을 넣는 폴더, 자원 접근 x 서블릿 내부에서만 접근이 가능하다. 따라서 jsp를 뷰로 쓰는 경우에는 여기에 정의해야한다.

  • 뷰를 담당할 출력 템플릿

🔼이렇게 하면 주소로 직접 접근 못하도록 막아져있다.
order/order.jsp 접근불가!!

3. include 액션 태그와 include 디렉티브 태그의 차이

include 액션태그 출력 버퍼에 추가
<jsp:include page="추가될 페이지">

include 디렉티브 태그는 출력 결과물이 물리적으로 소스 형태로(코드 형태) 추가
<%@ include file="파일 경로" %>

4. param 액션 태그의 기능과 사용법

  • param 액션 태그는 현재 JSP 페이지에서 다른 페이지에 정보를 전달하는 태그
  • 이 태그는 단독으로 사용되지 못하며 jsp:forward나 jsp:include 태그의 내부에 사용
  • 다른 페이지에 여러 개의 정보를 전송해야 할 때는 다중의 param 액션 태그를 사용할 수 있다.
  • 전달한 정보는 request내장 객체의 getParameter() 메서드로 접근할 수 있다.
  • 요청 데이터 전달할때 사용
    <jsp:forward/> <jsp:include/>
    : 요청 처리중에 버퍼 추가/ 요청 처리 중 추가 정보를 전달
    : request.getParameter() 를 통해서 조회 가능

param쪽 내용이 forward page경로로 데이터 전송이 된다.


한글을 안전하게 보내기 위해선.. URL인코딩..

인코딩된 URL을 바꿔주는 디코더
디코딩을 통해서 원래 형태로 바꿈!

👩‍🏫참고)
속성을 관리하는 4가지 객체💟
속성: 뷰에서 사용할 수 있는 데이터
PageContext pageContext: 하나의 jsp페이지에서만 데이터 조회 가능
HttpServletRequest request: 하나의 요청이 처리되는 범위에서 조회 가능
HttpSession session: 세션이 유지되는 범위에서 조회 가능
ServletContext application: 애플리케이션이 종료되기 전까지 조회 가능

  • 위 객체에 존재하는 메서드
    void setAttribute(String name, Object value): 속성 지정/ 없을땐 추가, 있을땐 수정
    Object getAttribute(String name):속성 조회
    void removeAttribute(String name): 속성 제거
    ...

데이터가 유지되는 범위
pageContext < request <sesstion < application

  • pageContext

  • request


다시 게시판 만들어보자
MVC

maven 의존성 추가

서비스 만들기

5. 자바빈즈 액션 태그의 기능과 사용법

Bean -> 자바 객체

1) 자바빈즈 : 데이터 표현을 목적으로 하는 자바 클래스

2) 자바빈즈 작성 규칙

  • 기본 생성자가 반드시 정의되어 있어야 한다.
  • 데이터를 담고 조회하는 데이터 클래스 위주로 정의
    (getter, setter)
  • 직렬화(Serializable)가 필수(예전)

빌더패턴은 new로 직접 객체생성 목적이 아님!
생성자 접근제어자 범위가 private으로 되어있다

기본 생성자가 있어야한다! 없으면 url요청시 오류

3) useBean 액션 태그로 자바빈즈 사용하기

<jsp:useBean id=“자바빈즈 식별이름” class=“패키지명을 포함한 자바빈즈 이름” scope=“범위” />

scope: 자바 빈스 객체 속성값 유지 범위(조회 가능 범위)

  • page(기본값)/ pageContext범위에서 조회 가능
  • request/ HttpServletRequest 범위에서 조회 가능(요청 처리 범위)
  • session/ HttpSession
  • application/ ServletContext

scope 설정 x -> 기본값일때


리스트에 항목 추가해도 나오지않음


scope request로 변경하고나서!

4) setProperty 액션 태그로 프로퍼티 값 저장하기
//setter 메서드 호출
setter을 대신하는 프로퍼티!

<jsp:setProperty name=“자바빈즈 식별 이름” property=“프로퍼티 이름” value=“값” />

5) getProperty 액션 태그로 프로퍼티의 값 가져오기
//getter 메서드 호출
getter을 대신하는 프로퍼티!

조회 쟈쟌~


📢📢set하고 get으로 조회하고 이런식으로 불러오는건 사실 비효율적이다. 출력문에서 바로 값 넣고 출력하는게 효율적일거다.
다만 name값은 다 동일해야한다.

profile
꽁꽁 얼어붙은 한강 위로 😺

0개의 댓글