申艳超-博客

搜索引擎、分布式、高性能、NLP、ElasticSearch、Solr

0%

dom4j解析xml

dom4j提供了一个DocumentHelper来解析xml内容,此处的内容是String类型的。下面是其源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public static Document parseText(String text) throws DocumentException {
Document result = null;
SAXReader reader = new SAXReader();
String encoding = getEncoding(text);

InputSource source = new InputSource(new StringReader(text));
source.setEncoding(encoding);

result = reader.read(source);

// if the XML parser doesn't provide a way to retrieve the encoding,
// specify it manually
if (result.getXMLEncoding() == null) {
result.setXMLEncoding(encoding);
}

return result;
}

private static String getEncoding(String text) {
String result = null;

String xml = text.trim();

if (xml.startsWith("<?xml")) {
int end = xml.indexOf("?>");
String sub = xml.substring(0, end);
StringTokenizer tokens = new StringTokenizer(sub, " =\"\'");

while (tokens.hasMoreTokens()) {
String token = tokens.nextToken();

if ("encoding".equals(token)) {
if (tokens.hasMoreTokens()) {
result = tokens.nextToken();
}

break;
}
}
}

return result;
}

从以上的代码中可以看出,解析过程中是使用XML的头<?xml version="1.0" encoding="UTF-8"?>来获取编码信息的。

Read more »

EL 表达式

在JSP页面中,使用标签库代替传统的Java片段语言来实现页面的显示逻辑已经不是新技术了,然而,由自定义标签很容易造成重复定义和非标准的实现。鉴于此,出现了JSTL(JSP Standard Tag Library),为大多数JSP页面逻辑提供了实现的JSTL技术,该技术本身就是一个标签库。

Sun公司Java规范标准的JSTL由apache jakarta组织负责维护。作为开源的标准技术,它一直在不断地完善。JSTL的发布包有两个版本:Standard-1.0 Taglib、Standard-1.1 Taglib,它们在使用时是不同的。

Standard-1.0 Taglib(JSTL1.0)支持Servlet2.3和JSP1.2规范,Web应用服务器Tomcat4支持这些规范,而它的发布也在Tomcat 4.1.24测试通过了。

Standard-1.1 Taglib(JSTL1.1)支持Servlet2.4和JSP2.0规范,Web应用服务器Tomcat5支持这些规范,它的发布在Tomcat 5.0.3测试通过了。

本文将以由Sun发布的Standard-1.1 Taglib标签库为主,而apache jakarta组织发布的开源标签库,可以从http://jakarta.apache.org/taglibs/找到所需要的帮助。Sun发布的标准JSTL1.1标签库有以下几个标签:

  • 核心标签库:包含Web应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
  • 国际化标签库:用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
  • 数据库标签库:可以做访问数据库的工作。
  • XML标签库:用来访问XML文件的工作,这是JSTL标签库的一个特点。
  • 函数标签库:用来读取已经定义的某个函数。

此外,JSTL还提供了EL表达式语言(Expression Language)来进行辅助的工作。

JSTL标签库由标签库和EL表达式语言两个部分组成。EL在JSTL 1.0规范中被引入,当时用来作为Java表达式来工作,而该表达式必须配合JSTL的标签库才能得到需要的结果。

说明:在JSTL 1.1规范中,JSP2.0容器已经能够独立的理解任何EL表达式。EL可以独立出现在JSP页面的任何角落。本文随后的内容将以JSTL 1.1规范作为介绍的重点。

Read more »

ut-maven-plugin简介

这是一个用来生成Unit Test模板的maven插件。使用这个插件不能彻底解决单元测试的问题,她还没有这么智能,只能按照自己的理解帮助你生成一个方法的单元测试方法框架。通过这些自动生成的代码,来提高写单元测试的生产率。
《程序员修炼之道》里的提示29说:“Write Code That Writes Code”。这也是ut-maven-plugin所做的,帮助程序员生成需要重复的工作以及共性的工作。

也许,现在她还小,还不足够智能,智能到足以测试你的方法的所有业务逻辑。但是在将来,她将会越来越智能。帮你解决更多的单元测试问题,或者解决更多共性的问题。

Read more »

《程序员修炼之道-从小工到专家》写的具有普遍意义的指导方法。很少有具体的开发讲解,更多的是告诉你,作为一个程序员,你应该具有哪些素质,以及怎么做。下面是我对书中印象比较深的一些记录。

关于心态

石头汤与煮青蛙

三个士兵从战场返回家乡,在路上饿了,他们看见前面有村庄,就来了精神(他们相信村民会给他们一顿饭吃)。但当他们到达那里,却发现门锁着,窗户也关着。经历了多年的战乱,村名们粮食匮乏,并把他们仅有的一点粮食藏了起来。

士兵们并没有气馁,他们煮开一锅水,小心地把三块石头放进去。吃惊的村民走出来望着他们。

“这是石头汤。”士兵们解释说。“就放这些吗?”村民们问。“一点也没错——但是有人说加一些胡萝卜味道更好…….” 一个村民跑开了,又很快带着他储藏的一篮胡萝卜跑回来。
几分钟后,村民们又问:“就这些了吗?”

“啊,”士兵们说:“几个土豆会让汤更实在。”又一个村民跑开了。

接下来的一小时,士兵们列举了更多让汤更鲜美的配料:牛肉,韭菜,盐,还有香菜。每一次都会有一个不同的村民跑回去搜寻自己的私人储藏品。

最后他们煮出了一大锅热气腾腾的汤。士兵们掉石头,和所有的村民一起享用了一顿美餐,这是几个月以来他们所有人第一次吃饱饭。

Read more »

一、什么是SSH?

简单说,SSH是一种网络协议,用于计算机之间的加密登录。

如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。

Read more »

在pom.xml里添加以下maven插件配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<!-- 静态代码检查 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.11</version>
<configuration>
<configLocation>checkstyle.xml</configLocation>
<includeResources>false</includeResources>
<failOnViolation>true</failOnViolation>
<violationSeverity>info</violationSeverity>
<maxAllowedViolations>0</maxAllowedViolations>
<consoleOutput>true</consoleOutput>
<encoding>UTF-8</encoding>
<includes>
**\/package\/**.java,**\/otherpackage\/**.java
</includes>
</configuration>
<!-- <executions>
<execution>
<goals>
<goal>check</goal>
</goals>
<phase>validate</phase>
</execution>
</executions>-->
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>2.7.1</version>
<configuration>
<failurePriority>5</failurePriority>
<failOnViolation>true</failOnViolation>
<targetJdk>${jdk.version}</targetJdk>
<verbose>true</verbose>
<outputEncoding>UTF-8</outputEncoding>
<rulesets>
<ruleset>pmd.xml</ruleset>
</rulesets>
<includes>
<include>**\/package\/**.java</include>
<include>**\/otherpackage\/**.java</include>
</includes>
</configuration>
<!-- <executions>
<execution>
<phase>package</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>-->
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.5.2</version>
<configuration>
<onlyAnalyze>
cn.shenyanchao.package.*,
cn.shenyanchao.otherpackage.*,
</onlyAnalyze>
<includeFilterFile>findbugs.xml</includeFilterFile>
<failOnError>true</failOnError>
<outputEncoding>UTF-8</outputEncoding>
</configuration>
<!-- <executions>
<execution>
<phase>package</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>-->
</plugin>

这些配置集成了checkstyle,pmd,findbugs的插件。并指明了要使用的规则集合(checkstyle.xml,pmd.xml,findbugs.xml)。

Read more »

Maven如何依赖本地包?

有些依赖包在mavencentral上是没有的。那么如何在项目中使用呢?

1
2
3
4
5
6
7
<dependency>
<groupId>org.wltea.ik-analyzer</groupId>
<artifactId>ik-analyzer</artifactId>
<version>3.2.8</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/ik-analyzer-3.2.8.jar</systemPath>
</dependency>

这里可以指明scope是system,然后制定这个依赖包的systemPath就可以啦。这里依ik-analyzer为例的。

如何将本地包打到war包内?

打war包,一般直接执行mvn clean package即可,但是默认的情况下是不能将scope=system的本地包打包的。这个时候就需要显式的指定啦。如下面这样,默认将lib下的所有jar文件打包到WEB-INF/lib下。当然也是可以打包其他的文件的,诸如xml,properties等的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<warName>${project.artifactId}</warName>
<webResources>
<resource>
<directory>lib/</directory>
<targetPath>WEB-INF/lib</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>

CheckStyle基于antlr对源码进行处理

  • antlr对AST解析
  • 使用Visitor模式

主要是通过:

1
public int[] getDefaultTokens()

指定要访问的节点类型。

1
public void visitToken(DetailAST assignAST)

指定如何处理节点,并进行规则校验。

Read more »

目标Web系统

apache + tomcat + mysql + linux, 介绍如何定位瓶颈与调优

Tomcat

按照官方默认配置。
并发150正常;达到210时,报connection refuse

$TOMCAT_HOME/conf/server.xml中

1
2
<Connector port="8080" protocol="HTTP/1.1"      connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>

maxThreads 默认值是200
acceptCount 默认值是100

解决方法:显式指明以上2项,并提高数值。并可配合min/maxSpareThreads

参数文档: http://tomcat.apache.org/tomcat-6.0-doc/config/http.html

Read more »

最近,由于公司内部的网络改造,在git push的时候提示如下信息:

1
2
3
4
5
ssh: connect to host github.com port 22: Connection timed out
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

看字面的意思就是连接超时了,什么原因造成的呢,这个估计是公司网络禁用了SSH的22端口导致的。所幸git提供了https、git、ssh三种协议来读写。

运行git config --local -e打开配置信息。
修改其中的

1
url = git@github.com:username/repo.git

1
url = https://username@github.com/username/repo.git

这样就改为使用https协议了。提交什么的就OK了。

后来,我再使用Octopress提交博客的时候问题又出现了。也就是在rake deploy的时候,又走ssh了。此时只要进入_deploy目录,把上述步骤再执行一次就好了。就是每次提交都要输入用户名密码而已。