개요: XML(eXtensible Markup Language)은 플랫폼, 언어 및 프로토콜에 독립적인 형식으로 데이터를 설명하고 교환하기 위해 널리 사용되는 표준이 되었습니다. XML과 그 보조 사양은 데이터의 문서 표현을 설명하고, XML 문서 유형의 제한 사항을 설명하고, XML 문서와 리소스 간의 링크를 설명하고, XML 문서의 자동 변환 및 형식을 설명하는 데 사용될 수 있습니다.
사용자 정의 태그 라이브러리를 개발하는 방법은 무엇입니까?
나는 오랫동안 JSP와 ASP 프로그래밍을 사용해 왔습니다. 두 가지 서버 측 프로그래밍 방법 중에서 JSP가 훨씬 더 강력하다는 것을 점점 더 느끼고 있습니다. 다른 것은 말할 것도 없고, JSP의 태그 라이브러리는 내가 선호하는 서버측 웹 애플리케이션 개발 도구로 JSP를 선택한 이유입니다. 왜? 이유: 유지 관리 및 개발 속도. 단일 서버 페이지 내에서 다양한 스크립트 방법과 개체를 혼합하고 일치시킬 수 있습니다. "콘크리트"와 마찬가지로 이 혼합은 서버측 스크립팅을 강력하게 만들고 서버측 프로그래머가 매우 유연하고 동적인 웹 페이지를 디자인할 수 있게 해줍니다. 그러나 이 무료 혼합에는 유지 관리가 매우 어렵다는 단점도 있습니다. 특히 프로젝트가 커질수록 최종 제품은 기존 웹 디자이너가 관리하기 때문에 개발 속도가 빨라지고 코드가 복잡해지면 속도가 느려지고 매체 개발에 도움이 되지 않습니다. 대규모 웹 애플리케이션이 개발되면 사이트는 이러한 다소 복잡한 코드를 유지 관리할 자격을 갖춘 프로그래머를 찾아야 합니다.
다행히 JSP는 좋은 솔루션을 제공합니다. 태그 라이브러리는 재사용 가능한 코드 블록을 구축하는 쉬운 방법을 제공합니다. 태그 라이브러리가 디자인되면 여러 프로젝트에서 다시 사용할 수 있습니다. 더욱 편리한 점은 COM 및 J2EE와 달리 태그 라이브러리를 생성하기 위해 다른 기술을 배울 필요가 없다는 것입니다! JSP 작성 방법만 알면 태그 라이브러리를 만들 수 있습니다. 태그 라이브러리는 웹 애플리케이션의 유지 관리도 향상시킬 수 있습니다. 이는 JSP 페이지의 사용자 정의 태그 덕분에 간단한 XML 인터페이스입니다. 이런 방식으로 웹 디자이너는 JSP 지식이 없어도 JSP 웹 애플리케이션을 구축할 수 있습니다. 이러한 개방형 웹 개발은 팀 운영에 매우 효과적입니다. JSP 프로그래머는 사용자 정의 태그와 배경 코드 모듈을 만들 수 있고, 웹 디자이너는 사용자 정의 태그를 사용하여 웹 애플리케이션을 구축하고 웹 디자인에 집중할 수 있습니다.
1. 태그 라이브러리 정의 JSP 태그 라이브러리(사용자 정의 라이브러리라고도 함)는 JavaBeans에서 지원하는 XML 기반 스크립트를 생성하기 위한 메서드 집합으로 간주할 수 있습니다. 개념적으로 태그 라이브러리는 매우 간단하고 재사용 가능한 코드 구성입니다.
XML/XSL 변환을 수행하는 태그 예제 및 HTML 페이지
<%@ taglib uri=" http://www.jspinsider.com/jspkit/JAXP " prefix="JAXP"%>
c:/xml/example.xml
c:/xml/example.xsl
이 예에서는 간단한 태그를 사용하여 배후에 있는 보다 강력한 코드에 액세스함으로써 XML이 로드되고 결과가 XSL 파일을 통해 생성되어 클라이언트로 전송됩니다. 이 작업은 모두 다음을 통해 수행됩니다. 간단한 태그 호출을 사용합니다.
사용자 정의 태그를 사용하면 JSP 프로젝트에서 쉽게 재사용할 수 있는 코드를 만들 수 있습니다. 필요한 것은 태그 라이브러리와 해당 문서뿐입니다.
2. 태그 구성요소 태그 라이브러리는 사용하기가 매우 쉽지만 태그 라이브러리를 지원하기 위한 내부 디자인을 생성하는 것은 상당히 복잡합니다. 적어도 간단한 JavaBean을 생성하는 것보다 더 복잡합니다. 복잡성은 태그 라이브러리가 여러 부분으로 구성되어 있다는 사실에서 비롯됩니다. 하지만 Java와 JSP만 알면 됩니다.
단순 태그는 다음 요소로 구성됩니다.
⑴ JavaBeans: Java 고유의 객체지향적 이점을 얻으려면 재사용 가능한 코드를 독립적인 코드 컨테이너에 배치해야 합니다. 이러한 JavaBeans는 태그 라이브러리의 일부가 아닙니다. 그러나 이는 코드 베이스가 관련 작업을 수행하는 데 사용하는 기본 코드 블록입니다.
⑵ 태그 처리: 태그 라이브러리의 실제 핵심입니다. 태그 핸들러는 필요한 리소스(JavaBeans)를 참조하고 JSP 페이지(pageContext 객체)에 대한 모든 정보에 액세스합니다. JSP 페이지는 또한 설정된 모든 태그 속성과 JSP 페이지의 태그 본문 내용을 태그 프로세서로 전송합니다. 태그 프로세서는 처리를 마친 후 처리를 위해 출력을 JSP 페이지로 다시 보냅니다.
⑶ 태그 라이브러리 설명(tld 파일) : 태그 프로세서의 속성, 정보, 위치를 기록한 간단한 XML 파일입니다. JSP 컨테이너는 이 파일을 사용하여 태그 라이브러리를 호출하는 위치와 방법을 파악합니다.
⑷ 웹사이트의 web.xml 파일: 웹사이트의 초기화 파일입니다. 이 파일에서는 웹사이트에서 사용되는 사용자 정의 태그와 각 사용자 정의 태그를 설명하는 데 사용되는 tld 파일을 정의합니다.
⑸ 배포 파일(WAR 또는 JAR 파일): 사용자 정의 태그를 재사용하려면 이를 한 프로젝트에서 다른 프로젝트로 전송할 수 있는 방법이 필요합니다. 태그 라이브러리를 JAR 파일로 패키징하는 것은 간단하고 효과적인 방법입니다.
⑹ JSP 파일에서 태그 라이브러리 선언을 만듭니다. 이 태그를 사용하려면 페이지에서 선언하면 JSP 페이지 어디에서나 사용할 수 있습니다.
해야 할 일이 많은 것처럼 보이지만 실제로는 그렇게 어렵지 않습니다. 요점은 코딩이 아니라 조각을 올바르게 구성하는 것입니다. 그러나 이러한 레이어링은 라벨 사용을 유연하게 하고 전송을 쉽게 해주기 때문에 중요합니다. 더 중요한 것은 이러한 계층이 JSP IDE(JSP 통합 개발 환경)를 통해 태그 생성 프로세스를 자동화하기 위해 존재한다는 것입니다. 향후 JSP IDE에서는 사용자 정의 태그 생성 작업의 대부분을 자동으로 완료할 수 있으므로 코드 작성과 태그 처리만 하면 됩니다.
참고: 태그 핸들러는 하나의 사용자 정의 태그만 정의합니다. 태그 라이브러리는 동일한 작업을 처리하는 여러 태그 프로세서의 모음입니다.
3. 자신만의 태그를 생성합니다. 다음은 사용자 정의 태그를 생성하는 방법을 단계별로 설명합니다. 구체적인 예는 자체 HTML 인코딩 기능을 갖도록 JSP를 확장하는 것입니다. 이 기능은 모든 < 및 > 문자를 HTML 코드로 대체합니다. 다른 인코딩 처리를 수행하도록 쉽게 확장할 수 있습니다. 단순화하기 위해 이 예에서는 사용자 정의 태그를 생성하는 기본 요소만 설명합니다.
⑴ 자바빈즈 생성
코드의 재사용 가능한 부분은 JavaBean에 배치되어야 합니다. 프로젝트의 다른 곳에서 이 코드를 자주 사용하게 되므로 이는 중요합니다. 태그 핸들러 내부에 배치된 코드는 태그 외부에서 재사용할 수 없으므로 재사용 가능한 코드 부분을 분리하는 것이 중요합니다. 이 예에서 HTML용으로 코딩된 로직은 공통적이므로 JavaBean에 배치됩니다.
⑵ HTML 인코딩 JavaBean
/* HTML_Format.Java */
공개 클래스 HTML_Format 확장 객체 구현 Java.io.Serialized {
/** 새로운 HTML_Format 생성 */
공개 HTML_Format() {}
/** 문자열의 모든 < 및 > 문자를 응답 HTML 인코딩으로 대체 */
공개 문자열 HTML_Encode(문자열 as_data)
{
int li_len = as_data.length();
/*문자열 버퍼의 길이가 원래 문자열보다 깁니다*/
StringBuffer lsb_encode = new StringBuffer(li_len + (li_len/10));
/* 모든 < 및 > 문자를 바꾸는 루프*/
for(int li_count = 0; li_count < li_len; li_count++)
{ String ls_next = String.valueOf(as_data.charAt(li_count));
if (ls_next.equals("<")) ls_next = "<";
if (ls_next.equals(">")) ls_next = ">";
lsb_encode.append(ls_next);
}
return(lsb_encode.toString());
}
}
⑶ 태그 프로세서를 생성합니다. 태그 프로세서는 다음 코드를 사용합니다.
HTML 인코딩 태그 프로세서.
Java.io.IOException 가져오기;
import Javax.servlet.jsp.*;
import Javax.servlet.jsp.tagext.*;
공개 클래스 HTML_FormatTag는 BodyTagSupport를 확장합니다.
{
/* 1} 이 함수는 태그 끝에서 호출됩니다*/
public int doEndTag()에서 JspTagException이 발생합니다.
{
노력하다
{ /* 2} 라벨의 텍스트 가져오기 */
BodyContent l_tagbody = getBodyContent();
문자열 ls_output = "";
/* 3} 태그 본문에 텍스트가 있으면 처리합니다 */
if(l_tagbody != null)
{ HTML_Format l_format = 새로운 HTML_Format();
/* 3a} 태그 본문의 내용을 문자열로 변환 */
문자열 ls_html_text = l_tagbody.getString();
ls_output = l_format.HTML_Encode(ls_html_text);
}
/* 4}결과를 다시 데이터 스트림에 씁니다*/
pageContext.getOut().write(ls_output.trim());
}
잡기(IOException e)
{ throw new JspTagException("태그 오류:" + e.toString());
}
/* JSP가 다음 페이지의 내용을 계속 처리하도록 합니다*/
EVAL_PAGE를 반환합니다.
}
}
이 처리는 매우 간단하며 다음이 포함됩니다.
o 태그의 시작과 끝 사이의 텍스트를 읽습니다. o html 인코딩 함수를 호출합니다. o 결과를 JSP 페이지로 반환합니다.
⑷ 태그 설명자를 생성하려면 시스템이 태그 처리 방법을 알 수 있도록 사용자 정의 태그를 설명해야 합니다. 이 설명 파일의 접미사는 .tld이며 일반적으로 이름은 태그 프로세서와 동일하며 "/WEB-INF/" 디렉터리에 저장됩니다.
HTML 인코딩 태그 설명자
<?xml version="1.0" 인코딩="UTF-8" ?>
<!DOCTYPE 태그 라이브러리
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP 태그 라이브러리 1.1//EN"
" http://Java.sun.com/j2ee/dtds/web-jsptalibrary_1_1.dtd ">
<TAGLIB>
<TLIBVERSION>1.0</TLIBVERSION>
<JSPVERSION>1.1</JSPVERSION>
<SHORTNAME>HTML_FormatTag</SHORTNAME>
<URI></URI>
<INFO>HTML 인코딩 태그</INFO>
<태그>
<NAME>HTML인코드</NAME>
<TAGCLASS>HTML_FormatTag</TAGCLASS>
<INFO>HTML 인코딩</INFO>
</TAG>
</TAGLIB>
⑸ 이제 JSP 컨테이너가 태그 라이브러리를 사용하도록 지시하도록 웹 XML 파일을 업데이트합니다. 이를 위해서는 web.xml 파일을 수정해야 하며, 특히 태그 라이브러리를 등록하기 위한 taglib 프로젝트를 추가해야 합니다. 가장 중요한 것은 태그에 URI를 할당하는 것입니다. URI는 웹사이트의 특정 태그에만 적용되는 고유한 참조입니다. 태그는 다른 웹사이트에서 사용될 수 있으므로 고유성을 보장하기 위해 전체 URL이나 패키지 이름을 사용하는 것이 좋습니다. 이 예는 단순화되었습니다.
web.xml 파일 수정
<?xml version="1.0" 인코딩="ISO-8859-1"?>
<!DOCTYPE 웹앱
PUBLIC "-//Sun Microsystems, Inc.//DTD 웹 애플리케이션 2.2//EN"
" http://Java.sun.com/j2ee/dtds/web-app_2.2.dtd ">
<웹앱>
<TAGLIB>
<TAGLIB-URI>
HTML인코드
</TAGLIB-URI>
<TAGLIB-위치>
/WEB-INF/HTML_FormatTag.tld
</TAGLIB-위치>
</TAGLIB>
</WEB-APP>
⑹ 새로운 태그를 이용한 커스텀 태그가 설정되어 JSP 페이지에서 사용할 수 있습니다. 이렇게 하려면 taglib 지시문을 사용하여 페이지에서 태그를 선언하면 됩니다. 태그는 고유한 URI로 참조되고 네임스페이스 접두사가 할당됩니다. 접두사는 다른 네임스페이스와 충돌하지 않는 한 임의적일 수 있습니다.
JSP 페이지에서 HTML 인코딩 태그 사용:
<%@ taglib uri="HTMLEncode" prefix="Examples" %>
<예비>
<?XML:NAMESPACE PREFIX = 예 /><예:HTMLEncode>
<안녕하세요, 간단한 샘플>
</예:HTMLEncode>
</PRE>
샘플 코드 출력
<안녕하세요, 간단한 샘플>
다음과 같이 표시됩니다.
<Hello, Simple 샘플>
이 태그를 사용하여 페이지의 모든 코드를 인코딩했습니다. 흥미로운 점은 모든 사용자 정의 태그가 서버에서 처리된다는 것입니다. 이는 출력 페이지에 사용자 정의 태그가 표시되지 않음을 의미합니다.
라벨을 만드는 것은 어렵지 않습니다. 가장 어려운 부분은 라벨 처리의 모든 내용을 배우는 것입니다. 이것은 매우 강력한 기능이며 우리는 기본적인 사항만 다루었습니다. 이 프로세스에는 여러 단계가 필요하기 때문에 새로운 JSP 프로그래머는 태그를 생성할 때 혼란을 겪을 것입니다.
JSP를 사용하여 DOM 애플리케이션을 개발하는 방법은 무엇입니까?
DOM은 Document Object Model의 약어로, 문서 객체 모델입니다. XML은 데이터를 트리로 구성하므로 DOM은 이 트리의 객체 설명입니다. 평신도의 말로는 XML 문서를 파싱하여 XML 문서에 대한 트리 모델을 논리적으로 구축하는 것이며, 트리의 노드는 객체입니다. 이러한 개체에 액세스하여 XML 문서의 내용에 액세스할 수 있습니다.
DOM에서 XML 문서를 작동하는 방법을 알아보기 위해 아래의 간단한 예를 살펴보겠습니다. 이것은 XML 문서이며 우리가 작업하려는 객체입니다:
<?xml version="1.0" 인코딩="UTF-8"?>
<메시지>
<message>직렬화는 이제 안녕, Java!</message>
</messages>
다음으로, 프로그램에서 사용할 수 있도록 이 문서의 내용을 Java 개체로 구문 분석해야 합니다. JAXP를 사용하면 단 몇 줄의 코드만으로 이 작업을 수행할 수 있습니다. 먼저, 특정 파서 객체를 얻기 위해 이 팩토리를 사용하는 파서 팩토리를 생성해야 합니다.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
여기서 DocumentBuilderFacotry를 사용하는 목적은 특정 파서와 독립적인 프로그램을 만드는 것입니다. DocumentBuilderFactory 클래스의 정적 메서드 newInstance()가 호출되면 시스템 변수에 따라 사용할 파서를 결정합니다. 그리고 모든 파서는 JAXP에서 정의한 인터페이스를 따르기 때문에 어떤 파서를 사용하든 코드는 동일합니다. 따라서 서로 다른 파서 간에 전환할 때 코드를 변경하지 않고 시스템 변수의 값만 변경하면 됩니다. 이것이 공장의 장점입니다.
DocumentBuilder db = dbf.newDocumentBuilder();
팩토리 객체를 얻은 후 정적 메서드인 newDocumentBuilder() 메서드를 사용하여 특정 DOM 파서를 나타내는 DocumentBuilder 객체를 얻습니다. 그러나 그것이 Microsoft인지 IBM인지 어떤 파서인지는 프로그램에 중요하지 않습니다.
그런 다음 이 파서를 사용하여 XML 문서를 파싱할 수 있습니다.
문서 doc = db.parse("c:/xml/message.xml");
DocumentBuilder의 구문 분석() 메소드는 XML 문서 이름을 입력 매개변수로 받아들이고 Document 객체를 반환합니다. 이 Document 객체는 XML 문서의 트리 모델을 나타냅니다. XML 문서에 대한 모든 향후 작업은 파서와 관련이 없으며 이 Document 개체에서 직접 작업할 수 있습니다. Document를 작동하는 구체적인 방법은 DOM에 의해 정의됩니다.
획득한 Document 개체에서 시작하여 DOM 여정을 시작할 수 있습니다. Document 개체의 getElementsByTagName() 메서드를 사용하면 NodeList 개체를 얻을 수 있습니다. Node 개체는 XML 문서의 태그 요소를 나타내고 NodeList 개체는 이름에서 볼 수 있듯이 Node 개체 목록을 나타냅니다.
NodeList nl = doc.getElementsByTagName("message");
이러한 명령문을 통해 얻는 것은 XML 문서의 모든 <message> 태그에 해당하는 Node 객체 목록입니다. 그런 다음 NodeList 객체의 item() 메서드를 사용하여 목록의 각 Node 객체를 가져올 수 있습니다.
노드 my_node = nl.item(0);
Node 객체가 생성되면 XML 문서에 저장된 데이터가 추출되어 Node.js 파일에 캡슐화됩니다. 이 예에서는 Message 태그 내의 콘텐츠를 추출하기 위해 일반적으로 Node 개체의 getNodeValue() 메서드를 사용합니다.
문자열 메시지 = my_node.getFirstChild().getNodeValue();
getFirstChild() 메소드는 메시지 아래의 첫 번째 하위 노드 객체를 얻기 위해 여기에서도 사용된다는 점에 유의하세요. 메시지 태그 아래에는 텍스트 외에 다른 하위 태그나 속성이 없지만 여기서는 주로 W3C의 DOM 정의와 관련된 getFirseChild() 메서드를 사용해야 합니다. W3C는 또한 태그 내의 텍스트 부분을 노드로 정의하므로 getNodeValue()를 사용하여 텍스트의 내용을 얻으려면 먼저 텍스트를 나타내는 노드를 가져와야 합니다. 이제 XML 파일에서 데이터를 추출할 수 있으므로 이 데이터를 적절한 위치에서 사용하여 애플리케이션을 구축할 수 있습니다.
DOM 예제
먼저 이 예제에서 수행할 작업에 대해 이야기하겠습니다. 추가된 URL 주소는 이 XML 파일에 기록됩니다. 매우 간단하지만 매우 실용적이며 대부분의 DOM 사용법을 설명하기에 충분합니다.
첫 번째 프로그램은 xmldisplay.Java입니다. 이 프로그램의 주요 기능은 이 XML 파일에 있는 각 노드의 내용을 읽은 다음 System.out에서 출력 형식을 지정하는 것입니다.
import Javax.xml.parsers. *;
import org.w3c.dom.*;
여기서는 Sun에서 제공하는 XML 파서를 사용하므로 필요한 클래스를 도입하기 위한 것이므로 DOM 파서와 SAX 파싱을 포함하는 Java.xml.parsers 패키지를 도입해야 합니다. 장치의 구체적인 구현입니다. org.w3c.dom 패키지는 w3c에서 개발한 DOM 인터페이스를 정의합니다.
DocumentBuilderFactory 팩토리 = DocumentBuilderFactory.newInstance();
DocumentBuilder 빌더=factory.newDocumentBuilder();
문서 doc=builder.parse("links.xml");
doc.normalize();
위의 내용 외에도 약간의 트릭이 있습니다. Document 개체에 대해 Normalize()를 호출하면 XML 문서의 공백으로 매핑된 불필요한 Text Node 개체를 제거할 수 있습니다. 그렇지 않으면 당신이 얻는 DOM 트리가 당신이 상상했던 것과 다를 수도 있습니다. 특히 출력할 때 이 Normalize()가 더 유용합니다.
NodeListlinks =doc.getElementsByTagName("link");
방금 언급한 것처럼 XML 문서의 공백 문자도 DOM 트리의 개체로 매핑됩니다. 따라서 Node 메소드의 getChildNodes 메소드를 직접 호출하면 문제가 발생할 수 있으며, 예상했던 NodeList 객체를 반환하지 못하는 경우도 있습니다. 해결책은 Element의 getElementByTagName(String)을 사용하는 것이며 반환된 NodeLise는 예상되는 개체입니다. 그런 다음 item() 메서드를 사용하여 원하는 요소를 추출할 수 있습니다.
for (int i=0;i<links.getLength();i++){
요소 link=(요소)links.item(i);
System.out.print("내용: ");
System.out.println(link.getElementsByTagName("text").item(0).getFirstChild();
.getNodeValue());
...
위의 코드 조각은 XML 문서 콘텐츠의 형식화된 출력을 완성합니다. getFirstChile() 메서드 및 getElementsByTagName() 메서드 사용과 같은 일부 세부 사항에 주의를 기울이면 비교적 쉽습니다.
다음 내용은 DOM 트리를 수정한 후 XML 문서로 다시 작성하는 내용입니다. 이 프로그램은 xmlwrite.Java라고 합니다. JAXP 1.0 버전에는 XML 문서 작성을 처리할 수 있는 직접적인 클래스와 메서드가 없으며, 다른 패키지에서 일부 보조 클래스를 사용해야 합니다. JAXP 1.1 버전에서는 XSLT에 대한 지원이 도입되었습니다. 소위 XSLT는 XML 문서(번역)를 변환한 후 새로운 문서 구조를 얻는 것입니다. 새로 추가된 이 기능을 사용하면 새로 생성되거나 수정된 DOM 트리를 XML 파일에 쉽게 다시 작성할 수 있습니다. 코드 구현을 살펴보겠습니다. 이 코드의 주요 기능은 새 링크 노드를 링크하는 것입니다. .xml 파일:
import Javax.xml.parsers.*;
import Javax.xml.transform.*;
Javax.xml.transform.dom.DOMSource를 가져옵니다.
Javax.xml.transform.stream.StreamResult 가져오기;
import org.w3c.dom.*;
새로 도입된 Java.xml.transform 패키지의 여러 클래스는 XSLT 변환을 처리하는 데 사용됩니다.
위의 XML 파일에 새 링크 노드를 추가하려고 하므로 먼저 link.xml 파일을 읽고 DOM 트리를 구축한 다음 DOM 트리를 수정(노드 추가)하고 마지막으로 수정된 DOM을 다시 추가해야 합니다. link.xml 파일:
DocumentBuilderFactory 팩토리 = DocumentBuilderFactory.newInstance();
DocumentBuilder 빌더=factory.newDocumentBuilder();
문서 doc=builder.parse("links.xml");
doc.normalize();
//---변수 가져오기----
String text="한중 홈페이지";
문자열 url=" www.hzliu.com ";
문자열 작성자="Hzliu Liu";
String Description="Hanzhong Liu의 사이트, 많은 놀라움을 선사합니다!!!",
핵심 사항을 명확하게 확인하고 절차를 단순화하기 위해 실제로 메모리 String 개체에 추가할 콘텐츠를 하드 코딩했습니다. 작업을 수행할 때 우리는 인터페이스를 사용하여 사용자 입력을 추출하거나 JDBC를 통해 데이터베이스에서 원하는 콘텐츠를 추출하는 경우가 많습니다.
텍스트 텍스트세그;
Element link=doc.createElement("link");
우선, Node의 유형이 Text 유형이든 Attr 유형이든 Element 유형이든 모두 Document 객체 CreateXXX(를 통해 생성된다는 점을 분명히 해야 합니다. )의 메소드(XXX는 생성될 특정 유형을 나타냄) 따라서 XML 문서에 링크 항목을 추가해야 하며 먼저 링크 개체를 생성해야 합니다.
Element linktext=doc.createElement("text") ;
textseg=doc.createTextNode(텍스트);
linktext.appendChild(textseg);
link.appendChild(링크텍스트);
...
노드를 생성하는 과정은 다소 균일할 수 있지만 주목해야 할 점은 Element에 포함된 텍스트입니다(DOM에서는 이러한 텍스트도 노드를 나타내므로 해당 노드도 생성해야 합니다). 이러한 텍스트의 내용을 설정하려면 Element 객체의 setNodeValue() 메서드를 직접 사용하고, 생성된 Text 객체의 setNodeValue() 메서드를 사용하여 텍스트를 설정해야 생성된 Element와 해당 텍스트 내용을 확인할 수 있습니다. DOM 트리에 추가되었습니다. 이전 코드를 살펴보면 이 내용을 더 잘 이해할 수 있습니다.
doc.getDocumentElement().appendChild(링크);
마지막으로 생성된 노드를 DOM 트리에 추가하는 것을 잊지 마세요. Document 클래스의 getDocumentElement() 메소드는 문서의 루트 노드를 나타내는 Element 객체를 반환합니다. XML 문서에서 루트 노드는 고유해야 합니다.
TransformerFactory tFactory =TransformerFactory.newInstance();
변환기 변환기 = tFactory.newTransformer();
DOMSource 소스 = 새로운 DOMSource(doc);
StreamResult 결과 = new StreamResult(new Java.io.File("links.xml"));
Transformer.transform(source, result);
그런 다음 XSLT를 사용하여 DOM 트리를 출력합니다. 여기서 TransformerFactory는 팩토리 패턴을 적용하여 특정 코드를 특정 변환기와 독립적으로 만듭니다. 구현 방법은 DocumentBuilderFactory와 동일하므로 여기서는 자세히 설명하지 않겠습니다. Transformer 클래스의 transfrom 메소드는 데이터 소스 Source와 출력 대상 Result라는 두 개의 매개변수를 허용합니다. 여기서는 DOMSource와 StreamResult를 각각 사용하여 DOM의 내용을 출력 스트림으로 출력할 수 있습니다. 출력 스트림이 파일인 경우 DOM의 내용이 파일에 기록됩니다.
JSP를 사용하여 SAX 애플리케이션을 개발하는 방법은 무엇입니까?
SAX는 Simple API for XML의 약자로 W3C에서 제안한 공식 표준은 아니지만 사실상의 표준이라고 할 수 있습니다. 실제로 이는 커뮤니티 토론의 산물입니다. 그럼에도 불구하고 SAX는 DOM보다 XML에서 덜 사용되지 않으며 거의 모든 XML 파서가 이를 지원합니다.
DOM에 비해 SAX는 가벼운 방법입니다. 우리는 DOM을 처리할 때 전체 XML 문서를 읽어야 하고 메모리에 DOM 트리를 생성하고 DOM 트리에 각 Node 개체를 생성해야 한다는 것을 알고 있습니다. 문서가 작을 때는 문제가 되지 않지만, 문서가 커지면 DOM을 처리하는 데 시간이 많이 걸리고 힘들어집니다. 특히 메모리 요구 사항도 기하급수적으로 증가하므로 일부 응용 프로그램(예: 애플릿)에서 DOM을 사용하는 것은 비용 효율적이지 않습니다. 현재로서는 더 나은 대체 솔루션은 SAX입니다.
SAX는 개념적으로 DOM과 완전히 다릅니다. 우선 DOM 문서 드라이버와 달리 이벤트 중심적입니다. 즉, 전체 문서를 읽을 필요가 없으며, 문서를 읽는 과정도 SAX 구문 분석 과정입니다. 소위 이벤트 중심(event-driven)은 콜백 메커니즘을 기반으로 하는 프로그램 실행 방법을 의미합니다. (Java의 새로운 프록시 이벤트 모델에 대해 명확하게 알고 있다면 이 메커니즘을 쉽게 이해할 수 있습니다.) XMLReader는 XML 문서를 읽는 과정, 즉 문서를 읽는 과정에서 XML 문서를 받아들이고 이를 구문 분석합니다. 파싱 과정이 동시에 진행되는데 이는 DOM과 매우 다릅니다. 구문 분석을 시작하기 전에 이벤트 리스너에 해당하는 XMLReader를 사용하여 ContentHandler를 등록해야 합니다. 과정. XMLReader가 적절한 콘텐츠를 읽으면 해당 이벤트를 발생시키고 이 이벤트의 처리 능력을 ContentHandler에 위임한 다음 해당 메서드를 호출하여 응답합니다.
일반적인 방식으로 이해하기는 다소 어려울 수 있지만 걱정하지 마십시오. 다음 예는 SAX 구문 분석 프로세스를 이해하는 데 도움이 될 것입니다. 이 간단한 XML 파일을 살펴보십시오:
<POEM>
<AUTHOR>오그덴 내쉬</AUTHOR>
<TITLE>벼룩</TITLE>
<LINE>아담</LINE>
</POEM>
XMLReader는 <POEM> 태그를 읽을 때 ContentHandler.startElement() 메서드를 호출하고 태그 이름 POEM을 매개 변수로 전달합니다. <POEM>이 나타날 때 수행해야 하는 작업을 처리하려면 구현하는 startElement() 메서드에서 해당 작업을 수행해야 합니다. 각각의 이벤트는 파싱 과정(즉, 문서를 읽는 과정)과 함께 하나씩 버려지며, 해당 메소드도 순차적으로 호출된다. 마지막으로 파싱이 완료되고 해당 메소드가 호출되면 문서가 처리된다. .그게 다야. 다음 표는 위의 XML 파일을 파싱할 때 순차적으로 호출되는 메서드 목록입니다.
발생한 프로젝트 메서드 콜백
{document start} startDocument()
<POEM> startElement(null,"POEM",null,{속성})
"n" 문자("<POEM>n...", 6, 1)
<AUTHOR> startElement(null,"AUTHOR",null,{속성})
"Ogden Nash" 문자("<POEM>n...", 15, 10)
</AUTHOR> endElement(null,"AUTHOR",null)
"n" 문자("<POEM>n...", 34, 1)
<TITLE> startElement(null,"TITLE",null,{속성})
"벼룩" 문자("<POEM>n...", 42, 5)
</TITLE> endElement(null,"TITLE",null)
"n" 문자("<POEM>n...", 55, 1)
<LINE> startElement(null,"LINE",null,{속성})
"아담" 문자("<POEM>n...", 62, 4)
</LINE> endElement(null,"LINE",null)
"n" 문자("<POEM>n...", 67, 1)
</POEM> endElement(null,"POEM",null)
{문서 끝} endDocument()
ContentHandler는 실제로는 인터페이스입니다.특정 XML 파일을 처리할 때 특정 이벤트를 처리하려면 ContentHandler를 구현하는 클래스를 만들어야 합니다. 이것이 실제로 SAX 처리 XML의 핵심이라고 할 수 있습니다. 문서. 여기에 정의된 몇 가지 메소드를 살펴보겠습니다.
void 문자(char[] ch, int start, int length): 이 메소드는 XML 파일에서 읽은 문자열을 처리하는 데 사용됩니다. 해당 매개변수는 문자 배열이며 이 배열에서 읽은 문자열의 시작 위치입니다. 이 문자열의 String 클래스를 얻기 위해 String 클래스의 생성자를 쉽게 사용할 수 있습니다. String charEncontered=new String(ch,start,length).
void startDocument(): 문서의 시작 부분을 발견하면 이 메서드를 호출하여 일부 전처리 작업을 수행합니다.
void endDocument(): 위 메서드에 해당하며, 문서가 끝나면 이 메서드가 호출되어 후속 작업을 수행합니다.
void startElement(String 네임스페이스URI, String localName, String qName, Attributes atts): 이 메서드는 시작 태그를 읽을 때 트리거됩니다. SAX1.0 버전에서는 네임스페이스가 지원되지 않지만 새 2.0 버전에서는 네임스페이스에 대한 지원이 제공됩니다. 여기서 매개변수의 네임스페이스URI는 네임스페이스이고, localName은 레이블 이름이며, qName은 레이블의 수정된 접두사입니다. 네임스페이스를 사용할 때 두 매개변수 모두 null이 아닙니다. 그리고 atts는 이 태그에 포함된 속성 목록입니다. atts를 통해 모든 속성 이름과 해당 값을 얻을 수 있습니다. SAX의 중요한 기능은 스트리밍 처리입니다. 태그를 만나면 이전에 만난 태그를 기록하지 않습니다. 즉, startElement() 메서드에서 아는 모든 정보는 이름과 속성입니다. 태그의 중첩된 구조, 상위 태그의 이름, 하위 요소 속성이 있는지 여부 및 기타 구조 관련 정보는 알 수 없으며 완료하려면 프로그램이 필요합니다. 이로 인해 SAX는 DOM보다 프로그래밍이 덜 편리해집니다.
void endElement(String 네임스페이스URI, String localName, String qName): 이 메소드는 종료 태그가 발견될 때 호출됩니다.
우리는 DOM에 대해 이야기할 때 사용한 문서 예제를 계속 사용하지만 먼저 더 간단한 애플리케이션을 살펴보겠습니다. 각 태그가 XML 파일에 나타나는 횟수를 계산해 보겠습니다. 이 예제는 매우 간단하지만 SAX 프로그래밍의 기본 아이디어를 설명하기에 충분합니다. 물론 import 문은 처음부터 계속 사용됩니다.
import org.xml.sax.helpers.DefaultHandler;
import Javax.xml.parsers.*;
org.xml.sax.* 가져오기;
org.xml.sax.helpers.* 가져오기;
Java.util.* 가져오기;
import Java.io.*;
그런 다음 DefaultHandler를 상속하는 클래스를 만듭니다. 특정 프로그램 논리는 잠시 미뤄두어도 됩니다. 우리가 주목해야 할 것은 프로그램의 구조입니다.
public class SAXCounter는 DefaultHandler를 확장합니다.
private Hashtable 태그; //이 해시테이블은 태그가 나타나는 횟수를 기록하는 데 사용됩니다.
//문서 처리 전 작업
public void startDocument()에서 SAXException이 발생합니다.
Tags = new Hashtable();//해시테이블 초기화
}
//각 시작 요소 속성을 처리합니다.
공공 무효 startElement(문자열 네임스페이스URI, 문자열 localName,
문자열 rawName, 속성 atts)
SAXException이 발생합니다.
{
문자열 키 = localName;
...
이 프로그램이 무엇을 하는지 봅시다. main() 메서드에서 수행하는 주요 작업은 파서를 만든 다음 문서를 구문 분석하는 것입니다. 실제로 여기서 SAXParser 객체를 생성할 때 프로그램 코드를 특정 파서와 독립적으로 만들기 위해 DOM에서와 동일한 설계 기술이 사용됩니다. 즉, SAXParserFactory 클래스를 통해 특정 SAXParser 객체를 생성하므로 구문 분석할 때 , 변경해야 할 것은 환경 변수의 값뿐이며 프로그램 코드는 변경되지 않은 상태로 유지될 수 있습니다. 이것이 FactoryMethod 패턴의 아이디어이다. 여기서는 자세히 설명하지 않겠습니다. 여전히 이해가 되지 않으면 위의 DOM에 있는 설명을 참조하세요. 원리는 동일합니다.
그러나 여기서 주목해야 할 사항은 SAXParser 클래스와 XMLReader 클래스 간의 관계입니다. 실제로 SAXParser는 JAXP의 XMLReader에 대한 래퍼 클래스이고 XMLReader는 문서 구문 분석을 위해 SAX2.0에 정의된 인터페이스입니다. SAXParser 또는 XMLReader에서 파서() 메서드를 호출하여 문서를 구문 분석할 수도 있으며 그 효과는 완전히 동일합니다. 그러나 SAXParser의 parser() 메서드는 더 많은 매개 변수를 허용하고 다양한 XML 문서 데이터 소스를 구문 분석할 수 있으므로 XMLReader보다 사용하기가 더 편리합니다.
이 예제는 SAX의 표면만 다루지만 다음 예제는 더 발전된 것입니다. 아래에서 구현하려는 함수는 XML 문서의 내용을 읽고 출력 형식을 지정하는 DOM 예제에 이미 구현되어 있습니다. 비록 프로그램 논리가 매우 단순해 보이지만, SAX는 DOM보다 나을 것이 없습니다.
앞서 언급했듯이 startElement() 메서드에서 시작 태그를 만나면 XML 문서에서 태그의 위치를 가져올 수 없습니다. 이는 XML 문서를 처리할 때 큰 문제가 됩니다. 왜냐하면 XML 태그의 의미가 부분적으로 위치에 따라 결정되기 때문입니다. 그리고 문서의 구조를 확인해야 하는 일부 프로그램에서는 이것이 더욱 문제가 됩니다. 물론, 해결되지 않는 문제는 없습니다. 문서 구조를 기록하기 위해 스택을 사용할 수 있습니다.
스택의 특징은 선입선출입니다. 현재 아이디어는 push를 사용하여 startElemnt() 메서드의 스택에 레이블 이름을 추가하고 endElement() 메서드에서 이를 팝업하는 것입니다. 구조가 잘 구성된 XML의 경우 중첩 구조가 완전하다는 것을 알고 있습니다. 각 시작 태그는 항상 종료 태그에 해당하며 태그 중첩 간에 정렬 오류가 없습니다. 따라서 startelement () 메소드에 대한 모든 호출은 Endelement () 메소드에 대한 호출에 해당하므로 푸시 및 팝도 현재 레이블이 어디에 있는지 쉽게 알 수 있도록 스택의 구조 만 분석하면됩니다. 문서 구조의 위치.
공개 클래스 SaxReader는 defaulthandler {를 확장합니다.
java.util.stack tags = new java.util.stack ();
...
스택 분석은 여기에 사용되지 않지만 스택 분석은 실제로 java.util.vector 클래스를 상속 받기 때문에 매우 쉬운 일입니다 따라서 맨 아래로 정렬됩니다. 따라서 벡터 클래스의 크기 () 메소드를 사용하여 스택의 요소 수를 얻을 수 있으며 벡터 클래스의 get (int) 메소드를 사용하여 특정을 얻을 수 있습니다. 각 요소의 속성. 실제로, 우리는 스택의 요소를 하나씩 아래로 정렬하면 XML 루트 노드 에서이 경로의 정보로 고유 한 경로를 얻을 수 있습니다. .
지금까지 XML 프로그래밍을위한 두 가지 주요 도구 인 DOM과 SAX를 마스터했으며 Java 프로그램에서 사용하는 방법도 알고 있습니다. DOM 프로그래밍은 비교적 간단하지만 느리고 많은 메모리를 차지하는 반면 S AX 프로그래밍은 더 복잡하지만 빠르며 메모리를 덜 차지합니다. 따라서 다른 환경에 따라 다른 방법을 사용하도록 선택해야합니다. 대부분의 XML 응용 프로그램은 기본적으로이를 사용하여 해결할 수 있습니다. Dom과 Sax는 실제로 언어 독립적이며 Java에 고유하지 않으며, 해당 언어 구현이있는 한, Dom과 Sax는 모든 객체 지향 언어로 적용될 수 있습니다.