티스토리 뷰


분량이 큰 JSP페이지 작성중에 65535 limit 어쩌고 메시지와 함게 500 서버 에러 를 내는 경우가 있다...

해당 .jsp 파일이 내부에서 .java로 변환되어 지면서 이 용량이 65535를 초과 한다고 하는데
(틀린 부분이면 지적 바랍니다 -_-)

해결책은 2가지이다..
------------------------------
1. 소스 코드의 사이즈를 줄인다
2. 커스텀 태그를 사용한다
------------------------------

중간중간에 include 시킨 것들도 내부에서 .java 파일로 변환시 전부 포함되어버리니 커지는것은 당연할 듯...

그렇다면 소스코드용량을 줄이면 좋겠지만... 이것이 불가능하다면 커스텀 태그를 사용하여 해결하도록 한다.


페이지 상단에 커스텀태그를 정의 한다.
(커스텀 태그명은 사용자 임의로 주면 되므로 적당히 알아서 설정들 하시길...)
<%@ taglib prefix="inc" tagdir="/WEB-INF/tags" %>
prefix
inc라는 태그명을 정의합니다.
include 앞 3글자 따서 정의한건데, 뭐 맘대로 암거나 알아서 주셔도 되겠습네다 -_-;;

tagdir
/WEB-INF/폴더 하단에 tags 라는 폴더를 하나 생성하여 둡니다.


import 시킬 파일에 있던 내용을 tag 파일로 작성하여 보겠습니다.
(이 파일은 /WEB-INF/tags 안에 위치시켜 주세요)
sample.tag
<%@ tag body-content="empty" pageEncoding="UTF-8" %>
<%@ attribute name="value" type="java.lang.Integer" %>
<%@ attribute name="stVar" %>
<%@ attribute name="stVar2" %>
<%
(JSP 코드 기술...)
%>
진~ 하게 표시된 부분들은... 변수 입니다.
import 와 다르게 필요한 변수값이 있을경우, 이것들을 넘겨 받아야 하기 때문이죠

위에서 value 는 정수 형으로, stVar 과 stVar2 는 문자형 데이터를 넘겨 받기 위해 설정되었습니다.
중간에 기술된 JSP 코드들이 원래의 jsp파일에서 해당 위치에 import 됩니다.


커스텀 태그를 이용하여 import !!
<%
(기존 소스코드들...)
%>
<inc:sample value='<%=Integer.parseInt(varInt) %>' stVar='<%=var1 %>' stVar2='<%=var2 %>' />
<%
(기존 소스코드들...)
%>

jsp 코드 부분인 %를 닫은 다음 커스텀태그로 내용을 import 시킵니다.
<커스텀태그:파일명 파라미터1='값1' 파라미터2='값2' ... /> 의 형태로 작성합니다.

설정한 파라미터 값을 넘겨주게 되고, sample.tag 파일에서 넘겨받은 파라미터 값을 사용한 결과가 import 됩니다.


@ 내용 출력 단순 태그 파일 구현

- WEB-INF/tags/now.tag

< %@ tag body-content="empty" pageEncoding="euc-kr" // 태그파일이 나타나는 커스텀태그의 몸체내용이 없다고 표시한다.%>

< %@ tag import = "java.util.Calender" %>

< %Calender = cal = Calender.getInstance(); %>

< %=cal.get(Calender.YEAR)%>


< %=cal.get(Calender.MONTH)+1%>

< %=cal.get(Calender.DATE)%>

 


- now.jsp
< %@ taglib prefix="tf" tagdir="/WEB-INF/tags" %>
< tf:now />


@ 태그파일의 속성 설정 방법
description - 속성에 대한 설명
name - 이름
required - 속성의 필수 여부 지정 true / false
rtexpvalue - 속성값으로 표현식을 사용할수 있는지 여부 지정 true/false
type - 속성값의 타입 명시  java.lang.Integer 등등 기본은 String
fragment - < jsp:attribute> 액션태그로 속성값을 전달할때 이값을 true로 지정한다.


- WEB-INF/tags/header.tag
< %@ tag body-content="empty" pageEncoding="euc-kr" %>
< %@ tag trimDirectiveWhiteSpaces="true" %>
< %@ attribute name="title" required="true" %>
< %@ attribute name="level" type="java.lang.Integer" %>
${title}
< %= level %>


- use_header.jsp
< tf;header title="${'제목'}" level="3" />
< tf;header title="< %= "제목"%>}" level="3" />


@ < jsp:attibute>액션태그를 이용한 속성값 전달
- header.tag
< %@ attibute name="title" fragment="true" %>
< jsp:invoke fragment="title" /> -- 몸체 내용을 그대로 처리하여 출력
< jsp:invoke fragment="title" var="rs" scope="page" /> --rs에 저장
${pageScope.rs}


- use_header.jsp
< %@ taglib prefix="tf" tagdir="/WEB-INF/tags" %>
< tf:header>
   < jsp:attibute name="title">${article.title}< /jsp:attribute> -- 표현식(< %=%>),스크립틀릿은 사용할수 없다.
< /tf:header>


@동적 속성 전달
- select.tag
< %@ tag body-content="empty" pageEncoding="euc-kr" %>
< %@ tag trimDirectiveWhitespaces="true" %>
< %@ tag dynamic-attributes="optionMap" %>
< %@ attibute name="name" required="true" %>
< %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
< select name="${name}" >

   < c:forEach items="${optionMap}" var="option">
   < option value="${option.key}">${option.value} < /option>
   < /c:forEach >
< /select>
- use_select.jsp
< %@ taglib prefix="tf" tagdir="/WEB-INF/tags" %>
< tf:select name="code" rgb="RGB모드" wb="흑백모드" />
< tf:select name="genre" rock="락" ballad="발라드" metal="메탈" />
- 소스
< select = "code">
   < option value="wb">흑백모드< /option>
   < option value="rbg">RGB모드< /option>
< /select>
< select = "genre">
   < option value="rock">락< /option>
   < option value="ballad">발라드< /option>
   < option value="metal">메탈< /option>
< /select>


@ EL 및 태그가 처리된 몸체 내용 사용하기
- removeHtml.tag
< %@ tag body-content="scriptless" pageEncoding="euc-kr" %>
< %@ attribute name="length" type="java.lang.Integer" %>
< %@ attribute name="trail"  %>
< %@ attribute name="trim" %>


< jsp:doBody var="content" scope="page" /> --몸체 내용을content에 저장
< %
   String content = (String)jspContext.getAttibute("content");
   if (trim != null && trim.equals("true")){
      content = content.trim();
   }
   content = content.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?>","");
   if (length != null && length.intValue() > 0 && content.length() > length.intValue()){
      content = content.substring(0,length.intValue());
      if (trail != null){
         content = content+ trail;
      }
   }
%>
< %=content %>
- use_removeHtml.jsp
< c:set var="dateEL" value="< %= new Date() %>" />
< tf:removeHtml trim="true" trail="..." length="15">
   현재시간은 ${dateEL}
< /tf:removeHtml>
- 결과
현재시간은 Fri Apr 03 ...


@몸체 내용자체를 데이터로 사용하기
- out.tag
< %@ body-content="tagdependent" pageEncoding="euc-kr" %>
< jsp:doBody var="bodyText " />
이럼 태그도 그냥 전부 출력되어버려진다.


@몸체 내용을 반복적으로 사용하기
-multiple.tag
< %@ attribute name="count" required="true"  type="java.lang.Integer" %>
< c:forEach begin="${1}" end="${count}" >
   < jsp:doBody />
< /c:forEach>
-use_multiple.jsp
< c:set var="num" value="${1}" />
< tf:multiple count="10" >
   ${num} < br/>
   < c:set var="num" value="${num+1}" />
</ tf:multiple >
- 결과
1
2
3
4
5
6
7
8
9
10


댓글
댓글쓰기 폼