ROOT에 대하여
<a href="">, <form action="">, sendRedirect()의 root = 'ip:port/' (외부 링크로도 이동할 수 있는 경우) <jsp:include page="">, <jsp:forward page="">의 root = 'ip:port/웹 어플리케이션 폴더' (어플리케이션 내부에서만 사용할 수 있는 경우)
- 외부 링크로도 이동할 수 있는 경우는
request.getContextPath()
를 통해 ROOT를 잡아준다!
jsp의 목적 -> 가공된 데이터 보여주기 (데이터 처리까지 하는 게 아님!)
우리는 개념을 배우기 위해 해보는 거지, 실제로는 연산이 jsp 안에 들어가면 안됨 (비권장)
가장 좋은 jsp는 스크립트릿, 표현식이 없는 식
(대체할 수 있는 식이 있음)
JSP 페이지 만들기 - 참여자
1. 개발자
2. 디자이너 (프엔 개발자, 디자이너, 퍼블리셔 등)
디자이너들은 비전공자, jsp를 이해하게 만들기 어려움
하지만 협업을 위해서는 함께 코드를 만들어야 함
-> "jsp 코드를 html처럼 만들자" = 액션 태그
<jsp:include page=“페이지 경로“ flush=“플러시 여부” />
page
: 포함될 JSP 페이지의 경로를 지정flush
: 지정한 JSP 페이지를 실행하기 전 출력 버퍼를 flush할지 여부를 지정 (기본값="false")물리적으로 분리된 내용을 논리적으로 합치는 것 (결과만)
(실행 결과가 버퍼에 구분없이 합쳐져 담겨 보내짐)
<jsp:include>
로 이어지는 jsp 페이지에 패러미터를 추가하기 위해 사용일반 파라미터는 사용자가 결정
jsp:param으로 추가한 파라미터는 개발자가 임의로 만든 것
- 기본객체에 속성 정의하는 게 더 간편하고 활용도 높은 편
- 속성(attribute)는 값으로 '객체'를 가질 수 있기 때문에 적당한 클래스에 원하는 정보를 모두 담아 사용할 수 있다는 것.
setCharacterEncoding()
이용하여 디코딩 설정<jsp:include>
로 이어진 jsp 페이지들에서만 패러미터 사용 가능<%@ include file="포함할 파일(.jspf)" %>
사용 목적 : 공통변수 지정 => 값이나 연산 중복 제거
반복되는 코드(반복문) 숨기려고 사용하기도 함
why? 보기 깔끔하게 하기 위해 (jsp는 개발자와 디자이너가 함께 보는 코드라는 인식)
지정한 페이지(.jspf)를 현재 위치에 포함시킴
.jspf
= 'JSP Fragment' = JSP 소스 코드 조각을 의미
(온전한 jsp 파일이 아님을 시사)
include 디렉티브에서는 변수를 함께 쓸 수 있다
(자바 코드로 바뀌는 단계부터 합쳐지기 때문)
include 디렉티브를 통해서 포함된 파일이 바뀔 경우 WAS가 인식하여 반영
but 인식 못해서 안바뀌는 경우도 있음!! 그때 우리가 할 일
.java
, .class
삭제기본객체의 속성으로 저장할 수도 있지만, 속성을 get/set하는 것조차 줄일 수 있다.
<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'를 삽입하라 지정redirect
와 유사)request
객체 하나를 공유한다. (redirect
와 차이점) redirect
와 차이점)forward 태그의 의미
forward 태그를 가지는 jsp 페이지가 중앙에서 요청-결과의 흐름을 통제할 수 있음
- 개발자가 코드 흐름을 제어하기 수월
- 기능의 모듈화 도움 (재사용, 기능 조합 가능)
- 중간 페이지에서 하는 일 숨길 수 있음
- 첫 버퍼 안에 forward 태그가 담기지 못할 경우
- IllegalStateException : Attemp to clear a buffer that's already been flushed
view.jsp
는 실제로는 컨트롤 기능이지만 겉으로 드러나지 않으므로,
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:useBean id="변수명" scope="기본객체" class="클래스명(패키지 포함)" />
<jsp:useBean>
= 기본객체에서 해당 클래스와 해당 이름을 가지고 있는 속성 가져와서 쓰기 (없으면 기본생성자로 생성) MemberInfo member = (MemberInfo)request.getAttribute("member");
if(member == null) {
member = new MemberInfo();
request.setAttribute("member", member);
}
클래스는 없으면 만들어 넣어줌
없으면 에러 발생시킨다.
property="*"
: 멤버변수와 이름이 같은 패러미터값을 가져와서 대입
<jsp:useBean> 관련 태그(getProperty, setProperty)의 사용 감소 이유
- 값 가져오는 것은 연산에 사용하기 위함
- 하지만 연산(로직)은 대부분 자바 클래스에서 처리한다
- 즉 이제는 잘 사용하지 않는다.