태그 파일 활용 예제

참조 : 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!!

태그 파일

참조
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”/>

JavaServer Pages Standard Tag Library

참조: 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

1. JSP Foundation

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들
[#M_ more.. | less.. | INSERT INTO customer(id, lname, fname, age, sex, married, children, smoker)
VALUES (1, ‘Smith’, ‘Jane’, 26, ‘F’, ‘Y’, 2, ‘N’);

INSERT INTO customer(id, lname, fname, age, sex, married, children, smoker)
VALUES (2, ‘Doe’, ‘John’, 47, ‘M’, ‘N’, 0, ‘Y’);

INSERT INTO customer(id, lname, fname, age, sex, married, children, smoker)
VALUES (3, ‘Johnson’, ‘Michael’, 36, ‘M’, ‘Y’, 0, ‘N’);

INSERT INTO customer(id, lname, fname, age, sex, married, children, smoker)
VALUES (4, ‘Brooks’, ‘Susan’, 24, ‘F’, ‘N’, 1, ‘Y’);

INSERT INTO customer(id, lname, fname, age, sex, married, children, smoker)
VALUES (5, ‘Inman’, ‘Bernard’, 34, ‘M’, ‘N’, 0, ‘N’);

INSERT INTO product (id, description, base, lt30, lt50, gt50, m, f, married, children, smoker)
VALUES (1, ‘Preferred Healthcare’, 75.00, 1.0, 1.1, 1.3, 1.1, 1.2, 1.8, 1.4, 1.2);

INSERT INTO product (id, description, base, lt30, lt50, gt50, m, f, married, children, smoker)
VALUES (2, ‘Premium Healthcare’, 65.00, 1.0, 1.1, 1.3, 1.1, 1.2, 1.8, 1.4, 1.2);

INSERT INTO product (id, description, base, lt30, lt50, gt50, m, f, married, children, smoker)
VALUES (3, ‘Value Healthcare’, 50.00, 1.0, 1.1, 1.3, 1.1, 1.2, 1.8, 1.4, 1.2);

_M#]- JSP 코드
[#M_ more.. | less.. | <%@ taglib prefix=”c” uri=”http://java.sun.com/jstl/core_rt” %>
<%@ taglib prefix=”sql” uri=”http://java.sun.com/jstl/sql_rt” %>
<sql:setDataSource
    var=”datasource”
    driver=”com.mysql.jdbc.Driver”
    url=”jdbc:mysql://localhost:3306/quoting?useUnicode=true&amp;chracterEncoding=UTF-8″
    user=”jedi”
    password=”jedi”
/>

<sql:query var=”customers” dataSource=”${datasource}”>
    SELECT * FROM customer
</sql:query>

<html>
    <head>
        <title>Insurance Quoting System</title>
    </head>
    <body>
    <font face=”Arial” />
    <table width=”550″ border=”0″ align=”center”>
    <tr>
        <td bgcolor=”#006633″>
        <div align=”center”>
            <font size=”6″ color=”#FFFFFF”>
                <b>Insurance Quoting System</b>
            </font>
        </div>
        </td>
    </tr>
    <tr>
        <td>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            <p align=”center”><b>Customers</b></p>
            <table width=”350″ border=”0″ align=”center”>
            <c:forEach items=”${customers.rows}” var=”row”>
            <tr>
                <td width=”20″><c:out value=”${row.id}” /></td>
                <td width=”70″><c:out value=”${row.lname}” /></td>
                <td width=”70″><c:out value=”${row.fname}” /></td>
                <td width=”40″>
                    <a href=”custMaint.jsp?id=${row.id}”&action=edit”>edit</a>
                </td>
                <td width=”40″>
                    <a href=”custMaint.jsp?id=${row.id}”&action=delete”>delete</a>
                </td>
                <td width=”110″>
                    <a href=”custMaint.jsp?id=${row.id}”&action=newQuote”>new quote</a>
                </td>
            </tr>
            </c:forEach>
            </table>
        </td>
    </tr>
    <tr>
        <td>
            <p>&nbsp;</p>
            <p align=”center”><a href=”custMaint.jsp?action=add”>New Customer</a></p>
        </td>
    </tr>
    </table>
    </body>
</html>_M#]- 화면
사용자 삽입 이미지
느낀점 & 궁금증
– 코드가 DB 접근, 내용과 표현이 결합으로 인해 정신없슴.
– 어디서 에러가 날지 두려움.
– DB, 디자인, 자바코드 모두 알고 있어야 개발 가능.
– 아직도 이런 방법(모델1)으로 많이 개발을 하고 있을까?