今年一些小研究的总结报告
今年弄过一些小研究,但不是太成功或未完善,
所以把这些零碎的经验和总结写在这里。
以后有时间再单独写博文或把测试工程上传至github。
目录:
一、使用Maven和XSL处理XML
二、MinGW中运行strace(略)
三、Java/JSP的ajax技术
四、MinGW中运行gprof和相关工具对Lua进行性能剖析
-------------------------------------
一、使用Maven和 XSL 处理XML
1. 创建maven快速开始工程
(参考资料:
http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
)
$ mvn archetype:generate -DgroupId=com.iteye.weimingtom -DartifactId=testmavenxsl -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
$ cd testmavenxsl
$ ls
pom.xml src
$ mvn package
2. 嵌入xml-maven-plugin插件到pom.xml
(参考资料:
http://search.maven.org/
http://mojo.codehaus.org/xml-maven-plugin/plugin-info.html
http://mojo.codehaus.org/xml-maven-plugin/examples/transform-basic.html
http://mojo.codehaus.org/xslt-maven-plugin/migrate_to_xml-maven-plugin.html
)
在pom.xml中的<build><plugins>节点内加入xml-maven-plugin插件,如下:
<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.iteye.weimingtom</groupId>
<artifactId>testmavenxsl</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>testmavenxsl</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<goals>
<goal>transform</goal>
</goals>
</execution>
</executions>
<configuration>
<transformationSets>
<transformationSet>
<dir>src/main/xml</dir>
<stylesheet>src/main/stylesheet.xsl</stylesheet>
<destDir>target/generated-resources/xml/xslt</destDir>
</transformationSet>
</transformationSets>
</configuration>
</plugin>
</plugins>
</build>
</project>
然后根据这个配置放置xml文件到src/main/xml目录。
放置xsl文件到src/main/stylesheet.xsl。
3. 执行xsl转换
(参考资料:
http://mojo.codehaus.org/xml-maven-plugin/plugin-info.html
http://appfuse.org/display/APF/Eclipse
http://maven.apache.org/guides/introduction/introduction-to-plugin-prefix-mapping.html
)
在命令行中执行:
$ mvn xml:transform
或者用插件的全称调用任务(xxx插件对应的全称是xxx-maven-plugin)
$ mvn org.codehaus.mojo:xml-maven-plugin:transform
如果想查看帮助,可以执行:
$ mvn xml:help
$ mvn xml:help -Ddetail=true -Dgoal=transform
最终生成文件输出到
target\generated-resources\xml\xslt
目录下(可以用pom.xml指定)。
-------------------------------------
二、MinGW中运行strace(略)
http://ftp.ntua.gr/mirror/mingw/OldFiles/
http://sourceforge.net/project/shownotes.php?release_id=46827
MSYS-1.0.11-20080821-src.tar.gz
MSYS-1.0.11-20080821-dll.tar.gz
MSYS-1.0.11-20080821-dbg.tar.gz
msysCORE-1.0.17-1-msys-1.0.17-src.tar.lzma
strace.cc
strace.h
-------------------------------------
三、Java/JSP的ajax技术
一、开发环境
* Windows XP
* Eclipse JEE
* Maven 2
* MinGW
二、笔记
1. 创建工程
执行mvn archetype:generate进入交互模式
选择maven-archetype-webapp
(由于列表太长,
可以用mvn archetype:generate > list.txt 2>1保存到list.txt文件中)
然后根据向导创建maven工程目录
(1)选择创建模板maven-archetype-webapp的序号。
(2)选择版本,默认,回车即可。
(3)输入Java包名(如com.company)。
(4)输入工程短名(如test)。
(5)其余默认,回车即可。
2. 测试打包
执行以下命令
mvn compile
mvn package
3. 添加到pom.xml:
<project>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.21</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
</configuration>
</plugin>
</plugins>
</build>
</project>
(或者更改jetty插件的相关信息)
然后执行mvn jetty:run测试
浏览器URL为http://localhost:8080/<工程名>/index.jsp
显示Hello World!字样
按Ctrl+C关闭服务器
4. 转换到Eclipse工程
mvn eclipse:eclipse -Dwtpversion=2.0
用Eclipse右键的Import导入,然后按Eclipse右上角切换到Java视角,
打开Porblems视图中右上角下拉菜单选择Show
取消勾选All Errors,改为勾选Errors/Warnings on Project
然后选择工程,显示错误:
Java compiler level does not match the version of the installed Java project facet.
工程右键菜单->Properties->Project Facets->把Java由1.4改为6.0。
(注:这个问题可以用下面的maven-compiler-plugin配置来解决)
消除上面的错误。
切换到Eclipse右上角的Web视角,看到Deployment Descriptor为2.3
5. 修改默认JSP的字符集
主菜单->Window->Preferences->Web->JSP Files
把Encoding改为ISO 10646/Unicode(UTF-8)
另外最好把Eclispe的General->Workspace设置中
Text file encoding也设置为Other:UTF-8
以后新建JSP文件就会以UTF-8标注文件开头
6. 修改默认打开JSP的编辑器
主菜单->Window->Preferences->General->Editors->File Associations
点击*.jsp,把Associated editors中Web Page Editor设为Default(默认)
这样就可以高亮JSP文件,
并且可以在设计视图中用图形界面方式改变页面的样式。
在输入标签时,还可以打开Properties视图中的Attributes,
获得当前HTML标签的属性提示。
按Ctrl+Shift+F9/F10/F11/F12或工具栏上的按钮可以把布局设置为
设计器和编辑器平行显示或只显示其中一个。
7. 创建Servlet类
注意必须先创建src\main\java目录,
接着,打开工程的Properties对话框的Java Build Path分类,
把src\main\java目录添加到Source目录中(Add Folder...按钮)。
然后在工程右键->New->Servlet创建Servlet类。
注意,在创建对话框中
把Source folder的\<工程名>\src\main\resources
改为\<工程名>\src\main\java
创建完类后,Eclipse会提示出错,
那是因为无法导入javax.servlet下的类
(必需的jar文件不在classpath中)
打开pom.xml,在dependencies标签内加入
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
可以更改其中的版本,
其中,依赖的scope为provided,
表示这些jar由Java的Web容器提供,不会被打包到war中。
保存pom.xml后,在Eclipse中工程右键->Delete键卸载工程(但不删除硬盘文件)
接着,重新用mvn eclipse:eclipse -Dwtpversion=2.0生成Eclipse工程文件,
在Eclispe中右键->Import...把工程目录重新导入到Eclipse,
(注:其实这里可以直接转换,然后用refresh刷新即可,不需要重新import)
把工程的Facets的Java版本改为6.0以消除Eclipse的错误。
在执行mvn jetty:run前可以用mvn package打包war文件,
然后用7zip或winrar打开war文件,可以看到里面\WEB-INF\classes下有
Servlet类编译后的class文件。
如果之后运行mvn jetty:run启动服务器后,修改JSP或Servlet的代码,
jetty服务器会自动重启(不需要手动按Ctrl+C)。
8. 修改web.xml的注意问题
<servlet>和<servlet-mapping>不能交错写
9. 在pom.xml设置.java文件的编译器字符集
需要在<plugins>标签内加入encoding的设置(加到jetty插件配置前)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
然后重新执行mvn clean compile package
10. 安装DWR(http://directwebremoting.org/)
(1)在pom.xml中的<dependencies>标签内加入依赖
<dependency>
<groupId>org.apache.geronimo.bundles</groupId>
<artifactId>dwr</artifactId>
<version>3.0.M1_1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
(2)html文件
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type='text/javascript' src='dwr/engine.js'> </script>
<script type='text/javascript' src='dwr/util.js'> </script>
<script type='text/javascript' src='dwr/interface/TestDWR.js'> </script>
<script type='text/javascript' src='dwr.js'></script>
</head>
<body>
<p>
Name:
<input type="text" id="demoName"/>
<input value="Send" type="button" οnclick="update()"/>
<br/>
Reply: <span id="demoReply"></span>
</p>
</body>
</html>
(3)嵌入的JavaScripts文件
function update() {
var name = dwr.util.getValue("demoName");
TestDWR.sayHello(name, function(data) {
dwr.util.setValue("demoReply", data);
});
}
(4)WEB-INF/web.xml(注意<servlet>和<servlet-mapping>不能交错书写)
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR Servlet</display-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
(5)WEB-INF/dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr//dwr30.dtd">
<dwr>
<allow>
<create creator="new" javascript="TestDWR">
<param name="class" value="com.ugame.TestDWR"/>
</create>
</allow>
</dwr>
上面HTML文件中出现的dwr/engine.js,dwr/util.js和dwr/interface/TestDWR.js是自动生成的。
TestDWR.sayHello的接口定义在dwr/interface/TestDWR.js中,对应Java端的API。
Java端的API由WEB-INF/web.xml指定。
(6)总结:
pom.xml引入必要的jar库(由于没有继承DWR里的类,所以不需要重新创建Eclipse工程)。
客户端的*.html对应服务器端的web.xml。
客户端的*.js对应服务器端的dwr.xml。
11. 在jetty上配置Perl/PHP/Python CGI
(1)WEB-INF/web.xml(注意<servlet>和<servlet-mapping>不能交错书写)
<!-- see http://docs.codehaus.org/display/JETTY/Jetty+and+PHP -->
<servlet>
<servlet-name>jetty-perl</servlet-name>
<servlet-class>org.mortbay.servlet.CGI</servlet-class>
<init-param>
<param-name>commandPrefix</param-name>
<param-value>C:/Perl/bin/perl.exe</param-value>
</init-param>
</servlet>
<!--
see http://docs.codehaus.org/display/JETTY/Jetty+and+PHP
需要自己创建一个批处理php-cgi-prefix.bat处理文件名问题:
在Windows下
@set SCRIPT_FILENAME=%1
@"C:\Program Files\PHP\php-cgi.exe"
在Linux下
$!/bin/sh
export SCRIPT_FILENAME=$1
/your/path/to/php-cgi
-->
<!-- 注意:ENV_REDIRECT_STATUS意思是设置REDIRECT_STATUS为环境变量 -->
<servlet>
<servlet-name>jetty-php</servlet-name>
<servlet-class>org.mortbay.servlet.CGI</servlet-class>
<init-param>
<param-name>commandPrefix</param-name>
<param-value>"C:/Program Files/PHP/php-cgi-prefix.bat"</param-value>
</init-param>
<init-param>
<param-name>ENV_SystemRoot</param-name>
<param-value>C:/WINDOWS</param-value>
</init-param>
<init-param>
<param-name>ENV_REDIRECT_STATUS</param-name>
<param-value>yes</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>jetty-python</servlet-name>
<servlet-class>org.mortbay.servlet.CGI</servlet-class>
<init-param>
<param-name>commandPrefix</param-name>
<param-value>C:/python26/python.exe</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>jetty-perl</servlet-name>
<url-pattern>/perl/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jetty-php</servlet-name>
<url-pattern>/php/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jetty-python</servlet-name>
<url-pattern>/python/*</url-pattern>
</servlet-mapping>
(2)安装问题
php-cgi有较强的安全限制,需要创建php-cgi-prefix和设置相关的环境变量。
而Perl和Python在jetty上的CGI配置比较简单。
(3)利用CGI,可以运行url-pattern指定目录下的脚本文件。
Perl CGI例子:
#!c:\perl\bin\perl.exe
##
## printenv -- demo CGI program which just prints its environment
##
print "Content-type: text/html\n\n";
print "<pre>*** Please define header of file *.pl or *.cgi with<b>
#!c:\\perl\\bin\\perl.exe</b>\n\n\n";
foreach $var (sort(keys(%ENV))) {
$val = $ENV{$var};
$val =~ s|\n|\\n|g;
$val =~ s|"|\\"|g;
print "${var}=\"${val}\"\n";
}
(4)PHP CGI例子:
<?php
phpinfo();
?>
(5)Python CGI例子:
#!c:/python26/python.exe
import cgitb
cgitb.enable()
import time
import cgi
print "Content-type: text/html"
print """<html>
<head>
<title></title>
</head>
<body>
%s<br/>""" % time.strftime("%I:%M:%S %p")
cgi.print_environ()
print "</body></html>"
-------------------------------------
四、MinGW中运行gprof和相关工具对Lua进行性能剖析
1. Lua 5.1.4 Makefile修改
(1)添加-g -pg
CC= gcc -g -pg
(2)去除ranlib
$(LUA_A): $(CORE_O) $(LIB_O)
$(AR) $@ $?
#$(RANLIB) $@
2. 使用gprof2dot生成图例
gprof ./lua.exe | /c/python26/python gprof2dot.py -n0 -e0 | dot -Tpng -o output.png
see http://www.51testing.com/?uid-13997-action-viewspace-itemid-79952
-------------------------------------