JSP+XML 구조의 웹사이트 예
저자:Eve Cole
업데이트 시간:2009-07-02 17:11:58
XML(Extensible Markup Language)은 일종의 W3C 표준처럼 보일 수 있습니다. 현재는 실질적인 영향이 거의 없으며 나중에 유용하게 쓰이더라도 오랜 시간이 걸릴 것입니다. 그러나 실제로는 이미 사용되고 있습니다. 따라서 즐겨 사용하는 HTML 편집기에 XML이 추가되어 사용을 시작할 때까지 기다리지 마십시오. 이제 다양한 내부 문제와 B2B 시스템 문제를 해결할 수 있습니다.
Sparks.com에서는 XML을 사용하여 Java 개체에서 HTML 데이터 표시에 이르기까지 서로 다른 시스템 전반에 걸쳐 데이터 표현을 표준화합니다.
특히, 우리는 데이터가 매우 기본적인 XML 구조로 표준화될 때 데이터를 더 쉽게 공유하고 조작할 수 있다는 사실을 발견했습니다. 그 과정에서 우리는 XML을 사용하는 효과적인 방법을 많이 발견했습니다. 다음은 현재 애플리케이션에 대해 자세히 설명합니다.
표준화 XML을 사용하기 전에 사용하려는 정보와 다른 XML 데이터 형식을 만드십시오.
동적 XML 생성
데이터베이스에서 HTML을 생성하는 것은 새로운 것이 아니지만 XML을 생성하는 것은 새로운 일입니다. 여기서는 구체적인 생성 단계를 소개합니다.
XSL을 템플릿 언어로 사용
XSL(Extensible Stylesheet Language)은 XML 데이터를 표시하기 위한 형식을 정의하는 좋은 방법이며 여러 개의 정적 템플릿으로 작성하면 더 효율적입니다.
HTML 생성
XML에 XSL을 더하면 HTML과 같습니다. 이것이 옳지 않게 들릴 수도 있지만 사용자가 보는 HTML 페이지는 실제로 XML과 XSL의 조합의 결과입니다.
1. 표준화
XML의 힘은 유연성에서 나옵니다. 그러나 불행하게도 때로는 너무 유연해서 문제 해결 방법을 궁금해하는 빈 페이지가 남을 수도 있습니다.
모든 XML 프로젝트에서 첫 번째 단계는 표준 데이터 형식을 만드는 것입니다. 이렇게 하려면 다음과 같은 결정을 내려야 합니다.
&&&
데이터를 확인하세요:
표준 XML 형식이 없기 때문에 개발자는 자신만의 형식을 자유롭게 개발할 수 있습니다. 그러나 형식이 하나의 응용 프로그램에서만 인식되는 경우 해당 응용 프로그램을 실행해야만 형식을 사용할 수 있습니다. XML 형식을 읽을 수 있는 다른 프로그램이 있다면 분명히 더 도움이 될 것입니다. XML 형식이 수정되면 이를 사용하는 시스템도 수정해야 할 수 있으므로 최대한 완전한 형식을 만들어야 합니다. 대부분의 시스템은 인식하지 못하는 태그를 무시하기 때문에 XML 형식을 변경하는 가장 안전한 방법은 태그를 수정하는 것보다 추가하는 것입니다.
XML 데이터 형식의 예를 보려면 여기를 클릭하십시오.
Sparks.com에서는 다양한 제품 프레젠테이션에 필요한 모든 제품 데이터를 살펴보았습니다. 모든 페이지가 모든 데이터를 사용하는 것은 아니지만 우리는 모든 데이터에 적합한 매우 완전한 XML 데이터 형식을 개발했습니다. 예를 들어, 제품 세부 정보 페이지에는 제품 검색 페이지보다 더 많은 데이터가 표시됩니다. 그러나 각 페이지의 XSL 템플릿은 필요한 필드만 사용하기 때문에 두 경우 모두 동일한 데이터 형식을 사용합니다.
DTD 사용 여부
Sparks.com에서는 올바른 XML보다는 잘 구성된 XML을 사용합니다. 전자에는 DTD가 필요하지 않기 때문입니다. DTD는 사용자가 페이지를 클릭하고 보는 사이에 처리 계층을 추가합니다. 우리는 이 레이어에 너무 많은 처리가 필요하다는 것을 발견했습니다. 물론 XML 형식으로 다른 회사와 통신할 때 DTD를 사용하는 것은 여전히 좋은 일입니다. DTD는 보내고 받을 때 데이터 구조가 올바른지 확인할 수 있기 때문입니다.
구문 분석 엔진 선택 이제 사용할 수 있는 여러 구문 분석 엔진이 있습니다. 어떤 것을 선택하느냐는 거의 전적으로 애플리케이션 요구 사항에 따라 달라집니다. DTD를 사용하기로 결정한 경우 구문 분석 엔진은 XML이 DTD의 유효성을 검사할 수 있도록 해야 합니다. 유효성 검사를 별도의 프로세스에 넣을 수 있지만 이는 성능에 영향을 미칩니다.
SAX와 DOM은 두 가지 기본 구문 분석 모델입니다. SAX는 이벤트 기반이므로 XML이 구문 분석되면 이벤트가 엔진으로 전송됩니다. 다음으로 이벤트는 출력 파일과 동기화됩니다. DOM 구문 분석 엔진은 동적 XML 데이터 및 XSL 스타일 시트에 대한 계층적 트리 구조를 생성합니다. DOM 트리에 무작위로 액세스하면 마치 XSL 스타일시트에 의해 결정된 것처럼 XML 데이터가 제공될 수 있습니다. SAX 모델에 대한 논쟁은 주로 DOM 구조의 과도한 메모리 감소와 XSL 스타일 시트 구문 분석 시간의 가속화에 중점을 두고 있습니다.
그러나 우리는 SAX를 사용하는 많은 시스템이 SAX를 전체 기능으로 활용하지 않는다는 사실을 발견했습니다. 이러한 시스템은 이를 사용하여 DOM 구조를 구축하고 DOM 구조를 통해 이벤트를 보냅니다. 이 접근 방식을 사용하면 XML 처리 전에 스타일시트에서 DOM을 구축해야 하므로 성능이 저하됩니다.
2. 동적 XML 생성
XML 형식이 설정되면 이를 데이터베이스에서 동적으로 이식하는 방법이 필요합니다.
문자열을 처리할 수 있는 시스템만 필요하므로 XML 문서를 생성하는 것은 상대적으로 간단합니다. 우리는 Java Servlet, Enterprise JavaBean 서버, JDBC 및 RDBMS(관계형 데이터베이스 관리 시스템)를 사용하여 시스템을 구축했습니다.
&&&&
(XSL 적용에 대한 자세한 내용은 템플릿 언어로서의 XSL을 참조하세요.)
XML 생성의 예 Java에서 XML 독스트링을 생성하기 위한 실제 코드는 여러 메소드와 클래스로 나눌 수 있습니다.
XML 생성 프로세스를 시작하는 코드는 EJB 메소드에 배치됩니다. 이 인스턴스는 생성된 XML 문자열을 저장하기 위해 StringBuffer를 즉시 생성합니다.
StringBuffer xml = 새로운 StringBuffer();
xml.append(XmlUtils.beginDocument("/browse_find/browse.xsl", "browse", request));
xml.append(product.toXml());
xml.append(XmlUtils.endDocument("찾아보기");
out.print(xml.toString());
다음 세 개의 xml.append() 변수 자체는 다른 메서드에 대한 호출입니다.
파일 헤더 생성 첫 번째 추가 메서드는 XmlUtils 클래스를 호출하여 XML 파일 헤더를 생성합니다. Java Servlet의 코드는 다음과 같습니다.
public static String startDocument(String 스타일시트, String 페이지)
{
StringBuffer xml = 새로운 StringBuffer();
xml.append("<?xml version="1.0"?> ")
.append("<?xml-stylesheet href="")
.append(스타일시트).append(""")
.append(" type ="text/xsl"?> ");
xml.append("<").append(페이지).append("> ");
xml.toString()을 반환합니다.
}
이 코드는 XML 파일 헤더를 생성합니다. <?xml> 태그는 이 파일을 버전 1.0을 지원하는 XML 파일로 정의합니다. 두 번째 코드 줄은 데이터를 표시할 올바른 스타일 시트의 위치를 가리킵니다. 마지막으로 포함된 것은 항목 수준 태그(이 예에서는 <browse>)입니다. 파일 끝에서는 <browse> 태그만 닫아야 합니다.
<?xml version="1.0"?> <?xml-stylesheet href="/browse_find/browse.xsl" type="text/xsl"?> <browse>
제품 정보를 채우고 파일 헤더를 완성한 후 제어 메소드는 Java 객체를 호출하여 XML을 생성합니다. 이 예에서는 제품 개체가 호출됩니다. 제품 객체는 두 가지 방법을 사용하여 XML 표현을 생성합니다. toXML()의 첫 번째 메서드는 <product> 및 </product> 태그를 생성하여 제품 노드를 생성합니다. 그런 다음 제품 XML에 필요한 컨텐츠를 제공하는 InternalXML()을 호출합니다. InternalXML()은 일련의 StringBuffer.append() 호출입니다. StringBuffer도 문자열로 변환되어 제어 메서드에 반환됩니다.
공개 문자열 toXml()
{
StringBuffer xml = new StringBuffer("<제품> ");
xml.append(internalXml());
xml.append("</product> ");
xml.toString()을 반환합니다.
}
공개 문자열 내부Xml()
{
StringBuffer xml = 신규
문자열버퍼(" ")
.append(productType).append(" ");
xml.append(" ").append(idValue.trim())
.append(" ");
xml.append(" ").append(idName.trim())
.append(" ");
xml.append(" ").append(page.trim())
.append(" ");
격통?
xml.append(" ").append(금액).append(" ");
xml.append(" ").append(공급업체).append(" ");
xml.append(" ");
xml.append(" ").append(pubDesc).append(" ");
xml.append(" ").append(venDesc).append(" ";
격통?
xml.toString()을 반환합니다.
}
마지막으로 파일을 닫은 후 XMLUtils.endDocument() 메서드가 호출됩니다. 이 호출은 XML 태그(이 경우)를 닫고 마지막으로 구조화된 XML 파일을 완성합니다. 제어 메소드의 전체 StringBuffer도 문자열로 변환되어 원래 HTTP 요청을 처리한 서블릿으로 반환됩니다.
3. XSL을 템플릿 언어로 사용
HTML 출력을 얻으려면 생성된 XML 파일을 XML 데이터 표시 방법을 제어하는 XSL 템플릿과 결합합니다. 우리의 XSL 템플릿은 세심하게 구성된 XSL 및 HTML 태그로 구성됩니다.
템플릿 작성 시작 XSL 템플릿의 시작 부분은 다음 코드와 유사합니다. 코드의 첫 번째 줄은 필수이며 이 파일을 XSL 스타일 시트로 정의합니다. xmlns:xsl= 속성은 이 파일에서 사용되는 XML 네임스페이스를 참조하고, version= 속성은 네임스페이스의 버전 번호를 정의합니다. 파일 끝에서 태그를 닫습니다.
<xsl:template>으로 시작하는 두 번째 코드 줄은 XSL 템플릿의 패턴을 결정합니다. Match 속성은 필수이며 여기서는 XML 태그 <basketPage>를 가리킵니다. 우리 시스템에서 <basketPage> 태그에는 XSL 템플릿이 <product> 태그에 포함된 제품 정보에 액세스할 수 있도록 하는 <product> 태그가 포함되어 있습니다. 다시 한 번 파일 끝에 있는 <xsl:template> 태그를 닫아야 합니다.
다음으로 잘 구성된 HTML을 살펴보겠습니다. XML 구문 분석 엔진에 의해 처리되므로 잘 구성된 XML의 모든 규칙을 준수해야 합니다. 기본적으로 이는 모든 여는 태그에 해당하는 닫는 태그가 있어야 함을 의미합니다. 예를 들어 일반적으로 닫히지 않는 <P> 태그는 </P>로 닫아야 합니다.
<xsl:스타일시트 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
버전="1.0">
<xsl:템플릿 일치="바구니페이지">
<html>
<머리>
<title>쇼핑백 / 수량 조정</title>
</head>
<본체 bgcolor="
</xsl:템플릿>
</xsl:스타일시트>
템플릿 본문 내에는 데이터 표현을 위한 논리를 제공하는 데 사용되는 많은 XSL 태그가 있습니다. 일반적으로 사용되는 두 가지 태그는 아래에 설명되어 있습니다.
선택하다
<xsl:choose> 태그는 기존 프로그래밍 언어의 if-then-else 구조의 시작 부분과 유사합니다. XSL에서 choose 태그는 코드가 입력되는 부분에서 할당이 작업을 트리거한다는 것을 나타냅니다. 속성이 할당된 <xsl:when> 태그는 choose 태그 뒤에 옵니다. 할당이 올바른 경우 <xsl:when>의 여는 태그와 닫는 태그 사이의 내용이 사용됩니다. 할당이 잘못된 경우 <xsl:otherwise>의 여는 태그와 닫는 태그 사이의 내용이 사용됩니다. 전체 섹션은 </xsl:choose>로 끝납니다.
이 예에서 when 태그는 XML에서 수량 태그를 확인합니다. 수량 태그에 값이 true인 오류 속성이 포함되어 있으면 수량 태그에 아래 나열된 테이블 셀이 표시됩니다. 속성 값이 true가 아닌 경우 XSL은 그렇지 않은 경우 태그 사이의 내용을 표시합니다. 아래 예에서는 error 속성이 true가 아닌 경우 아무 것도 표시되지 않습니다.
<xsl:선택>
<xsl:when test="수량[@error='true']">
<td bgcolor="src=""/></td>
<td valign="top" bgcolor="<fontface="Verdana, Arial" size="1" color="<b>*재고가 충분하지 않습니다.</b></font>
</td>
</xsl:언제>
<xsl:그렇지 않으면>
</xsl:그렇지 않으면>
</xsl:선택>
각각에 대해
<xsl:for-each> 태그를 사용하면 유사한 XML 데이터의 여러 상황에 동일한 스타일 시트를 적용할 수 있습니다. 우리의 경우 일련의 제품 정보를 데이터베이스에서 가져와 웹 페이지에 균일하게 형식화할 수 있습니다. 예는 다음과 같습니다.
<xsl:for-each select="패키지">
<xsl:apply-templates select="제품"/>
</xsl:for-each>
for-each 루프는 프로그램이 레이블을 발견할 때 시작됩니다. 이 루프는 프로그램이 레이블을 만나면 종료됩니다. 이 루프가 실행되면 레이블이 나타날 때마다 이 템플릿이 적용됩니다.
4. HTML 생성
미래의 어느 시점에는 브라우저에 XML 구문 분석 엔진이 통합될 것입니다. 이 시점에서 XML 및 XSL 파일을 브라우저로 직접 보낼 수 있으며 브라우저는 스타일 시트에 나열된 규칙에 따라 XML 데이터를 표시합니다. 그러나 그때까지 개발자는 서버측 시스템에 구문 분석 기능을 만들어야 합니다.
Sparks.com에서는 XML 파서를 Java 서블릿에 통합했습니다. 이 파서는 XSLT(XSL 변환)라는 메커니즘을 사용하여 XSL 태그에 지정된 대로 XSL 템플릿에 XML 데이터를 추가합니다.
Java 서블릿이 HTTP 요청을 처리할 때 서블릿은 동적으로 생성된 XML을 검색한 다음 구문 분석 엔진으로 전달합니다. XML 파일의 지침에 따라 구문 분석 엔진은 적절한 XSL 스타일시트를 찾습니다. 파서는 DOM 구조에서 HTML 파일을 생성한 다음 이 파일을 HTTP 요청을 하는 사용자에게 전송합니다.
SAX 모델을 사용하기로 선택한 경우 파서는 XML 소스를 읽고 각 XML 태그에 대한 이벤트를 생성합니다. 이벤트는 XML 데이터에 해당하며 데이터는 최종적으로 XSL 태그에 따라 스타일 시트에 삽입됩니다.