[Web][JSP] 페이지 모듈화와 요청 흐름 제어

포키·2023년 4월 26일
0

국비과정

목록 보기
55/73

ROOT에 대하여

<a href="">, <form action="">, sendRedirect()의 root = 'ip:port/'
(외부 링크로도 이동할 수 있는 경우)
<jsp:include page="">, <jsp:forward page="">의 root = 'ip:port/웹 어플리케이션 폴더'
(어플리케이션 내부에서만 사용할 수 있는 경우)
  • 외부 링크로도 이동할 수 있는 경우는 request.getContextPath()를 통해 ROOT를 잡아준다!

jsp의 목적 -> 가공된 데이터 보여주기 (데이터 처리까지 하는 게 아님!)
우리는 개념을 배우기 위해 해보는 거지, 실제로는 연산이 jsp 안에 들어가면 안됨 (비권장)


페이지 모듈화

액션 태그

  • html 같은 jsp 코드 (태그처럼 생긴 jsp)
  • 코드 분량도 줄어듦

    가장 좋은 jsp는 스크립트릿, 표현식이 없는 식
    (대체할 수 있는 식이 있음)

JSP 페이지 만들기 - 참여자
1. 개발자
2. 디자이너 (프엔 개발자, 디자이너, 퍼블리셔 등)
디자이너들은 비전공자, jsp를 이해하게 만들기 어려움
하지만 협업을 위해서는 함께 코드를 만들어야 함
-> "jsp 코드를 html처럼 만들자" = 액션 태그

<jsp:include>

<jsp:include page=“페이지 경로“ flush=“플러시 여부” />

  • 사용 목적 : 공통 영역 작성 = 중복 영역 처리
  • page : 포함될 JSP 페이지의 경로를 지정
  • flush : 지정한 JSP 페이지를 실행하기 전 출력 버퍼를 flush할지 여부를 지정 (기본값="false")
    false면 생성된 데이터를 구분없이 합쳐서 보내는 것
  • 메서드 호출과 유사
    (main 코드에서 메서드 코드로 넘어가 진행된 뒤 끝나고 다시 main 기존 줄로 돌아옴)
  • 반복 호출 가능 (a.jsp 안의 b.jsp 안의 c.jsp 안의 ...)

물리적으로 분리된 내용을 논리적으로 합치는 것 (결과만)
(실행 결과가 버퍼에 구분없이 합쳐져 담겨 보내짐)

<jsp:param>

  • 사용 목적 : <jsp:include> 로 이어지는 jsp 페이지에 패러미터를 추가하기 위해 사용

일반 파라미터는 사용자가 결정
jsp:param으로 추가한 파라미터는 개발자가 임의로 만든 것

  • 기본객체에 속성 정의하는 게 더 간편하고 활용도 높은 편
  • 속성(attribute)는 값으로 '객체'를 가질 수 있기 때문에 적당한 클래스에 원하는 정보를 모두 담아 사용할 수 있다는 것.
  • setCharacterEncoding() 이용하여 디코딩 설정
  • request 객체의 파라미터 관련 메서드 이용 가능
  • <jsp:include>로 이어진 jsp 페이지들에서만 패러미터 사용 가능

include 디렉티브

<%@ include file="포함할 파일(.jspf)" %>

  • 사용 목적 : 공통변수 지정 => 값이나 연산 중복 제거

    반복되는 코드(반복문) 숨기려고 사용하기도 함
    why? 보기 깔끔하게 하기 위해 (jsp는 개발자와 디자이너가 함께 보는 코드라는 인식)

  • 지정한 페이지(.jspf)를 현재 위치에 포함시킴

    .jspf = 'JSP Fragment' = JSP 소스 코드 조각을 의미
    (온전한 jsp 파일이 아님을 시사)

  • include 디렉티브에서는 변수를 함께 쓸 수 있다
    (자바 코드로 바뀌는 단계부터 합쳐지기 때문)

  • include 디렉티브를 통해서 포함된 파일이 바뀔 경우 WAS가 인식하여 반영
    but 인식 못해서 안바뀌는 경우도 있음!! 그때 우리가 할 일

  1. localhost에서 .java, .class 삭제
  2. 브라우저의 캐시 삭제

기본객체의 속성으로 저장할 수도 있지만, 속성을 get/set하는 것조차 줄일 수 있다.

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

  • 합쳐지는 시점 : 액션태그는 '버퍼에 담을 때', 디렉티브는 '자바 코드 단계에서'
  • 목적 : 액션태그는 '눈에 보이는 중복' 제거, 디렉티브는 '값이나 연산 중복' 제거

코드 조각(.jspf) 자동 포함 기능

  • 매번 앞뒤에 중복 코드를 추가해주는 것도 코드 중복
  • web.xml에서 <include-prelude><include-coda>를 통해 설정 가능
  • 복수개 설정도 가능
  • 코드를 줄이기는 좋지만, 흔적이 남지 않는다는 건 그만큼 확인, 수정이 어렵다는 것
    그래서 남발하면 안된다

예시

<jsp-config>
	<jsp-property-group>
    	<url-pattern>/view/*</url-pattern>
        <include-prelude>/common/variable.jspf</include-prelude>
        <include-coda>/common/footer.jspf</include-coda>
    </jsp-property-group>
</jsp-config>
  • <url-pattern> : url이 '/view/'로 시작하는 모든 jsp 파일의
    <include-prelude> : 앞에 '/common/variable.jspf'를
    <include-coda> : 뒤에 '/common/footer.jspf'를 삽입하라 지정

<jsp:forward>

  • 요청은 from.jsp인데 내용만 to.jsp로 돌려받음 (redirect와 유사)
  • 사용자는 to.jsp의 존재를 모르고, from.jsp에서 무슨 일이 일어나는지 알 수 없음
  • request 객체 하나를 공유한다. (redirect와 차이점)
  • forward 태그 아래에 존재하는 코드는 실행되지 않음 (redirect와 차이점)
  • 단순 이동의 목적이면 forward 사용 (경제적으로 효율적)

forward 태그의 의미
forward 태그를 가지는 jsp 페이지가 중앙에서 요청-결과의 흐름을 통제할 수 있음

  • 개발자가 코드 흐름을 제어하기 수월
  • 기능의 모듈화 도움 (재사용, 기능 조합 가능)
  • 중간 페이지에서 하는 일 숨길 수 있음

출력 버퍼와의 관계

  • forward 액션태그가 실행되면 출력 버퍼에 저장했던 내용은 버려진다.
  • 에러페이지와 마찬가지로, 첫 버퍼가 전송되기 전에 forward 태그가 실행되어야 한다
  • 만약 출력 버퍼를 플러시한 후 실행되면 실행 흐름을 이동하는데 실패한다.
  • 버퍼 속성이 none인 경우도 실패한다.
  • 첫 버퍼 안에 forward 태그가 담기지 못할 경우
  • IllegalStateException : Attemp to clear a buffer that's already been flushed

예시 코드

  • view.jsp에서 주소를 만들어 실제로 요구받은(필요한 기능이 있는) 페이지로 이동
  • TIP view.jsp는 실제로는 컨트롤 기능이지만 겉으로 드러나지 않으므로,
    겉으로 드러나는 역할인 view의 이름을 준다.
  • request.getContextPath()를 통해 절대경로 간편히&확실히 취하기
<form action="<%= request.getContextPath() %>/view.jsp">

★★ 참고 ★★
WEB_INF 안의 파일은 클라이언트가 직접 요청할 수 없다

<form action="/WEB_INF/secret.jsp" />
<%-- 404 에러 --%>

-> jsp:forward서버가 요청하는 것은 가능하다

	<jsp:forward page="/WEB_INF/secret.jsp" />

: forward를 통해 외부에서 접근을 막고, 외부에서 주소, 위치를 알지 못하게 함

<jsp:param>

  • forward 태그에서도 사용 가능

경로 처리

  • 절대경로가 좋다
    (변경에 더 유연한 대처 가능, 활용도 더 높음 ex. 주소를 연산에 사용할 때)

<jsp:useBean>

  • '정보'를 담고있는 객체 (=정보묶음)
  • 자바빈 규약에 의거해 만듦
  • 기본적으로는 serializable 구현 (최근에는 구현 생략하기도)
  • 필드(속성), 기본생성자, getter, setter 필수
	<jsp:useBean id="변수명" scope="기본객체" class="클래스명(패키지 포함)" />
  • <jsp:useBean> = 기본객체에서 해당 클래스와 해당 이름을 가지고 있는 속성 가져와서 쓰기 (없으면 기본생성자로 생성)
	MemberInfo member = (MemberInfo)request.getAttribute("member");
	if(member == null) {
		member = new MemberInfo();
		request.setAttribute("member", member);
	}

클래스는 없으면 만들어 넣어줌
없으면 에러 발생시킨다.

<jsp:setProperty>

  • setter와 비슷

속성

  • name : 객체명
  • property : 멤버변수(속성)명

    property="*" : 멤버변수와 이름이 같은 패러미터값을 가져와서 대입

  • value : 대입할 값
  • param : 패러미터 중 가져와서 대입할 값
  • 쓰는 이유 (태그처럼 생겨서 --- 태그처럼 생기게 하려고)
  • 졸았음 책보고 정리하기!!!!!!!!!!!!!!!!!!!!!!!!

<jsp:getProperty>

  • getter와 비슷
  • 표현식을 대체할 수 있다

속성

  • name : 객체명
  • property : 멤버변수(속성)명

<jsp:useBean> 관련 태그(getProperty, setProperty)의 사용 감소 이유

  • 값 가져오는 것은 연산에 사용하기 위함
  • 하지만 연산(로직)은 대부분 자바 클래스에서 처리한다
  • 즉 이제는 잘 사용하지 않는다.
profile
welcome

0개의 댓글