까다로운 녀석..ㅠ.ㅠ

    <table border=”1″>
        <tr>
            <th>순번</th>
            <th>책</th>
            <th>신청자</th>
        </tr>
    <c:forEach items=”${list}” var=”item”>
        <tr>
            <td>${item.num}</td>
            <td><a href=”${item.link}”>${item.bookName}</a></td>
            <td>${item.owners}</td>
        </tr>
    </c:forEach>
    </table>

이녀석을 태그 파일을 사용하여 다음과 같은 인터페이스로 표현하려고 합니다.

<ajn:table item=”list>
    <ajn:column title=”순번” property=”num” />
    <ajn:column title=”책” property=”bookName” link=”link” />
    <ajn:column title=”신청자” property=”owners” />
</ajn:table>

하지만 발생한 버그는 잡힐 줄을 모르고 현재는… 태그 파일 만들기 직전인 상태로 아래와 같습니다.

<table border=”1″>
    <c:set var=”count” value=”0″ scope=”session” />
    <c:forEach items=”${list}” var=”item”>
        <c:choose>
        <c:when test=”${count == 0}”>
        <tr>
            <th>순번</th>
            <th>책</th>
            <th>신청자</th>
        </tr>
        <c:remove var=”count” scope=”session”/>
        </c:when>
        <c:when test=”${count == null}”>
        <tr>
            <td>${item.num}</td>
            <td><a href=”${item.link}”>${item.bookName}</a></td>
            <td>${item.owners}</td>
        </tr>
        </c:when>
        </c:choose>
    </c:forEach>
</table>

for:each 문안에 모두 들어가게 하고 분기문을 사용해서 첫번째에는 title을 찍게 하고 나머진 프로퍼티를 찍는데 link가 있는 경우에는 link를 달아주는 간단한 jstl입니다.

문제는..루프를 아이탬의 갯수 만큼 돌기 때문에 첫번째 아이탬을 출력하는 대신 타이틀을 출력하고 두번째, 세번째 아이탬을 출력합니다. 따라서 결과는…

사용자 삽입 이미지이제 버그의 끝이 슬슬 보이기 시작하는데.. 엄청나게 삽질하면서 JSTL 사용에 익숙해져 가고 있는 모습으로 위안을 삼고 있습니다.

DisplayTag 링크 기능

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

<display:column property=”name” title=”이름” href=”detail.do” paramId=”id” paramProperty=”id” sortable=”true” />

이런식으로 지정해 주면 detail.do 로 링크가 생기며 이 링크로 객체의 id를 id라는 이름으로 넘겨 줍니다.

이것을 받아서 member 한명에 대한 정보를 뿌리는 controller를 만듭니다.
[#M_ more.. | less.. | public class MemberDetailController extends AbstractController{

   private MemberRepository memberRepository;

   @Override
   protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {

       Integer id = Integer.parseInt(request.getParameter(“id”));
       Member member = memberRepository.get(id);
       return new ModelAndView(“detail”, “member”, member);
   }

   public void setMemberRepository(MemberRepository memberRepository) {
       this.memberRepository = memberRepository;
   }
}_M#]id로 넘어온 id를 받은 뒤 그것을 가지고 member 객체를 가져오고 다시 member 객체를 detail이라는 view와 함꼐 ModelAndView 객체에 담아서 리턴합니다. 그럼 viewResolver에 의해서 detail.jsp를 찾아가게 될 것입니다.
[#M_ more.. | less.. | <jsp:root version=”1.2″ xmlns:jsp=”http://java.sun.com/JSP/Page”
    xmlns:display=”urn:jsptld:http://displaytag.sf.net”
    xmlns:c=”urn:jsptld:http://java.sun.com/jstl/core“>

    <jsp:directive.page contentType=”text/html; charset=UTF-8″ />
    <jsp:include page=”inc/header.jsp” flush=”true” />

    <h2><c:out value=”${member.name}”/>’s Information</h2>

    <table>
        <tr>
            <th>이름</th>
            <td><c:out value=”${member.name}”/></td>
        </tr>
        <tr>
            <th>Email</th>
            <td><c:out value=”${member.email}”/></td>
        </tr>
        <tr>
            <th>Phone</th>
            <td><c:out value=”${member.phone}”/></td>
        </tr>
        <tr>
            <th>Blog</th>
            <td><c:out value=”${member.blogAddress}”/></td>
        </tr>
        <tr>
            <th>MessengerId</th>
            <td><c:out value=”${member.messengerId}”/></td>
        </tr>
    </table>

    <jsp:include page=”inc/footer.jsp” flush=”true” />
</jsp:root>_M#]
JSTL을 사용하기 위해 taglib을 지정해 주고 이 페이지에 member객체가 넘어 왔을 테니깐 “${member.name}” 이런식으로 사용해주면 됩니다.

사용자 삽입 이미지
결과는..
사용자 삽입 이미지

JSP 화면 작성

참조 : Spring MVC 어플리케이션 개발 <9> JSP 화면 작성

이전에 컨트롤러를 만들고 viewResolver를 등록해서 적당한 jsp파일에 적당한 객체가 주어지도록 했습니다.[footnote]index.jsp 파일에 memberList 객체를 memberList 라는 이름으로 전달해 주었습니다.[/footnote] 하지만~ 그 객체를 써먹진 않고 그냥 “OK~”만 화면에 출력을 했었습니다.

이번에는 jstl을 사용해서 전달 받은 객체를 가지고 화면에 출력하는 jsp페이지를 만들겠습니다.

JSTL을 사용하기 위해서는 jstl.jar파일과 standard.jar파일이 필요합니다. 이 파일들은 http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi 이곳에서 Taglib를 다운 받아 압축을 풀면 lib 디렉토리에서 찾을 수 있습니다.

위 두 파일을 WEB-INF/lib 폴더에 복사해서 추가를 한 뒤 index.jsp파일을 다음과 같이 수정했습니다.
[#M_ more.. | less.. | <%@ page language=”java” contentType=”text/html; charset=UTF-8″
    pageEncoding=”UTF-8″%>
<%@ taglib prefix=”c” uri=”http://java.sun.com/jstl/core_rt”%>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>Agile Java Network</title>
</head>
<body>
<table border=”1″>
    <caption>Agile Java Network’s All Members</caption>
    <tr align=”left”>
        <th>Name</th>
        <th>Blog</th>
        <th>E-mail</th>
        <th>Messenger ID</th>
        <th>Phone</th>
        <th>&nbsp;</th>
        <th>&nbsp;</th>
    </tr>
    <c:forEach var=”member” items=”${memberList}”>
        <tr>
            <td>${member.name}</td>
            <td><a href=”${member.blogAddress}” targer=”_blank”>보러가기</a></td>
            <td><a href=”mailto:${member.email}” target=”_blank”>보내기</a></td>
            <td>${member.messengerId}</td>
            <td>${member.phone}</td>
            <td><a href=”modify.do?id=${member}”>수정하기</a></td>
            <td><a href=”delete.do?id=${member.id}”>삭제하기</a></td>
        </tr>
    </c:forEach>
</table>
<table border=”1″>
    <tr>
        <td>Name</td>
        <td>Blog</td>
        <td>E-mail</td>
        <td>Messenger ID</td>
        <td>Phone</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td><input type=”text” name=”name” /></td>
        <td><input type=”text” name=”phone” /></td>
        <td><input type=”text” name=”email” /></td>
        <td><input type=”text” name=”blogAddress” /></td>
        <td><input type=”text” name=”messengerID” /></td>
        <td><input type=”submit” value=”Add” /></td>
    </tr>
</table>
</body>
</html>_M#]
그리고 프로그램을 실행시켜 봅시다.
bl105.bmp
휴~ 기나긴 여정의 끝이 보이기 시작합니다.

앞으로 남은 일

1. 삭제하기 버튼을 클릭했을 때 정말 삭제할 것인지 확인 하는 팝업 창이 뜬 뒤에 수정을 해주고 다시 리스트를 뿌려주는 일.

2.수정하기 버튼을 클릭했을 때 수정하는 화면으로 넘어가는 일

3.수정하기 화면에서 수정 완료 버튼을 클릭하면 수정이 완료되었슴을 알리는 글자를 출력하고 다시 이 화면으로 넘어 오는 일

4. 새로운 멤버 추가 버튼(Add)을 클릭하면 새로운 멤버의 정보가 추가되었슴을 알려주고 다시 위 리스트를 보여주기.