'custom Tag'에 해당되는 글 1건

  1. 2009.01.07 게시판, 자료실, XML과 JSP, JDOM, JSTL, Custom TAG

게시판, 자료실, XML과 JSP, JDOM, JSTL, Custom TAG

|

▩ Resin 2.X, Tomcat 4.X를 사용합니다.

1. resin의 셋팅
    <web-app id='jboard_100_mysql'/>
  </host>

 


▩ 게시판 데이터베이스 셋팅

1. 테이블 구조

mysql -u root mysql

use mysql;

create database mysqldb;
grant all privileges on mysqldb.* to nulunggi identified  by '123'; 
flush privileges;
grant all privileges on mysqldb.* to shinji@localhost identified  by '123'; 
flush privileges;

select host, user, password from user;

nulunggi로 로그인: mysql -u nulunggi -p mysqldb


CREATE TABLE board (
 num                 int(11)              NOT NULL  auto_increment  ,
 wname                varchar(15)          NULL      ,
 email               varchar(30)          NULL      ,
 homepage            varchar(50)          NULL      ,
 subject             varchar(50)          NULL      ,
 wcontent             text                 NULL      ,
 pos                 int(11)              NULL      ,
 depth               smallint(5)          NULL      ,
 regdate             date                 NULL      ,
 pass                varchar(15)          NULL      ,
 count               smallint(5)          NULL      ,
 ip                  varchar(15)          NULL      ,
 PRIMARY KEY ( num )
);

 


▩ Eclise 설정

1. Resin의 doc 폴더아래에 jboard_100_mysql 폴더를 생성합니다.


2. 빈이 들어갈 폴더를 다음과 같이 생성합니다.
   D:\resin-2.1.11\doc\jboard_100_mysql\WEB-INF\classes


3. Eclipse에서 "Tomcat-Project" or "Java Project"를 선택합니다.
   - Project Name: jboard_100_mysql
   - Directory: D:\resin-2.1.11\doc\jboard_100_mysql\WEB-INF\classes

 

4. "src"폴더를 추가하고 bin폴더는 추가하지 않습니다.
   - mysql JDBC 드라이버를 추가합니다.

 

5. "src"폴더를 선택하고 [class]를 생성합니다.
   - Name: BoardBean
   - Package: jboard_100_mysql

 

6. 답변 원리의 이해
mysql> select subject,num,depth,pos from board order by pos asc;
+---------+-----+-------+------+
| subject | num | depth | pos  |
+---------+-----+-------+------+
| 부모글1 |   1 |     0 |    0 |
+---------+-----+-------+------+

 

mysql> select subject,num,depth,pos from board order by pos asc;
+---------+-----+-------+------+
| subject | num | depth | pos  |
+---------+-----+-------+------+
| 부모글2 |   2 |     0 |    0 |
| 부모글1 |   1 |     0 |    1 |
+---------+-----+-------+------+

 

mysql> select subject,num,depth,pos from board order by pos asc;
+---------+-----+-------+------+
| subject | num | depth | pos  |
+---------+-----+-------+------+
| 부모글3 |   3 |     0 |    0 |
| 부모글2 |   2 |     0 |    1 |
| 부모글1 |   1 |     0 |    2 |
+---------+-----+-------+------+

 

mysql> select subject,num,depth,pos from board order by pos asc;
+-----------------------+-----+-------+------+
| subject               | num | depth | pos  |
+-----------------------+-----+-------+------+
| 부모글3               |   3 |     0 |    0 |
| 부모글2               |   2 |     0 |    1 |
| 부모글1               |   1 |     0 |    2 |
| [답변]부모글1의 답변1 |   4 |     1 |    3 |
+-----------------------+-----+-------+------+

 

mysql> select subject,num,depth,pos from board order by pos asc;
+-----------------------+-----+-------+------+
| subject               | num | depth | pos  |
+-----------------------+-----+-------+------+
| 부모글3               |   3 |     0 |    0 |
| 부모글2               |   2 |     0 |    1 |
| [답변]부모글2의 답변1 |   5 |     1 |    2 |
| 부모글1               |   1 |     0 |    3 |
| [답변]부모글1의 답변1 |   4 |     1 |    4 |
+-----------------------+-----+-------+------+

 

mysql> select subject,num,depth,pos from board order by pos asc;
+-----------------------+-----+-------+------+
| subject               | num | depth | pos  |
+-----------------------+-----+-------+------+
| 부모글3               |   3 |     0 |    0 |
| [답변]부모글3의 답변1 |   6 |     1 |    1 |
| 부모글2               |   2 |     0 |    2 |
| [답변]부모글2의 답변1 |   5 |     1 |    3 |
| 부모글1               |   1 |     0 |    4 |
| [답변]부모글1의 답변1 |   4 |     1 |    5 |
+-----------------------+-----+-------+------+

 

mysql> select subject,num,depth,pos from board order by pos asc;
+-----------------------+-----+-------+------+
| subject               | num | depth | pos  |
+-----------------------+-----+-------+------+
| 부모글3               |   3 |     0 |    0 |
| [답변]부모글3의 답변2 |   7 |     1 |    1 |
| [답변]부모글3의 답변1 |   6 |     1 |    2 |
| 부모글2               |   2 |     0 |    3 |
| [답변]부모글2의 답변1 |   5 |     1 |    4 |
| 부모글1               |   1 |     0 |    5 |
| [답변]부모글1의 답변1 |   4 |     1 |    6 |
+-----------------------+-----+-------+------+

 

mysql> select subject,num,depth,pos from board order by pos asc;
+-------------------------------------+-----+-------+------+
| subject                             | num | depth | pos  |
+-------------------------------------+-----+-------+------+
| 부모글3                             |   3 |     0 |    0 |
| [답변]부모글3의 답변2               |   7 |     1 |    1 |
| [답변][답변]부모글3의 답변2의 답변1 |   8 |     2 |    2 |
| [답변]부모글3의 답변1               |   6 |     1 |    3 |
| 부모글2                             |   2 |     0 |    4 |
| [답변]부모글2의 답변1               |   5 |     1 |    5 |
| 부모글1                             |   1 |     0 |    6 |
| [답변]부모글1의 답변1               |   4 |     1 |    7 |
+-------------------------------------+-----+-------+------+

 

7. 페이징의 원리

insert into board(wname,subject,wcontent, pass) VALUES('왕눈이','안녕하세요','안녕하세요','123');

 

8. 검색 원리

 


▩ 자료실 만들기 MySQL 4.0
   - 자료실 322번 참고

1. Tomcat, Resin 셋팅하기 resin.conf 수정
    <web-app id='/jdataroom_103_mysql'/>
  </host>

 

2. jspSmart 콤포넌트 설치하기
  


3. 데이터베이스 셋팅하기
//MySql 4.0 버전 기준 입니다.

자료실 테이블 구조 입니다.
create database mysqldb;
grant all privileges on mysqldb.* to shinji@localhost identified  by '123'; 
flush privileges;
grant all privileges on mysqldb.* to nulunggi identified  by '123'; 
flush privileges;
select host, user, password from user;

create table dataroom(
 num   int not null auto_increment primary key,
 title     varchar  (100)  NULL ,
 wname      varchar  (20)   NULL ,
 email     varchar  (50)   NULL ,
 visited   int        DEFAULT 0 ,
 dTime     varchar  (30)   NULL ,
 wcontent   text   NULL ,
 ref       int        DEFAULT 0 ,
 indent    smallint   DEFAULT 0 ,
 ansnum    smallint   DEFAULT 0 ,
 passwd    varchar  (10)   NULL,
 filename  varchar  (30)   NULL,
 filesize  int        NULL
);

select * from dataroom;

 

4. http://127.0.0.1:8080/jdataroom_103_mysql/bbs.jsp   

 

5. 파일 업로드의 원리

   <form action="write_end.jsp" method="post" name="myform" enctype="multipart/form-data">

 

 

▩ XML(Extensible Markup Language)과 JSP 프로그래밍

1. XML(eXtensible Markup Language)과 HTML(Hyper Text Markup Language)의 차이점
   - 배우기 어렵고 관련 주변기슬을 알아야 함   <---> HTML: 상대적으로 쉽게 배울 수 있음
   - 문서에 출력되는 문자가 정보의 셩격이 강함 <---> HTML: 단순히 문서를 출력함
   - XML파일 자체로도 데이터의 표현이 가능함   <---> HTML: 태그의 의미가 없고 데이터라고 보기 어려움
   - 데이터를 검색하여 처리하기 편리함         <---> HTML: 출력된 문서에서 값을 찾는 것이 어려움
   - 출력시 XSL이라는 언어를 사용함            <---> HTML: CSS를 사용하여 출력함
   - 사용자가 태그를 만들수 있음               <---> HTML: 만들 수 없음
   - 대소문자 철저히 구분                      <---> HTML: 대소문자 구분 안함
   - 하나의 루트 태그 존재                     <---> HTML: 여러개의 <HTML>태그 존재 가능
   - 태그가 부정확할시 태그관련 에러 정보 출력 <---> HTML: 에러 발생시 원인을 손수 찾아야 함
   - 안김구조로 태그를 기술함                  <---> HTML: 겹쳐진 상태도 가능함
   - 속성값은 더블쿼테이션(")을 이용한         <---> HTML: 다양한 속성값을 지정할 수 있음
   - XML문서는 데이터를 저장하는 문서로 쓰임
   - DTD(Document Type Definition)문서는 태그의 구조를 기술하는 문서임
   - XSL(eXtensible Stylesheet Language, XSLT, SXLF)문서는 태그의 출력 형식을 기술하는 문서임
   - 단순히 보여주는 홈페이지를 만들경우 복잡함 <---> HTML: 웹페이지를 신속히 제작할 수 있음
   - 공백도 구분함                             <---> HTML: 1칸 이상의 공백은 의미가 없음


 
2. XML과 XSL문서의 실습

>>>>> student.xml
탐색기에서 파일 열기로 파일을 엽니다. D:\Tomcat-4-1\webapps\test\student.xml

<?xml version="1.0" encoding="euc-kr"?>
<student>
     <학생>
          <학번>20010001</학번>
          <성명>홍길동</성명>
          <전화번호>016-256-7874</전화번호>
          <강의실>STEP 1</강의실>
          <주소>서울시 강남구 역삼동</주소>
     </학생>
     <학생>
          <학번>20010002</학번>
          <성명>홍길순</성명>
          <전화번호>017-436-7874</전화번호>
          <강의실>STEP 2</강의실>
          <주소>서울시 서초구 서초동</주소>
     </학생>
     <학생>
          <학번>20010003</학번>
          <성명>왕눈이</성명>
          <전화번호>018-856-7874</전화번호>
          <강의실>STEP 3</강의실>
          <주소>서울시 서초구 양재동</주소>
     </학생>
</student>

 

>>>>> display.xsl
- XSL의 적용: <?xml-stylesheet type="text/xsl" href="display.xsl"?>


<?xml version="1.0" encoding="euc-kr"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
     <table border="1">
          <tr>
        <td>학번</td>
        <td>성명</td>
        <td>전화번호</td>
        <td>강의실</td>
        <td>주소</td>
          </tr>
   <xsl:for-each select="student/학생">
   <tr>
        <td><xsl:value-of select="학번"/></td>
        <td><xsl:value-of select="성명"/></td>
               <td><xsl:value-of select="전화번호"/></td>
              <td><xsl:value-of select="강의실"/></td>
        <td><xsl:value-of select="주소"/></td>
          </tr>
   </xsl:for-each>
     </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

 


▩ XML Parser
   - XML문서의 분석
   - XML Parser를 구현하는 인터페이스로는 DOM(Document Object Model), SAX(Simple API for XML)라는
     공통된 인터페이스가 있으며 각 언어별로 구현해야함
   - DOM은 Tree구조에 기반하여 XML문서를 파싱함, XML문서를 모두 메모리에 올려놓고 처리할 필요가 있는 경우 사용,
     XML문서가 큰 경우 많은 메모리 사용하는 단점이 있음
   - SAX는 이벤트 기반하에 XML문서를 파싱하는 구조를 가지고 있음, 이벤트에 따른 특정 부분을 처리함

 


▩ JDOM 설치
   - Java기반 DOM, SAX 지원 API
   - JDOM 파서의 다운: http://www.jdom.org/downloads/index.html
   - D:\pdsfile\java\jdom-b9\jdom-b9\build 폴더의 jdom.jar 파일을
     C:\j2sdk1.4.2_03\jre\lib\ext 폴더에 복사합니다.
   - Tomcat server.xml 환경 설정하기
     <!-- XML Test Application -->
     <Context path="/xTest" reloadable="true" docBase="D:/Tomcat-4-1/webapps/xmlTest" />

    - resin.conf
    <web-app id='/examples/login'/>
    <web-app id='/xmlTest'/>
  </host>

 


▩ JDOM을 이용하여 XML문서를 불러오기

>>>>> mail.xml
<?xml version="1.0" encoding="euc-kr"?>
<?xml-stylesheet type="text/xsl" href="mail.xsl" ?>

<mail>
    <from>왕눈이</from>
    <to>아로미</to>
    <content>보고싶고 사랑하는 아로미양에게</content>
</mail>
 


>>>>> mail.xsl
<?xml version="1.0" encoding="euc-kr" ?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">

 <HTML>
 <H1> 내용 : <xsl:value-of select="mail/content" /></H1>
 <H2> FROM : <xsl:value-of select="mail/from" /></H2>
 <H2> TO   : <xsl:value-of select="mail/to" /></H2>
 </HTML>

</xsl:template>

</xsl:stylesheet>

 

>>>>> MailViewBean.java
package xmlTest;

import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;

public class MailViewBean{
 private static String XML_FILE_DIR;
 private static String XML_FILE_NAME;

 SAXBuilder builder;
 Document doc;
 Element root;

 public MailViewBean(){
  XML_FILE_DIR ="D:/Tomcat-4-1-29/webapps/xmlTest";
  XML_FILE_NAME="mail.xml";

  try {
   builder = new SAXBuilder();
   doc = builder.build(new File(XML_FILE_DIR,XML_FILE_NAME));
  }catch(Exception e) {
   e.printStackTrace();
  }

 }

 public Hashtable getMailInfo(){
  Hashtable myXML = new Hashtable();
  root = doc.getRootElement();
  Element from=root.getChild("from");
  Element to = root.getChild("to");
  Element content = root.getChild("content");
  myXML.put("from", from.getText());
  myXML.put("to", to.getText());
  myXML.put("content", content.getText());
  return myXML;
 }
 
}
  


>>>>> mailView.jsp
<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.*"%>
<jsp:useBean id="bean" class="xmlTest.MailViewBean" />

<%
Hashtable mail=bean.getMailInfo();
String from =(String) mail.get("from");
String to = (String) mail.get("to");
String content = (String) mail.get("content");
%>
  
<html>
<head>
 <title>JDOM 이용한 XML 분석</title>
</head>
<body>
<table width="90%" border="1" cellspacing="0" cellpadding="2"  align="center">
    <tr align="center" bgcolor="#996600">
      <td colspan="3"><font color="#FFFFFF"><b>메일 읽기</b></font></td>
    </tr>
    <tr>
      <td width="24%">보낸 분</td>
      <td width="41%"><%=from%></td>
    </tr>
    <tr>
      <td>받는 분</td>
      <td><%=to%></td>
    </tr>
    <tr>
      <td>내용</td>
      <td><%=content%></td>
    </tr>
</table>
</body>
</html>

 


▩ XML 파일에 데이터의 입력
   - 테스트: http://127.0.0.1:8080/xTest/Address.jsp
   - 컴파일: cd Tomcat-4-1\webapps
             javac -d WEB-INF/classes -classpath %CLASSPATH%;D:\Tomcat-4-1\webapps\xmlTest\WEB-INF\classes Address.java

>>>>> Address.java
package xmlTest;

public class Address {
 String name="";
 String phone="";
 String addr="";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }
}

 

>>>>> AddressBean.java
package xmlTest;

import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;

public class AddressBean{

 private static String XML_FILE_DIR;
 private static String XML_FILE_NAME;

 SAXBuilder builder;
 Document doc;
 Element root;

 public AddressBean()
 {
  XML_FILE_DIR ="D:/Tomcat-4-1/webapps/xmlTest/";
  XML_FILE_NAME="Address.xml";

  try {
   builder = new SAXBuilder();
   doc = builder.build(new File(XML_FILE_DIR, XML_FILE_NAME));
    }catch(Exception ex) {
   ex.printStackTrace();
  }

 }

 public Vector getAddrInfo()
 {
  root = doc.getRootElement();
  List list=root.getChildren("Address");
  Iterator it = list.iterator();
  Vector vAddr = new Vector();

  while ( it.hasNext()){
   Address address = new Address();
   Element emt = (Element)it.next();
   address.setName(emt.getChild("name").getText());
   address.setPhone(emt.getChild("phone").getText());
   address.setAddr(emt.getChild("addr").getText());
   vAddr.add(address);
  }
  return vAddr;
 }

 public boolean addElement(Address address){

  root = doc.getRootElement();

   Element newEvent = new Element("Address");

    Element name = new Element("name");
    name.setText(address.getName());
    newEvent.addContent(name);
    System.out.println("name"+ address.getName());

    Element phone = new Element("phone");
    phone.setText(address.getPhone());
    newEvent.addContent(phone);

    Element addr = new Element("addr");
    addr.setText(address.getAddr());
    newEvent.addContent(addr);

   root.addContent(newEvent);

         XMLOutputter outputter = new XMLOutputter("", true, "euc-kr");
  try{
         FileWriter writer = new FileWriter(XML_FILE_DIR + XML_FILE_NAME);
         outputter.output(doc, writer);
         writer.close();

     }catch(Exception ex)
     {
   ex.printStackTrace();
         return false;
     }

  return true;
 }
}

 

>>>>> Address.xml
<?xml version="1.0" encoding="euc-kr"?>
<AddressList>
<Address>
<name>왕눈이</name>
<phone>02-855-9611</phone>
<addr>서울시 관악구 신림1동 </addr>
</Address>
</AddressList>

 

>>>>> Address.jsp
<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.*, xmlTest.*" %>
<%
request.setCharacterEncoding("euc-kr");
String flag=request.getParameter("flag");
%>

<jsp:useBean id="bean" class="AddressBean" />
<jsp:useBean id="addr" class="Address" />
<jsp:setProperty name="addr" property="*" />

<%
 
 if(flag != null && flag.equals("write")){
  bean.addElement(addr);
 }

 Vector vAddr = bean.getAddrInfo();

%>


<html>
 <body>
  <table width="90%" border="1" cellspacing="0" cellpadding="2"  align="center">
      <tr align="center" bgcolor="#996600">
        <td colspan="3"><font color="#FFFFFF"><b>주소 정보</b></font></td>
      </tr>
      <tr>
        <td>이름</td>
        <td>전화번호</td>
  <td>주소</td>
      </tr>
      <% for(int i=0; i<vAddr.size();i++){
   Address temp =(Address)vAddr.get(i);
      %>
   <tr>
  <td><%=temp.getName()%></td>
  <td><%=temp.getPhone()%></td>
  <td><%=temp.getAddr()%></td>
   </tr>
      <%}%>
  </table>

  <form method="post" action="Address.jsp">
  <table width="90%" border="1" cellspacing="0" cellpadding="2"  align="center">
      <tr align="center" bgcolor="#996600">
        <td colspan="3"><font color="#FFFFFF"><b>주소 정보 입력</b></font></td>
      </tr>
      <tr>
        <td>이름</td>
        <td>전화번호</td>
  <td>주소</td>
      </tr>
   <tr>
  <td><input type="text" name="name"></td>
  <td><input type="text" name="phone"></td>
  <td><input type="text" name="addr"></td>
   </tr>
   <tr>
      <td colspan="3" align="center"><input type="submit" value="등록"></td>
   </tr>
  </table>
  <input type="hidden" name="flag" value="write" >
  </form>

 </body>
</html>

 


▩ JSTL(JSP Standard TAG Library)
   - 일반적으로 많이 쓰이는 사용자정의 XML태그를 라이브러리로 미리 제공하여 같은 태그를 만드는 수고를 덜어줌
   - jstl 1.0 버전은 tomcat 4.X, JSP 1.2, 서블릿 2.3을 지원함
     jstl 1.1 버전은 tomcat 5.X, JSP 2.0을 지원함

1. jstl의 설치
   - http://ftp.kaist.ac.kr/pub/Apache/jakarta/taglibs/standard-1.0/

   - WEB-INF 폴더에 web.xml파일을 생성합니다.
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <description>jstl 실습</description>

    <welcome-file-list>
      <welcome-file>setTag.jsp</welcome-file>
      <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

- WEB-INF폴더에 lib폴더를 생성합니다. jakarta-taglibs-standard-1.0.5\lib 폴더에 있는 jar파일을 복사합니다.


1. jstl이 지원하는 라이브러리

라이브러리     하위기능     프리픽스   관련URI
=================================================================================
코어           변수지원      c          http://java.sun.com/jsp/jstl/core
               흐름제어                 http://java.sun.com/jstl/core(1.0)
               URL 처리               
---------------------------------------------------------------------------------
XML            XML 코어      x          http://java.sun.com/jsp/jstl/xml
               흐름제어                 http://java.sun.com/jstl/xml(1.0)
               XML변환
---------------------------------------------------------------------------------
국제화         지역          fmt        http://java.sun.com/jsp/jstl/fmt
               메시지형식               http://java.sun.com/jstl/fmt(1.0)
               숫자 및 날짜 형식
---------------------------------------------------------------------------------
데이터베이스   SQL           sql        http://java.sun.com/jsp/jstl/sql
                                        http://java.sun.com/jstl/sql(1.0)
---------------------------------------------------------------------------------
펑션           콜렉션처리    fn         http://java.sun.com/jsp/jstl/functions
=================================================================================

 

2. 코어 태그 라이브러리
 
기능분류     태그      설명
=================================================================================
변수지원     set       JSP에서 사용되는 변수 설정
             remove    설정한 변수의 삭제
---------------------------------------------------------------------------------
흐름제어     if        조건 분기
             choose    다중 조건 분기
             forEach   컬렉션처리
             forTokens 구분자에 의한 토큰 처리
---------------------------------------------------------------------------------
URL 처리     import    다른 파일의 결과 삽입
             redirect  경로 변경
             url       url재 작성
---------------------------------------------------------------------------------
기타 태그    catch     예외처리에 사용
             out       JspWriter에 내용을 출력한다.
=================================================================================

 

3. 변수 지원 태그
   - http://127.0.0.1:8080/jstl/test.jsp

>>>>> test.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<html>
<head>
<title>변수 지원 태그의 실습</title>
</head>
<body>

<c:set var="os" value="한글 윈도우 2000 서버"/>
<c:out value="${os}"/>
<br>
<b>
더하기:
<c:set var="num1" value="100"/>
<c:set var="num2" value="200"/>
<c:out value="${num1+num2}"/>
<br>
곱하기:
<c:set var="num1" value="100"/>
<c:set var="num2" value="200"/>
<c:out value="${num1*num2}"/>

</b>
</body>
</html>

 

4. 흐름 제어 태그
   - http://127.0.0.1:8080/jstl/ifTag.jsp
   - http://127.0.0.1:8080/jstl/ifTag.jsp?name=jsp&age=30

>>>>> ifTag.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<html>
<head>
    <title>if 태그</title>
</head>
<body>
<c:if test="true">
무조건 수행<br>
</c:if>

<c:if test="${param.name == 'jsp'}">
 name 파라미터의 값은
 <c:out value="${param.name}"/>
 입니다.<br>
</c:if>

<c:if test="${18 < param.age}">
 당신의 나이는 18세 이상입니다.
</c:if>

</body>
</html>

 


>>>>> chooseTag.jsp
   - http://127.0.0.1:8080/jstl/chooseTag.jsp?name=xq&age=15

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<html>
<head>
    <title>choose 태그</title>
</head>
<body>

<ul>
<c:choose>
  <c:when test="${param.name == 'jsp'}" >
    <li> 당신의 이름은 <c:out value="${param.name}"/> 입니다.
  </c:when>
  <c:when test="${param.age > 18}" >
    <li> 당신은 18세 이상입니다.
  </c:when>
  <c:otherwise>
    <li> 당신은 'jsp'가 아니고 18세 이상이 아닙니다.
  </c:otherwise>
</c:choose>
</ul>

</body>
</html>

 


▩ 사용자 정의 태그(Custom TAG)
   - JSTL같은 경우 미리 태그를 만들어 제공함에 비해 자신의 특성에 맞는 태그를 만들수 있는 기술임
   - JSP페이지내의 스크립틀릿 코드를 줄여 좀더 간결한 JSP페이지를 만들수 있음
   - 한번 작성된 태그는 계속적으로 사용하기가 편리함
   - HTML과 같은 태그라 자바를 모르더라고 사용하기가 편리함
   - 사이트 구축후 유지 보수 차원에서 뛰어난 효율을 발휘함

1. 기본적인 태그의 실습
   - server.xml의 수정
     <Context path="/xTest" reloadable="true" debug="0" docBase="D:/Tomcat-4-1/webapps/xmlTest" />

   - http://127.0.0.1:8080/xmlTest/WelcomeTag.jsp
   - http://127.0.0.1:8080/xTest/WelcomeTag.jsp


>>>>> WelcomeTag.jsp : 호출자, 이용자

<%@ page contentType="text/html; charset=euc-kr" %>
<%@ taglib uri="/WEB-INF/tlds/WelcomeTag.tld" prefix="tag" %>

<h1>첫번째 사용자 태그 만들기</h1>
<font color="red">
<tag:welcome/>
</font>

 

>>>>> WEB-INF/tlds/WelcomeTag.tld: 태그 라이브러리(Tag Library Descriptor, TLD) 설명자 파일 
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
         "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

  <tlib-version></tlib-version>
  <jsp-version></jsp-version>
  <short-name>controls</short-name>
  <tag>
 <name>welcome</name>
 <tag-class>xmlTest.WelcomeTag</tag-class>
  </tag>
</taglib>

 

>>>>> WelcomeTag.java: 태그 핸들러
-d D:\Tomcat-4-1\webapps\xmlTest\WEB-INF\classes -classpath D:\Tomcat-4-1\webapps\xmlTest\WEB-INF\classes $(FileName)

package xmlTest;

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class WelcomeTag extends TagSupport {
    public int doStartTag() throws JspException {
        try {
            pageContext.getOut().print("Welcome to My Custom Tag");
        } catch (Exception ex) {
            throw new JspTagException("WelcomeTag: " + ex.getMessage());
        }
        return SKIP_BODY;
    }
}

 

▩ Tag Handler
   - 사용자 태그의 처리를 담당함
   - TagSupport: 몸체 내용을 처리하지 않는 경우, <tag:hello></tag:hello>, <tag:hello/>
     BodyTagSupport: 몸체 내용을 처리하는 경우, <tag:hello>안녕하세요.</tag:hello>


1. 몸체가 있지만 처리하지 않는 경우
   - http://127.0.0.1:8080/xmlTest/WelcomeBodyTag.jsp

>>>>> WelcomeBodyTag.jsp
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ taglib uri="/WEB-INF/tlds/WelcomeBodyTag.tld" prefix="tag" %>

<h1>몸체 있는 태그 </h1>
<br>
<font color="blue">
<tag:welcomeBody>왕눈이</tag:welcomeBody>
</font>
 


>>>>> WEB-INF/tlds/WelcomeBodyTag.tld
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
         "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>TagLibrary</short-name>

  <tag>
    <name>welcomeBody</name>
    <tag-class>xmlTest.WelcomeBodyTag</tag-class>
  </tag>

</taglib>

 

>>>>> WelcomeBodyTag.java: 태그 핸들러
package xmlTest;

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class WelcomeBodyTag extends TagSupport {
   
 int count;

    public int doStartTag() throws JspException {
        try {
            pageContext.getOut().print("환영합니다 <b>");
        } catch (Exception ex) {
            throw new JspTagException("WelcomeBodyTag: " + ex.getMessage());
        }
        return EVAL_BODY_INCLUDE;
    }

    public int doAfterBody() throws JspTagException {
        if (count < 5) {
            count++;
            try {
                pageContext.getOut().println("<br> " + count);
            } catch (IOException e) {
            }
            return EVAL_BODY_AGAIN;
        } else {
            return SKIP_BODY;
        }
    }

    public int doEndTag() throws JspException {
        try {
            pageContext.getOut().print("<br></b>님");
        } catch (Exception ex) {
            throw new JspTagException("WelcomeBodyTag: " + ex.getMessage());
        }
        return EVAL_PAGE;
    }
}

 

2. PageContext 객체
   - JSP페이지에서 상용되는 내부 객체를 가져올수 있는 객체임
   - 태그 핸들러를 만들때에는 JSP컨테이너에서 돌아가는 상태가 아니기 때문에 내부객체를 사용할 수 없음

 


▩ TagSupport
   - 몸체 처리가 필요 없는 경우

1. 처음에 int doStartTag()가 호출됩니다.
   - SKIP_BODY: 몸체가 없는 경우나 몸체를 무시할 경우 호출됨
   - EVAL_BODY_INCLUDE: 몸체 내용을 전달함
   - 초기화 작업을 할 경우 사용하는 메소드임

 

2. int doAfterBody()
   - doStartTag()가 호출되고 난 후에 리턴값이 EVAL_BODY_INCLUDE이면 호출되는 메소드임
   - EVAL_BODY_AGAIN: 몸체의 내용을 다시 분석함
   - SKIP_BODY: 몸체의 내용을 분석하지 않음
   - 몸체의 내용을 반복적으로 사용할 경우 선언하는 메소드임

 

3. int doEndTag()
   - EVAL_PAGE: 사용자 태그를 처리한 후 사용자 태그 이후의 JSP페이지 내용을 계속적으로 처리하도록 함
   - SKIP_PAGE: 사용자 태그를 처리한 후 사용자 태그 이후의 JSP페이지 내용을 처리하지 않음
   - 데이터베이스 Connection등을 닫아주는 역활을 함

 

4. void release(): 태그핸들러가 가지고 있던 변수를 초기화 합니다.


▩ BodyTagSupport
   - 몸체 처리가 필요한 경우 사용됨

1. 처음에 int doStartTag()가 호출됩니다.
   - SKIP_BODY: 몸체가 없는 경우나 몸체를 무시할 경우 호출됨
   - EVAL_BODY_BUFFERED: 몸체 내용을 전달함
   - 초기화 작업을 할 경우 사용하는 메소드임


2. void setBodyContent()
   - EVAL_BODY_BUFFERED의 리턴값에 따라 몸체를 미리 가져와 준비합니다. 잘 사용되지 않습니다.

 

3. void doInitBody()
   - 처음에 몸체를 평가하기 전에 호출됩니다. 잘 사용되지 않습니다.

 

4. int doAfterBody()
   - doStartTag()가 호출되고 난 후에 리턴값이 EVAL_BODY_INCLUDE이면 호출되는 메소드임
   - EVAL_BODY_AGAIN: 몸체의 내용을 다시 분석함
   - SKIP_BODY: 몸체의 내용을 분석하지 않음
   - 몸체의 내용을 반복적으로 사용할 경우 선언하는 메소드임

 

5. int doEndTag()
   - EVAL_PAGE: 사용자 태그를 처리한 후 사용자 태그 이후의 JSP페이지 내용을 계속적으로 처리하도록 함
   - SKIP_PAGE: 사용자 태그를 처리한 후 사용자 태그 이후의 JSP페이지 내용을 처리하지 않음
   - 데이터베이스 Connection등을 닫아주는 역활을 함

 

6. void release(): 태그핸들러가 가지고 있던 변수를 초기화 합니다.

 

>>>>> LowerCaseTag.jsp
 - http://127.0.0.1:8080/xmlTest/LowerCaseTag.jsp
  
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ taglib uri="/WEB-INF/tlds/LowerCaseTag.tld" prefix="tag" %>

<h1> 몸체 처리 </h1>
<br>
<font color="brown">
<tag:lowercase>
몸체를 처리하는 태그 예제입니다.
</tag:lowercase>
</font>

 

>>>>> LowerCaseTag.tld
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
         "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>TagLibrary</short-name>

  <tag>
    <name>lowercase</name>
    <tag-class>xmlTest.LowerCaseTag</tag-class>
    <body-content>jsp</body-content>
  </tag>

</taglib>

 

>>>>> LowerCaseTag.java
package xmlTest;

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class LowerCaseTag extends BodyTagSupport {
    public int doAfterBody() throws JspException {
        try {
            BodyContent bc = getBodyContent();
            String body = bc.getString();
            JspWriter out = bc.getEnclosingWriter();
            if (body != null) {
                out.print(body.toLowerCase());
            }
        } catch (IOException ex) {
            throw new JspException("LowerCaseTag:" + ex.getMessage());
        }
        return SKIP_BODY;
    }
}

 


▩ 속성값이 있는 태그의 작성
   - http://127.0.0.1:8080/xmlTest/PageTag.jsp

>>>>> PageTag.jsp
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ taglib uri="/WEB-INF/tlds/PageTag.tld" prefix="tag" %>
<%
  String start="1";
  String end="10";
      String nowPage="1";

      if(request.getParameter("nowPage") !=null) {
       nowPage=request.getParameter("nowPage");
      }
%>

<h1>속성 값을 갖는 태그</h1>
현재 페이지는 <b><%=nowPage%></b> 입니다.<br>
<font color="orange">
<tag:page from='<%=start%>' to='<%=end%>'/>
</font>

 

>>>>> PageTag.tld
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
         "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>TagLibrary</short-name>

    <tag>
         <name>page</name>
         <tag-class>xmlTest.PageTag</tag-class>
         <attribute>
            <name>from</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>to</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
     </tag>

</taglib>

 

>>>>> PageTag.java
package xmlTest;

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class PageTag extends TagSupport {
    private String from;
    private String to;

    public void setFrom(String i) {
        this.from = i;
    }

    public void setTo(String i) {
        this.to = i;
    }

    public int doStartTag() throws JspException {
        int start = Integer.parseInt(from);
        int end = Integer.parseInt(to);
        try {
            JspWriter out = pageContext.getOut();
            out.print("Page &nbsp");
            for (int i = start; i <= end; i++) {
                out.print("<a href=/myapp/ch15/PageTag.jsp?nowPage=" + i + ">");
                out.print("[" + i + "]");
                out.print("</a>&nbsp");
            }
        } catch (Exception ex) {
            throw new JspTagException("PageTag: " + ex.getMessage());
        }
        return SKIP_BODY;
    }
}

 


▩ 스크립트 변수의 사용
   - <jsp:useBean id="db" class="xmlTest.DBConnection">
     <%
     Connection DbCon = db.getConnection();
     %>

   - 스크립트 변수를 생성하기 위한 클래스 필요
   - 스크립트 변수의 검사를 수행하는 Helper 클래스
   - MySQL의 셋팅
   - http://127.0.0.1:8080/xmlTest/ConnectionTag.jsp


mysql -u root

create database mysqldb;

use mysql;
grant all privileges on mysqldb.* to nulunggi@localhost identified by '123'; 
flush privileges;
grant all privileges on mysqldb.* to nulunggi identified by '123'; 
flush privileges;
select host, user, password from user;

nulunggi로 로그인 합니다.

mysql -u nulunggi -p mysqldb

create table member(
           name      varchar  (20)   NOT NULL ,
           id        varchar(20)     NOT NULL
);

insert into member(name, id) VALUES('왕눈이', 'spring');

select * from member;

 

>>>>> ConnectionTag.jsp
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="java.sql.*" %>
<%@ taglib uri="/WEB-INF/tlds/ConnectionTag.tld" prefix="tag" %>

<h1>스크립트 변수 생성하기</h1>
<tag:db id="db" />
<%
   Connection conn = db.getConnection();
   Statement stmt=conn.createStatement();
   ResultSet rs = stmt.executeQuery("select * from member");
   if(rs.next()){
%>

당신의 이름은?  : <%=rs.getString("name")%><br>
당신의 아이디는? :  <%=rs.getString("id")%>
<%}
   rs.close();
   stmt.close();
   conn.close();
%>

 

>>>>> ConnectionTag.tld
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
         "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>TagLibrary</short-name>

  <tag>
    <name>db</name>
    <tag-class>xmlTest.ConnectionTag</tag-class>
    <tei-class>xmlTest.ConnectionTagTEI</tei-class>
    <attribute>
      <name>id</name>
      <required>true</required>
    </attribute>
  </tag>

</taglib>

 

>>>>> Helper 클래스
 - TagExtraInfo 클래스를 상속받습니다.
 - public VariableInfo[] getVariableInfo(TagData data)를 구현합니다.
 - isValid(TagDate data) 메소드를 선업합니다. 일반적으로 선언하지 않습니다.     
 - VariableInfo(String varName, String className, boolean declare, int scope)
   varName: 속성값을 문자열로 가져옵니다.
   className: 스크립트 변수 이름으로 생성할 클래스 이름입니다.    
   declare: 새로운 스크립트 변수 생성을 의미
   scope: 스크립트 변수의 범위를 지정합니다.
   . VariableInfo.AT_BEGIN: 시작태그 이후부터 모든 JSP 페이지에서 사용가능
   . VariableInfo.AT_END: 끝태그 이후부터 모든 JSP 페이지에서 사용가능
   . VariableInfo.NESTED: 시작태그와 끝태그 안에서만 변수를 사용할 수 있음


package xmlTest;

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class ConnectionTagTEI extends TagExtraInfo {
    public VariableInfo[] getVariableInfo(TagData data) {
        VariableInfo vInfo = new VariableInfo(data.getAttributeString("id"),
                                              "xmlTest.DBConnection",
                                              true,
                                              VariableInfo.AT_BEGIN);
        VariableInfo[] vInfoArray = {vInfo};
        return vInfoArray;
    }
}

 

>>>>> DBConnection.java
package xmlTest;

import java.sql.*;

public class DBConnection {
  private static final String JDBC_DRIVER = "org.gjt.mm.mysql.Driver";
  private static final String JDBC_URL = "jdbc:mysql://127.0.0.1:3306/mysqldb?useUnicode=true&characterEncoding=EUC_KR";
  private static final String USER = "nulunggi";
  private static final String PASSWD = "123";

  public DBConnection() throws Exception {
    try {
      Class.forName(JDBC_DRIVER);
    } catch (ClassNotFoundException ex) {
      throw new Exception("DBConnection" + ex.getMessage());
    }
  }

  public Connection getConnection() throws Exception {
    Connection conn;
    try {
      conn = DriverManager.getConnection(JDBC_URL, USER, PASSWD);
    } catch (SQLException ex) {
      throw new SQLException("DBConnection" + ex.getMessage());
    }
    return conn;
  }

}

 

>>>>> ConnectionTag.java
 - 속성명과 관련 클래스를 연결해 주는 역활을 함

package xmlTest;

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class ConnectionTag extends TagSupport {
    public int doStartTag() throws JspException {
        try {
            pageContext.setAttribute(id, new DBConnection());
        } catch (Exception ex) {
            throw new JspTagException("ConnectionTag: " + ex.getMessage());
        }
        return SKIP_BODY;
    }
}


'JAVA/JSP > Source' 카테고리의 다른 글

xmlParser  (0) 2009.01.07
해당 url html 소스 가져오기  (0) 2009.01.07
Javascript  (0) 2008.10.28
JAVASCRIPT source  (0) 2008.10.27
servlet + ibatis + ajax sample  (0) 2008.07.25
And
prev | 1 | next