Whiteship's Note


태그 파일에서 객체 노출시키기

View/JSP : 2008.10.14 13:27


태그 파일에 어떤 객체를 전달하는게 아니라, 그 반대로 태그 파일에서 어떤 객체를 외부로 노출 시킬 수 있습니다. 태그 파일을 사용하고 있는 쪽에서 태그 파일이 가지고 있는 어떤 값에 접근하고자 할 때 유용하게 사용할 수 있겠습니다. jspContext를 사용하여 원하는 객체를 원하는 이름으로 저장해두면 됩니다.

상위 태그 파일

gridpage.tag

<%@ variable name-given="startNum" %>

<%
jspContext.setAttribute("startNum", count);
%>

JSP 파일

grid.jsp
<o:gridpage>
   ${startNum}
</o:gridpage>


top

Write a comment.


DisplayTag에서 팝업 링크 달기

View/JSP : 2008.10.13 12:13


DisplayTag를 계속해서 사용해보니, 한계점들이 들어납니다. 역시 직접 사용해서 뭔가 만들어보기 전까진 모르는건가 봅니다. 암튼, 찾아보니 어떻게든 방법은 있길래 적용했습니다.

    <d:column title="No">
        <a href="javascript:sendToUpdate(<c:out value="${maingrid.id}" />)">
            <%out.print(count++);%>
        </a>
    </d:column>

거의뭐.. displaytag가 해주는 일은 없습니다. 그냥 자바스크립트를 이용해서 팝업창 띄우기라고 글 제목을 바꿔야할지도 몰겠습니다.

<script type="text/javascript">
function sendToUpdate(selectedId) {
    popup("update.do?id=" + selectedId + "&gridid=maingrid", "maingridpopup", 500, 600, "yes", "yes");
}

이제, 그리드 완성입니다. 태그 파일로 다듬고, 태그 파일 서술자 만들어서 url로 태그 파일 참조해서 사용할 수 있는지만 확인하면 OSAF 배포합니다. 이번 주를 목표로 합니다. 아자 아자 파이팅!!!!
top

Write a comment.


DisplayTag 체크 박스 컬럼 추가하기

View/JSP : 2008.10.01 13:21


참조: http://displaytag.sourceforge.net/11/tut_implicitobjects.html

<d:table name="list" class="maingrid" id="maingrid">
    <d:column><input type="checkbox" name="selectedIds" value="${maingrid.id}"></d:column>

저렇게 table에 id를 주면, implicit 객체에 접근할 수 있습니다. 특정 속성에 접근할 수 있도 있고, 줄 번호를 출력하고 싶을 때 사용할 수 있습니다. 위의 경우 ${maingrid_rawNum} 이라고 하면 줄번호를 출력합니다. 저는 줄번호를 DispalyTag가 아니라 서비스에 첫 번째 줄 번호를 가져와서 차차 찍어주기 때문에, 저 속성은 사용하지 않았습니다. 대신에 id값을 가지고 있는 체크박스를 표현할 때 사용했습니다.

이젠 자바스크립트로 체크된 값들을 가져오는 일이 남았군요.


top

Write a comment.


DisplayTag 히든 컬럼(hidden column) 추가하기

View/JSP : 2008.09.30 17:02


캬오.. 간단하지 않네요. media 속성 값중에 "none"이라는 값을 지원해주면 좋을텐데, 이 값은 지원하지 않습니다. 이슈 트래커에 올리면 반영해주려나.. 흠..

방법은.. 일단 CSS에 hidden이라는 클래스 하나를 추가합니다.

.hidden {
    display: none;
}

그리고 컬럼의 class와 headerClass의 값을 hidden으로 설정해줍니다.

    <d:column property="id" class="hidden" headerClass="hidden" />

끝~ 나중에 OSAF 태그 파일로 감싸서 좀 더 간단하게 이 기능을 제공할 수 있겠습니다. isHidden 이라는 속서을 추가해서 말이죠. 간단하게~ 명시적으로~
top

  1. BlogIcon {-String.Split-|- 2011.12.01 16:38 PERM. MOD/DEL REPLY

    이것은 실제로 흥미있다, 당신은 꽤 자격 작가입니다. 우리는 현재 공급하고 현재 인상적인 문서의 큰 부분을 찾아 방향으로 검색을 통해 가입했습니다. 또한, 내 소셜 네트워킹 사이트 내부 웹 사이트를 배포했습니다!

Write a comment.


그리드 태그 파일 으윽.. 머리야~

View/JSP : 2008.09.30 10:24


사용자 삽입 이미지

현재 그리드에 스타일 적용과 데코레이터 사용법까지 확인을 했고, 뭘 해야 할지 잠시 정리해 봤습니다. 곰곰히..

1. 페이지 네비게이션 바 추가.(완료)
-> displaytag가 제공하는 네비게이션바도 있지만, 그건 이미 많은 양의 데이터를 세션에 집어넣고 그 중에서 페이징처리를 하는거기 때문에 별로입니다. 제대로 페이징을 하려면 서비스 단에서 제공하는 만큼의 데이터가 한 페이지 분량이 되고, 페이징 로직도 서비스단에서 제공하는 걸 이용해야 합니다.

2. id값을 히든 컬럼으로 추가.(완료)
-> 한 Row가 하나의 객체 정보를 보여주고 있고 그 중에 선택을 해서 삭제/수정 작업을 하려면 id를 물고 있어야합니다. 따라서 id 값은 테이블에 안 보이는 컬럼으로 추가되어 있어야합니다.

3. 순번 표시(완료)
-> id가 아닌, 컬럼 줄 수를 표시해야 합니다. 500개의 데이터 중에 해당 줄이 몇 번째 데이터에 해당하는지, 기본적으로 이 순서로 정렬해서 보여줄 필요가 있겠죠. 이 기능도 역시 서비스 단과 맞물려서 동작해야겠습니다. displaytag에서도 뭔가 제공해주겠지만, 그건 저 한 페이지 내용에 대한 순번일 뿐, 전체 데이터에 대한 순번은 서비스 단이 알고 있을테니 말이죠.

4. 정렬 기능(에러)
-> 각 컬럼 헤더에 정렬 단추를 달고, 해당 단추를 눌러서 정렬 할 수 있는 기능을 제공해야 합니다. 이 기능은 displaytag가 제공하기 때문에, 설정만 추가하면 됩니다.

5. 링크 기능
-> 어떤 줄을 더블클릭하면, 바로 수정 화면으로 이동하도록 설정하고 싶습니다. 이 기능은 displaytag가 제공하는 링크 기능을 이용하면 간단하게 될 듯 합니다.

6. 컬럼 데이터 포맷
-> 금액이나 날짜 데이터의 경우 포맷을 설정할 수 있는 기능을 displaytag가 제공합니다. 그 패턴을 좀 익혀서 정리해둬야 겠습니다.

7. 체크 박스
-> 그리드 맨 왼쪽에 체크 박스 컬럼을 만들어서 다중 선택을 지원합니다. 다중 선택으로 해당 객체의 id 값들의 배열을 특정 요청 매개변수로 넘겨줄 수 있다면, 그 뒤엔 여러가지 일들을 할 수 있겠죠.

이밖에도 그리드 편집/새로운 줄 추가 등 여러 기능이 있을 수 있겠지만.. 일단 저 위의 것들부터도 그닥 만만해 보이지 않습니다. 저것만 끝내면 OSAF 공개인데... ㅠ.ㅠ 파이팅 하자 파이팅 해..

updated today 6:00


top

  1. Favicon of http://ttuet.tistory.com BlogIcon 세가그못만 2008.09.30 14:52 PERM. MOD/DEL REPLY

    기선님, 화이팅!

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.09.30 16:59 PERM MOD/DEL

    넵 파이팅!

Write a comment.


휴.. 폼 태그 파일 완성.

View/JSP : 2008.09.22 11:59


<o:popuppage title="사원등록">
    <o:buttons>
        <o:savebtn />
        <o:cancelbtn />
    </o:buttons>
    
    <o:form>
        <o:ftext label="이름" path="name" size="10" maxlength="20" />
        <o:ftext label="아이디" path="loginId" size="15" maxlength="20" desc="최대 20자리까지 입력 할 수 있습니다." />
        <o:fpassword label="패스워드" path="password" size="10" maxlength="16" desc="최대 16자리까지 입력 할 수 있습니다." />
        <o:fradiobuttons label="성별" path="sex" items="${ref.sexType}" />
        <o:fcheckboxes label="취미" path="hobbies" items="${ref.hobbyType}" />
        <o:fselect label="국적" path="location" items="${ref.locations}" isCOV="yes" />
        <o:ftextarea label="메모" path="memo" rows="3" cols="50" />
    </o:form>
</o:popuppage>

이게 추가와 수정시에 사용할 JSP 페이지 코드입니다. JSP를 몰라도 금방 태그 파일 몇개만 익히면 쉽게 페이지를 찍어낼 수 있습니다. 이 페이지에서 사용하고 있는 태그 파일들은 다음과 같습니다.

사용자 삽입 이미지

흠냐~ 이 녀석들로 만들어 낸 화면입니다.
사용자 삽입 이미지

물론 CSS도 가미가 되어 있습니다. CSS는 잘 몰라서 사부님이 만들어 둔 걸 그대로 쓰고 있습니다. 저기 items 뿌리는 부분의 label 스타일을 좀 변경하고 싶은데;; 일단 스타일은 나중에 변경하기로.. ㅋㅋ

사용자 삽입 이미지

업데이트 뷰에서도 위와 동일한 태그를 사용하면 됩니다. 흠.. 버튼을 하나 추가해서 삭제버튼을 달아야겠군요.

이것으로 폼 태그 파일들은 다 준비가 됐습니다. 이제 그리드 태그 파일만 완성하면... 드디어 OSAF를 출시할 수 있게 됩니다. 캬오~~
top

Write a comment.


items를 사용하는 태그 파일 꺄오~

View/JSP : 2008.09.19 19:17


태그 파일 만드는데 무슨 설계가 필요할까? 생각을 하자면, 한 없이 생각할 것이 많을 수 있습니다. 어떤 속성들을 받을 것인가? 속성 타입은 그냥 문자열로 할까 아니면 특정 타입으로 받을까? 태그 파일 코드 중복을 어떻게 제거할까? EL안에 EL을 쓸까? 덩덩덩...

오늘 고민한 건 저 중에서도 어떤 속성과 그 속성에 넘겨줄 값은 무슨 타입인가?에 대한 겁니다. 좀 더 구체적으로 HTML radio, checkbox, select 에 대응하는 태그 파일을 만들 때, items라는 속성에 어떤 값을 넘겨줄지에 대한 고민을 했습니다.

이런 경우가 있겠죠. 취미를 입력받아야 하는데, 예시로 몇개를 제공하고 그 중에서 선택할 수 있게 하려고 합니다. 그럼 화면에 참조할 데이터를 전달해야 합니다. 이 데이터가 최종적으로 items에 설정될 값이죠. 따라서 어떤 값을 넘겨줄 수 있는지 고민을 해야 합니다. 여러 형태로 참조 데이터를 넘겨줄 수 있겠지만, 일단 세 종류로 간추렸습니다.

1. Entity Type Collection

public List<Hobby> getHobbyType{
    return hobbyDao.getAll();
}

public class Member {
    Hobby hobby;
}

Entity 타입의 경우 화면에 보여줄 값을 가지고 있는 변수(textpath)와 실제 값을 가지고 있는 변수(valuepath)가 모두 엔티티의 속성입니다. 그리고 이 변수 이름은 각각의 엔티티에 따라 변할 수 있죠. 따라서 태그 파일에 valuepath와 textpath를 추가하고, 최종적으론 EL의 EL을 사용해서 값을 가져오면 됩니다.

2. Value Type Collection

public List<String> getHobbyType{
  return Arrays.asList("coding", "music", "movie");
}

public class Member{
  String hobby;
}

이 경우는 1번에 비해 매우 간단한데, 일단 차이는 textpath와 valuepath가 콜렉션에 들어있는 값이고, 이 값을 그대로 엔티티에 값으로 설정하면 되며, 일단, 스프링의 form 태그를 활용하면 정말 간단하게 태그 파일을 구현할 수 있습니다.

3. AbstractType's 하위클래스

public HobbyType getHobbyType{
  return HobbyType.getInstance();
}

public class Member {
    int hobby;
}

이 경우는 특수한 경우로, 프레임워크에서 별도의 enum 지원 클래스를 만들었을 때에 해당합니다. 특히 저 코드는 OSAF의 AbstractType을 사용한 경우로, 이 클래스에 대해서는 나중에 자세히 설명할 기회가 있을 것 같아서 자세한 설명은 미루겠습니다. 기본적으로 AbstractType 클래스는 ArrayList 타입입니다. 결국은 1번과 같은 것 아니냐?.. 아닙니다. key, value를 가지고 있는 Pair 타입의 콜렉션이기 때문에, 고정적인 valuepath와 textpath를 가지고 있습니다. 따라서 태그파일에서 컨벤션으로 실제 값과 화면에 보여줄 값을 가져다 보여줄 수 있습니다.

이 세 가지 경우를 모두 고려해서 만들어야 하는 태그 파일들은..

fselect.tag
fradiobuttons.tag
fcheckboxes.tag

Coming Soon...with OSAF!!

ps: 이밖에도 경우수는 더 많습니다. Map, 배열, enum.. 이것들까지 지원할 수 있는 태그를 완성하면.. 짱먹는 폼 태그가 되는거죠. 캬~

top

Write a comment.


1년 반 만에 다시 찾은, EL 안에 EL 사용하는 방법

View/JSP : 2008.09.17 17:50


커스텀 태그에서 Expression Language를 사용하다보면, 언젠간 아래처럼 쓰고 싶은 경우가 발생할 수도 있습니다. 전 예전에 한 번 이 벽에 부딪혀서 결국 못 넘고 좌절한 적이 있는데, 해당 글에 물개선생님이 남겨주신 댓글과 사부님이 만든 태그를 보니.. 이해가 됩니다.

먼저 상황부터 설명을 하자면,..

일단 EL 안에 EL을 사용하고 싶은 경우가 어떤 경우냐면.. 보통 ${member.name} 이렇게 쓰는데, 만약 이 때 이 name라는 값도 변수화 해서 property라는 태그 파일 속성으로 받도록 할 수 있겠습니다. 그리고 이 속성에는 name 뿐만 아니라, age, height 등등 여러 가지 member 객체가 가지고 있는 속성 값을 넣을 수 있다고 했을 때.. EL로 그 속성값을 뿌리려면..

<%@ attribute name="property" required="false" %>

${member.${property}}

이렇게 하고 싶습니다. 그쵸? 하지만, 해보시면 아시겠지만 안 됩니다. 저런 문법을 EL이 지원하질 않습니다.

심각: Servlet.service() for servlet sample threw exception
org.apache.el.parser.ParseException: Encountered "{" at line 1, column 4.
Was expecting one of:
    "}" ...
    "." ...
    "[" ...
    ">" ...
    "gt" ...
    "<" ...
    "lt" ...
    ">=" ...
    "ge" ...
    "<=" ...
    "le" ...
    "==" ...
    "eq" ...
    "!=" ...
    "ne" ...
    "&&" ...
    "and" ...
    "||" ...
    "or" ...
    "*" ...
    "+" ...
    "-" ...
    "?" ...
    "/" ...
    "div" ...
    "%" ...
    "mod" ...
    "(" ...
   
    at org.apache.el.parser.ELParser.generateParseException(ELParser.java:1874)
    at org.apache.el.parser.ELParser.jj_consume_token(ELParser.java:1754)
    at org.apache.el.parser.ELParser.DynamicExpression(ELParser.java:156)

자.. 이런 에러가 발생합니다. 괄호를 안쪽부터 처리해주면 좋겠지만, 희망사항이었던 것 같습니다. ${property}의 값이 name이면 ${member.name} 이 되고.. 이건 내부적으로 member.getName()을 호출해서 가져다주면 좋을텐데 말이죠. 흠... 복잡해 질까봐 이렇게 구현하지 않았을지도 모르겠습니다.

어쨋든, 저 윗 글에 물개선생님이 알려주신 코드대로 하면 EL안에 EL을 사용하는 효과를 얻을 수 있습니다.

<%@ attribute name="property" required="false" %>

<%
property = (property != null) ? property : "name";
Object memberPropertyValue = PageContextImpl.proprietaryEvaluate("${member." + property + "}", Object.class, (PageContext)this.getJspContext(), null, false);
out.print(memberPropertyValue.toString());
%>

이렇게 PageContextImpl를 이용해서 가져오면 됩니다. 위에서 제가 원하던 방법대로 자바 코드를 사용해서 처리한 겁니다. "${member." + property + "} 이렇게 하는 순간, 이미 안 쪽의 변수 값을 가져오기 때문에 이후에는 ${member.name}를 쓰는 것과 같은 것이 됩니다.

흠.. 이상합니다. 저 때도 분명 물개 선생님이 댓글로 코드까지 주셨는데, 저걸 못 써먹고 포기했었습니다. 거의 1년 반이 지난 이제와서 그때 포기했던걸 다시 하게 되네요. ㅋㅋ 1년 반이라...
top

  1. Favicon of http://toby.epril.com BlogIcon '토비 2008.09.17 19:57 PERM. MOD/DEL REPLY

    저 코드는 문제가 있음. 멀까나.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.09.17 20:55 신고 PERM MOD/DEL

    앗!.. 수정했습니다.

  2. 자바인 2009.03.03 11:27 PERM. MOD/DEL REPLY

    단순 출력만을 위해서는
    빈 태그를 사용해도 무난합니다.

    전 게시판 목록을 뿌릴때 사용합니다만..
    <logic:iterate id="list" name="to" property="lists">
    <logic:iterate id="titParam" name="module" property="titParams">
    <bean:write name="list" property="${titParam}" />
    </logic:iterate>
    </logic:iterate>

    제가 구현한 소스의 일부분입니다.
    단순 출력만 할땐 문제가 안되었지만 ..
    length를 체크하여 너무 길면 잘라서 ...으로 나타나게 할려고 하는데 .

    <c:if test="${fn:length(list.${titParam}) > 15}">
    이때가 문제가 되더군요 ..
    네이버에서 'el 안에 el'이라는 키워드로 검색하다 오게되었습니다..

    이 게시물을 보고 희망이 생겼습니다.
    감사합니다 !!
    하지만 PageContextImpl 에 proprietaryEvaluate가 없는것 같은데 ㅠㅠ
    해결방법이 없을까요 ?

    이클립스에서 계속 proprietaryEvaluate 부분에 빨간 밑줄이 그어지네요 .. ㅠㅠ

    Favicon of http://whiteship.me BlogIcon 기선 2009.03.03 11:56 PERM MOD/DEL

    에잉~ 왜그러세요 아마추어 같이 ;)
    API를 보시면 되죠.ㅋㅋ (확인해보시면 아시겠지만 PageContextImpl이 그 매서드 가지고 있습니다.)

    JSP나 태그파일에서 import 문을 빠트리신거 아닐까요?
    아님 이클립스 편집기가 말썽이거나요..
    혹은 오타??

    셋 중 하나일것 같네요.

  3. 자바인 2009.03.03 12:16 PERM. MOD/DEL REPLY

    다른 패키지인가 봅니다 -.,-
    프로젝트에는
    org.apache.taglibs.standard.lang.jstl.test.PageContextImpl
    밖에 없네요 ㅠㅠ
    org.apache.jasper.runtime.PageContextImpl 인가 봐요 ??

    Favicon of http://whiteship.me BlogIcon 기선 2009.03.03 15:09 PERM MOD/DEL

    아.. 다른 패키지에 있는 클래스였군요.ㅎㅎ;;
    넹 후자가 맞습니다.

  4. leeplay 2011.05.11 13:47 PERM. MOD/DEL REPLY

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*,org.apache.jasper.runtime.PageContextImpl"%>

    저렇게 선언하고

    <%@ attribute name="property" required="false" %>

    <%
    property = (property != null) ? property : "name";
    Object memberPropertyValue = PageContextImpl.proprietaryEvaluate("${member." + property + "}", Object.class, (PageContext)this.getJspContext(), null, false);
    out.print(memberPropertyValue.toString());
    %>

    했는데 getJspContext 부분에 에러가 뜹니다-ㅅ-a;; getServletContext 가 있어서 써봣는데
    안되더라구요-ㅁ-; 뭐가 문제인가요?

Write a comment.


태그 파일 중복 제거 예제

View/JSP : 2008.09.17 14:08


스프링 form태그를 이용해서 태그 파일 두 개를 만들었습니다. 하나는 일반 text, 하나는 password입니다.

osaf/ftext.tag
<%@ tag pageEncoding="euc-kr" %>

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<%@ attribute name="path" required="true" %>
<%@ attribute name="label" required="false" %>
<%@ attribute name="size" required="true" %>
<%@ attribute name="maxlength" required="true" %>
<%@ attribute name="desc" required="false" %>

<p id="${path}row">
    <label>${label} :</label>
    <form:input path="${path}" size="${size}" maxlength="${maxlength}"  />
    &nbsp;${desc}
    <form:errors path="${path}" cssClass="error" />
</p>

osaf/fpassword.tag
<%@ tag pageEncoding="euc-kr" %>

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<%@ attribute name="path" required="true" %>
<%@ attribute name="label" required="false" %>
<%@ attribute name="size" required="true" %>
<%@ attribute name="maxlength" required="true" %>
<%@ attribute name="desc" required="false" %>

<p id="${path}row">
    <label>${label} :</label>
    <form:password path="${path}" size="${size}" maxlength="${maxlength}"  />
    &nbsp;${desc}
    <form:errors path="${path}" cssClass="error" />
</p>

코드가 완전 똑같아 보입니다. 무슨 틀린그림 찾기도 아닌데, 차이를 발견하기가 힘듭니다. 어쩔까~~ 내비둘까.. 계속 다른 태그 만들까.. 중복을 제거하고 갈까.. 하다가. TDD 책이 생각났습니다.

꺠진 테스트 -> 코딩 -> 녹색 -> 리팩터링.

태그 파일도 이런 순으로 만들고 있습니다. 일단 뷰부터 만들고(저 태그를 사용하는 JSP 페이지부터 만들고) -> 태그를 작성합니다. -> 화면에 나오는지 확인!..

아무래도 리팩터링을 하고 넘어가야될 듯 합니다. 어떻게 할까.. 대충 떠오릅니다. 저 태그에서 또 다른 태그를 이용해서 화면에 뿌리면되고, 그 태그에 type을 넘겨줘서 그 태그 안에서 분기문으로 ..샤샥.. 유사코드는 떠오르는데 실제 코드는 안 떠오릅니다. OTL 코드는 제 블로그 어딘가를 치팅해가면서;; ㅋ

osaf/felement.tag
<%@ tag pageEncoding="euc-kr" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<%@ attribute name="path" required="true" %>
<%@ attribute name="label" required="false" %>
<%@ attribute name="size" required="true" %>
<%@ attribute name="maxlength" required="true" %>
<%@ attribute name="desc" required="false" %>
<%@ attribute name="type" required="true" %>

<p id="${path}row">
    <label>${label} :</label>
    <c:choose>
        <c:when test="${type =='text'}">
            <form:input path="${path}" size="${size}" maxlength="${maxlength}" />
        </c:when>
        <c:when test="${type =='password'}">
            <form:password path="${path}" size="${size}" maxlength="${maxlength}" />
        </c:when>
    </c:choose>
    &nbsp;${desc}
    <form:errors path="${path}" cssClass="error" />
</p>

좋아. 이 태그를 사용해서 확인해보니, 잘 동작합니다. 그럼 이제 기존의 코드들을 수정합니다.

osaf/ftext.tag
<%@ tag pageEncoding="euc-kr" %>
<%@ taglib prefix="o" tagdir="/WEB-INF/tags/osaf" %>

<%@ attribute name="path" required="true" %>
<%@ attribute name="label" required="false" %>
<%@ attribute name="size" required="true" %>
<%@ attribute name="maxlength" required="true" %>
<%@ attribute name="desc" required="false" %>

<o:felement type="text" label="${label}" path="${path}" maxlength="${maxlength}" size="${size}" desc="${desc}" />

osaf/fpassword.tag
<%@ tag pageEncoding="euc-kr" %>
<%@ taglib prefix="o" tagdir="/WEB-INF/tags/osaf" %>

<%@ attribute name="path" required="true" %>
<%@ attribute name="label" required="false" %>
<%@ attribute name="size" required="true" %>
<%@ attribute name="maxlength" required="true" %>
<%@ attribute name="desc" required="false" %>

<o:felement type="password" label="${label}" path="${path}" maxlength="${maxlength}" size="${size}" desc="${desc}" />

OK. 중복제거 완료 입니다. 덤으로 사용자에게 선택권이 생겼습니다. type 속성을 사용해가면서 felement를 직접 쓰거나, type 속성 쓸 필요 없이 ftext나 fpassword 엘리먼트 사용할 수 있습니다.
top

Write a comment.


태그 파일 배포하기

View/JSP : 2008.09.14 23:12


참조 :
http://docs.sun.com/app/docs/doc/819-3669/bnalj?l=ko&a=view

1. 작성한 태그 파일을 JAR로 묶기

- META-INF/tags 밑에 또는 그 하위 폴더에 태그 파일을 옮기고 묶는다.

2. TLD 파일을 작성하기

- WEB-INF/tag 밑에 두었으면 tld 파일 자동으로 만들어 주지만, 별도의 jar로 배포할 때는 반드시 TLD 파일을 작성해야 함. 태그 파일들의 위치를 알아야할테니..
- tld 파일은 META-INF/ 폴더 또는 그 하위 폴더에 둔다. 태그들이랑 같은 폴더에 둬도 상관없음.

3. JSP에서 참조하기

- <%@ taglib prefix="o" uri="www.opensprout.org" %>
- 여기서 uri는 진짜 URI를 말하는게 아니라, 그냥 이름. TLD 파일에 정의한 uri와 같은 값.
- JSP 2.0 이전에는 DD에 직접 TLD 위치를 설정해줬지만, JSP 2.0부터 WEB-INF/lib에 들어있는 JAR들의 META-INF/ 폴더 밑 그 하위 폴더를 뒤져서 TLD 파일을 찾아냄.

Whiteship's 사족

흠.. 글쿠나.. WEB-INF/tags 밑에 태그 두고 사용하면, 자동으로 TLD 파일을 컨테이너가 만들어 준댔는데.. 그럼 그 파일을 복사해서 좀만 수정해서 TLD를 만들면 편하겠네. 그렇게 자동으로 만들어진 TLD 파일은 어디에 만들어질려나.. WEB-INF/ 폴더 일려나.. 흠... 구하고 싶다. xml 파일 만들기 귀찮은데; TLD 생성기 같은거 없나.

top

TAG JSP, TagFile

Write a comment.


태그 파일 활용 예제

View/JSP : 2008.02.18 21:19


참조 : Developing Custom Tag Libraries as Tag Files

1. JSP 조각 태그 파일로 넘겨주기
- attribute의 fragment 사용하면 돼.
<%@ page contentType="text/html" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags/mytags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Even and Odd Rows</title>
</head>
<body bgcolor="white">
<h1>Even and Odd Rows</h1>
<table>
<my:forEvenAndOdd items="a,b,c,d,e">
<jsp:attribute name="even">
<c:set var="counter" value="${counter + 1}" />
<tr bgcolor="red"><td>${counter}: Even Row</td></tr>
</jsp:attribute>
<jsp:attribute name="odd">
<c:set var="counter" value="${counter + 1}" />
<tr bgcolor="blue"><td>${counter}: Odd Row</td></tr>
</jsp:attribute>
</my:forEvenAndOdd>
</table>
</body>
</html>

이런 HTML이 있을 때 even이랑 odd라는 JSP 조각을 forEvenAdnOdd 태그 파일로 넘긴다. 물론 items라는 속성도 가지고 있다.

<%@ tag body-content="empty" %>
<%@ attribute name="items" rtexprvalue="true" required="true" %>
<%@ attribute name="even" fragment="true" required="true" %>
<%@ attribute name="odd" fragment="true" required="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:forEach items="${items}" varStatus="status">
<c:choose>
<c:when test="${status.count % 2 == 0}">
<jsp:invoke fragment="even" />
</c:when>
<c:otherwise>
<jsp:invoke fragment="odd" />
</c:otherwise>
</c:choose>
</c:forEach> 

태그 파일 안에서 <jsp:invoke>를 사용해서 해당 조각들을 호출할 수 있다. items 속성의 값을 , 로 구분된 리스트로 인식하려고 한 듯, 기본값도 true니까 굳이 적어주지 않아도 될 듯. fragment="true" 는 반드시 설정해 주어야 함. 기본값이 false니까.

JSP에서 태그 파일에서 사용하는 값도 알아야 할 필요가 있다. 위와 같은 경우 태그 타일 내부에서는 a, b, c, d, e를 구분하여 하나씩 값으로 처리하고 있는데 이걸 JSP에서는 모르니까.. JSP로 넘겨주어야 한다. 이럴 때 variable 지시자를 사용한다.

<%@ tag body-content="empty" %>
<%@ attribute name="items" rtexprvalue="true" required="true" %>
<%@ attribute name="even" fragment="true" required="true" %>
<%@ attribute name="odd" fragment="true" required="true" %>
<%@ variable name-given="current" variable-class="java.lang.Object"
scope="NESTED" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach items="${items}" varStatus="status" var="current">
<c:choose>
<c:when test="${status.count % 2 == 0}">
<jsp:invoke fragment="even" />
</c:when>
<c:otherwise>
<jsp:invoke fragment="odd" />
</c:otherwise>
</c:choose>
</c:forEach> 

나머지 부분은 동일하고, current라는 변수를 루프 돌 때 사용하고 있다, 그러면 이제 JSP에서도 current라는 변수로 태그 파일에서 사용하고 있는 값을 참조할 수 있다.

<%@ page contentType="text/html" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags/mytags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Even and Odd Rows</title>
</head>
<body bgcolor="white">
<h1>Even and Odd Rows</h1>
<table>
<my:forEvenAndOdd2 items="a,b,c,d,e">
<jsp:attribute name="even">
<c:set var="counter" value="${counter + 1}" />
<tr bgcolor="red"><td>${counter}: Even Row: ${current}</td></tr>
</jsp:attribute>
<jsp:attribute name="odd">
<c:set var="counter" value="${counter + 1}" />
<tr bgcolor="blue"><td>${counter}: Odd Row: ${current}</td></tr>
</jsp:attribute>
</my:forEvenAndOdd2>
</table>
</body>
</html>
 
그런데, JSP 입장에서 보면 참 쌩뚱 맞을 수 밖에 없다. 느닺없이 current라는 변수가 튀어 나왔다. 도대체 어디서 튀어 나온 녀석이냐며 심각한 고민에 빠질 수도 있다. 그래서 태그의 속성으로 current라는 이름을 리스트의 인자를 가리킬 때 사용할 거라는 것을 알려줘야 한다.

<%@ tag body-content="empty" %>
<%@ attribute name="items" rtexprvalue="true" required="true" %>
<%@ attribute name="var" rtexprvalue="false" required="true" %>
<%@ attribute name="even" fragment="true" required="true" %>
<%@ attribute name="odd" fragment="true" required="true" %>
<%@ variable name-from-attribute="var" alias="current"
variable-class="java.lang.Object" scope="NESTED" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach items="${items}" varStatus="status" var="current">
<c:choose>
<c:when test="${status.count % 2 == 0}">
<jsp:invoke fragment="even" />
</c:when>
<c:otherwise>
<jsp:invoke fragment="odd" />
</c:otherwise>
</c:choose>
</c:forEach>

이전 태그 파일과 다른 부분은 name-given 대신에 name-from-attibute를 사용했고, 그 값으로 var라는 attribute를 지정했다. 이 속성은 rtexprvalue를 false로 지정해두었다. 무슨 값이 오던 신경끄라는 것 같다. 그냥 그 값으로 태그 파일 내부의 값을 참조하게 된다. 안에서 보면 좀 어지럽지만.. 밖에서 보면 간단해진다.

<%@ page contentType="text/html" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags/mytags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Even and Odd Rows</title>
</head>
<body bgcolor="white">
<h1>Even and Odd Rows</h1>
<table>
<my:forEvenAndOdd3 items="a,b,c,d,e" var="anyName">
<jsp:attribute name="even">
<c:set var="counter" value="${counter + 1}" />
<tr bgcolor="red"><td>${counter}: Even Row: ${anyName}</td></tr>
</jsp:attribute>
<jsp:attribute name="odd">
<c:set var="counter" value="${counter + 1}" />
<tr bgcolor="blue"><td>${counter}: Odd Row: ${anyName}</td></tr>
</jsp:attribute>
</my:forEvenAndOdd3>
</table>
</body>
</html> 

멋지다. 이제 더 이상 current라는 변수 명이 어디서 왔는지 신경쓰지 않아도 되고, 거기에 얽매이지 않아도 된다. 원하는 이름으로 태그 파일에 주고 그 이름으로 태그 파일에 있는 값을 가져올 수 있다.

이렇게 진화하는 예제를 가지고 글을 써주는 사람들은 정말 멋진 것 같다. 머리에도 잘 들어오고, 이해하기도 좋은 것 같다. Good!!

top

Write a comment.


태그 파일

View/JSP : 2008.02.18 20:00


참조
Easy Custom Tags with Tag Files, Part 1
Easy Custom Tags with Tag Files, Part 2

JSP 2.0 이전의 커스텀 태그 사용법
1. 핸들러를 작성하고 컴파일 한다.
2. 태그 핸들러와 관련된 태그를 정의한다.

그러나 태그 파일은 미리 컴파일 할 필요 없다. 호출 되는 순간 컴파일 된다.
핸들러 또한 오직 JSP 문법만을 사용하여 만들 수 있다.
태그 라이브러리 서술자 역시 만들 필요 없다. 태그 파일이름을 태그 이름으로 사용하기 때문에.

태그 파일에서 묵시적으로 사용 가능한 객체들
- request     javax.servlet.http.HttpServletRequest
- response     javax.servlet.http.HttpServletResponse
- out     javax.servlet.jsp.JspWriter
- session     javax.servlet.http.HttpSession
- application     javax.servlet.ServletContext
- config     javax.servlet.ServletConfig
- jspContext     javax.servlet.jsp.JspContext

태그 파일 지시자
- <%@ 로 열고 %> 로 닫는다.
- tag      JSP 페이지의 page와 비슷한 지시자
- include     태그 파일에 다른 자원을 포함시킬 때 사용하는 지시자
- taglib     태그 파일에서 커스텀 태그 라이브러리를 사용하고자 할 때 사용
- attribute     태그 파일에 속성 선언할 때 사용
- variable     호출하는 JSP 페이지로 넘겨줄 변수를 정의할 때 사용

tag 지시자의 속성
- display-name      XML 툴에 의해 보여질 간단한 이름. 기본값은 .tag를 짤라버린 태그 파일이름.
- body-content     이 태그의 몸체 컨텐츠에 대한 정보. The value can be empty, tagdependent, or scriptless (default).
- dynamic-attributes     동적인 속성의 지원 여부 알려줌. The value identifies a scoped attribute in which to place a Map containing the names and values of the dynamic attributes passed during this invocation.
- small-icon     보통 사용하지 않는다니까 패스.
- large-icon     보통 사용하지 않는다니까 패스.
- description     태그에 대한 설명.
- example     이 액션을 사용하는 방법에 설명.
- language     태그 파일에서 사용되는 스크립트 언어. The value for this attribute for the current version of JSP must be "java".
- import     page의 import와 같다.
- pageEncoding     page의 속성과 같다.
- isELIgnored     기본값은 false. page의 속성과 같다.
- 사용예
<%@ tag body-content="empty"
import="java.util.Enumeration" %>
<%@ tag import="java.sql.*" %>
- import 빼고는 한 번만 나올 것이다.(모든 속성이 optional이다.)

include 지시자
- 여러 태그 파일에서 공통으로 사용되는 코드가 있을 때 사용한다.
- 사용예
<%@ include file="included.tagf" %>

taglib 지시자
- <%@ taglib uri="tagLibraryURI" prefix="tagPrefix" %> 이런 문법 사용한다.
- 사용예
<%@ taglib prefix="simple" tagdir="/WEB-INF/tags" %>
The server's date: <simple:firstTag/>

attribute 지시자 속성
- name      이 태그 파일이 받아들일 때 사용할 속성 이름. 이 이름은 해당 태그 파일에서 유일 해야 한다.
- required     필수 속성인지 아닌지. false가 기본값.
- fragment     태그 핸들러에 의해 계산되는 fragment인지 아닌지 컨테이너가 그냥 처리할 녀석인지 알려준다. 기본값은 false. 속성의 값을 태그 핸들러가 먼저 처리해야 되면 true로 설정하라.
- rtexprvalue     속성의 값이 scriptlet expression에 의해 동적으로 계산되는 값인지 알려준다. true가 기본값.
- type     속성의 타입. java.lang.String이 기본값.
- description     속성에 대한 설명.

variable 지시자 속성
- atttibute 지시자와 반대로, JSP로 태그 파일안에 있는 어떤 값을 넘겨 줄 수 있고, 여러개를 선언할 수 있으니까 여러 개의 값을 이 태그를 사용한 JSP로 넘길 수 있다.
- name-given      호출한 JSP에 있는 스크립트 언어나 EL 표현식에서 사용할 수 있는 변수 이름. name-from-attribute와 이 속성 둘 중 하나만 존재해야 한다. 태그 파일 내에서 유일해야 한다.
- name-from-attribute     name-given과 동일한데, 다만 이 속성의 값이 attribute의 이름이다.
- alias     이 변수의 값을 가지고 있을 로컬 attriute
- variable-class     이 변수의 타입. java.lang.String이 기본값.
- declare     이 것을 호출하는 페이지나 태그 파일에서 변수가 선언되어 있는지 알려준다. true가 기본값.
- scope     The scope of the scripting variable defined. The possible values are AT_BEGIN, AT_END, and NESTED (default).
- description     변수에 대한 설명.
- 예제
<%@ tag import="java.util.Date"
import="java.text.DateFormat"%>
<%@ variable name-given="longDate" %>
<%@ variable name-given="shortDate" %>
<%
  Date now =
new Date(System.currentTimeMillis());
  DateFormat longFormat =
DateFormat.getDateInstance(DateFormat.LONG);
  DateFormat shortFormat =
DateFormat.getDateInstance(DateFormat.SHORT);
  jspContext.setAttribute(
"longDate", longFormat.format(now));
  jspContext.setAttribute(
"shortDate", shortFormat.format(now));
%>
<jsp:doBody/>

<%@ taglib prefix="tags"
tagdir="/WEB-INF/tags" %>
Today's date:
<br/>
<tags:varDemo>
In long format: ${longDate}
<br/>
In short format: ${shortDate}
</tags:varDemo>

jsp:doBody
- 오직 태그 파일 안에서만 사용할 수 있다.
- 태그의 몸체를 실행할 때 사용한다.
- 몸체를 호출한 결과를 특정 변수에 담고 싶을 때는 var(값을 String으로 받는다.)나 varReader(값을 Reader로 받는다.) 속성을 사용한다.
- 예제
<jsp:doBody var="referer"
scope="session"/>
저렇게 정의해둔 태그로 둘러 쌓인 부분을 실행한 결과를 String 타입으로 refer라는 변수에 session 스콥으로 가지고 있는다.

jsp:invoke
- fragment attribute를 호출할 때 사용한다.
- attribute를 fragment로 설정했다면, 태그 파일 안에서 원하는 만큼 여러번 호출할 수 있다.
- 이것도 jsp:doBody과 같은 역할을 하는 속성을 가질 수 있고, fragment는 필수 속성이다.
- 예제
<%@ attribute name="productDetails"
fragment="true" %>
<%@ variable name-given="productName" %>
<%@ variable name-given="description" %>
<%@ variable name-given="price" %>
<%
  jspContext.setAttribute(
"productName", "Pelesonic DVD Player");
  jspContext.setAttribute(
"description",
    "Dolby Digital output through
coaxial digital-audio jack," +
    " 500 lines horizontal
resolution-image digest viewing");
  jspContext.setAttribute("price", "65");
%>
<jsp:invoke fragment="productDetails"/>

<%@ taglib prefix="easy"
tagdir="/WEB-INF/tags" %>
<html>
<head>
<title>Product Details</title>
</head>
<body>
<easy:invokeDemo>
  <jsp:attribute name="productDetails">
    <table width="220" border="1">
    <tr>
      <td><b>Product Name</b></td>
      <td>${productName}</td>
    </tr>
    <tr>
      <td><b>Description</b></td>
     <td>${description}</td>
    </tr>
    <tr>
      <td><b>Price</b></td>
      <td>${price}</td>
    </tr>
    </table>
  </jsp:attribute>
</easy:invokeDemo>
</body>
</html>

태그 파일 패키징하기
- 태그 라이브러리 서술자. tld 파일을 만들어야 한다.
<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation=
"http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
  version="2.0">
 
  <description>JSP 2.0 tag files</description>
  <tlib-version>1.0</tlib-version>
  <short-name>My Tag Files</short-name>
  <uri>http://www.brainysoftware.com/tagfiles</uri>
  <tag-file>
    <name>encode</name>
    <path>/META-INF/tags/encode.tag</path>
  </tag-file>
</taglib>

- 루트 폴더 밑에 META-INF 폴더를 만들고 그 안에 서술자 파일을 넣는다.
- 태그 파일들은 META-INF 폴더 밑에 tags폴더를 만들고 그 안에 넣는다.
- JAR파일로 묶는다. ex) jar cvf mytagfiles.jar *
- 사용한다.
<%@ taglib prefix="easy"
uri="http://www.brainysoftware.com/tagfiles" %>
<easy:encode input="<br/> means changing line"/>

top

  1. Favicon of http://seal.tistory.com BlogIcon 물개선생 2008.02.19 02:21 PERM. MOD/DEL REPLY

    늘 그렇듯이.. 정리 구우~ㅅ ^^*

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.02.19 09:14 PERM MOD/DEL

    헤헷 물개선생님께 배웠던 내용인데 까먹어서 다시 정리했어요. :)

Write a comment.


JavaServer Pages Standard Tag Library

View/JSP : 2008.02.18 17:10


참조: http://java.sun.com/j2ee/1.4/docs/tutorial/doc/

총 다섯 종류의 표준 태그 라이브러리 제공.

# Core: http://java.sun.com/jsp/jstl/core
# XML: http://java.sun.com/jsp/jstl/xml
# Internationalization: http://java.sun.com/jsp/jstl/fmt
# SQL: http://java.sun.com/jsp/jstl/sql
# Functions: http://java.sun.com/jsp/jstl/functions

Core 태그는 다시 네 가지로 나뉨.

Variable support (remove,set)
Flow control (choose, when, otherwise, forEach, forTokens, if)
URL management  (import, param, redirect, param, url, param)
Miscellaneous (catch, out )

변수 관련 태그

변수 만들기
<c:set var="변수명" value="값" scopr="application|session|request|page" />

변수 지우기
<c:remove var="변수명" />


흐름 제어 태그

조건문

if문
<c:if test="${!empty param.Add}">
  <c:set var="bid" value="${param.Add}"/>
  <jsp:useBean id="bid"  type="java.lang.String" />
   <sql:query var="books"
    dataSource="${applicationScope.bookDS}">
    select * from PUBLIC.books where id = ?
    <sql:param value="${bid}" />
  </sql:query>
  <c:forEach var="bookRow" begin="0" items="${books.rows}">
    <jsp:useBean id="bookRow" type="java.util.Map" />
    <jsp:useBean id="addedBook"
      class="database.BookDetails" scope="page" />
  ...
  <% cart.add(bid, addedBook); %>
...
</c:if>

switch-case와 비스무리한 것
<c:choose>
  <c:when test="${customer.category == 'trial'}" >
    ...
  </c:when>
  <c:when test="${customer.category == 'member'}" >
    ...
  </c:when>
    <c:when test="${customer.category == 'preferred'}" >
    ...
  </c:when>
  <c:otherwise>
    ...
  </c:otherwise>
</c:choose> 

반복문
<c:forEach var="item" items="${sessionScope.cart.items}">
  ...
  <tr>
    <td align="right" bgcolor="#ffffff">
    ${item.quantity}
  </td>
  ...
</c:forEach>

URL 태그, Miscellaneous 태그는 PASS


'View > JSP' 카테고리의 다른 글

1년 반 만에 다시 찾은, EL 안에 EL 사용하는 방법  (7) 2008.09.17
태그 파일 중복 제거 예제  (0) 2008.09.17
태그 파일 배포하기  (0) 2008.09.14
태그 파일 활용 예제  (0) 2008.02.18
태그 파일  (2) 2008.02.18
JavaServer Pages Standard Tag Library  (5) 2008.02.18
JMeter 다운로드 & 사용해보기  (0) 2007.06.29
9. Testing Techniques  (2) 2007.06.26
6. The Decorating Filter Pattern  (0) 2007.06.20
5. Development Using Patterns  (0) 2007.06.06
4. Role Separation with Custom Tags  (0) 2007.06.01
top

  1. 이승훈 2009.08.20 11:01 PERM. MOD/DEL REPLY

    제가 지금 이클립스에서 JSTL설정과 관련하여 골머리를 썩고 있다가 백기선님의 블로그에서 유용한 정보들을 많이 얻게 되어서 다시 또 들릅니다.
    이클립스에서 이상하게도 태그라이브러리 선언하는 한줄만 추가해도 이클립스에서
    "Processing Dirty Regions" 라던가 'NoClassDefError" , "NullException"과 관련 이클립스 오류 메세지를 접하게 되는데 왜 그런것일까요?
    혹시 원인을 알 수 있을까요?
    설정하는 방법은 인터넷을 보면서 이런 저런 기본적인 방법들은 모두 해보았습니다.
    (WEB-INF/tld/*.tld파일들을 넣고 lib폴더안에 두 개의 jar파일도 넣어 보았습니다. )

    Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.08.20 21:08 PERM MOD/DEL

    Deployment Descriptor (web.xml) 에 있는
    web-app element 의 attribute 설정이 잘못됐을 가능성이
    높아 보입니다만...

    참고하세요.
    http://happyzoo.kr/156

    전 게을러서 그런지 제 블로그 팽개쳐두고
    남의 블로그에서만 노는군요... :(

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2009.08.21 00:07 PERM MOD/DEL

    어떤 댓글을 달아야 하나..
    묘책이 떠오르지 않았었는데 감사합니다.

  2. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.08.25 01:16 PERM. MOD/DEL REPLY

    에이... 안 믿습니다.
    단지 제가 먼저 발견했을뿐... :D

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2009.08.26 18:54 PERM MOD/DEL

    ㅋㅋ진짠데요

Write a comment.


JMeter 다운로드 & 사용해보기

View/JSP : 2007.06.29 13:30


1. 바이너리 압축 파일을 다운로드 : http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi
하고 압축을 풀고 bin 디렉토리에서 jmeter.bat를 실행합니다.
사용자 삽입 이미지
AWT를 사용하여 만든 것 같습니다.

2. Test Plan에 Thread Group을 생성합니다.
사용자 삽입 이미지

3. Thread Group을 설정합니다.
사용자 삽입 이미지
20명의 사용자가 동시에(0) 접근하는 것을 10번 반복하여 테스트하겠다고 선언합니다. 샘플러가 에러가 나도 계속(countinue)작업하기로 합니다.

4. 이제 요청을 만듭니다.
사용자 삽입 이미지

5. request를 설정합니다.
사용자 삽입 이미지

6. 결과를 살펴볼 Listener들 중에서 Graph Result를 추가합니다.
사용자 삽입 이미지

7. 테스트를 실행합니다.
사용자 삽입 이미지

8. 그럼 결과가 나타납니다.
사용자 삽입 이미지

아 근데 이게 뭘 나타내는지 모르겠군요.ㅋㅋㅋ

그나마 View In Table은 좀 알아 볼 수 있겠네요.
사용자 삽입 이미지
동시 접속자 20명일 때를 10번 테스트 해본 결과 페이지 로딩하는데 평균 144 밀리세컨이 걸리는군요.

참조 : http://wiki.javajigi.net/display/IDE/JMeter

'View > JSP' 카테고리의 다른 글

태그 파일 중복 제거 예제  (0) 2008.09.17
태그 파일 배포하기  (0) 2008.09.14
태그 파일 활용 예제  (0) 2008.02.18
태그 파일  (2) 2008.02.18
JavaServer Pages Standard Tag Library  (5) 2008.02.18
JMeter 다운로드 & 사용해보기  (0) 2007.06.29
9. Testing Techniques  (2) 2007.06.26
6. The Decorating Filter Pattern  (0) 2007.06.20
5. Development Using Patterns  (0) 2007.06.06
4. Role Separation with Custom Tags  (0) 2007.06.01
3. Role Separation with JavaBeans  (0) 2007.05.29
top

Write a comment.


9. Testing Techniques

View/JSP : 2007.06.26 12:41


책에서 다루고 있는 테스트 종류
    Regression Test :: Unit Test를 묶어 둔 것으로 새로운 기능을 개발하기 전에 실행. 즉 테스트는 다른 테스트에 독립적이어야 함.
    Unit Test :: 단일 메소드 또는 기능을 테스트 하는 것
    Load Test :: 병목현상이나 성능 측정을 위한 테스트

테스트가 왜 중요한가?
    제목하고 어울리는 내용은 아닌것 같은데 시나리오를 들어 설명하고 있었습니다. 갑이라는 사람이 a, b, c 메소드를 구현하고 테스트 합니다. 병이라는 사람이 해당 클래스에 d, e 메소드를 개발하고 테스트 합니다. 그리고 QA팀에 넘겨줬는데 에러가 납니다. 원인은 regression test를 하지 않았기 때문에...

JUnit 테스팅 프레임워크 소개
    역시나 이 프레임워크도 다들 알고 있을 법한 내용인지라...

JMeter 를 사용한 성능 테스트
    오.. 첨보는 거라 한번 해봐야겠습니다.

생각해볼 것
    1. 테스트가 중요함에도 테스트를 잘 작성하지 않는 이유?
    2. 개발하는 모든 메소드를 빠짐없이 테스트 해야 하는가?
    3. p192쪽의 제목 "애플리케이션에 단위 테스트 추가하기"의 코드는 정말 단위 테스트인가?
    4. JMeter 외에 성능 테스트를 위한 오픈소스는 없을까?
    5. 책에서 다루지 않고 있는 테스트의 종류에는 어떤 것이 있을까?

'View > JSP' 카테고리의 다른 글

태그 파일 배포하기  (0) 2008.09.14
태그 파일 활용 예제  (0) 2008.02.18
태그 파일  (2) 2008.02.18
JavaServer Pages Standard Tag Library  (5) 2008.02.18
JMeter 다운로드 & 사용해보기  (0) 2007.06.29
9. Testing Techniques  (2) 2007.06.26
6. The Decorating Filter Pattern  (0) 2007.06.20
5. Development Using Patterns  (0) 2007.06.06
4. Role Separation with Custom Tags  (0) 2007.06.01
3. Role Separation with JavaBeans  (0) 2007.05.29
Foundation of JSP Design Patterns 소스코드  (0) 2007.05.28
top

  1. Favicon of https://springframework.tistory.com BlogIcon 영회 2007.06.26 13:13 신고 PERM. MOD/DEL REPLY

    http://blog.empas.com/ahnyounghoe/list.html?c=1411683

    4번에 대해서 한가지 알려주면.. JMeter는 GUI가 있어 편하긴 하지만..
    Grinder라는 도구가 훨씬 강력함

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2007.06.26 23:18 PERM MOD/DEL

    그런것이 있었군요.
    감사합니다. :)

Write a comment.


6. The Decorating Filter Pattern

View/JSP : 2007.06.20 09:38


참조
- Foundation of JSP Design Patterns
- http://java.sun.com/j2ee/patterns/DecoratingFilter.html

패턴의 정의
Create pluggable filters to process common services in a standard manner without requiring changes to core request processing code. The filters intercept incoming requests and outgoing responses, allowing pre and post-processing. We are able to add and remove these filters unobtrusively, without requiring changes to our existing code.
- 필터로 Http request와 response를 인터셉트 하도록 데코레이션하는 패턴

사용처
- 로깅, 사용자의 권한 체크, 데이터 전달, 데이터 검증

Participants & Responsibilities
사용자 삽입 이미지

패턴 적용 전략
- 커스텀 필터 만들기(Dynamic Filter Strategy), 표준 필터 만들기(Declared Filter Strategy)
- 커스텀 필터의 단점
1. 서블릿안에 필터를 하드 코딩해야 한다. -> 변경 사항이 생기면 서브릿을 수정하고 다시 컴파일
2. Request와 Response 객체를 변경할 수 없다. -> 왜냐면 they'll be dispatched upon completion(?)
- 표준 필터 사용의 장점
1. 애플리케이션 코드와 상관없이 필터를 추가, 수정 할 수 있다.
2. 서블릿 컨틀롤러 밖에서 처리하기 때문에 request와 response 객체를 변경할 수 있다.

필터 적용하기
1. 필터 만들기
    - javax.servlet.Fileter 인터페이스 구현
2. web.xml에 선언하기
    - <filter>
          <filter-name>testFilter</fileter-name>
          <filter-class>x.y.foo</filter-class>
       </filter>
3. URL(또는 URL 패턴으) 또는 특정 서블릿에 매핑하기
    - <filter-mapping>
          <filter-name>testFilter</filter-name>
          <url-pattern>/*</url-pattern>
       </filter-mapping>
or
        <filter-mapping>
         <filter-name>testFilter</filter-name>
         <servlet-name>Bar</servlet-name>
      </filter-mapping>
 
생각해볼 것
1. 커스텀 필터의 단점들 중에 두 번째가 잘 이해가 안 됩니다. Request와 Response 객체를 왜 바꿀 수 없는 것인지...
2. Spring 의 HandlerInterceptor(또는 HandlerInterceptorAdapter)는 필터와 같은 역할을 하는데 프로그래밍 방식으로 구현(표준 인터페이스를 따르지 않고 구현)을 하고 사용은 선언적인 방법(web.xml에 선언하지는 않지만 역시 xml에 적용할 url을 설정해줌)으로 사용합니다. 이 경우 필터보다 구현이 간단하고 사용은 선언적인 필터와 거의 유사합니다. 그렇다면 일반적인 필터와 Spring의 인터셉터의 사용처는 어떻게 구분을 할 수 있을까요? 둘 중에 아무거나 편한 것을 사용하면 될까요?
3. (원래는 AOP를 사용하려고 했지만.. 무언가 잘 안되서..)Spring의 인터셉터를 사용하여 간단하게 사용자가 로그인 한 상태인지 아닌지를 확인하는 것을 구현해본적이 있습니다. 이 때 세션에 해당 객체가 있는지 확인하는 방법으로 구현하였습니다. 이 방법보다 보다 더 보편적이거나 유용한 방법이 있는지 궁금합니다.

'View > JSP' 카테고리의 다른 글

태그 파일 활용 예제  (0) 2008.02.18
태그 파일  (2) 2008.02.18
JavaServer Pages Standard Tag Library  (5) 2008.02.18
JMeter 다운로드 & 사용해보기  (0) 2007.06.29
9. Testing Techniques  (2) 2007.06.26
6. The Decorating Filter Pattern  (0) 2007.06.20
5. Development Using Patterns  (0) 2007.06.06
4. Role Separation with Custom Tags  (0) 2007.06.01
3. Role Separation with JavaBeans  (0) 2007.05.29
Foundation of JSP Design Patterns 소스코드  (0) 2007.05.28
2. Using JSP  (0) 2007.05.28
top

Write a comment.


5. Development Using Patterns

View/JSP : 2007.06.06 21:59


1. Why Use Patterns?
Best Practice니까..
재사용 하려고..
의사소통을 위해..

2. Introducting the J2EE Patterns Catalog
http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html
Presentation tier :: 데이터를 보여주는 것을 책임지는 계층
Business tier :: 비즈니스 처리를 책임지는 계층
Integration tier :: resource 계층과의 연결을 책임지는 계층

3. Looking at Presentation Design Patterns
Decorating Filter Pattern :: request를 처리하기 전에 filter를 거치도록 함.
Front Controller Pattern :: filter를 거쳐온 request를 단일 서블릿에서 처리 함.
Dispatcher View Pattern :: 처리된 결과를 보여줄 JSP를 찾아줌.
View Helper Pattern :: 결과를 보여줄 때 커스텀 태그과 JavaBeans를 적용
p105쪽 그림

4. Understanding MVC
MVC 아키텍처를 적용함으로써 애플리케이션 데이터와 그 데이터를 보여주는 것을 분리함.
분리함으로 써 뷰가 보다 가벼워 짐(lightweight), 쉽게 변경할 수 있슴, 재사용 편리해짐(pluggable and transportable across platform)
p106쪽 그림

5. MVC 예제
모델 만들기(JavaBean) -> View 만들기(JSP) -> 특정 URL을 특정 컨트롤러(servlet)에 바인딩(web.xml) -> 컨트롤러 구현(servlet)

느낀점
- web.xml에 Main 서블릿 등록하는 모습이 Spring의 dispatcher Sevlet과 거의 비슷
- 마지막에 만든 servlet 코드가 너무 방대하다. 역할을 더 나눠야 할 것 같다.
- "컨트롤러 : 화면 = 1 : 다" 요런 관계인데 이러면 정말 서브릿이 무한대로 커지는 거 아닌가?
- Single Entry Point를 유지하면서도 다수의 컨트롤러를 등록하는 방법을 찾아야겠다.

'View > JSP' 카테고리의 다른 글

태그 파일  (2) 2008.02.18
JavaServer Pages Standard Tag Library  (5) 2008.02.18
JMeter 다운로드 & 사용해보기  (0) 2007.06.29
9. Testing Techniques  (2) 2007.06.26
6. The Decorating Filter Pattern  (0) 2007.06.20
5. Development Using Patterns  (0) 2007.06.06
4. Role Separation with Custom Tags  (0) 2007.06.01
3. Role Separation with JavaBeans  (0) 2007.05.29
Foundation of JSP Design Patterns 소스코드  (0) 2007.05.28
2. Using JSP  (0) 2007.05.28
1. JSP Foundation  (0) 2007.05.21
top

Write a comment.


4. Role Separation with Custom Tags

View/JSP : 2007.06.01 13:11


Using Custom Tags
- Sevlet Container가 custom tag를 다루는 과정
1. 페이지 처리 도중에 custom tag를 만나면 제어권을 해당 페이지에서 태크 핸들러에게 넘깁니다. 태그 핸들러에서 필요한 처리를 하고나서 다시 페이지로 제어권을 넘깁니다.
2. Servlet Container는 이런 태그 핸들러 들의 객체를 생성하여 풀에서 관리합니다.
- 태그 핸들러를 taglib 지시자를 사용하여 jsp에 포함시킬 수 있습니다.
ex) <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
- taglib의 uri는 web.xml에 정의되어 있으며 web.xml에서는 해당 uri를 특정 TLD 파일과 매칭시킵니다.
- TLD 파일에는 태그 핸들러 클레스의 위치와 해당 태그에서 사용할 수 있는 속성들의 정보를 가지고 있습니다.
- 태그 핸들러는 자바 클레스 입니다.
1. 태그 만들기 :: TagSupport 클레스 상속
2. Body가 있는 태그 만들기 :: BodyTagSupport 클레스 상속
- 태그 만들기 예제
참조 : http://www.javastudy.co.kr/docs/lec_javaweb/jsp/chapter5.pdf

Introducing Simple Tag
- JSP2.0 에 새로 추가된 기능
- WEB-INF/tag 밑에 태그를 만들어서 사용하면 됩니다.
- 사용 예)<%@ taglib tagdir="/WEB-INF/tags" prefix="tags" %>
- 심플 태그 만들기 예제
참조 : http://whiteship.tistory.com/470




'View > JSP' 카테고리의 다른 글

태그 파일  (2) 2008.02.18
JavaServer Pages Standard Tag Library  (5) 2008.02.18
JMeter 다운로드 & 사용해보기  (0) 2007.06.29
9. Testing Techniques  (2) 2007.06.26
6. The Decorating Filter Pattern  (0) 2007.06.20
5. Development Using Patterns  (0) 2007.06.06
4. Role Separation with Custom Tags  (0) 2007.06.01
3. Role Separation with JavaBeans  (0) 2007.05.29
Foundation of JSP Design Patterns 소스코드  (0) 2007.05.28
2. Using JSP  (0) 2007.05.28
1. JSP Foundation  (0) 2007.05.21
top

Write a comment.


3. Role Separation with JavaBeans

View/JSP : 2007.05.29 17:32


어떻게 하면 잘 돌아가는 것(function well) 뿐만 아니라 인터페이스 까지 볼 수 있는(appealing interface) 애플리케이션을 만들 수 있을까?
- 컨텐츠 생성 과 컨텐츠 표현 계층을 분리하라.
- 이렇게 하면 화면 디자이너가 애플리케이션의 코드와 상관없이 인터페이스만 보고 화면을 개발할 수 있다.
- 애플리케이션 코드를 화면에서 숨길수록 더 깔끔한 표현 계층을 만들 수 있다.

JavaBeans
- Serializable 인터페이스 구현
- default 생성자
- private 속성들
- public getter, setter들

Using JavaBeans
- <jsp:useBean id="objectName" scope="page" calss="class.path" />
- <jsp:getProperty name="objectName" property="propertyName" />
- <jsp:setProperty name="simpleBean" property="propertyName" value="propertyValue" />

Dealing with Large Sets of Data
- 조금씩 그때그때 가져오기
- 왕창 가져와 놓고 조금씩 보여주기 => 캐쉬 사용

Standardizing Form Handling
- validation 과 error reporting
- 검증과정
    - 1. 입력되는 데이터를 임의로 저장한다.
    - 2. 입력된 데이터를 검증하여 에러가 나면 에러를 객체에 저장한다.
    - 3. 2번 과정을 무사히 마치면 데이터베이스에 커밋할 것으로 체크한다.
- 표현과정
    - 1. request의 파라미터로 커밋 될 것인지 확인(submit이라는 파라미터가 있는지 확인)한다.
    - 2. 없으면 에러가 있거나 아직 데이터를 입력하지 않은 상태(폼을 처음 로딩했을 때)니까 폼을 보여준다.(에러가 있으면 에러도 표시)



'View > JSP' 카테고리의 다른 글

태그 파일  (2) 2008.02.18
JavaServer Pages Standard Tag Library  (5) 2008.02.18
JMeter 다운로드 & 사용해보기  (0) 2007.06.29
9. Testing Techniques  (2) 2007.06.26
6. The Decorating Filter Pattern  (0) 2007.06.20
5. Development Using Patterns  (0) 2007.06.06
4. Role Separation with Custom Tags  (0) 2007.06.01
3. Role Separation with JavaBeans  (0) 2007.05.29
Foundation of JSP Design Patterns 소스코드  (0) 2007.05.28
2. Using JSP  (0) 2007.05.28
1. JSP Foundation  (0) 2007.05.21
top

Write a comment.


Foundation of JSP Design Patterns 소스코드

View/JSP : 2007.05.28 19:53


http://www.apress.com/book/download.html 여기서 직접 다운로드 하실 수도 있습니다.
사용자 삽입 이미지
요 화면을 만들려면 Image 파일들이 필요해서 다운로드 해뒀습니다.

'View > JSP' 카테고리의 다른 글

태그 파일  (2) 2008.02.18
JavaServer Pages Standard Tag Library  (5) 2008.02.18
JMeter 다운로드 & 사용해보기  (0) 2007.06.29
9. Testing Techniques  (2) 2007.06.26
6. The Decorating Filter Pattern  (0) 2007.06.20
5. Development Using Patterns  (0) 2007.06.06
4. Role Separation with Custom Tags  (0) 2007.06.01
3. Role Separation with JavaBeans  (0) 2007.05.29
Foundation of JSP Design Patterns 소스코드  (0) 2007.05.28
2. Using JSP  (0) 2007.05.28
1. JSP Foundation  (0) 2007.05.21
top

Write a comment.


2. Using JSP

View/JSP : 2007.05.28 18:38


Handling Errors
- 에러페이지 만들기 :: <%@ page isErrorPage="true" %> ${param.from}   //myError.jsp
- 에러페이지로 포워딩 하기 :: <%@ page errorPage="/myError.jsp?from=custom.jsp" %> // custom.jsp

Including Other Files
- Compile Time :: <%@ include file="myFile.jsp" %>
- Runtime :: <%@ include file="myFile.jsp" flush=true" %>


Processing Form Data
- param 사용 :: ${param.속성이름}
- paramValus 사용 :: ${paramValues.엘리먼트의 name}


Controlling Page Navigation with JSP
- <jsp:include>
- <jsp:forward>

Maintaining State
- Application Data vs Presentation Data
- Session 만들기 :: <%@ page session="true"%>
- Session 스콥 변수 만들기 :: <c:set var="firstName" value="Christina" scope="session" />
- Session 스콥 변수 지우기 :: <c:remove var="firstName" scope="session" />


Initializing and Cleaning Up Jsp Pages
- HttpJspPage 클래스를 상속하는 클래스를 만든다.
- jspInit() 메소드 안에 초기화 관련 코드를 넣어서 오버라이딩 한다.
- jspDestroy() 메소드 안에 청소 관련 코드를 넣어서 오버라이딩 한다.
- service() 메소드에 초기화 한 datasource를 session에 넣어주고 _jspService(request, response) 메소드를 호출해 준다.
- JSP가 여기서 만든 클레스를 상속하도록 설정 :: <%@ page extends="jspBook.util.JspSuper" %>


느낀점
- 소스 쳐 보는게 벌써부터 귀찮아 지고 있다.
- session을 JSP 상에서 만들려면 jstl을 사용해야 되는 군하..
- DB connection 코드를 빼 내는 것이 보안상 굉장히 좋은 일이군하..
- param 이랑 paramValues 라는 객체가 있었구나. sessionScope 이라는 것도 있네.

'View > JSP' 카테고리의 다른 글

태그 파일  (2) 2008.02.18
JavaServer Pages Standard Tag Library  (5) 2008.02.18
JMeter 다운로드 & 사용해보기  (0) 2007.06.29
9. Testing Techniques  (2) 2007.06.26
6. The Decorating Filter Pattern  (0) 2007.06.20
5. Development Using Patterns  (0) 2007.06.06
4. Role Separation with Custom Tags  (0) 2007.06.01
3. Role Separation with JavaBeans  (0) 2007.05.29
Foundation of JSP Design Patterns 소스코드  (0) 2007.05.28
2. Using JSP  (0) 2007.05.28
1. JSP Foundation  (0) 2007.05.21
top

TAG JSP

Write a comment.


1. JSP Foundation

View/JSP : 2007.05.21 11:00


Understanding HTTP
- Http Uses TCP/IP
- 요청(request)와 응답(response)가 HTTP의 핵심
- HTTP 요청의 구성 : 헤더, 폼데이타, 두 종류 있다.(GET - 서버로 부터 데이터를 가져올 때 사용, POST - 서버에 데이터를 추가/수정 할 때 사용)
- HTTP 응답의 구성 : 컨텐츠 타입, 길이, HTTP 버전. 상태코드

Servlet & JSP
- 쓰레드 기반의 Servlet 만들었으나 HTML 출력하기 불편함
- 그리하여 JSP 만들었으나 자바 코드랑 섞여 있어서 디자인 요소랑 분리하고파짐

Web Appication Development 패턴
- Servlet 모델 :: 전부 서브릿으로
- 모델 1 :: 전부 JSP 로
- 모델 2 :: 서브릿(C), JSP(V)에 역할 나눠서 MVC 패턴 구현

Larning JSP Basics
- JSP 페이징 처리 과정 :: 맨 처음 요청 들어오면 JSP 페이지를  Servlet Java 코드로 변환한 뒤 컴파일 하여 class 파일 만들어서 그 클래스파일 로딩해서 처리하는데, 그 다음 요청 부터는 JSP 페이지가 바꼈는지 확인하고 바꼈으면 위에 과정 반복하고 아니면 그냥 처리.
- 라이프 사이클 메서드 :: jpsInit(), _jspService(). jspDestroy() 순으로 호출 되지만 _가 앞에 붙은 메소드는 오버라이딩 금지.(요 부분이 JSP 에서 Servlet 코드로 바뀔 때 만들어 지는 부분이니까 충돌 납니다.)

JSP 페이지 구조
- Direntives
    - <%@ page import="" extends="" buffur="" autoflush="" %>
    = <jsp:directive.page import="" extends="" buffur="" autoflush="" />
    - <%@ include file="" %>
    = <jsp:directive.include file="" />
- Declarations
    - visibal to the rest of the page
    - <%! int balance = 0; %>
    - <jsp:declaration> int balance = 0; </jsp:declaration>
- Scriptlets
    - 요 부분이 _jspService() 에 들어가게 됨
    - <%    %>
    - <jsp:scriptlet> </jsp:scriptlet>
- Expressions
    - <%= %>
    - <jsp:expression> </jsp:expression>

EL 사용하기
- ${변수명.속성명}

JSTL 사용하기
- http://epro.tistory.com/79

1장 소스코드
- 테스트 데이터 넣을 DDL들
- JSP 코드
- 화면
사용자 삽입 이미지

느낀점 & 궁금증
- 코드가 DB 접근, 내용과 표현이 결합으로 인해 정신없슴.
- 어디서 에러가 날지 두려움.
- DB, 디자인, 자바코드 모두 알고 있어야 개발 가능.
- 아직도 이런 방법(모델1)으로 많이 개발을 하고 있을까?

'View > JSP' 카테고리의 다른 글

태그 파일  (2) 2008.02.18
JavaServer Pages Standard Tag Library  (5) 2008.02.18
JMeter 다운로드 & 사용해보기  (0) 2007.06.29
9. Testing Techniques  (2) 2007.06.26
6. The Decorating Filter Pattern  (0) 2007.06.20
5. Development Using Patterns  (0) 2007.06.06
4. Role Separation with Custom Tags  (0) 2007.06.01
3. Role Separation with JavaBeans  (0) 2007.05.29
Foundation of JSP Design Patterns 소스코드  (0) 2007.05.28
2. Using JSP  (0) 2007.05.28
1. JSP Foundation  (0) 2007.05.21
top

Write a comment.