웹(forward, 자바빈)

제이·2023년 5월 1일
0

목록 보기
13/15
post-thumbnail

<jsp:forward> 액션태그

  • 리다이렉트와 비슷하다.
    리다이렉트와 동일한 부분 : 요청한 거랑 다른 거 보여준다.
    그러나 동작하는 방식이 다르다.

  • 라다이렉트는 from.jsp에게 응답보내고,다시 요청하는 방식.
    forward는 from.jsp에 대한 응답이 나가지 않는다.
    to.jsp의 존재여부를 알 수 없다.
    요청 흐름이 이동할 때 from.jsp에서 사용한 request 기본 객체와 response 기본객체가 to.jsp로 전달된다.
    리다이렉트는 다시 돌아오는데, forward는 안돌아온다.

  • <jsp:forward>액션 태그를 사용하면 '각 조건을 처리하는 jsp'를 분리하여 기능별로 모듈화할 수 있게 된다.

사용법 : <jsp:forward page="이동할 페이지"/>

  • from.jsp에서 forward를 사용하여 to.jsp를 생성한다면, 웹브라우저 주소는 from.jsp 그대로인다. 라다이렉트처럼 to.jsp로 변경되지 않는다. 웹 컨테이너 내에서 요청 흐름을 이동시키기 때문에, 웹 브라우저는 다른 jsp가 요청을 처리했다는 사실을 알지 못한다.(요청한 페이지를 숨기는 게 목적이다.)

  • 표현식 사용할 수 있다. - forward액션태그에 이동할 페이지를 표현식으로 쓸 수 있다.

  • 라다이렉트보다 포워드가 경제적임. 왔다갔다 하는 것도 낭비라서!

forward 액션태그와 출력 버퍼와의 관계

  • 리다이렉트는 밑에 적힌 코드까지 다 읽는데 반해서
  • forward는 포워드 밑의 코드는 읽지않고, 실행 되지 않는다.(버퍼 비우고 걍 딴 데로 간다.)
    <jsp:forward> 액션 태그가 올바르게 작동하려면, 이 액션태그를 실행하기 전에 웹 브라우저에 데이터가 전송되면 안된다.=> error페이지랑 똑같다. 정상적으로 나오다가 갑자기 중간에 error문구가 뜨게 된다.
    그래서!! forward 되기 전에 flush 되는 걸 막아야 한다.
    그렇게 하려면, 출력버퍼를 늘려놔야한다. 적어도 forward까지 버퍼에 담길 수 있도록 버퍼의 크기를 늘려놔야 한다.

forward를 사용하는 예시

조건에 따라서 다른 페이지로 이동하는 구조를 갖는데, forward액션태그를 사용해서 해당 페이지로 이동한다. 근데 만약 forward액션태그를 사용하지 않을 경우, HTML과 스크립트 등이 섞여서 식이 엄청 복잡해진다. 그리고 새로운 조건을 추가할 경우, else-if문 블럭 하나만 추가하면 돼서 forward구문을 쓰는 게 더 간단한 방법이다.

  • <%=request.getContextPath()%>/view.jsp"> : 많이 쓰이는 표현이다!!! 이렇게 쓰면 실수가 없음. rootContext를 꺼내오는 메서드.
  • 결국 viwe.jsp 페이지의 url이 남는다. 그게 "view"라고 이름 지은 이유이다.

select

<%@ 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>

view.jsp

<%@ 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 %>"/>

viewModule\a.jsp,b.jsp,c.jsp

<%@ 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)

WEB-INF에서 만든 파일은 외부에서 읽지를 못한다.
근데 만들때가 있다.
클라이언트가 다이렉트로 요청할 수는 없지만, forward로 WEB-INF안에 있는 파일을 불러올 수 있다.
외부에서는 못들어오는데, 내가 거기로 forward하고 있는 페이지를 거쳐야지만 안의 폴더의 파일을 가져올 수 있다.
서버 내부에서 이동하는 것은 된다. 외부에서는 요청할 수 없다.
url은 WEB-INF안의 파일말고 요청한 페이지가 보인다.

<jsp:param>액션태그를 이용할 수 있다.

<jsp:param>액션 태그를 사용하면 <jsp:forward> 액션 태그로 이동할 페이지에 파라미터를 추가로 전달할 수 있다.


<jsp:include>와 <jsp:forward>의 page경로

2가지 방식으로 입력할 수 있다.
1. 루트에서 출발(웹 어플리케이션 폴더를 기준으로 함) : 절대경로 - 일반적으로 좋다
: '/'로 시작하면 절대경로가 된다.
2. 현재위치에서 출발 : 상대경로

  • 이동할 페이지가 같은 폴더에 있거나, 내가 현재위치하고 있는 바로 밑의 하위폴더에 있는 경우에 상대경로를 쓴다.
    :'..' 한칸 위로 라는 뜻.

경로를 보고 절대경로와 상대경로가 무엇인지를 알아야 한다.


기본 객체의 '속성'을 이용해서 값 전달하기

<jsp:param>액션 태그를 이용해서 '파라미터'를 전달하면, String밖에 못넣는데 반해 '속성'은 객체를 넣을 수 있다.
속성을 지원하는 객체 : 4개(pageContext,request,session,application)

  • 아래는 request 기본 객체에 속성을 추가한 후에 forward 액션태그를 이용해서 흐름을 이동시키는 예제 코드.
  • makeTime.jsp를 실행하면 현재 시간을 담고 있는 Calender객체를 생성해서 request 기본 객체의 time속성에 저장한 후 viewTime.jsp로 이동한다.
  • viewTime.jsp는 request 기본 객체에 저장된 속성인 time 값을 읽어온다.

makeTime.jsp

<%@ 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"/>

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:useBean> 액션태그

자바빈 : 속성, 변경 이벤트, 객체 직렬화를 위한 표준이다. 이 중에서 jsp에서는 '속성'을 표현하기 위한 용도로 사용된다.

기본생성자 무조건 있어야 한다.-> 자바빈 규약에 보면 기본생성자가 있어야 한다고 적혀있다.

자바빈 프로퍼티

프로퍼티 : 자바빈에 저장되는 값.

  • d : 컴파일 결과로 생성될 클래스 파일의 위치를 지정한다. 실제 클래스 파일은 패키지에 맞는 폴더에 생성된다.

<jsp:useBean> 태그를 이용한 자바 객체 사용

기본 구분 : <jsp:useBeam id="[빈이름]" class="[자바빈클래스이름]" scope="[범위]" />
속성

위의 사진 설명
scope로 정의된 객체안에서 id를 뽑아줘 근데 그 객체는 class에 나오는 객체일거야... 이런 뜻인듯..
저기 안에서 부르는게 기본생성자라서 bean에 기본생성자 꼭 만들어 줘야 한다.

  • id : jsp페이지에서 자바빈 객체에 접근할 때 사용할 이름을 지정.
  • class : 패키지이름을 포함한 자바빈 클래스의 완전한 이름을 입력. - 없으면 새로 만들어줌
  • scope : 자바빈 객체를 저장할 영역을 지정.
  • class속성 대신 type속성을 사용할 수도 있다.
    class는 없으면 새로 만들어줌.
    type를 쓰면 꺼내기만 하고 없으면 에러를 발생시킨다.
    <jsp:useBeam id="member" type="chap08.member.MemberInfo" scope="request"/>

makeObject.jsp

<%@ 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>

useObject.jsp

<%@ 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>

<jsp:setProperty>,<jsp:getProperty> ->setter,getter의미.

<jsp:setProperty>

  • <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"/> 같은 것을 뜻한다.

vaue대신 param사용할수 있다.

<param속성> : param 속성과 value속성은 함께 사용할 수 없다.

<jsp:setProperty name="member" property="id" param="userId"/>
파라미터 중에 userid를 꺼내와서 멤버변수 id에 넣으라는 뜻.
(String id = request.getParameter("userId");
member.setId(id);) 와 같은 말이 된다.

<property속성>

파라미터 중에 객체에 멤버변수 이름 같은 게 있으면 걍 알아서 넣어주라는 뜻.
<jsp:setProperty name="member" property="*"/>
이렇게 적으면 알아서 해준다.
코드가 많을 수록 이렇게 쓰면 큰 효과를 본다.

조건은 멤버변수와 파라미터하고 이름이 같아야 한다는 것이다.

<jsp:getProperty>

: 자바빈 객체의 프로퍼티 값을 출력할 때 사용.
표현식 대신에 'getProperty'를 사용할 수 있다.
• name : (ispiuseBean)의 id 속성에서 지정한 자바빈 객체의 이름을 지정한다.
• property : 출력할 프로퍼티의 이름을 지정한다.

<%=member.getName() %>(<%=member.getId()%>)을
<jsp:getProperty name="member" property="id"/> 로 바꿀 수 있다.
태그처럼 표현식 대신에 쓰는 것이다.
스크립트릿 같은 거 대신에 태그처럼 표현할 수 있어야 한다.

<자바빈 프로퍼티 타입에 따른 값 매핑>

문자열이어도 setproperty쓰면 알아서 int로 바꿔준다.

<useBean액션태그>

계산이나 연산하는 게 jsp에서 안나오고, java에서 처리될거라는 뜻.
그냥 useBean은 유용할 수 있다. get,setproperty는 잘 안쓰인다.

profile
Hello :)

0개의 댓글