웹(include 액션태그, include디렉티브)

제이·2023년 4월 29일
0

목록 보기
11/15
post-thumbnail

페이지 모듈화와 요청 흐름 제어

배울 내용

  • <jsp:include> 액션 태그와 모듈화

  • include 디렉티브 = <%@ include %>
    위의 두 기능을 사용하면 중복된 코드 없이 여러 jsp코드에 공통된 구성요소를 만들 수 있다.

  • <jsp:forword> 액션 태그를 이용한 흐름 이동

<jsp:include> 액션태그⭐⭐⭐

<jsp : 이름이 나온다> : 액션태그
<jsp:include> :인클루드 액션태그

사용법 : <jsp:include page="포함할 페이지" flush="true"/>

💡<jsp:include page="sub.jsp" flush="false"/>
sub.jsp를 포함시키겠다는 뜻.
flush = true라는 뜻은 'a,b,c,d,e'가 있다면 버퍼에 다 차지 않아도 플러시해서 a,b는 일단 브라우저로 응답으로 보내라는 뜻이다.
flush = false는 flush()시키지말고, 우선 버퍼에 'a,b,c'를 담아놔라는 뜻.
false가 기본값이다.
flush : 플러시하고 합칠거냐 그냥 브라우저에 보낼 것이냐?
결론적으로 사용자는 abcd로 보이기 때문에 두개로 나눠진것을 알 수 없다.
include는 요청이 들어와서 응답이 나갈때까지 복수개의 jsp를 사용하는 방법이다.
->request영역은 요청이 들어와서 응답이 나갈때까지를 말한다.
페이지가 두개 자나가서, 두개의 페이지는 리퀘스트객체를 공유하게 된다.
sub.jsp에서 리퀘스트 객체가 그대로 유지가 된다.
sub.jsp에서 문제생길 때 flsuh는 무조건 false해야한다.

<main.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>main</title>
</head>
<body>
main.jsp에 생성한 내용.

<jsp:include page="sub.jsp" flush="false"/>	

include 이후 내용.
</body>
</html>

sub.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>

<p>
sub.jsp에서 생성한 내용.
</p>

<!-- 필요한 태그만 여기에 써준다.  -->

<결과>

<jsp:include>액션 태그를 이용한 중복 영역 처리

상단과 하단의 부분을 공통적인 부분인데, 만약 jsp파일을 40개만든다면 중복되는 부분이 40개 되는 것이다. 그리고 수정을 하려고 한다면, 전부 다 건들여야 한다. 그래서 이렇게 전부 다 건들이는 것을 막기 위해서 만든다.

공통의 부분을 jsp파일로 뽑아서 작성하고 <jsp:include>액션태그를 사용해서 공통부분 jsp파일로 페이지를 이동시킨다. 사용자에게는 별도의 구분없이, 보인다.

예시
<layout.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>layout1</title>
</head>
<body>
	
	<table width="400" border="1" cellpadding="0" cellspacing="0">
	<tr>
		<td colspan="2">
			<jsp:include page="/module/top.jsp" flush="false"/>
		</td>
	</tr>
	<tr>
		<td width="100" valign="top">
			<jsp:include page="/module/left.jsp" flush="false"/>
		</td>
		<td width="300" valign="top">
			<!--  내용부분 : 시작 -->
			레이아웃1
			<br><br><br>
			<!--  내용부분 : 끝 -->
		</td>
	</tr>
	<tr>
		<td colspan="2">
			<jsp:include page="/module/bottom.jsp" flush="false"/>
		</td>
	</tr>
	</table>
</body>
</html>

<결과>

<layout2.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>layout2</title>
</head>
<body>
	<table width="400" border="1" cellpadding="0" cellspacing="0">
	<tr>
		<td colspan="2">
			<jsp:include page="/module/top.jsp" flush="false"/>
		</td>
	</tr>
	<tr>
		<td width="100" valign="top">
			<jsp:include page="/module/left.jsp" flush="false"/>
		</td>
		<td width="300" valign="top">
			이 부분은 layout2.jsp가 생성한다.<br>
			레이아웃2
			<br><br><br>
		</td>
	</tr>
	<tr>
		<td colspan="2">
			<jsp:include page="/module/bottom.jsp" flush="false"/>
		</td>
	</tr>
	</table>
</body>
</html>

<결과>

상,하, 좌는 고정된 jsp파일을 통해서 작성한다.
그래서 두개의 코드 모두 안의 내용만 다르고 상, 하, 좌는 똑같다.



그럼 안의 내용도 바꾸려면 어떻게 해야 하나?
안의 내용 A와 B도 그냥 jsp파일로 뽑아서 연결하면 된다.

파라미터를 입력해서 start.jsp와 page를 연결하는 듯 -주소창에 연결됨. 처리는 start에서 처리한다.
이때 파라미터는 "?"로 설정하나? - 물어보기.
이러면 중복이 없어지고 추가만 해주면 된다.
화면이 바뀌면 start.jsp만 처리하면 된다.

<strat.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
	String contentsPage = request.getParameter("contentsPage");
	if(contentsPage == null) {
		contentsPage = "a";
	}
	contentsPage += ".jsp";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<%-- template page --%>
<title>start.jsp</title>
</head>
<body>
	<table border="1">
		<tr>
			<td colspan="2">
				<jsp:include page="logo.jsp" />
			</td>
		</tr>
		<tr>
			<td><jsp:include page="menu.jsp" /></td>
			<td><jsp:include page="<%= contentsPage %>" /></td>
		</tr>
	</table>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
Menu
<ul>
	<li><a href="start.jsp?contentsPage=a">page A</a></li>
	<li><a href="start.jsp?contentsPage=b">page B</a></li>
	<li><a href="start.jsp?contentsPage=c">page C</a></li>
</ul>

<logo.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<h1>Logo</h1>

<a.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<h2>a.jsp</h2>

<b.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<h2>b.jsp</h2>

<c.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<h2>c.jsp</h2>

<결과>

a를 누르면 a가 나오고, b,c도 각각 누르면 화면이 바뀐다.

<jsp:param>으로 포함할 페이지에 파라미터 추가하기.

형식은 아래의 사진과 같다.


<jsp:param>액션 태그는 <jsp:include> 의 자식 태그이다.
<jsp:param>액션 태그는 파리미터를 인위적으로 추가할 수 있게 해주는 것이다.
name속성과 value속성은 각각 포함할 페이지에 새로 추가할 파라미터의 이름과 값을 지정.

원래라면, 리퀘스트로 요청이 들어가면 요청이 나올때까지 같이 값을 공유하는데,
이렇게 전체적으로 사용하는 파라미터 말고(result.jsp가 포함되는 파라미터말고),
특정 하나의 jsp에만 즉, some.jsp에만 쓸 수 있는 파라미터를 추가할 수 있다.
include된 파일 안에서만 쓸 수 있는 파라미터를 만들어 준다.
그 안의 연산이 끝나면 그냥 사라진다. 우리가 인위적으로 만든 것이다.
메서드 파라미터와 비슷하다. include가 메서드랑 비슷하다.

속성(attribute)

근데 만약에 some.jsp와 other.jsp만 가지고 있는 파라미터를 다시 result.jsp에게 전달해주고 싶다면???
이럴 때, attribute를 사용해서 공유한다.

속성을 잡아넣으면 어디든 사용할 수 있다.
그래서 param대신에 Attribute를 사용하는 것이 더 좋지 않나 싶다.
문자열뿐만아니라 오브젝트여서 걍 다 던질 수 있기 때문에.

<form.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>form.jsp</title>
</head>
<body>
	<form action="result.jsp" method="get">
		age : <input type="text" name="age" />
		<input type="submit" />
	</form>
</body>
</html>

<result.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>result.jsp</title>
</head>
<body>
	result.jsp : age 파라미터 => 
	<%= request.getParameter("age") %>
	<hr>
	<jsp:include page="some.jsp">
		<jsp:param name="addr" value="busan" />
	</jsp:include>
	<hr>	
	result.jsp : addr 파라미터 => 
	<%= request.getParameter("addr") %>
	result.jsp : myAttr 속성 =>
	<%= request.getAttribute("myAttr") %>
</body>
</html>

<some.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%-- some.jsp --%>
some.jsp : age 파라미터 => 
	<%= request.getParameter("age") %>
<br>
some.jsp : addr 파라미터 => 
	<%= request.getParameter("addr") %>
<hr>
<jsp:include page="other.jsp" />

<other.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%-- other.jsp --%>
other.jsp : age 파라미터 => 
	<%= request.getParameter("age") %>
<br>
other.jsp : addr 파라미터 => 
	<%= request.getParameter("addr") %>
<%
	request.setAttribute("myAttr", "myValue");
%>

<결과>

include 디렉티브

<%@ include %>

include 액션태그와 include 디렉티브 비교하기

<include 액션태그> :<jsp:include page="" flush="">

목적: 눈에 보이는 중복되는 거 소거하기 위해서 사용.
html의 구조같은 거 중복되는 거 삭제하려고.

  • 변환과정
    main.jsp->main_jsp.java ->class파일
    sub.jsp ->sub_jsp.java ->class파일
    두개의 jsp가 있으면 각각 독립적으로 변환된다.
    그리고 합쳐지는 과정은 출력버퍼를 같이 쓰는 것이다.

  • main.jsp에서 sub.jsp를 include한다고 하면,
    버퍼에 main의 a -> sub의 c -> 다시 main의 b 순으로 버퍼에 들어감.
    출력버퍼로 합쳐지는 것이다.
    sub.jsp는 걍 혼자서 쓰일 수 있음. 서로 관계없음.
    동일한 버퍼를 사용함으로 합쳐진다.

<include 디렉티브> : 한몸이 된다. <include file="~~.jspf">

목적 : 디렉티브는 값이나 연산의 중복을 삭제하려고.
.jspf : jsp의 조각이다.

includer.jsp
includee.jspf
위의 두개가 합쳐져서 -> includer_jsp.java ->class파일 하나만.
아예 합친 내용으로 서블릿을 만든다.
쓰임새가 좀 다르다.
인클루드 디렉티브안에 jspf파일이 들어가는 것 같음.

저 합치는 작업은 순전히 WAS한테 의존하다. 하지만 바꿨는데 적용안될수도 있음.
1.그럴때 localhost파일로 가서 includer_jsp.java와 clas파일을 삭제해야한다.
2.그리고 브라우저에 캐시를 삭제해라.
2가지하면 해결된다.

목적
1.모든 jsp페이지에서 사용하는 변수 지정
2.저작권 표시와 같이 모든 페이지에서 중복되는 간단한 문장.

매번 getAttribute같은 거 안해줘도 되고, 그냥 include 하면 사용할 수 있다.
반복되는 코드(반복문 같은거) 눈에 안보이게 하려고 사용한다.
코드같은 거 숨기려고도 사용한다.

코드조각자동포함기능

내가 인클루드 디렉티브를 안써도 자동으로 해주는 게 있다.

  • <jsp-property-group> : jsp의 프로퍼티를 포함한다.
  • <url-pattern> : 프로퍼티를 적용할 jsp파일의 url패턴을 지정한다.
  • <include-prelude> : url-pattern 태그에 지정한 패턴에 해당하는 jsp파일의 앞에 삽입할 파일을 지정한다. 최상단에 자동으로 인클라이드해주는 거. -변수 같은거多
  • <inclued-coda> : url-pattern 태그에 지정한 패턴에 해당하는 jsp 파일의 뒤에 삽입할 파일을 지정한다. 최하단에 자동 인클루드해주는 거. -공통된 정보多
  • <include-prelude><inclued-coda> 태그를 모두 설정해야하는 것은 아니며, 필요한 태그만 설정하면 된다.
  • web.xml에 <jsp-property-group> 태그를 사용해서 2개이상의 파일을 정할 수도 있는데 이때는 내가 적은 순서대로 추가가 된다.
  • 이렇게 자동 되는 것이 인클루드가 '많으면', 어디서 왔는지, 사용했는지 알기 어렵다. 그래서 무조건 사용하면 안된다. 어디있는 지 찾아야 한다.

web.xml

  <jsp-config>
  <jsp-property-group>
  	<url-pattern>/view/*</url-pattern>
    //view에 있는 모든 jsp에 자동으로 들어간다는 뜻.
  	<include-prelude>/common/variable.jspf</include-prelude>
  	<include-coda>/common/footer.jspf</include-coda>
  </jsp-property-group>
  </jsp-config>
</web-app>

/common/varialbe.jspf

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%

java.util.Date CURRENT_TIME = new java.util.Date();
%>

/common/footer.jspf

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!-- 
소스코드 작성 : madvirus.net

 -->

/view/autoInclude.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>
현재 시간은 <%= CURRENT_TIME %> 입니다.
</body>
</html>

결과

04.26,04.28수업

profile
Hello :)

0개의 댓글