리다이렉트와 비슷하다.
리다이렉트와 동일한 부분 : 요청한 거랑 다른 거 보여준다.
그러나 동작하는 방식이 다르다.
라다이렉트는 from.jsp에게 응답보내고,다시 요청하는 방식.
forward는 from.jsp에 대한 응답이 나가지 않는다.
to.jsp의 존재여부를 알 수 없다.
요청 흐름이 이동할 때 from.jsp에서 사용한 request 기본 객체와 response 기본객체가 to.jsp로 전달된다.
리다이렉트는 다시 돌아오는데, forward는 안돌아온다.
사용법 : <jsp:forward page="이동할 페이지"/>
from.jsp에서 forward를 사용하여 to.jsp를 생성한다면, 웹브라우저 주소는 from.jsp 그대로인다. 라다이렉트처럼 to.jsp로 변경되지 않는다. 웹 컨테이너 내에서 요청 흐름을 이동시키기 때문에, 웹 브라우저는 다른 jsp가 요청을 처리했다는 사실을 알지 못한다.(요청한 페이지를 숨기는 게 목적이다.)
표현식 사용할 수 있다. - forward액션태그에 이동할 페이지를 표현식으로 쓸 수 있다.
라다이렉트보다 포워드가 경제적임. 왔다갔다 하는 것도 낭비라서!
조건에 따라서 다른 페이지로 이동하는 구조를 갖는데, forward액션태그를 사용해서 해당 페이지로 이동한다. 근데 만약 forward액션태그를 사용하지 않을 경우, HTML과 스크립트 등이 섞여서 식이 엄청 복잡해진다. 그리고 새로운 조건을 추가할 경우, else-if문 블럭 하나만 추가하면 돼서 forward구문을 쓰는 게 더 간단한 방법이다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>옵션화면 선택</title>
</head>
<body>
<form action= "<%=request.getContextPath()%>/view.jsp">
//많이 쓰이는 표현이다!!! 이렇게 쓰면 실수가 없음.
rootContext를 꺼내오는 메서드.
보고싶은 페이지 선택:
<select name="code">
<option value="A">A페이지</option>
<option value="B">B페이지</option>
<option value="C">C페이지</option>
</select>
<input type="submit" value="이동">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<% String code = request.getParameter("code");
String viewPageURI = null;
if(code.equals("A")) {
viewPageURI = "/viewModule/a.jsp";
}else if(code.equals("B")){
viewPageURI = "/viewModule/b.jsp";
}else if(code.equals("C")){
viewPageURI = "/viewModule/c.jsp";
}
%>
<jsp:forward page="<%=viewPageURI %>"/>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
이 페이지는 <b><font size="5">A</font></b> 입니다.
</body>
</html>
<결과>
WEB-INF
에서 만든 파일은 외부에서 읽지를 못한다.
근데 만들때가 있다.
클라이언트가 다이렉트로 요청할 수는 없지만, forward로 WEB-INF안에 있는 파일을 불러올 수 있다.
외부에서는 못들어오는데, 내가 거기로 forward하고 있는 페이지를 거쳐야지만 안의 폴더의 파일을 가져올 수 있다.
서버 내부에서 이동하는 것은 된다. 외부에서는 요청할 수 없다.
url은 WEB-INF안의 파일말고 요청한 페이지가 보인다.
<jsp:param>액션 태그를 사용하면 <jsp:forward> 액션 태그로 이동할 페이지에 파라미터를 추가로 전달할 수 있다.
2가지 방식으로 입력할 수 있다.
1. 루트에서 출발(웹 어플리케이션 폴더를 기준으로 함) : 절대경로 - 일반적으로 좋다
: '/'로 시작하면 절대경로가 된다.
2. 현재위치에서 출발 : 상대경로
경로를 보고 절대경로와 상대경로가 무엇인지를 알아야 한다.
<jsp:param>액션 태그를 이용해서 '파라미터'를 전달하면, String밖에 못넣는데 반해 '속성'은 객체를 넣을 수 있다.
속성을 지원하는 객체 : 4개(pageContext,request,session,application)
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import ="java.util.Calendar" %>
<%
Calendar cal = Calendar.getInstance();
request.setAttribute("time", cal);
%>
<jsp:forward page="/to/viewTime.jsp"/>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import = "java.util.Calendar" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>현재시간</title>
</head>
<body>
<%
Calendar cal = (Calendar)request.getAttribute("time");
%>
현재시간은 <%=cal.get(Calendar.HOUR) %>시
<%=cal.get(Calendar.MINUTE) %>분
<%=cal.get(Calendar.SECOND) %>초
</body>
</html>
<결과>
자바빈 : 속성, 변경 이벤트, 객체 직렬화를 위한 표준이다. 이 중에서 jsp에서는 '속성'을 표현하기 위한 용도로 사용된다.
기본생성자 무조건 있어야 한다.-> 자바빈 규약에 보면 기본생성자가 있어야 한다고 적혀있다.
프로퍼티 : 자바빈에 저장되는 값.
기본 구분 : <jsp:useBeam id="[빈이름]" class="[자바빈클래스이름]" scope="[범위]" />
속성
위의 사진 설명
scope로 정의된 객체안에서 id를 뽑아줘 근데 그 객체는 class에 나오는 객체일거야... 이런 뜻인듯..
저기 안에서 부르는게 기본생성자라서 bean에 기본생성자 꼭 만들어 줘야 한다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<jsp:useBean id="member" scope="request" class="chap08.member.MemberInfo"/>
<%
member.setId("madvirus");
member.setName("최범균");
%>
<jsp:setProperty name="member" property="id" value="madvirus"/>
<jsp:setProperty name="member" property="name" value="최범균"/>
<jsp:forward page="/useObject.jsp"></jsp:forward>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<jsp:useBean id="member" scope="request" class ="chap08.member.MemberInfo"></jsp:useBean>
<%--
MemberInfo member = (MemberInfo)request.getAttribute("member");
if(member== null) {
member = new MemberInfo();
request.setAttribute("member", member);
}
--%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>인사말</title>
</head>
<body>
<%=member.getName() %>(<%=member.getId()%>)회원님
안녕하쇼.
</body>
</html>
<jsp:setProperty>,<jsp:getProperty> ->setter,getter의미.
- <jsp:setProperty name="[자바빈]" property="이름" value="[값]"/>
- <jsp:setProperty>의 속성
• name : 프로퍼티의 값을 변경할 자바빈 객체의 이름을 지정한다. (isp:useBean) 액션 태 그의 서 속성에서 지정한 값을 사용한다.
• property : 값을 지정할 프로퍼티의 이름을 지정한다.
• value : 프로퍼티의 값을 지정한다. 표현식((%- 값 96)이나 EL(S값)을 사용할 수 있다.
EL에 대한 내용은 11장에서 배운다.
왜 굳이 이렇게 쓸까? 태그처럼 보이게 하려고.
member.setId("madvirus")
= <jsp:setProperty name="member" property="id" vlaue="madvirus"/>
같은 것을 뜻한다.
<jsp:setProperty name="member" property="id" param="userId"/>
파라미터 중에 userid를 꺼내와서 멤버변수 id에 넣으라는 뜻.
(String id = request.getParameter("userId");
member.setId(id);) 와 같은 말이 된다.
파라미터 중에 객체에 멤버변수 이름 같은 게 있으면 걍 알아서 넣어주라는 뜻.
<jsp:setProperty name="member" property="*"/>
이렇게 적으면 알아서 해준다.
코드가 많을 수록 이렇게 쓰면 큰 효과를 본다.
조건은 멤버변수와 파라미터하고 이름이 같아야 한다는 것이다.
: 자바빈 객체의 프로퍼티 값을 출력할 때 사용.
표현식 대신에 'getProperty'를 사용할 수 있다.
• name : (ispiuseBean)의 id 속성에서 지정한 자바빈 객체의 이름을 지정한다.
• property : 출력할 프로퍼티의 이름을 지정한다.
<%=member.getName() %>(<%=member.getId()%>)을
<jsp:getProperty name="member" property="id"/> 로 바꿀 수 있다.
태그처럼 표현식 대신에 쓰는 것이다.
스크립트릿 같은 거 대신에 태그처럼 표현할 수 있어야 한다.
문자열이어도 setproperty쓰면 알아서 int로 바꿔준다.
계산이나 연산하는 게 jsp에서 안나오고, java에서 처리될거라는 뜻.
그냥 useBean은 유용할 수 있다. get,setproperty는 잘 안쓰인다.