??xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--This is a test for dom4j, holen, 2004.9.11-->
<book show="no">
<title>Dom4j Tutorials</title>
</book>
<book show="no">
<title>Lucene Studing</title>
</book>
<book show="no">
<title>Lucene in Action</title>
</book>
<owner>O'Reilly</owner>
</books>
--------------------------------
import java.io.File;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
* @author Holen Chen
*/
public class Dom4jDemo {
public Dom4jDemo() {
}
/**
* 建立一个XML文档,文名由输入参数军_
* @param filename 需建立的文件名
* @return q回操作l果, 0表失? 1表成?br>
*/
public int createXMLFile(String filename){
/** q回操作l果, 0表失? 1表成?nbsp;*/
int returnValue = 0;
/** 建立document对象 */
Document document = DocumentHelper.createDocument();
/** 建立XML文的根books */
Element booksElement = document.addElement("books");
/** 加入一行注?nbsp;*/
booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");
/** 加入W一个book节点 */
Element bookElement = booksElement.addElement("book");
/** 加入show参数内容 */
bookElement.addAttribute("show","yes");
/** 加入title节点 */
Element titleElement = bookElement.addElement("title");
/** 为title讄内容 */
titleElement.setText("Dom4j Tutorials");
/** cM的完成后两个book */
bookElement = booksElement.addElement("book");
bookElement.addAttribute("show","yes");
titleElement = bookElement.addElement("title");
titleElement.setText("Lucene Studing");
bookElement = booksElement.addElement("book");
bookElement.addAttribute("show","no");
titleElement = bookElement.addElement("title");
titleElement.setText("Lucene in Action");
/** 加入owner节点 */
Element ownerElement = booksElement.addElement("owner");
ownerElement.setText("O'Reilly");
try{
/** document中的内容写入文g?nbsp;*/
XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
writer.write(document);
writer.close();
/** 执行成功,需q回1 */
returnValue = 1;
}catch(Exception ex){
ex.printStackTrace();
}
return returnValue;
}
/**
* 修改XML文g中内?q另存ؓ(f)一个新文g
* 重点掌握dom4j中如何添加节?修改节点,删除节点
* @param filename 修改对象文g
* @param newfilename 修改后另存ؓ(f)该文?br>
* @return q回操作l果, 0表失? 1表成?br>
*/
public int ModiXMLFile(String filename,String newfilename){
int returnValue = 0;
try{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(filename));
/** 修改内容之一: 如果book节点中show参数的内容ؓ(f)yes,则修Ҏ(gu)no */
/** 先用xpath查找对象 */
List list = document.selectNodes("/books/book/@show" );
Iterator iter = list.iterator();
while(iter.hasNext()){
Attribute attribute = (Attribute)iter.next();
if(attribute.getValue().equals("yes")){
attribute.setValue("no");
}
}
/**
* 修改内容之二: 把owner内Ҏ(gu)为Tshinghua
* q在owner节点中加入date节点,date节点的内容ؓ(f)2004-09-11,qؓ(f)date节点d一个参数type
*/
list = document.selectNodes("/books/owner" );
iter = list.iterator();
if(iter.hasNext()){
Element ownerElement = (Element)iter.next();
ownerElement.setText("Tshinghua");
Element dateElement = ownerElement.addElement("date");
dateElement.setText("2004-09-11");
dateElement.addAttribute("type","Gregorian calendar");
}
/** 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 */
list = document.selectNodes("/books/book");
iter = list.iterator();
while(iter.hasNext()){
Element bookElement = (Element)iter.next();
Iterator iterator = bookElement.elementIterator("title");
while(iterator.hasNext()){
Element titleElement=(Element)iterator.next();
if(titleElement.getText().equals("Dom4j Tutorials")){
bookElement.remove(titleElement);
}
}
}
try{
/** document中的内容写入文g?nbsp;*/
XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
writer.write(document);
writer.close();
/** 执行成功,需q回1 */
returnValue = 1;
}catch(Exception ex){
ex.printStackTrace();
}
}catch(Exception ex){
ex.printStackTrace();
}
return returnValue;
}
/**
* 格式化XML文,q解决中文问?br>
* @param filename
* @return
*/
public int formatXMLFile(String filename){
int returnValue = 0;
try{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(filename));
XMLWriter output = null;
/** 格式化输?cdIE览一?nbsp;*/
OutputFormat format = OutputFormat.createPrettyPrint();
/** 指定XML字符集编?nbsp;*/
format.setEncoding("GBK");
output = new XMLWriter(new FileWriter(new File(filename)),format);
output.write(document);
output.close();
/** 执行成功,需q回1 */
returnValue = 1;
}catch(Exception ex){
ex.printStackTrace();
}
return returnValue;
}
public static void main(String[] args) {
Dom4jDemo temp = new Dom4jDemo();
System.out.println(temp.createXMLFile("d://holen.xml"));
System.out.println(temp.ModiXMLFile("d://holen.xml","d://holen2.xml"));
System.out.println(temp.formatXMLFile("d://holen2.xml"));
}
}
转自Qhttp://www.donews.net/holen/archive/2004/09/11/96062.aspx
前言
从JSP 1.1规范开始,JSP支持在JSP中用自定义标签了,自定义标{q泛使用造成了程序员重复定义Q这样就促成了JSTLQJavaServer Pages Standard Tag LibraryQ的诞生?br />因ؓ(f)工作中需要用到JSTLQ但|上却苦于找不到有关JSTL的中文资料,所以就有了q篇文章?br />
JSTL?br />
JSTL是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta组来维护的。JSTL只能q行在支持JSP1.2和Servlet2.3规范的容器上Q如tomcat 4.x。但是在卛_推出的JSP 2.0中是作ؓ(f)标准支持的?br />JSTL目前的最新版本ؓ(f)1.02Q最l发布版?.0。JSTL包含两个部分Q标{ֺ和ELQExpression Language表达式语aQ语a。标{ֺ目前支持四种标签Q?标签 URI 前缀 CZ
Core http://java.sun.com/jstl/core c <c:tagname ...>
XML processing http://java.sun.com/jstl/xml x <x:tagname ...>
I18N capable formatting http://java.sun.com/jstl/fmt fmt <fmt:tagname ...>
Database access (SQL) http://java.sun.com/jstl/sql sql <sql:tagname ...>
Core支持JSP中的一些基本的操作Q?br />XML processing支持XML文档的处理;
I18N capable formatting支持对JSP面的国际化Q?br />Database access (SQL)支持JSPҎ(gu)据库的操作?br />
׃本h水^有限Q本文仅介绍Core标签Q如有兴,可一h讨其它三U标{使用与扩充?br />
EL语言介绍
EL语言是JSTL输出Q输入)(j)一个JAVA表达式的表示形式?br />在JSTL中,EL语言只能在属性g使用。EL语言只能通过建立表达?{exp1}来进行调用。在属性g使用表达式有三种方式?br />
1?value属性包含一个表辑ּ
<some:tag value="${expr}"/>
在这U情况下Q表辑ּD计算出来q根据类型{换规则赋值给value属性。比如:(x)<c:out value="${username}" />中的${username}是一个ELQ它相当于JSP语句<%=request.getAttribute(“username?%>?lt;%=session.getAttribute(“username?%>
2?value属性包含一个或多个属性,q些属性被文本分割或围l?br /><some:tag value="some${expr}${expr}text${expr}"/>
在这U情况下Q表辑ּ从左到右q行计算Qƈ结果{换ؓ(f)字符串型Q根据类型{换规则)(j)Qƈ结果赋值给value属?br />
3?value属性仅仅包含文?br /><some:tag value="sometext"/>
在这U情况下Q字W串型属性value根据类型{换规则{换ؓ(f)标签所希望的类型?br />
EL语言的操作符
取得某个对象或集合中的属性?br />Z获得集合中的属性,EL支持以下两种操作
1Q?使用.操作W来获得有名字的属性。例如表辑ּ${user.username}表明对象user的username属?br />2Q?使用[]操作W来获得有名字或按数字排列的属性?br />表达?{user["username"]}和表辑ּ${user. username }含义相同
表达?{row[0]} 表明row集合的第一个条目?br />在这里user是一个类的对象,它的属性username必须W合标准JavaBean的规范,卛_Mؓ(f)username属性定义相应的getter、setterҎ(gu)?br />
Empty操作W?I值检?
使用empty操作W来军_对象、集合或字符串变量是否ؓ(f)I或null。例如:(x)
${empty param.username}
如果request的参数列表中的usernamegؓ(f)nullQ则表达式的gؓ(f)true?EL也可以直接用比较操作符与nullq行比较。如${param.firstname == null}?br />比较操作W?操作W?描述
==或eq 相等(g)?
!=或ne 不等(g)?
<或lt 于(g)?
>或gt 大于(g)?
<=或le 于{于(g)?
>=或ge 大于{于(g)?
数字q算W与逻辑q算W均与JAVA语言相同Q不再列表?br />
Core标签?br />
1?通用标签
<c:out>
<c:out>标签用于在JSP中显C数据,它有如下属????q?是否必须 ~省?
value 输出的信息,可以是EL表达式或帔R ??
default value为空时显CZ???
escapeXml 为true则避开Ҏ(gu)的xml字符??true
例子: (zhn)的用户名是: <c:out value=?{user.username}?default=”guest?>
昄用户的用户名Q如为空则显Cguest
<c:out value="${sessionScope.username}"/>
指定从session中获取username的值显C;
<c:out value="${username}" />
昄username的|默认是从request(page)中取Q如果request中没有名为username的对象则从session中取Qsession中没有则从application(servletContext)中取Q如果没有取CQ何值则不显C?br />
<c:set>
<c:set>标签用于保存数据Q它有如下属????q?是否必须 ~省?
value 要保存的信息Q可以是EL表达式或帔R ?
target 需要修改属性的变量名,一般ؓ(f)javabean的实???
property 需要修改的javabean属???
var 需要保存信息的变量 ??
scope 保存信息的变量的范围 ?page
如果指定了target属? 那么property属性也必须指定?br />例子Q?<c:set value="${test.testinfo}" var="test2" scope=”session?/>
test.testinfo的g存到session的test2中,其中test是一个javabean的实例,testinfo是test对象的属性?br /><c:set target="${cust.address}" property="city" value="${city}"/>
对象cust.address的city属性g存到变量city?br />
<c:remove>
<c:remove>标签用于删除数据Q它有如下属????q?是否必须 ~省?
var 要删除的变量 ??
scope 被删除变量的范围 ?所有范_(d)包括page、request、session、application{?
例子: <c:remove var="test2" scope="session"/>
从session中删除test2变量?br />
2?控制标{?br />
<c:if>
<c:if>标签有如下属????q?是否必须 ~省?
test 需要评L(fng)条gQ相当于if (...){}语句中的条g ??
var 要求保存条gl果的变量名 ??
scope 保存条gl果的变量范??page
<c:choose>
q个标签不接受Q何属?br />
<c:when>
<c:when>标签有以下属????q?是否必须 ~省?
test 需要评L(fng)条g ??
<c:otherwise>
q个标签同样不接受Q何属?br />
例子Q?<c:if test="${user.wealthy}">
user.wealthy is true.
</c:if>
如果user.wealthy值trueQ则昄user.wealthy is true.
<c:choose>
<c:when test="${user.generous}">
user.generous is true.
</c:when>
<c:when test="${user.stingy}">
user.stingy is true.
</c:when>
<c:otherwise>
user.generous and user.stingy are false.
</c:otherwise>
</c:choose>
只有当条件user.generousq回值是trueӞ才显Cuser.generous is true.
只有当条件user.stingyq回值是trueӞ才显Cuser.stingy is true.
其它所有的情况Q即user.generous和user.stingy的值都不ؓ(f)trueQ全部显Cuser.generous and user.stingy are false.
׃JSTL没有形如if (){…} else {…}的条件语句,所以这UŞ式的语句只能?lt;c:choose>?lt;c:when>?lt;c:otherwise>标签共同来完成了?br />
3?循环控制标签
<c:forEach>
<c:forEach>标签用于通用数据Q它有以下属????q?是否必须 ~省?
items q行循环的项???
begin 开始条??0
end l束条g ?集合中的最后一个项?
step 步长 ?1
var 代表当前目的变量名 ??
varStatus 昄循环状态的变量 ??
例子Q?<c:forEach items="${vectors}" var="vector">
<c:out value="${vector}"/>
</c:forEach>
相当于java语句 for (int i=0;i<vectors.size();i++) {
out.println(vectors.get(i));
}
在这里vectors是一个java.util.Vector对象Q里面存攄是String数据Qvector是当前@环条件下String对象。实际上q里的vectors可以是Q何实Cjava.util. Collection接口的对象?
<c:forEach begin="0" end="100" var="i" step="1">
count=<c:out value="${i}"/><br>
</c:forEach>
输出:
count=0
...
count=100
<c:forTokens>
<c:forTokens>标签有以下属????q?是否必须 ~省?
items q行循环的项???
delims 分割W???
begin 开始条??0
end l束条g ?集合中的最后一个项?
step 步长 ?1
var 代表当前目的变量名 ??
varStatus 昄循环状态的变量 ??
例子
<c:forTokens items="a:b:c:d" delims=":" var="token">
<c:out value="${token}"/>
</c:forTokens>
q个标签的用相当于java.util.StringTokenizercR在q里字W串a:b:c:d以:(x)分开循环四次Qtoken是@环到当前分割到的字符丌Ӏ?br />
4.导入文g和URL
JSTL核心标签库支持?lt;c:import>来包含文Ӟ使用<c:url>来打印和格式化URL,使用<c:redirect>来重定向URL?br />
<c:import>
<c:import>标签包含另外一个页面代码到当前,它有以下属????q?是否必须 ~省?
url 需要导入页面的url ??
context /后跟本地web应用E序的名??当前应用E序
charEncoding 用于导入数据的字W集 ?ISO-8859-1
var 接受导入文本的变量名 ?page
scope 接受导入文本的变量的变量范围 ?1
varReader 用于接受导入文本的java.io.Reader变量???
varStatus 昄循环状态的变量 ??
<c:url>
<c:url>标签输出一个url地址Q它有以下属????q?是否必须 ~省?
url url地址 ??
context /后跟本地web应用E序的名??当前应用E序
charEncoding 用于导入数据的字W集 ?ISO-8859-1
var 接受处理q的url变量名,该变量存储url ?输出到页
scope 存储url的变量名的变量范??page
例子Q?
<c:import url="http://www.url.com/edit.js" var="newsfeed"/>
url http://www.url.com/edit.js包含到当前页的当前位|,q将url保存到newsfeed变量?
<a href="<c:url url="/index.jsp"/>"/>
在当前页的当前位|输?lt;a />Qhttp://www.yourname.com是当前页的所在的位置?br />
<c:redirect>
<c:redirect>标签请求重新定向到另外一个页面,它有以下属????q?是否必须 ~省?
url url地址 ??
context /后跟本地web应用E序的名??当前应用E序
例子Q?
<c:redirect url="http://www.yourname.com/login.jsp"/>
请求重新定向到http://www.yourname.com/login.jsp,相当于response.setRedirect("http://www.yourname.com/login.jsp");
<c:param>
<c:param>标签用来传递参数给一个重定向或包含页面,它有以下属????q?是否必须 ~省?
name 在request参数中设|的变量???
value 在request参数中设|的变量???
例子Q?
<c:redirect url="login.jsp">
<c:param name="id" value="888"/>
</c:redirect>
参?88以id为名字传递到l(f)ogin.jsp面Q相当于login.jsp?id=888
JSTL的优?br />1?在应用程序服务器之间提供了一致的接口Q最大程序地提高了WEB应用在各应用服务器之间的UL?br />2?化了JSP和W(xu)EB应用E序的开发?br />3?以一U统一的方式减了JSP中的scriptlet代码数量Q可以达到没有Q何scriptlet代码的程序。在我们公司的项目中是不允许有Q何的scriptlet代码出现在JSP中?br />4?允许JSP设计工具与WEB应用E序开发的q一步集成。相信不久就?x)有支持JSTL的IDE开发工具出现?br />
ȝ
上面介绍的仅仅是JSTL的一部分Q如果有旉我会(x)l箋把其它部分写出来分nl大家。如果要使用JSTLQ则必须jstl.jar和standard.jar文g攑ֈclasspath中,如果你还需要用XML processing?qing)Database access (SQL)标签Q还要将相关JAR文g攑ֈclasspath中,q些JAR文g全部存在于下载回来的zip文g中。这个zip文g可以从http://jakarta.apache.org/builds/jakarta-taglibs/releases/standard/jakarta-taglibs-standard-1.0.zip下蝲?br />
参考资?br />1?http://java.sun.com/products/jsp/jstl/
sun公司的JSTL站点
2?http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html
jakarta组的JSTL站点
3?http://www.manning.com/bayern/appendixA.pdf
JSTL的参考文档,本文很多内容都是从这个PDF文g里翻译的?br />4?Q<J2EE~程指南Q?.3版)(j)Q>
介绍了JSTL的雏形,wrox的书都是_֓?/p>
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1464467