'custom Tag'에 해당되는 글 1건
- 2009.01.07 게시판, 자료실, 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  ");
for (int i = start; i <= end; i++) {
out.print("<a href=/myapp/ch15/PageTag.jsp?nowPage=" + i + ">");
out.print("[" + i + "]");
out.print("</a> ");
}
} 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 |