??xml version="1.0" encoding="utf-8" standalone="yes"?>
package com.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternTest {
private static void test0() {
String str = "<biao><>c<b>x";
Pattern pattern;
Matcher matcher;
// 贪婪: 最长匹?.* : 输出: <biao><>c<b>
pattern = Pattern.compile("<.*>");
matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}
// 不知是否非贪?.*? : 输出: <biao>, <>, <b>
pattern = Pattern.compile("<.*?>");
matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}
// 使用l? 输出<>里的内容, 输出: 'biao', ' ', 'b'
// 0l代表整个表辑ּ, 子组?开?br /> pattern = Pattern.compile("<(.*?)>");
matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(">>"+matcher.group(1));
}
}
/** 查找以Java开头的L字符?*/
public static void test1() {
Pattern pattern = Pattern.compile("^Java.*");
Matcher m = pattern.matcher("Java哈哈");
System.out.println(m.find());
}
/** 以多条g分割字符?*/
public static void test2() {
Pattern pattern = Pattern.compile("[,|\\+]+");
String str[] = pattern.split("Java+ Hello World Java,Hello,,World|Sun");
if(str != null) {
for(String s : str) {
System.out.println(">> " +s);
}
}
}
/** 文字替换 */
public static void test3() {
Pattern pattern = Pattern.compile("abc*");
Matcher matcher = pattern.matcher("xabcccc试abd, abcce");
String str = matcher.replaceAll("(?)");
System.out.println(str);
}
/** 文字替换(替换字符) l果会(x)?nbsp; x(?)试(?)d, (?) */
public static void test4() {
Pattern pattern = Pattern.compile("123|4(567)");
Matcher matcher = pattern.matcher("0123456789abcde");
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(">>"+ matcher.start()+":"+matcher.end());
matcher.appendReplacement(sb, "(?)");
}
matcher.appendTail(sb);
System.out.println(sb);
}
public static void test5() {
String regEx="B(ond)";
String str="My name is Bond. James Bond.";
Pattern p=Pattern.compile(regEx);
Matcher matcher=p.matcher(str);
if(matcher.find()){
System.out.println(matcher.groupCount());
System.out.println(matcher.start());
String group_0 = matcher.group(0);
String group_1 = matcher.group(1);
System.out.println("Group 0 " + group_0);
System.out.println("Group 1 " + group_1);
System.out.println(str);
}
}
// 验证是否为邮地址
public static void test6() {
String str="ponline@yahoo.com.cn.jcWe--_*";
Pattern pattern =
Pattern.compile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+");
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());
}
/** 去除html 标记 */
public static void test7() {
Pattern pattern = Pattern.compile(".+?");
Matcher matcher = pattern.matcher("<a 试 href=\"index.html\">主页</a>");
matcher.find();
System.out.println(matcher.group());
String string = matcher.replaceFirst("");
System.out.println(string);
}
/** 查找html 中对应条件字W串 **/
public static void test8() {
Pattern pattern = Pattern.compile("href=\"(.+?)\"");
Matcher matcher = pattern.matcher("<a href=\"index.html\">主页</a>");
if(matcher.find())
System.out.println(matcher.group(1));
}
/** 截取http://地址 **/
public static void test9() {
Pattern pattern = Pattern.compile("(http://|https://){1}.+");
Matcher matcher = pattern.matcher("dsdsds<http://dfhf.\\sd-: s//国家gfg-ffdfd>fdf");
StringBuffer buffer = new StringBuffer();
while(matcher.find()){
buffer.append(matcher.group());
buffer.append("\r\n");
System.out.println(buffer.toString());
}
}
/** 替换指定{}中文?nbsp; **/
public static void test10() {
String str = "Java目前的发展史是由{0}q?{1}q?;
String[][] object={new String[]{"\\{0\\}","1995"},new String[]{"\\{1\\}","2007"}};
System.out.println(replace(str,object));
}
public static String replace(String sourceString, String[][] object) {
String temp=sourceString;
for(int i=0;i<object.length;i++){
String[] result=(String[])object[i];
Pattern pattern = Pattern.compile(result[0]);
Matcher matcher = pattern.matcher(temp);
temp=matcher.replaceAll(result[1]);
}
return temp;
}
public static void main(String[] args) throws Exception{
PatternTest.test10();
}
}
Here’s a guide to show you how to integrate Spring with JAX-WS, as mention in this link : http://jax-ws-commons.java.net/spring/. Upon finishing this tutorial, you will create a simple HelloWorld web service (JAX-WS), and DI a bean into the web service via Spring.
See the final project folder structure.
Use Maven to get all the library dependencies. The key to integrate Spring with JAX-WS is via jaxws-spring.jar.
File : pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mkyong</groupId> <artifactId>WebServicesExample</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>WebServicesExample Maven Webapp</name> <url>http://maven.apache.org</url> <repositories> <repository> <id>java.net</id> <url>http://download.java.net/maven/2</url> </repository> </repositories> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- Spring framework --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> <version>2.5.6</version> </dependency> <!-- JAX-WS --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>2.2.3</version> </dependency> <!-- Library from java.net, integrate Spring with JAX-WS --> <dependency> <groupId>org.jvnet.jax-ws-commons.spring</groupId> <artifactId>jaxws-spring</artifactId> <version>1.8</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> <exclusion> <groupId>com.sun.xml.stream.buffer</groupId> <artifactId>streambuffer</artifactId> </exclusion> <exclusion> <groupId>org.jvnet.staxex</groupId> <artifactId>stax-ex</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <finalName>web services</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.1</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> </project>
A simple JAX-WS example, and dependency inject (DI) “HelloWorldBo” via Spring.
File : HelloWorldWS.java
package com.mkyong.ws; import javax.jws.WebMethod; import javax.jws.WebService; import com.mkyong.bo.HelloWorldBo; @WebService public class HelloWorldWS{ //DI via Spring HelloWorldBo helloWorldBo; @WebMethod(exclude=true) public void setHelloWorldBo(HelloWorldBo helloWorldBo) { this.helloWorldBo = helloWorldBo; } @WebMethod(operationName="getHelloWorld") public String getHelloWorld() { return helloWorldBo.getHelloWorld(); } }
Here’s the HelloWorldBo class, with a getHelloWorld()
method to return a simple string.
File : HelloWorldBo.java
package com.mkyong.bo; public interface HelloWorldBo{ String getHelloWorld(); }
File : HelloWorldBoImpl.java
package com.mkyong.bo.impl; import com.mkyong.bo.HelloWorldBo; public class HelloWorldBoImpl implements HelloWorldBo{ public String getHelloWorld(){ return "JAX-WS + Spring!"; } }
Spring beans configuration file to bind URL pattern “/hello” to “com.mkyong.ws.HelloWorldWS” web service class.
File : applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ws="http://jax-ws.dev.java.net/spring/core" xmlns:wss="http://jax-ws.dev.java.net/spring/servlet" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://jax-ws.dev.java.net/spring/core http://jax-ws.dev.java.net/spring/core.xsd http://jax-ws.dev.java.net/spring/servlet http://jax-ws.dev.java.net/spring/servlet.xsd" > <wss:binding url="/hello"> <wss:service> <ws:service bean="#helloWs"/> </wss:service> </wss:binding> <!-- Web service methods --> <bean id="helloWs" class="com.mkyong.ws.HelloWorldWS"> <property name="helloWorldBo" ref="HelloWorldBo" /> </bean> <bean id="HelloWorldBo" class="com.mkyong.bo.impl.HelloWorldBoImpl" /> </beans>
In web.xml, declares “com.sun.xml.ws.transport.http.servlet.WSSpringServlet
“, and link it to “/hello
“.
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Spring + JAX-WS</display-name> <servlet> <servlet-name>jaxws-servlet</servlet-name> <servlet-class> com.sun.xml.ws.transport.http.servlet.WSSpringServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>jaxws-servlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <!-- Register Spring Listener --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app>
Start the project, and access the deployed web service via URL “/hello“, for example http://localhost:8080/WebServicesExample/hello?wsdl
Spring AOP 用户可能?x)经怋?execution
pointcut designator。执行表辑ּ的格式如下:(x)
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
除了q回cd模式Q上面代码片断中的ret-type-patternQ,名字模式和参数模式以外,所有的部分都是可选的?q回cd模式军_了方法的q回cd必须依次匚w一个连接点?你会(x)使用的最频繁的返回类型模式是 *
Q它代表了匹配Q意的q回cd?一个全U限定的cd名将只会(x)匚wq回l定cd的方法。名字模式匹配的是方法名?你可以?*
通配W作为所有或者部分命名模式?参数模式E微有点复杂Q?/span>()
匚w了一个不接受M参数的方法, ?(..)
匚w了一个接受Q意数量参数的Ҏ(gu)Q零或者更多)?模式 (*)
匚w了一个接受一个Q何类型的参数的方法?模式 (*,String)
匚w了一个接受两个参数的Ҏ(gu)Q第一个可以是LcdQ第二个则必LStringcd?/span>
下面l出一些常见切入点表达式的例子?/p>
L公共Ҏ(gu)的执行:(x)
execution(public * *(..))
M一个以“set”开始的Ҏ(gu)的执行:(x)
execution(* set*(..))
AccountService
接口的Q意方法的执行Q?/p>
execution(* com.xyz.service.AccountService.*(..))
定义在service包里的Q意方法的执行Q?/p>
execution(* com.xyz.service.*.*(..))
定义在service包或者子包里的Q意方法的执行Q?/p>
execution(* com.xyz.service..*.*(..))
within(com.xyz.service.*)在service包或者子包里的Q意连接点Q在Spring AOP中只是方法执行) Q?nbsp;
within(com.xyz.service..*)实现?AccountService 接口的代理对象的Lq接点(在Spring AOP中只是方法执行) Q?nbsp;
this(com.xyz.service.AccountService)'this'在binding form中用的更多:(x)- 请常见以下讨论通知的章节中关于如何使得代理对象可以在通知体内讉K到的部分?nbsp;
实现?AccountService 接口的目标对象的Lq接点(在Spring AOP中只是方法执行) Q?nbsp;
target(com.xyz.service.AccountService)'target'在binding form中用的更多:(x)- 请常见以下讨论通知的章节中关于如何使得目标对象可以在通知体内讉K到的部分?nbsp;
M一个只接受一个参敎ͼ且在q行时传入的参数实现?Serializable 接口的连接点 Q在Spring AOP中只是方法执行)
args(java.io.Serializable)'args'在binding form中用的更多:(x)- 请常见以下讨论通知的章节中关于如何使得Ҏ(gu)参数可以在通知体内讉K到的部分?nbsp;
h意在例子中给出的切入点不同于 execution(* *(java.io.Serializable))Q?args只有在动态运行时候传入参数是可序列化的(SerializableQ才匚wQ而execution 在传入参数的{声明的类型实C Serializable 接口时候匹配?nbsp;
有一?@Transactional 注解的目标对象中的Q意连接点Q在Spring AOP中只是方法执行)@target(org.springframework.transaction.annotation.Transactional)'@target' 也可以在binding form中用:(x)请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内讉K到的部分?nbsp;
M一个目标对象声明的cd有一?@Transactional 注解的连接点Q在Spring AOP中只是方法执行)@within(org.springframework.transaction.annotation.Transactional)'@within'也可以在binding form中用:(x)- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内讉K到的部分?nbsp;
M一个执行的Ҏ(gu)有一?@Transactional annotation的连接点Q在Spring AOP中只是方法执行)@annotation(org.springframework.transaction.annotation.Transactional)'@annotation' 也可以在binding form中用:(x)- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内讉K到的部分?nbsp;
M一个接受一个参敎ͼq且传入的参数在q行时的cd实现?@Classified annotation的连接点Q在Spring AOP中只是方法执行)
@args(com.xyz.security.Classified)'@args'也可以在binding form中用:(x)- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内讉K到的部分?/p>
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SessionFactory' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)VCaused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77)
|上的说法真是良莠不?最l找?span style="color: #009900">能解决问题的Ҏ(gu)(折腾我一下午,快疯?
原因Q?/span>
其中asm-2.2.2.jar与asm.jar存在cM的冲H!Q!
使用其中之一或两者都使用Q可能会(x)出现如下错误Q?br />java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit
去这里下载j(lu)dic
我用的是0.94?eclipse 3.x
下截?/font>
jdic.dll,IeEmbed.exe,jdic.jar,MozEmbed.exe,packager.jar,tray.dll考贝C的工Elib目录(在工E上建立lib目录),然后讄以上.jar文g到编译\?
Z个jFrame,加一个JPanel
以下Z码片? 用以下代码加载浏览器
WebBrowser webBrowser = new WebBrowser();
panel_name.add(webBrowser, BorderLayout.CENTER);
webBrowser .setURL(new URL(http://www.google.com));
webBrowser .addWebBrowserListener(new WebBrowserListener() {
public void downloadStarted(WebBrowserEvent event) {;}
public void downloadCompleted(WebBrowserEvent event) {;}
public void downloadProgress(WebBrowserEvent event) {;}
public void downloadError(WebBrowserEvent event) {;}
public void documentCompleted(WebBrowserEvent event) {
//在这里写代码
// 很COOL的功?与脚本交?/font>
StringBuffer jsBuff = new StringBuffer();
jsBuff.append(" var bodyhtml = document.body.innerHTML;"); //取当前页的内?/font>
String html = webBrowser .getContent(); //取当前页的内?q个不好?在有iframe的网中不灵
jsBuff.append(" var hrefObj = document.getElementsByTagName('A');");
//....?取页面的N个内?/p>
//好了,好多人都?如何取得iframe的内容呢?jdic 的包没有一个方法可以取得到?看以上的脚本 var bodyhtml ,我们怎么取到它的值呢?如果取得?那一切问题都可以解决.
String iframeScript= " var iframehtml = document.frames[0].body.innerHTML;"; //取得指定iframe的内?/p>
//在这?可以与脚本变量的D行交?完成我们惌的功?实很COOL
String iframeHtml = webBrowser .executeScript(iframeScript);
System.out.println(iframeHtml ); //出来的正是想要的,很简单吧?但是不知道的?想破头也不明?/p>
//说到q?其实大家已经明白,用jdic可以操纵l大多数的网?比如时下行的web|游,惛_什么了??写一个脚本外挂就是这么简?
//快装一个浏览器doml构查看插g,操控在你手中
}
public void titleChange(WebBrowserEvent event) {;}
public void statusTextChange(WebBrowserEvent event) {;}
public void windowClose(WebBrowserEvent arg0) {
}
});
// 创徏Excel工作?br />
jxl.write.WritableSheet ws = wwb.createSheet("个h信息?", 0);
/**
* 19?标题占据2?br />
*/
int charTitle = 10;// 标题字体大小
int charNormal = 10;// 标题字体大小
// d带有字型Formatting的对?/p>
// 用于标题
jxl.write.WritableFont titleFont = new jxl.write.WritableFont(
WritableFont.createFont("宋体"), charTitle, WritableFont.BOLD);
jxl.write.WritableCellFormat titleFormat = new jxl.write.WritableCellFormat(
titleFont);
titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // U条
titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直寚w
titleFormat.setAlignment(Alignment.CENTRE); // 水^寚w
titleFormat.setWrap(true); // 是否换行
titleFormat.setBackground(Colour.GRAY_25);// 背景色暗?25%
// 用于正文
WritableFont normalFont = new WritableFont(WritableFont
.createFont("宋体"), charNormal);
jxl.write.WritableCellFormat normalFormat = new jxl.write.WritableCellFormat(
normalFont);
normalFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // U条
normalFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直寚w
normalFormat.setAlignment(Alignment.CENTRE);// 水^寚w
normalFormat.setWrap(true); // 是否换行
// 用于带有formatting的Number对象
WritableFont nf = new WritableFont(WritableFont
.createFont("Times New Roman"), charNormal);
// jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(
nf);
wcfN.setBorder(Border.ALL, BorderLineStyle.THIN); // U条
wcfN.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直寚w
wcfN.setAlignment(Alignment.CENTRE);// 水^寚w
wcfN.setWrap(true); // 是否换行
/**
* d标题
*/
// W一?br />
/** *********讄列宽每个字体占charset?*************** */
ws.mergeCells(14, 0, 18, 0); // 合ƈ单元|
ws.mergeCells(10, 0, 13, 0); // 合ƈ单元|
ws.mergeCells(0, 0, 0, 1); // 合ƈ单元|序号
ws.setColumnView(0, 6); // 讄列宽,W??br />
ws.mergeCells(1, 0, 1, 1); // 合ƈ单元|公民w䆾证号
ws.setColumnView(1, 9); // 讄列宽,W??br />
ws.mergeCells(2, 0, 2, 1); // 合ƈ单元|?sh)脑序?br />
ws.setColumnView(2, 6); // 讄列宽,W??br />
ws.mergeCells(3, 0, 3, 1); // 合ƈ单元|四险姓名
ws.setColumnView(3, 6); // 讄列宽,W??br />
ws.mergeCells(4, 0, 4, 1); // 合ƈ单元|ȝ姓名
ws.setColumnView(4, 6); // 讄列宽,W??br />
ws.mergeCells(5, 0, 5, 1); // 合ƈ单元|ȝ保险手册?br />
ws.setColumnView(5, 9); // 讄列宽,W??br />
ws.mergeCells(6, 0, 6, 1); // 合ƈ单元|四险~费人员cd
ws.setColumnView(6, 9); // 讄列宽,W??br />
ws.mergeCells(7, 0, 7, 1); // 合ƈ单元|ȝ~费人员cd
ws.setColumnView(7, 9); // 讄列宽,W??br />
ws.mergeCells(8, 0, 8, 1); // 合ƈ单元|ȝ参保人员cd
ws.setColumnView(8, 9); // 讄列宽,W??br />
ws.mergeCells(9, 0, 9, 1); // 合ƈ单元|ȝ参保状?br />
ws.setColumnView(9, 7); // 讄列宽,W?0?br />
ws.setColumnView(10, 6); // 讄列宽,W?1?br />
ws.setColumnView(11, 6); // 讄列宽,W?2?br />
ws.setColumnView(12, 6); // 讄列宽,W?3?br />
ws.setColumnView(13, 6); // 讄列宽,W?4?br />
ws.setColumnView(14, 6); // 讄列宽,W?5?br />
ws.setColumnView(15, 6); // 讄列宽,W?6?br />
ws.setColumnView(16, 6); // 讄列宽,W?7?br />
ws.setColumnView(17, 6); // 讄列宽,W?8?br />
ws.setColumnView(18, 6); // 讄列宽,W?9?br />
jxl.write.Label tit00 = new jxl.write.Label(0, 0, "序号", titleFormat);
ws.addCell(tit00);
jxl.write.Label tit10 = new jxl.write.Label(1, 0, "公民w䆾证号",
titleFormat);
ws.addCell(tit10);
jxl.write.Label tit20 = new jxl.write.Label(2, 0, "?sh)脑序?,
titleFormat);
ws.addCell(tit20);
jxl.write.Label tit30 = new jxl.write.Label(3, 0, "四险姓名",
titleFormat);
ws.addCell(tit30);
jxl.write.Label tit40 = new jxl.write.Label(4, 0, "ȝ姓名",
titleFormat);
ws.addCell(tit40);
jxl.write.Label tit50 = new jxl.write.Label(5, 0, "ȝ保险手册?,
titleFormat);
ws.addCell(tit50);
jxl.write.Label tit60 = new jxl.write.Label(6, 0, "四险~费人员cd",
titleFormat);
ws.addCell(tit60);
jxl.write.Label tit70 = new jxl.write.Label(7, 0, "ȝ~费人员cd",
titleFormat);
ws.addCell(tit70);
jxl.write.Label tit80 = new jxl.write.Label(8, 0, "ȝ参保人员cd",
titleFormat);
ws.addCell(tit80);
jxl.write.Label tit90 = new jxl.write.Label(9, 0, "ȝ参保状?,
titleFormat);
ws.addCell(tit90);
jxl.write.Label tit100 = new jxl.write.Label(10, 0, "四险~费状?,
titleFormat);
ws.addCell(tit100);
jxl.write.Label tit140 = new jxl.write.Label(14, 0, "~费基数",
titleFormat);
ws.addCell(tit140);
// W二?br />
jxl.write.Label tit101 = new jxl.write.Label(10, 1, "养?,
titleFormat);
ws.addCell(tit101);
jxl.write.Label tit111 = new jxl.write.Label(11, 1, "׃",
titleFormat);
ws.addCell(tit111);
jxl.write.Label tit121 = new jxl.write.Label(12, 1, "工伤",
titleFormat);
ws.addCell(tit121);
jxl.write.Label tit131 = new jxl.write.Label(13, 1, "生育",
titleFormat);
ws.addCell(tit131);
jxl.write.Label tit141 = new jxl.write.Label(14, 1, "养?,
titleFormat);
ws.addCell(tit141);
jxl.write.Label tit151 = new jxl.write.Label(15, 1, "׃",
titleFormat);
ws.addCell(tit151);
jxl.write.Label tit161 = new jxl.write.Label(16, 1, "工伤",
titleFormat);
ws.addCell(tit161);
jxl.write.Label tit171 = new jxl.write.Label(17, 1, "生育",
titleFormat);
ws.addCell(tit171);
jxl.write.Label tit181 = new jxl.write.Label(18, 1, "ȝ",
titleFormat);
ws.addCell(tit181);
double yljs = 0;// ȝ基数合计
double yxjs = 0;// 养老基数合?br />
double syjs = 0;// ׃基数合计
double sxjs = 0;// 生育基数合计
double gsjs = 0;// 工伤基数合计
for (int i = 0; i < list.size(); i++) {
Grxx xx = (Grxx) list.get(i);
jxl.write.Label lab1 = new jxl.write.Label(0, i + 2, String
.valueOf(i + 1), wcfN);
ws.addCell(lab1);// W?列:(x)序号
jxl.write.Label lab2 = new jxl.write.Label(1, i + 2, xx
.getBzhm(), wcfN);
ws.addCell(lab2);// W?列:(x)公民w䆾证号
jxl.write.Label lab3 = new jxl.write.Label(2, i + 2, "字段不存?,
wcfN);
ws.addCell(lab3);// W?列:(x)?sh)脑序?br />
jxl.write.Label lab4 = new jxl.write.Label(3, i + 2,
xx.getXm(), normalFormat);
ws.addCell(lab4);// W?列:(x)四险姓名
jxl.write.Label lab5 = new jxl.write.Label(4, i + 2,
xx.getXm(), normalFormat);
ws.addCell(lab5);// W?列:(x)ȝ姓名
jxl.write.Label lab6 = new jxl.write.Label(5, i + 2, xx
.getBxh(), wcfN);
ws.addCell(lab6);// W?列:(x)ȝ保险手册?br />
jxl.write.Label lab7 = new jxl.write.Label(6, i + 2, xx
.getBxh(), normalFormat);
ws.addCell(lab7);// W?列:(x)四险~费人员cd
jxl.write.Label lab8 = new jxl.write.Label(7, i + 2, "字段不存?,
normalFormat);
ws.addCell(lab8);// W?列:(x)ȝ~费人员cd
jxl.write.Label lab9 = new jxl.write.Label(8, i + 2, "字段不存?,
normalFormat);
ws.addCell(lab9);// W?列:(x)ȝ参保人员cd
jxl.write.Label lab10 = new jxl.write.Label(9, i + 2, "字段不存?,
normalFormat);
ws.addCell(lab10);// W?0列:(x)ȝ参保状?br />
jxl.write.Label lab11 = new jxl.write.Label(10, i + 2, "字段不存?,
normalFormat);
ws.addCell(lab11);// W?1列:(x)养老缴费状?br />
jxl.write.Label lab12 = new jxl.write.Label(11, i + 2, "字段不存?,
normalFormat);
ws.addCell(lab12);// W?2列:(x)׃~费状?br />
jxl.write.Label lab13 = new jxl.write.Label(12, i + 2, "字段不存?,
normalFormat);
ws.addCell(lab13);// W?3列:(x)工伤~费状?br />
jxl.write.Label lab14 = new jxl.write.Label(13, i + 2, "字段不存?,
normalFormat);
ws.addCell(lab14);// W?4列:(x)生育~费状?br />
jxl.write.Number lab15 = new jxl.write.Number(14, i + 2, xx
.getGrjs().getYxjfjs().doubleValue(), wcfN);
ws.addCell(lab15);// W?5列:(x)养老缴费基?br />
yxjs += xx.getGrjs().getYxjfjs().doubleValue();
jxl.write.Number lab16 = new jxl.write.Number(15, i + 2, xx
.getGrjs().getSyjfjs().doubleValue(), wcfN);
ws.addCell(lab16);// W?6列:(x)׃~费基数
syjs += xx.getGrjs().getSyjfjs().doubleValue();
jxl.write.Number lab17 = new jxl.write.Number(16, i + 2, xx
.getGrjs().getGsjfjs().doubleValue(), wcfN);
ws.addCell(lab17);// W?7列:(x)工伤~费基数
gsjs += xx.getGrjs().getGsjfjs().doubleValue();
jxl.write.Number lab18 = new jxl.write.Number(17, i + 2, xx
.getGrjs().getSxjfjs().doubleValue(), wcfN);
ws.addCell(lab18);// W?8列:(x)生育~费基数
sxjs += xx.getGrjs().getSxjfjs().doubleValue();
jxl.write.Number lab19 = new jxl.write.Number(18, i + 2, xx
.getGrjs().getYljfjs().doubleValue(), wcfN);
ws.addCell(lab19);// W?9列:(x)ȝ~费基数
yljs += xx.getGrjs().getYljfjs().doubleValue();
}
/**
* 最后一行合?br />
*/
int end = list.size() + 2;
jxl.write.Label end0 = new jxl.write.Label(0, end, "合计",
normalFormat);
ws.addCell(end0);
jxl.write.Label end1 = new jxl.write.Label(1, end, "--",
normalFormat);
ws.addCell(end1);
jxl.write.Label end2 = new jxl.write.Label(2, end, "--",
normalFormat);
ws.addCell(end2);
jxl.write.Label end3 = new jxl.write.Label(3, end, "--",
normalFormat);
ws.addCell(end3);
jxl.write.Label end4 = new jxl.write.Label(4, end, "--",
normalFormat);
ws.addCell(end4);
jxl.write.Label end5 = new jxl.write.Label(5, end, "--",
normalFormat);
ws.addCell(end5);
jxl.write.Label end6 = new jxl.write.Label(6, end, "--",
normalFormat);
ws.addCell(end6);
jxl.write.Label end7 = new jxl.write.Label(7, end, "--",
normalFormat);
ws.addCell(end7);
jxl.write.Label end8 = new jxl.write.Label(8, end, "--",
normalFormat);
ws.addCell(end8);
jxl.write.Label end9 = new jxl.write.Label(9, end, "--",
normalFormat);
ws.addCell(end9);
jxl.write.Label end10 = new jxl.write.Label(10, end, "--",
normalFormat);
ws.addCell(end10);
jxl.write.Label end11 = new jxl.write.Label(11, end, "--",
normalFormat);
ws.addCell(end11);
jxl.write.Label end12 = new jxl.write.Label(12, end, "--",
normalFormat);
ws.addCell(end12);
jxl.write.Label end13 = new jxl.write.Label(13, end, "--",
normalFormat);
ws.addCell(end13);
// 养?br />
jxl.write.Number end14 = new jxl.write.Number(14, end, yxjs, wcfN);
ws.addCell(end14);
// ׃
jxl.write.Number end15 = new jxl.write.Number(15, end, syjs, wcfN);
ws.addCell(end15);
// 工伤
jxl.write.Number end16 = new jxl.write.Number(16, end, gsjs, wcfN);
ws.addCell(end16);
// 生育
jxl.write.Number end17 = new jxl.write.Number(17, end, sxjs, wcfN);
ws.addCell(end17);
// ȝ
jxl.write.Number end18 = new jxl.write.Number(18, end, yljs, wcfN);
ws.addCell(end18);
// 写入Exel工作?br />
wwb.write();
// 关闭Excel工作薄对?br />
wwb.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
q一q接Q发现WebMail只支持pop3/imap/smtp的protocolQ而对gmail的pop3 ssl/imap ssl/smtp ssl的安全连接都不支持,于是奋力M改,l于今天搞定了?/p>
接着Z试邮g的多h,从Hotmail账户当中转移了一部分邮gq入gmail的IMAP FolderQ发现英国金融时报旗下的FT中文|发送的新闻邮gQ居然无法在WebMail中显C,出现Exception.
java.io.IOException: Unknown encoding: GB2312
at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:108)
at com.sun.mail.handlers.text_plain.getContent(text_plain.java:90)
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:775)
at javax.activation.DataHandler.getContent(DataHandler.java:522)
at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1395)
觉得很奇怪,GB2312肯定属于Java认识的encoding啊? Z么会(x)U信息呢Q?仔细查此邮g的源码,以及(qing)查阅资料。发现此处所说的Encodingq是Java Encoding?而是邮g的一U自有的~码?该新闻邮件的~码
Date: Thu, 20 Aug 2009 09:09:16 +0800
MIME-Version: 1.0
Content-Type: text/html; charset=”gb2312″
Content-Transfer-Encoding: gb2312
Message-ID: 1250730614939471@200809NewsLetter
该邮件的发送程序把 text/html charset=gb2312的编码部分,当作Content-Transfer-Encoding的编码,而实际上JavaMail认识的Content-Transfer-Encoding包含如下几种Q?#8221;base64″, “quoted-printable”, “7bit”, “8bit”, “binary”, “uuencode”?/p>
原则上针对这U错误格式的邮gQ可以不对应Q但是考虑到未来可能还有别的问题,于是直接M?javax.mail.internet.MimePartDataSource.javaQ?/p>
public InputStream getInputStream() throws IOException {
InputStream is;try {
if (part instanceof MimeBodyPart)
is = ((MimeBodyPart)part).getContentStream();
else if (part instanceof MimeMessage)
is = ((MimeMessage)part).getContentStream();
else
throw new MessagingException(“Unknown part”);
String encoding = restrictEncoding(part.getEncoding(), part);
if (encoding != null){
if(encoding.equalsIgnoreCase(“GB2312″) ||
encoding.equalsIgnoreCase(“GBK”)){
encoding = “7bit”;
}
return MimeUtility.decode(is, encoding);
}else{
return is;
}
} catch (MessagingException mex) {
throw new IOException(mex.getMessage());
}
}
~译好以后,攑֛ sun-javamail-1.4.2.jarQ执行一遍后QOK了?/p>
如果已经配置好CATALINA_HOME,以及(qing)path变量%CATALINA_HOME%\bin,可直接运行下列命令?br />
C:\> service.bat install C:\> service.bat remove
没有配置环境变量则进入tomcat安装目录下的bin目录Q加载服务service install tomcat6 卸蝲服务service remove tomcat6
二、apache服务安装卸蝲
把apache注册为windows服务. q行cmd命o(h) 注册apache为windows服务Qapache安装目录\bin\httpd.exe -k install 卸蝲apache为windows服务Qapache安装目录\bin\httpd.exe -k uninstall
三、MYSQL服务安装卸蝲
1.?安装服务?nbsp;
在Windows2000下,安装完成后,q没有把MySQL安装成服务,我们必须执行下面的语句把MySQL注册为服?mysql安装目录\bin\mysqld-nt –-install?nbsp;
Windows98下没有服务的概念Q所以不用安装服务?
2?卸蝲服务
可以通过下面的命令卸载MySQL服务:mysql安装目录\bin\mysqld-nt –-remove?nbsp;
l过上面的安装就可以使用了,可以把我们系l空的数据库内徏到mySQL数据目录卛_Q缺省数据库目录在installdirmysqldata?nbsp;
3.?启动服务
在Windows2000下,安装服务后可以启动MySQL服务:net start mysql?nbsp;
在Windows98下,可以用下面的命o(h)启动服务:c:\mysql\bin\mysqldQ服务启动后在后台运行,q没有界面?nbsp;
4.?停止服务
在Windows2000下,可以通过下面的命令停止MySQL服务:net stop mysql?nbsp;
在Windows98下,可以通过下面命o(h)停止服务:C:> C:\mysql\bin\mysqladmin -u root shutdown
==========================================================================
1.报错:Can't find messagefile 'F:Program Filesmysqlshareenglisherrmsg.sys'
原因:原来?.1版本安装在F:Program Filesmysql目录;而现在的5.0版本在F:database目录
解决Ҏ(gu):在c:winnt目录下找到my.ini文gQ修Ҏ(gu)删除?nbsp;
2.报错:ready for connections.
Version: '5.0.21-community-nt' socket: '' port: 3306 MySQL Community Edition (GPL)
原因:socket为空Q没有配|mysql;或者端口已l占?nbsp;
解决Ҏ(gu): mysqlbin目录下运行MySQLInstanceConfig.exe配置mysql实例
3.如何更改Win2000服务MySQL属性中的可执行文g路径!
开始时在D盘装了MySQLQ后来卸载后Q格式化D盘,再次安装Q\径与原\径不同,不能通过“net start mysql”启动。查看win2000服务中MYsql的属性,可执行文件\径在位于D盘。现在怎么h改,或启动Mysql?
注册表里HKEY_LOCAL_MECHINE---SYSTEM ---CurrentControlSet?nbsp;
启动MYSQL服务时出错的几种解决Ҏ(gu)
1.安装MYSQL后更改了ROOT的密码后用net startmysql启动时我遇Cq样的问?使用以下命o(h)后c:mysqlbinmysqladmin-u root -p shutdown再net start mysql没有这个错误提CZ!
2.MySQL?067错误
Q:我的Mysql到?1067 错误
错误信息?
A:在我的机上的解决办法?
修改%windir%my.iniQ增?nbsp;
3.已经弄好?!!
好像是这?#8230;…
mysql_install_db脚本只是在初ơ安装时才需要运行一?之后׃用再q行?不知道是不是q么回事.我把mysql.server拯?etc/rc.d/init.d/?q行chkconfig mysql.server,xmysql服务器每ơ开动启?只要讄好PATH,在命令行上输入mysql׃切搞?
Z服务模式的参数调?br />
Z服务模式修改tomcat\bin目录下的catalina.bat文gQ调整参敎ͼ如:(x)内存Q是不v作用的,我们可以采用以下方式(以tomcat5Z)Q?br />
1、运行cmdQ从控制台进入tomcat的bin目录
2、运行tomcat5w //MS//服务?/u>Qwindows的右下角出现托盘图标
Q服务名是具体的tomcat服务Q?br />
3、进入调整参敎ͼ保存
4、重新启动tomcat服务
试图在jsp面里包含ActionQ?/p>
<c:import url="/friendlink.do?method=list"></c:import>
<jsp:include flush="true" page="friendlink.do"></jsp:include>
l果出现以上错误?/p>
x其实也很Ҏ(gu)理解QAction的过E本w就是请求{发,而此时处理未完成面却已输出?/p>
解决办法一Q用bean:include
<bean:include id="friendlink" page="/friendlink.do?method=list"/>
<bean:write name="friendlink" filter="false"/>
可以q样理解Q就是Action处理的结果被保存到bean里了Q这里只是输出bean里包含的内容Q没有涉?qing)页面{发和定向问题Q所以不?x)有异常?/p>
解决办法二:(x)使用tiles
tiles里可以直接包含ActionQ配|方法和包含jsp时一栗?/p>
解决办法三:(x)使用Ajax
Ajax是被设计来从后台异步发送请求和接收处理l果Q所以必定能满q种需求?/p>
解决办法四:(x)使用TAG
标签的用法就不用说了Q相当于不用Action而在面嵌入Java代码?/p>
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/prufeng/archive/2009/05/24/4213218.aspx
JDOM 是一U?XML 的独?Java 工具包,用于快速开?XML 应用E序。它的设计包?Java 语言的语法乃臌义。但是它是否比现有的 -- 更标准的 -- XML APL 好呢Q当我们看过一些示例ƈ说明q个行的开放源代码目的设计目标后Q?zhn)自己来判断吧。最q这个开放源代码目已被正式接受成ؓ(f) Java 规范要求?/blockquote>作ؓ(f)开发h员,(zhn)可能听说过 80-20 规则Q在其它领域被称?Pareto 法则Q一U过E或Ҏ(gu)能适应所有可能情늚 80%Q另外的 20% 则需要根据具体情冉|处理。Y件开发的必然l果是:(x)对于开发h员而言Q有了给定的技术后p非常Ҏ(gu)地完成可能要做的工作?80%?/p>
当然QY件品和标准q不LҎ(gu) 80-20 规则发展的。特别的QJava XML 的缺陷就是这条规则的一个例外。Java 的编E世界拥有很多的 API -- 一些是自己开发的Q一些是由几个大公司开发ƈ被制定ؓ(f)标准?-- 他们提供了解决特D?XML d的成熟解x案。作?XML 普遍性的证明Q每个新d都存在着一U新技术,但如何将它们l合在一P又如何寻找一U合适的工具d成必重复做的Q务中?80% -- 利用 Java 语言的直观映象的基本 XML ?wi)操作?JDOM 正好是用来解决上q问题的一?XML API?/p>
在许多方面,Java 语言已变成供 XML 选择的一U编E语a。由?Apache 软g基金?x)?IBM alphaWorks 所做的开创性工作,现在已有完整的工具链用于创徏Q操作,传送文档和?XML 文档q行语法分析?/p>
但是Q虽然许?Java 开发h员每天都在?XMLQSun 却在?XML 整合q?Java q_斚w落后了。因为在 XML 成ؓ(f)从商家对商家集成?Web 站点内容水化等斚w的关键技术之前,Java 2 q_已l非常流行了。Sun 已经使用 JSR q程使之成ؓ(f)现存 XML API 的E,q一点已被广泛接受。目前最显著的是加入?JAXP Q用?XML 语法分析?Java APIQ,其中包含了三个Y件包Q?/p>
org.w3c.dom
QW(xu)3C 推荐的用?XML 标准规划文档对象模型?Java 工具org.xml.sax
Q用于对 XML q行语法分析的事仉动的?APIjavax.xml.parsers
Q工厂化工具Q允许应用程序开发h员获得ƈ配置Ҏ(gu)的语法分析器工具管对于 Java 开发h员而言Q有了这些Y件包是g好事Q但它仅仅代表获得了现有 API 标准的正式许可而已Qƈ没有在提供一的 Java-XML 互操作性方面取得了巨大飞跃。核?Java q_所~Z的是?XML 文档作ؓ(f) Java 对象操作的直观接口?/p>
q入 JDOM。JDOM 是两位著名的 Java 开发h员兼作者,Brett Mclaughlin ?Jason Hunter 的创作成果, 2000 q初在类g Apache 协议的许可下QJDOM 作ؓ(f)一个开放源代码目正式开始研发,JDOM 作ؓ(f)一个开放源代码目正式开始了。它已成长ؓ(f)包含来自q泛?Java 开发h员的投稿、集中反馈及(qing)错误修复的系l,q致力于建立一个完整的Z Java q_的解x案,通过 Java 代码来访问、操作ƈ输出 XML 数据?/p>
回页?/strong>
JDOM 能够替换
org.w3c.dom
软g包来有计划地操作 XML 文档。它q不是一个简单的替代品,实际?JDOM ?DOM 能够愉快地ƈ存。另外,管它提供的cȝ装从配|和q行分析器执行中分担了大量工作,但它不负责根据文本输入来?XML q行语法分析。JDOM 建立在现有的 API 的能力之上,正如目|页所表述?#8220;一个更好的捕鼠?#8221;?要理解需要备?API 的原因,p考虑 W3C DOM 设计的局限性:(x)
- 语言独立?/strong>DOM q不是用Z心目中的 Java 语言设计的。虽然这U方法保留了在不同语a中非常相似的 APIQ它也那些?fn)?Java 语言的程序员感到更麻烦。例如:(x)Java 语言内徏了一U?
String
c,?DOM 则规范定义了自己?Text
cR?
- 严格的层ơ结构?/strong>DOM API 直接沿袭?XML 规范。在 XML 中,每g东西都是一个结点,因此(zhn)能?DOM 中找C个几乎每件东襉K可以扩展的基?
Node
的接口和q回Node
的一pdҎ(gu)。就多态性的观点来讲Q它是优U的,但鉴于如上解释,它在 Java 语言中的应用是困难而且不便的,其中?Node
向叶cd作显式下拉会(x)D代码的冗长和难以理解?
- 接口驱动?/strong>公共 DOM API 仅由接口l成Q?
Exception
cL一个例外,但恰恰够了Q。w3c Ҏ(gu)供实现ƈ不感兴趣Q它只对定义接口Q比较有意义Q感兴趣。但它也意味着作ؓ(f) Java E序员?API 在创?XML 对象时增加了分散E度Q因?w3c 标准大量使用工厂化的cdcM的灵zȝ但不直接的模式。在某些应用中,XML 文档是仅p法分析器建立的,而从不会(x)由应用程序代码建立Q这是不相关的。但是,随着 XML 更广泛的使用Qƈ不是所有问题都l箋需要由语法分析器来驱动。应用程序的开发h员需要一个更方便的方法有计划地构?XML 对象?对于E序员,q些U束意味着庞大Q在内存占用和接口大方面)的和难掌握的 APIQ学?fn)和使用都很难。相反,JDOM 是作ZU轻量 API 被制定的Q最主要的是它是?Java Z心的。它在遵?DOM 主要规则的基上除M上述~点Q?/p>
- JDOM ?Java q_专用的?/strong>只要有可能,API 都?Java 语言的内?
String
支持Q因此文本g适用?String
。它q可利用 Java 2 q_的类集,?List
?Iterator
Q给E序员提供了一个丰富的q且?Java 语言cM的环境?
- 没有层次性?/strong>?JDOM 中,XML 元素是
Element
的实例,XML 属性就?Attribute
的实例,XML 文档本n是Document
的实例。由于在 XML 中所有这些都代表了不同的概念Q因此它们L作ؓ(f)自己的类型被引用Q而不是作Z个含p的“l点”?
- c驱动?/strong>因ؓ(f) JDOM 对象是?
Document
?Element
?Attribute
q些cȝ直接实例Q因此创Z个新 JDOM 对象如?Java 语言中?new
操作W一样容易。它q意味着不需要进行工厂化接口配置 -- JDOM 的用是直截了当的?
回页?/strong>
JDOM 使用标准?Java ~码模式。只要有可能Q它使用 Java
new
操作W而不用复杂的工厂化模式,使对象操作即便对于初学用户也很方ѝ例如,让我们看一下如何随便?JDOM 建立一个简单的 XML 文档。我们将要徏立的l构如清?1 所C。(?参考资?/a>上可下蝲关于本文的完整代码)
清单 1. 建立 XML 文档h
<?xml version="1.0" encoding="UTF-8"?> <car vin="123fhg5869705iop90"> <!--Description of a car--> <make>Toyota</make> <model>Celica</model> <year>1997</year> <color>green</color> <license state="CA">1ABC234</license> </car>
注意Q我们将建立 CZ文档Q在下面的清?2 到清?7 中有详细描述?
开始,让我们先创徏一个根元素Qƈ其d到文档中Q?/p>
清单 2. 创徏一?Document
Element carElement = new Element("car"); Document myDocument = new Document(carElement);
q一步创Z个新
org.jdom.Element
Qƈ其作ؓ(f)org.jdom.Document
myDocument
的根元素。(如果(zhn)?参考资?/a>中提供的h代码Q请务必导入org.jdom.*
。)因ؓ(f)一?XML 文档必须一直有一个唯一的根元素Q所?Document
?Element
攑֜它的构造器中?下一步,d
vin
属性:(x)
清单 3. d一?Attribute
carElement.addAttribute(new Attribute("vin", "123fhg5869705iop90"));
d元素也是很简单的。这里我们添?
make
元素Q?
清单 4. 元素和子元素
Element make = new Element("make"); make.addContent("Toyota"); carElement.addContent(make);
׃
Element
?addContent
Ҏ(gu)q回Element
Q我们也可以q样写:(x)
清单 5. 用简zŞ式添加元?/strong>
carElement.addContent(new Element("make").addContent("Toyota"));
q两个语句完成了相同的工作。有些h认ؓ(f)W一个示例可L更好,但是如果(zhn)一ơ徏立许多元素,(zhn)会(x)觉得W二个示例可L更好。要完成构徏文档Q?/p>
清单 6. d其余的元?/strong>
carElement.addContent(new Element("model").addContent("Celica")); carElement.addContent(new Element("year").addContent("1997")); carElement.addContent(new Element("color").addContent("green")); carElement.addContent(new Element("license") .addContent("1ABC234").addAttribute("state", "CA"));
(zhn)会(x)注意到对?
license
元素Q我们不但添加了元素的内容,qؓ(f)其添加了一个属性,表明许可已被发出了这个状态。这是因?Element
?addContent
Ҏ(gu)Lq回Element
本nQ而不是一个无效的声明?用同L(fng)Ҏ(gu)d注释部分或其它标?XML cdQ?/p>
清单 7. d一条注?/strong>
carElement.addContent(new Comment("Description of a car"));
操作文档也是用类似方式。例如,要引?
year
元素Q我们?Element
?getChild
Ҏ(gu)Q?
清单 8. 讉K子元?/strong>
Element yearElement = carElement.getChild("year");
该语句实际上返回第一个元素名?
year
的子Element
?如果没有year
元素Q则调用q回一个空倹{注意,我们不必回溯来自McM?DOMNode
接口的返回?--Element
的子元素是Element
。用cM的方式,我们可把year
元素从文档中除去Q?
清单 9. 除去子元?/strong>
boolean removed = carElement.removeChild("year");
q次调用只除去
year
元素Q文档的其余部分保持不变?到目前ؓ(f)止,我们已经늛了文档的生成和操作。要完成的文档输出x制台Q可使用 JDOM ?
XMLOutputter
c:(x)
清单 10. ?JDOM 转化?XML 文本
try { XMLOutputter outputter = new XMLOutputter(" ", true); outputter.output(myDocument, System.out); } catch (java.io.IOException e) { e.printStackTrace(); }
XMLOutputter
有几个格式选项。这里我们已指定希望子元素从父元素羃q两个空|q且希望元素间有I?XMLOutputter
可输出到Writer
?OutputStream
。ؓ(f)输出到文Ӟ我们可以单地输化ؓ(f)Q?
清单 11. 使用FileWriter
输出 XML
FileWriter writer = new FileWriter("/some/directory/myFile.xml"); outputter.output(myDocument, writer); writer.close();
回页?/strong>
与其它方法良好协作:(x)和现有的 XML 工具q行互操?/span>
JDOM 的一个有特征是和其?API 有互操作性。?JDOMQ不仅能把文档输出到
Stream
?Reader
Q还可将文档作ؓ(f) SAXEvent Stream
或作?DOMDocument
。这U灵zL允?JDOM 能在多种环境下用或被添加到已经在用另一U方法处?XML 的系l中厅R正如我们在后面一个示例中所看到的,它还允许 JDOM 使用其它的还不能识别 JDOM 的数据结构的 XML 工具?JDOM 的另一个用处是它能够读取ƈ操作现有?XML 数据。?
org.jdom.input
中的一个类可以阅读l构很规范的 XML 文g。在q个CZ中我们?SAXBuilder
Q?
清单 12. 使用SAXBuilder
?XML 文gq行语法分析
try { SAXBuilder builder = new SAXBuilder(); Document anotherDocument = builder.build(new File("/some/directory/sample.xml")); } catch(JDOMException e) { e.printStackTrace(); } catch(NullPointerException e) { e.printStackTrace(); }
(zhn)可以用清单 2 到清?7 中显C的Ҏ(gu)来操作通过q个q程建立的文档?/p>
JDOM 的另一个实用应用程序将其与 Apache ?Xalan 产品l合在一P请参?参考资?/a>Q。用上面的汽RCZQ我们将为在U汽车经销商徏立一?Web 面Q显C特定汽车的详细信息。首先,假设我们上面建立的文档显C我们准备呈现给用户的汽车的信息。下一步,我们把q个 JDOM
Document
与一?XSL 样式表结合v来ƈ?HTML 格式的结果输出到 servlet ?OutputStream
上以便在用户的浏览器中显C?在本例中Q我们准备用的 XSL 样式表被UCؓ(f)
car.xsl
Q?
清单 13. 用于汽车记录{换ؓ(f) HTML ?XSL 文档
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/car"> <html> <head> <title><xsl:value-of select="make"/> <xsl:value-of select="model"/> </head> <body> <h1><xsl:value-of select="make"/></h1><br /> <h2><xsl:value-of select="model"/></h2><br /> <table border="0"> <tr><td>VIN:</td><td><xsl:value-of select="@vin"/></td></tr> <tr><td>Year:</td><td><xsl:value-of select="year"/></td></tr> <tr><td>Color:</td><td><xsl:value-of select="color"/></td></tr> </table> </body> </html> </xsl:template> </xsl:stylesheet>
现在我们把
org.jdom.Document
转换?DOMDocument
Qƈ其与显C我们的 XSL ?OutputStream
的文件一h供给 XalanQ?OutputStream
是我们从我们假定的?servletQ如清单 14 所C)的应用服务器上获取的?
清单 14. 使用 JDOM ?Xalan 创徏 HTML 文档
TransformerFactory tFactory = TransformerFactory.newInstance(); // Make the input sources for the XML and XSLT documents org.jdom.output.DOMOutputter outputter = new org.jdom.output.DOMOutputter(); org.w3c.dom.Document domDocument = outputter.output(myDocument); javax.xml.transform.Source xmlSource = new javax.xml.transform.dom.DOMSource(domDocument); StreamSource xsltSource = new StreamSource(new FileInputStream("/some/directory/car.xsl")); // Make the output result for the finished document using // the HTTPResponse OutputStream StreamResult xmlResult = new StreamResult(response.getOutputStream()); // Get a XSLT transformer Transformer transformer = tFactory.newTransformer(xsltSource); // Do the transform transformer.transform(xmlSource, xmlResult);
在这个示例中Q输出是通过 Java servlet ?
HTTPResponse
OutputStream
出。然而,输出可以象早期的?XMLOutputter
的实例一L(fng)单的通过文g输出。我们?DOMOutputter
?Xalan 生成 XML 源代码。但是我们可以生成相同的输出Q方法是使用XMLOutputter
我们的 XML 文档作ؓ(f)String
输出q其进?StreamSource
。说到灵zL:(x)JDOM 可将它的l构作ؓ(f)String
、SAXEvent Stream
?DOMDocument
输出。这允许 JDOM 与能把Q何这些模型作入的工具一起工作。(关于附加功能Q请讉K JDOM Web 站点?contrib
包,在那里?zhn)发C个基?JDOM 工具的宝库,可提供基?JDBC ResultSet 的构建器、XPATH 实现Ҏ(gu)和其它更多工兗)在短短几行代码中QJDOM 启用了许多功能,我们已经?XML 中分析过q有计划地创Z XML 文档Q操作了那些文档Qƈ使用它们产生 XML 驱动?Web 面?/p>
helloworld2008 2009-10-12 22:09 发表评论]]>
一、JDOM ?/p>
JDOM是一个开源项目,它基于树(wi)型结构,利用UJAVA的技术对XML文档实现解析、生成、序列化以及(qing)多种操作?/p>
JDOM 直接为JAVA~程服务。它利用更ؓ(f)强有力的JAVA语言的诸多特性(Ҏ(gu)重蝲、集合概念以?qing)映)Q把SAX和DOM的功能有效地l合h?/p>
在用设计上可能地隐藏原来使用XMLq程中的复杂性。利用JDOM处理XML文档是一件轻松、简单的事?/p>
JDOM ?000q的春天被Brett McLaughlin和Jason Hunter开发出来,以I补DOM?qing)SAX在实际应用当中的不之处?/p>
q些不之处主要在于SAX没有文档修改、随问以?qing)输出的功能Q而对于DOM来说QJAVAE序员在使用时来用v来总觉得不太方ѝ?/p>
DOM的缺点主要是来自于由于Dom是一个接口定义语aQIDLQ?它的d是在不同语言实现中的一个最低的通用标准Qƈ不是为JAVA特别设计的。JDOM的最新版本ؓ(f)JDOM Beta 9。最qJDOM被收录到JSR-102内,q标志着JDOM成ؓ(f)了JAVAq_l成的一部分?/p>
二、JDOM 包概?/p>
JDOM是由以下几个包组成的
org.jdom 包含了所有的xml文档要素的javac?/p>
org.jdom.adapters 包含了与dom适配的javac?/p>
org.jdom.filter 包含了xml文档的过滤器c?/p>
org.jdom.input 包含了读取xml文档的类
org.jdom.output 包含了写入xml文档的类
org.jdom.transform 包含了将jdom xml文档接口转换为其他xml文档接口
org.jdom.xpath 包含了对xml文档xpath操作的类三、JDOM c说?/p>
1、org.JDOMq个包里的类是你J解析xml文g后所要用到的所有数据类型?/p>
Attribute
CDATA
Coment
DocType
Document
Element
EntityRef
Namespace
ProscessingInstruction
Text
2、org.JDOM.transform在涉?qing)xslt格式转换时应使用下面?个类
JDOMSource
JDOMResult
org.JDOM.input
3、输入类Q一般用于文档的创徏工作
SAXBuilder
DOMBuilder
ResultSetBuilder
org.JDOM.output
4、输出类Q用于文档{换输?/p>
XMLOutputter
SAXOutputter
DomOutputter
JTreeOutputter
使用前注意事:(x)
1.JDOM对于JAXP 以及(qing) TRax 的支?/p>
JDOM 支持JAXP1.1Q你可以在程序中使用M的parser工具c?默认情况下是JAXP的parser?/p>
制定特别的parser可用如下形式
SAXBuilder parser
= new SAXBuilder("org.apache.crimson.parser.XMLReaderImpl");
Document doc = parser.build("http://www.cafeconleche.org/");
// work with the document...
JDOM也支持TRaXQXSLT可通过JDOMSource以及(qing)JDOMResultcL转换Q参见以后章节)
2.注意在JDOM里文档(DocumentQ类由org.JDOM.Document 来表C。这要与org.w3c.dom中的Document区别开Q这2U格式如何{换在后面?x)说明?/p>
以下如无Ҏ(gu)均指JDOM里的Document?/p>
四、JDOM主要使用Ҏ(gu)
1.Ducumentc?/p>
(1)Document的操作方法:(x)
Element root = new Element("GREETING");
Document doc = new Document(root);
root.setText("Hello JDOM!");
或者简单的使用Document doc = new Document(new Element("GREETING").setText("Hello JDOM!t"));
q点和DOM不同。Dom则需要更为复杂的代码Q如下:(x)
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
DocumentBuilder builder =factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element root =doc.createElement("root");
Text text = doc.createText("This is the root");
root.appendChild(text);
doc.appendChild(root);
注意事项QJDOM不允许同一个节点同时被2个或多个文档相关联,要在W?个文档中使用原来老文档中的节点的话。首先需要用detach()把这个节点分开来?/p>
(2)从文件、流、系lID、URL得到Document对象Q?/p>
DOMBuilder builder = new DOMBuilder();
Document doc = builder.build(new File("jdom_test.xml"));
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(url);
在新版本中DOMBuilder 已经Deprecated?DOMBuilder.builder(url)Q用SAX效率?x)比较快?/p>
q里举一个小例子Qؓ(f)了简单v见,使用String对象直接作ؓ(f)xml数据源:(x)
public jdomTest() {
String textXml = null;
textXml = "<note>";
textXml = textXml +
"<to>aaa</to><from>bbb</from><heading>ccc</heading><body>ddd</body>";
textXml = textXml + "</note>";
SAXBuilder builder = new SAXBuilder();
Document doc = null;
Reader in= new StringReader(textXml);
try {
doc = builder.build(in);
Element root = doc.getRootElement();
List ls = root.getChildren();//注意此处取出的是root节点下面的一层的Element集合
for (Iterator iter = ls.iterator(); iter.hasNext(); ) {
Element el = (Element) iter.next();
if(el.getName().equals("to")){
System.out.println(el.getText());
}
}
}
catch (IOException ex) {
ex.printStackTrace();
}
catch (JDOMException ex) {
ex.printStackTrace();
}
}
(3)DOM的document和JDOM的Document之间的相互{换用方法,单!
DOMBuilder builder = new DOMBuilder();
org.jdom.Document jdomDocument = builder.build(domDocument);
DOMOutputter converter = new DOMOutputter();// work with the JDOM document…
org.w3c.dom.Document domDocument = converter.output(jdomDocument);
// work with the DOM document…
2.XML文档输出
XMLOutPutterc:(x)
JDOM的输出非常灵z?支持很多Uio格式以及(qing)风格的输?/p>
Document doc = new Document(...);
XMLOutputter outp = new XMLOutputter();
outp.output(doc, fileOutputStream); // Raw output
outp.setTextTrim(true); // Compressed output
outp.output(doc, socket.getOutputStream());
outp.setIndent(" ");// Pretty output
outp.setNewlines(true);
outp.output(doc, System.out);
详细请参阅最新的JDOM API手册
3.Element c:(x)
(1)览Element?/p>
Element root = doc.getRootElement();//获得根元素element
List allChildren = root.getChildren();// 获得所有子元素的一个list
List namedChildren = root.getChildren("name");// 获得指定名称子元素的list
Element child = root.getChild("name");//获得指定名称的第一个子元素
JDOMl了我们很多很灵zȝ使用Ҏ(gu)来管理子元素Q这里的List是java.util.ListQ?/p>
List allChildren = root.getChildren();
allChildren.remove(3); // 删除W四个子元素
allChildren.removeAll(root.getChildren("jack"));// 删除?#8220;jack”的子元素
root.removeChildren("jack"); // 便捷写法
allChildren.add(new Element("jane"));// 加入
root.addContent(new Element("jane")); // 便捷写法
allChildren.add(0, new Element("first"));
(2)UdElements:
在JDOM里很?/p>
Element movable = new Element("movable");
parent1.addContent(movable); // place
parent1.removeContent(movable); // remove
parent2.addContent(movable); // add
在Dom?/p>
Element movable = doc1.createElement("movable");
parent1.appendChild(movable); // place
parent1.removeChild(movable); // remove
parent2.appendChild(movable); // 出错!
补充Q纠错?/p>
JDOM的Element构造函敎ͼ以及(qing)它的其他函数Q会(x)查element是否合法?/p>
而它的add/removeҎ(gu)?x)检查树(wi)l构Q检查内容如下:(x)
1.在Q何树(wi)中是否有回环节点
2.是否只有一个根节点
3.是否有一致的命名I间QNamespacesQ?/p>
(3)Element的text内容d
<description>
A cool demo
</description>
// The text is directly available
// Returns "\n A cool demo\n"
String desc = element.getText();
// There's a convenient shortcut
// Returns "A cool demo"
String desc = element.getTextTrim();
(4)Elment内容修改
element.setText("A new description");
3.可正解释特D字W?/p>
element.setText("<xml> content");
4.CDATA的数据写入、读?/p>
element.addContent(new CDATA("<xml> content"));
String noDifference = element.getText();
混合内容
element可能包含很多U内容,比如?/p>
<table>
<!-- Some comment -->
Some text
<tr>Some child element</tr>
</table>
取table的子元素tr
String text = table.getTextTrim();
Element tr = table.getChild("tr");
也可使用另外一个比较简单的Ҏ(gu)
List mixedCo = table.getContent();
Iterator itr = mixedCo.iterator();
while (itr.hasNext()) {
Object o = i.next();
if (o instanceof Comment) {...}
// q里可以写成Comment, Element, Text, CDATA,ProcessingInstruction, 或者是EntityRef的类?/p>
}
// 现在U除Comment,注意q里游标应ؓ(f)1。这是由于回车键也被解析成Textcȝ~故,所以Comment应??/p>
mixedCo.remove(1);
4.Attributec?/p>
<table width="100%" border="0"> </table>
String width = table.getAttributeValue("width");//获得attribute
int border = table.getAttribute("width").getIntValue();
table.setAttribute("vspace", "0");//讄a(chn)ttribute
table.removeAttribute("vspace");// 删除一个或全部attribute
table.getAttributes().clear();
5.处理指o(h)(Processing Instructions)操作
一个Pls的例?/p>
<?br?>
<?cocoon-process type="xslt"?>
| |
| |
目标 数据
处理目标名称(Target)
String target = pi.getTarget();
获得所有数据(dataQ,在目标(targetQ以后的所有数据都?x)被q回?/p>
String data = pi.getData();
String type = pi.getValue("type");获得指定属性的数据
List ls = pi.getNames();获得所有属性的名称
6.命名I间操作
<xhtml:html
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xhtml:title>Home Page</xhtml:title>
</xhtml:html>
Namespace xhtml = Namespace.getNamespace("xhtml", "http://www.w3.org/1999/xhtml");
List kids = html.getChildren("title", xhtml);
Element kid = html.getChild("title", xhtml);
kid.addContent(new Element("table", xhtml));
7.XSLT格式转换
使用以下函数可对XSLT转换
最后如果你需要用w3c的Document则需要{换一下?/p>
public static Document transform(String stylesheetQDocument in)
throws JDOMException {
try {
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(new StreamSource(stylesheet));
JDOMResult out = new JDOMResult();
transformer.transform(new JDOMSource(in), out);
return out.getDeocument();
}
catch (TransformerException e) {
throw new JDOMException("XSLT Trandformation failed", e);
}
}
五、用?
1、生成xml文档Q?/p>
public class WriteXML{
public void BuildXML() throws Exception {
Element root,student,number,name,age;
root = new Element("student-info"); //生成根元素:(x)student-info
student = new Element("student"); //生成元素Qstudent(number,name,age)
number = new Element("number");
name = new Element("name");
age = new Element("age");
Document doc = new Document(root); //根元素植入文档doc?/p>
number.setText("001");
name.setText("lnman");
age.setText("24");
student.addContent(number);
student.addContent(name);
student.addContent(age);
root.addContent(student);
Format format = Format.getCompactFormat();
format.setEncoding("gb2312"); //讄xml文g的字Wؓ(f)gb2312
format.setIndent(" "); //讄xml文g的羃qؓ(f)4个空?/p>
XMLOutputter XMLOut = new XMLOutputter(format);//元素后换行一层元素羃四格
XMLOut.output(doc, new FileOutputStream("studentinfo.xml"));
}
public static void main(String[] args) throws Exception {
WriteXML w = new WriteXML();
System.out.println("Now we build an XML document .....");
w.BuildXML();
System.out.println("finished!");
}
}
生成的xml文档为:(x)
<?xml version="1.0" encoding="gb2312"?>
<student-info>
<student>
<number>001</number>
<name>lnman</name>
<age>24</age>
</student>
</student-info>
创徏XML文档2Q?/p>
public class CreateXML {
public void Create() {
try {
Document doc = new Document();
ProcessingInstruction pi=new ProcessingInstruction("xml-stylesheet","type="text/xsl" href="test.xsl"");
doc.addContent(pi);
Namespace ns = Namespace.getNamespace("http://www.bromon.org" );
Namespace ns2 = Namespace.getNamespace("other", "http://www.w3c.org" );
Element root = new Element("根元?, ns);
root.addNamespaceDeclaration(ns2);
doc.setRootElement(root);
Element el1 = new Element("元素一");
el1.setAttribute("属?, "属性一");
Text text1=new Text("元素?);
Element em = new Element("元素?).addContent("W二个元?);
el1.addContent(text1);
el1.addContent(em);
Element el2 = new Element("元素?).addContent("W三个元?);
root.addContent(el1);
root.addContent(el2);
//~进四个I格,自动换行,gb2312~码
XMLOutputter outputter = new XMLOutputter(" ", true,"GB2312");
outputter.output(doc, new FileWriter("test.xml"));
}catch(Exception e) {
System.out.println(e);
}
}
public static void main(String args[]) {
new CreateXML().Create();
}
}
2、读取xml文档的例子:(x)
import org.jdom.output.*;
import org.jdom.input.*;
import org.jdom.*;
import java.io.*;
import java.util.*;
public class ReadXML{
public static void main(String[] args) throws Exception {
SAXBuilder builder = new SAXBuilder();
Document read_doc = builder.build("studentinfo.xml");
Element stu = read_doc.getRootElement();
List list = stu.getChildren("student");
for(int i = 0;i < list.size();i++) {
Element e = (Element)list.get(i);
String str_number = e.getChildText("number");
String str_name = e.getChildText("name");
String str_age = e.getChildText("age");
System.out.println("---------STUDENT--------------");
System.out.println("NUMBER:" + str_number);
System.out.println("NAME:" + str_name);
System.out.println("AGE:" + str_age);
System.out.println("------------------------------");
System.out.println();
}
}
}
3、DTD验证的:(x)
public class XMLWithDTD {
public void validate() {
try {
SAXBuilder builder = new SAXBuilder(true);
builder.setFeature("http://xml.org/sax/features/validation";,true);
Document doc = builder.build(new FileReader("author.xml"));
System.out.println("搞掂");
XMLOutputter outputter = new XMLOutputter();
outputter.output(doc, System.out);
}catch(Exception e) {
System.out.println(e);
}
}
public static void main(String args[]) {
new XMLWithDTD().validate();
}
}
需要说明的是,q个E序没有指明使用哪个DTD文g。DTD文g的位|是在XML中指定的Q而且DTD不支持命名空_(d)一个XML只能引用一个DTDQ所以程序直接读取XML中指定的DTDQ程序本w不用指定。不q这样一来,好象只能用外部式的DTD引用方式了?高h指点?/p>
4、XML Schema验证的:(x)
public class XMLWithSchema {
String xml="test.xml";
String schema="test-schema.xml";
public void validate() {
try {
SAXBuilder builder = new SAXBuilder(true);
//指定U束方式为XML schema
builder.setFeature("http://apache.org/xml/features/validation/schema";, true);
//导入schema文g
builder.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation";,schema);
Document doc = builder.build(new FileReader(xml));
System.out.println("搞掂");
XMLOutputter outputter = new XMLOutputter();
outputter.output(doc, System.out);
}catch(Exception e) {
System.out.println("验证p|:"+e);
}
}
}
上面的程序就指出了要引入的XML Schema文g的位|?/p>
pȝ默认输出是UTF-8Q这有可能导致出Cؕ码?/p>
5、Xpath例子Q?/p>
JDOM的关于XPATH的api在org.jdom.xpathq个包里。这个包下,有一个抽象类XPath.java和实现类JaxenXPath.javaQ?使用时先用XPathcȝ静态方法newInstance(String xpath)得到XPath对象Q然后调用它的selectNodes(Object context)Ҏ(gu)或selectSingleNode(Object context)Ҏ(gu)Q前者根据xpath语句q回一l节?List对象)Q后者根据一个xpath语句q回W合条g的第一个节?Objectcd)。请看jdom-1.0自带的范例程序:(x)
它分析在web.xml文g中的注册的servlet的个数及(qing)参数个数Qƈ输出角色名?/p>
web.xml文gQ?/p>
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
-->
<web-app>
<servlet>
<servlet-name>snoop</servlet-name>
<servlet-class>SnoopServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>file </servlet-name>
<servlet-class>ViewFile</servlet-class>
<init-param>
<param-name>initial</param-name>
<param-value>1000</param-value>
<description>The initial value for the counter <!-- optional --></description>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mv</servlet-name>
<url-pattern>*.wm</url-pattern>
</servlet-mapping>
<distributed/>
<security-role>
<role-name>manager</role-name>
<role-name>director</role-name>
<role-name>president</role-name>
</security-role>
</web-app>
处理E序Q?/p>
import java.io.*;
import java.util.*;
public class XPathReader {
public static void main(String[] args) throws IOException, JDOMException {
if (args.length != 1) {
System.err.println("Usage: java XPathReader web.xml");
return;
}
String filename = args[0];//从命令行输入web.xml
PrintStream out = System.out;
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File(filename));//得到Document对象
// Print servlet information
XPath servletPath = XPath.newInstance("http://servlet");//,选择L路径下servlet元素
List servlets = servletPath.selectNodes(doc);//q回所有的servlet元素?/p>
out.println("This WAR has "+ servlets.size() +" registered servlets:");
Iterator i = servlets.iterator();
while (i.hasNext()) {//输出servlet信息
Element servlet = (Element) i.next();
out.print("\t" + servlet.getChild("servlet-name")
.getTextTrim() +
" for " + servlet.getChild("servlet-class")
.getTextTrim());
List initParams = servlet.getChildren("init-param");
out.println(" (it has " + initParams.size() + " init params)");
}
// Print security role information
XPath rolePath = XPath.newInstance("http://security-role/role-name/text()");
List roleNames = rolePath.selectNodes(doc);//得到所有的角色?/p>
if (roleNames.size() == 0) {
out.println("This WAR contains no roles");
} else {
out.println("This WAR contains " + roleNames.size() + " roles:");
i = roleNames.iterator();
while (i.hasNext()) {//输出角色?/p>
out.println("\t" + ((Text)i.next()).getTextTrim());
}
}
}
}
输出l果:
C:\java>java XPathReader web.xml
This WAR has 2 registered servlets:
snoop for SnoopServlet (it has 0 init params)
file for ViewFile (it has 1 init params)
This WAR contains 3 roles:
manager
director
president
6、数据输入要用到XML文档要通过org.jdom.input包,反过来需要org.jdom.output。如前面所_(d)x看API文档p够用?/p>
我们的例子读入XML文gexampleA.xmlQ加入一条处理指令,修改W一本书的h(hun)格和作者,q添加一条属性,然后写入文gexampleB.xmlQ?/p>
//exampleA.xml
<?xml version="1.0" encoding="GBK"?>
<bookList>
<book>
<name>Java~程入门</name>
<author>张三</author>
<publishDate>2002-6-6</publishDate>
<price>35.0</price>
</book>
<book>
<name>XML在Java中的应用</name>
<author>李四</author>
<publishDate>2002-9-16</publishDate>
<price>92.0</price>
</book>
</bookList>
//testJDOM.java
import org.jdom.*;
import org.jdom.output.*;
import org.jdom.input.*;
import java.io.*;
public class TestJDOM{
public static void main(String args[])throws Exception{
SAXBuilder sb = new SAXBuilder();
//从文件构造一个DocumentQ因为XML文g中已l指定了~码Q所以这里不必了
Document doc = sb.build(new FileInputStream("exampleA.xml"));
ProcessingInstruction pi = new ProcessingInstruction//加入一条处理指?/p>
("xml-stylesheet","href=\"bookList.html.xsl\" type=\"text/xsl\"");
doc.addContent(pi);
Element root = doc.getRootElement(); //得到根元?/p>
java.util.List books = root.getChildren(); //得到根元素所有子元素的集?/p>
Element book = (Element)books.get(0); //得到W一个book元素
//为第一本书d一条属?/p>
Attribute a = new Attribute("hot","true");
book.setAttribute(a);
Element author = book.getChild("author"); //得到指定的字元素
author.setText("王五"); //作者改为王?/p>
//?Text t = new Text("王五");book.addContent(t);
Element price = book.getChild("price"); //得到指定的字元素
//修改hQ比较郁L(fng)是我们必自p{换数据类型,而这正是JAXB的优?/p>
author.setText(Float.toString(50.0f));
String indent = " ";
boolean newLines = true;
XMLOutputter outp = new XMLOutputter(indent,newLines,"GBK");
outp.output(doc, new FileOutputStream("exampleB.xml"));
}
};
执行l果exampleB.xmlQ?/p>
<?xml version="1.0" encoding="GBK"?>
<bookList>
<book hot=”true”>
<name>Java~程入门</name>
<author>50.0</author>
<publishDate>2002-6-6</publishDate>
<price>35.0</price>
</book>
<book>
<name>XML在Java中的应用</name>
<author>李四</author>
<publishDate>2002-9-16</publishDate>
<price>92.0</price>
</book>
</bookList>
<?xml-stylesheet href="bookList.html.xsl" type="text/xsl"?>
在默认情况下QJDOM的ElementcȝgetText()q类的方法不?x)过滤空白字W,如果你需要过滤,用setTextTrim() ?/p>
java.util.Map.Entry。这时var=entry的话Q用表达?{entry.key}取得键名?/p>
用表辑ּ${entry.value}得到每个entry的倹{这是因为java.util.Map.Entry对象有getKey和getValue?/p>
法,表达式语a遵守JavaBean的命名约定。 example:
<c:forEach items="${map}" var="entry">
<c:out value="${entry.key}" />
<c:out value="${entry.value}" />
</c:forEach>
2、根据key变量求?br />
如果事先知道key那么很容易根?{map.key值}可以得到值对象,但是如果key是一个变量呢Q?/p>
有一个问?如果l定一个key的变量如何用EL得到对象?q里需要用EL表达式中的[]来解?
解决Ҏ(gu)如示?
<c:out value="${map[key]}" />
<!-- q里的map是 java.util.Map对像Qkey是这个map里的一个key -->
eval_body_includeQ告诉服务器正文的内容,q把q些内容送入输出?
skip_bodyQ告诉服务器不要处理正文内容
eval_pageQ让服务器l执行页?
skip_pageQ让服务器不要处理剩余的面
eval_body_againQ让服务器l处理正文内容,只有doafterbodyҎ(gu)可以q回
eval_body_bufferedQbodytag接口的字D,在dostarttag()q回
卸蝲时就出现q个问题,重装了JDK和myeclipsel果问题q是一?
解决办法Q这个问题是׃JDK更新造成?
扑ֈMyEclipse的安装目录,下面?x)有一个名字类似Uninstall MyEclipse 5.5.0GA.lax的文Ӟ打开Q可以找?br />
lax.nl.current.vm=
q项Q将后面的值更新成有效的jre的值就可以了,如下所C:(x)
# LAX.NL.CURRENT.VM
# -----------------
# the VM to use for the next launch
lax.nl.current.vm=C:\\Program Files\\Java\\jre1.5.0_11\\bin\\java.exe
{
final int ACCOUNTANT = 1;
final int PAYROLL_CLERK = 2;
final int MANAGER = 3;
int jobID = ACCOUNTANT;
}如果你将一个字D声明ؓ(f)volatileQ则多线E将能访问此字段Q而特定的~译器将防止最优化以该字D能被适当的访问。如果你一个字D定义ؓ(f)staticQ则所有对象都共享此字段的一份拷贝。当你将一个新Dl这个字D|Q所有对象都得到这个新倹{如果没有指定ؓ(f)staticQ则q个字段是一个实例字D,每个对象都用他们自q一份拷贝?br />
定义为transient的字D值在对象串行化过E中不被保存。实例字D?br />
“实例字段”是没有使用static修改标识W定义的字段。实例字D和对象紧密相连——而不是和cR当在一个对象代码里修改Ӟ仅仅q个相关的类实例——对象——可以得到这个改变。实例字D随对象的创创建,随对象的释放而释放。类字段
cdD|用static关键字定义的字段。类字段和类联系——而不是对象。当在一个类代码中修Ҏ(gu)Q这个类Q以?qing)所有创建的对象Q都能感知这个变化。类字段随类的加载而创建,随类的卸载而释攑ָ?br />
“帔R”是一U只d量;当JVM初始化这U变量后Q变量的值就不能改变了?br />
使用final关键字来定义帔R。正如有两种字段——实例和cdD,帔R也有两种——实例常量和cd量。ؓ(f)了提高效率,应当创徏cd量,或者说是final static字段。class Constants
{
final int FIRST = 1;
final static int SECOND = 2;
public static void main(String[] args)
{
int iteration = SECOND;
if (iteration == FIRST)//~译错误
System.out.println(“first iteration”);
else
if (iteration == SECOND)
System.out.println(“second iteration”);
}
}
上例中的Constantscd义了一对常量——FIRST和SECOND。FIRST是实例常量,因ؓ(f)JVMl每个Constants对象分配一份FIRST的拷贝。相反的Q因为JVM在加载Constantscd只创Z一份SECOND拯Q所以SECOND是类帔R?br />
注意Q当你尝试在main()中直接访问FIRST时会(x)D一个编译错误。常量FIRST直到一个对象创建时才存在,所以FIRST仅仅只能被这个对象所讉K——而不是类?