﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-上善若水-文章分类-Java</title><link>http://www.blogjava.net/bourn/category/25422.html</link><description> 反者道之动，弱者道之用。
 天下万物生于有，有生于无。</description><language>zh-cn</language><lastBuildDate>Tue, 04 Sep 2007 17:08:22 GMT</lastBuildDate><pubDate>Tue, 04 Sep 2007 17:08:22 GMT</pubDate><ttl>60</ttl><item><title>JDK5 介绍</title><link>http://www.blogjava.net/bourn/articles/142537.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Tue, 04 Sep 2007 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/142537.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/142537.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/142537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/142537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/142537.html</trackback:ping><description><![CDATA[<font style="line-height: 18px;" color="#333333">　本文中，我们将讨论几个在JDK1.5中新的语言特征，包括：<br />
<br />
泛型（Generics）--为集合（collections）提供编译时类型安全，无需每刻从Collections取得一个对象就进行强制转换（cast）<br />
<br />
增强的&#8220;for&#8221;循环（Enhanced For loop）--减少迭代器(iterator)的潜在错误（error-proneness）<br />
<br />
自动置入/自动取出（Autoboxing/unboxing）--无需在基本类型（primitive types）（例如double）和包装类型（wrapper types）（例如Double）之间人工地进行转换。<br />
<br />
类型安全的枚举（Typesafeenums）--提供类型安全枚举模式的各项好处。<br />
<br />
静态导入（Static import）--无需在使用其他类的静态成员变量前缀其类名.这将使得代码更为简洁。<br />
<br />
元数据（Metadata）--使编程人员避免编写样板化代码（boiler plate code），并提供机会进行宣告式程式设计(declarative programming)。<br />
<br />
让我们详细讨论每个新特性，并看一些例子。<br />
<br />
<strong>泛型（Generics）</strong><br />
<br />
泛型是JDK1.5中一个最&#8220;酷&#8221;的特征。通过引入泛型，我们将获得编译时类型的安全和运行时更小地抛出ClassCastExceptions的可
能。在JDK1.5中，你可以声明一个集合将接收/返回的对象的类型。在JDK1.4中，创建雇员名字的清单（List）需要一个集合对象，像下面的语
句：<br />
<br />
List listOfEmployeeName = new ArrayList();<br />
<br />
在JDK1.5中，你将使用下面语句<br />
<br />
List&lt;String&gt; listOfEmployeeName = new ArrayList&lt;String&gt;();<br />
<br />
最&#8220;酷&#8221;的是，如果你试图插入非string类型的值，你将在编译时发现并且修正这类问题。没有泛型，你会发现这样一个bug，当你的客户调用后会告诉你，你所编写的程序抛出ClassCastException异常而崩溃。<br />
<br />
另外，当你从集合中得到一个元素时你无需进行强制转换。故原先为：<br />
<br />
String employeeName = ((String) listOfEmployee.get(i));<br />
<br />
而下面的语句将比上面的更加简单：<br />
<br />
String employeeName = listOfEmployee.get(i);<br />
<br />
不清楚对象的类型而强制转换对象是不合理的，并且更重要的是，它将在运行时失败。假使用户无意间传入一个包含string
buffers类型而非string类型的集合，那结果会怎样呢。在Listing
A中，客户被要求传入一个编译器无法强制的strings类型集合。Listing B中显示了同样的方法使用泛型是如何实现的。<br />
<br />
Listing A<br />
<br />
staticbooleancheckName(Collection employeeNameList, String name) {<br />
<br />
for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) {<br />
<br />
String s = (String) i.next();<br />
<br />
if(s.equals(name)){<br />
<br />
return true;<br />
<br />
//print employee name here ......<br />
<br />
}<br />
<br />
}<br />
<br />
return false;<br />
<br />
}<br />
<br />
Listing B<br />
<br />
staticbooleancheckName(Collection&lt;String&gt; employeeNameList, String name) {<br />
<br />
for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) {<br />
<br />
if(i.next().equals(name)){<br />
<br />
return true;<br />
<br />
//print employee name here ......<br />
<br />
}<br />
<br />
}<br />
<br />
return false;<br />
<br />
}<br />
<br />
现在，通过方法签名可以清楚知道输入集合必须只能包含strings。如果客户试图传入一个包含string buffers的集合，程序将不会编译。同时注意，该方法不包含任何强制转换。它只需要短短一行，一旦你习惯泛型后，它也更加清晰。<br />
<br />
在JDK当前版本下的For循环语法如下：<br />
<br />
void printAll(Collection c) {<br />
<br />
for (Iteratori = c.iterator(); i.hasNext(); ) {<br />
<br />
Employee emp = (Employee)i.next();<br />
<br />
System.out.println(emp.getName());<br />
<br />
}<br />
<br />
}<br />
<br />
现在，用增强的For语句实现相同方法：<br />
<br />
voidprintAll(Collection c) {<br />
<br />
for (Object o : c)<br />
<br />
System.out.println((TimerTask)o).getName());<br />
<br />
}<br />
<br />
在这类For循环中，你应该将":"看成"in"，所以，在该例中可以看成"for Object o in c"。你可以发现这种For循环更具可读性。<br />
<br />
<strong>自动置入/自动取出（Autoboxing/unboxing）</strong><br />
<br />
Java有基本数据类型，在这些基本数据类型周围又有包装类。通常，编程人员需要将一种类型转换成另一种。看看Listing C.中的代码片断。<br />
<br />
Listing C<br />
<br />
public class Employee {<br />
<br />
private static final Integer CHILD = new Integer(0);<br />
<br />
public static void main(String args[]) {<br />
<br />
//code for adding n to an Integer<br />
<br />
int n=10;<br />
<br />
Integer age= new Integer(30);<br />
<br />
Integer ageAfterTenYear= new Integer(age.intValue +10);<br />
<br />
}<br />
<br />
}<br />
<br />
请注意，用于计算ageAfterTenYear的内循环代码看上去是多么杂乱。现在，在Listing D.中看看相同的程序使用autoboxing重写后的样子。<br />
<br />
Listing D<br />
<br />
public class Employee {<br />
<br />
public static void main(String args[]) {<br />
<br />
int n=10;<br />
<br />
Integer age= new Integer(30);<br />
<br />
Integer ageAfterTenYear= age +10;<br />
<br />
}<br />
<br />
}<br />
<br />
有一件事值得注意的：在先前，如果你取出（unbox）Null值，它将变为0。在次代码中，编译器将自动地转换Integer为int然后加上10，接着将其转换回Integer.。<br />
<br />
<strong>类型安全的枚举（Typesafeenums）</strong><br />
<br />
类型安全枚举提供下列特性：<br />
<br />
他们提供编译时类型安全。<br />
<br />
他们都是对象，因此你不需要将他们放入集合中。<br />
<br />
他们作为一种类的实现，因此你可以添加一些方法。<br />
<br />
他们为枚举类型提供了合适的命名空间。<br />
<br />
他们打印的值具有情报性（informative）― 如果你打印一个整数枚举（intenum），你只是看见一个数字，它可能并不具有情报性。<br />
<br />
例一：<br />
<br />
enum Season { winter, spring, summer, fall }<br />
<br />
例二：<br />
<br />
public enum Coin {<br />
<br />
penny(1), nickel(5), dime(10), quarter(25);<br />
<br />
Coin(int value) { this.value = value; }<br />
<br />
private final int value;<br />
<br />
public int value() { return value; }<br />
<br />
}<br />
<br />
<strong>静态导入（Static import）</strong><br />
<br />
静态导入使代码更易读。通常，你要使用定义在另一个类中的常量（constants），像这样：<br />
<br />
importorg.yyy.pkg.Increment;<br />
<br />
class Employee {<br />
<br />
public Double calculateSalary(Double salary{<br />
<br />
return salary + Increment.INCREMENT * salary;<br />
<br />
}<br />
<br />
}<br />
<br />
当时使用静态导入，我们无需为常量名前缀类名就能使用这些常量，像这样：<br />
<br />
import static org.yyy.pkg.Increment;<br />
<br />
class Employee {<br />
<br />
public Double calculateSalary(Double salary{<br />
<br />
return salary + INCREMENT * salary;<br />
<br />
}<br />
<br />
}<br />
<br />
注意，我们可以调用INCREMENT这一常量而不要使用类名Increment.。<br />
<br />
<strong>元数据（Metadata）</strong><br />
<br />
元数据特征志于使开发者们借助厂商提供的工具可以进行更简易的开发。看一看Listing E.中的代码。<br />
<br />
Listing E<br />
<br />
importorg.yyy.hr;<br />
<br />
public interface EmployeeI extends Java.rmi.Remote {<br />
<br />
public String getName()<br />
<br />
throwsJava.rmi.RemoteException;<br />
<br />
public String getLocation ()<br />
<br />
throwsJava.rmi.RemoteException;<br />
<br />
}<br />
<br />
public class EmployeeImpl implements EmployeeI {<br />
<br />
public String getName(){<br />
<br />
}<br />
<br />
public String getLocation (){<br />
<br />
}<br />
<br />
}<br />
<br />
通过元数据的支持，你可以改写Listing E中的代码为：<br />
<br />
importorg.yyy.hr;<br />
<br />
public class Employee {<br />
<br />
@Remote public String getName() {<br />
<br />
...<br />
<br />
}<br />
<br />
@Remote public public String getLocation() {<br />
<br />
...<br />
<br />
}<br />
<br />
}<br />
<br />
正像你所看到的，所有样板化的代码都不见了。<br />
<br />
这些新特性和规格说明将在JDK1.5中实现。它将提供Java编程社区更多的选择以编写鲁棒的、可扩展的代码。认真的Java编程人员将感到着手去熟悉这一Java编程语言的新版本是很有益的。 <br />
<a href="http://www.linuxpk.com/43851.html">本文来自：http://www.linuxpk.com/43851.html</a><br />
</font><font style="line-height: 18px;" color="#333333">　Java2标准版(Java 2
Platform, Standard Edition,
J2SE)1.5即将正式推出，这一次的版本更新不同于以往，它带来了很多里程碑式的革新，SUN将其绰号取名为&#8220;虎&#8221;。这一次的变革将是Java诞生以
来从未有过的，它给我们带来了耳目一新的感觉。下面我们就来欣赏一下其中的部分典型变化：<br />
<br />
<strong>1.自动包装和解包(Autoboxing and unboxing)</strong><br />
<br />
代码示例<br />
<br />
往一个ArrayList中加入一个整数，1.5版本以前的版本写法是：<br />
<br />
List list = new ArrayList();<br />
<br />
list.add( new Integer( 10 ) );<br />
<br />
而在1.5版本中可以写为：<br />
<br />
list.add( 10 );<br />
<br />
因为，在1.5版本中，对一个整数进行包装，使之成为一个Integer对象(即包装，boxing)，然后加入到一个ArrayList中的做法被认
为是没有必要的，反之，解包(unboxing)的做法也是没有必要的，这样的代码只是增加了程序的文本长度而已，所以1.5版本支持了自动包装和解包操
作，对于bool/Boolean，byte/Byte，double/Double，short/Short，int/Integer，
long/Long，float/Float的相应包装/解包操作都进行了支持，从而使代码变得简单。<br />
<br />
<strong>2.更优化的循环语句(The inhanced for loop)</strong><br />
<br />
代码示例<br />
<br />
一个典型的遍历数组的循环语句，1.5版本以前的写法是：<br />
<br />
for ( Iterator iterator = list.iterator(); iterator.hasNext(); )<br />
<br />
{<br />
<br />
Integer n = (Integer)iterator.next();<br />
<br />
...<br />
<br />
}//for<br />
<br />
而在1.5版本中可以写为：<br />
<br />
for ( Integer n : list )<br />
<br />
{<br />
<br />
...<br />
<br />
}//for<br />
<br />
显然1.5版本的写法比以前是大大简化了，但是在需要修改集合，比如删除其中元素时不能采用这种写法。之所以Java1.5版本没有象C#那样干脆定义
一个foreach关键词，主要是因为SUN认为增加一个专门的关键词成本太高了(too
costly)。但1.4版本中就曾经增加了assert关键词，1.5版本中也新增加了enum关键词，因此这一解释恐怕并不那么令人信服。<br />
<br />
<strong>3.参数可变的方法和printf</strong><br />
<br />
代码示例<br />
<br />
当不能确定一个方法的入口参数的个数时，以往版本的Java中，通常的做法是将多个参数放在一个数组或者对象集合中作为参数来传递，1.5版本以前的写法是：<br />
<br />
int sum(Integer[] numbers)<br />
<br />
{<br />
<br />
int nSum = 0;<br />
<br />
for(int i: numbers)<br />
<br />
nSum += i;<br />
<br />
return nSum;<br />
<br />
}<br />
<br />
...<br />
<br />
//在别处调用该方法<br />
<br />
sum(new Integer[] {12,13,20});<br />
<br />
而在1.5版本中可以写为：<br />
<br />
int sum(Integer... numbers)<br />
<br />
{<br />
<br />
int nSum = 0;<br />
<br />
for(int i: numbers)<br />
<br />
nSum += i;<br />
<br />
return nSum;<br />
<br />
}<br />
<br />
...<br />
<br />
//在别处调用该方法<br />
<br />
sum(12,13,20);<br />
<br />
显然，1.5版本的写法更为简易，也更为直观，尤其是方法的调用语句，不仅简化很多，而且更符合通常的思维方式，更易于理解。<br />
<br />
1.5版本自身就有一个应用该特征的典型例子，即C风格的格式化输出方法――printf。<br />
<br />
代码示例<br />
<br />
输出一个加法算式，1.5版本以前的写法是：<br />
<br />
int x = 5;<br />
<br />
int y = 7;<br />
<br />
int nSum = x + y;<br />
<br />
System.out.println(x + " + " + y + " = " + nSum);<br />
<br />
而在1.5版本中可以写为：<br />
<br />
System.out.printf("%d + %d = %d"n", x, y, nSum);<br />
<br />
以上两种写法的输出结构是一样的，即&#8220;5 + 7 = 12&#8221;。<br />
<br />
这种改变不仅仅是形式上的，printf还可以提供更为灵活、强大的输出功能，比如限定按照两位整数的形式输出，可以写为
&#8220;System.out.printf("%02d + %02d = %02d"n", x, y, nSum);&#8221;，输出结果将是&#8220;05 + 07
= 12&#8221;。<br />
<br />
<strong>4.枚举</strong><br />
<br />
代码示例<br />
<br />
构建一个表示色彩的枚举，并赋值，在1.5版本中可以写为：<br />
<br />
public enum MyColor{ Red, Yellow, Blue }<br />
<br />
MyColor color = MyColor.Red;<br />
<br />
for ( MyColor mycolor : MyColor.values() )<br />
<br />
System.out.println( mycolor );<br />
<br />
以往的Java版本中没有enum关键词，1.5版本中终于加入了进来，这确实是一个令人高兴的改进。此外，enum还提供了一个名为values()
的静态方法，用以返回枚举的所有值的集合。所以，以上程序的输出结果是把&#8220;Red&#8221;、&#8220;Yellow&#8221;、&#8220;Blue&#8221;分行输出。<br />
<br />
而
enum提供的静态方法valueOf()则将以字符串的形式返回某一个具体枚举元素的值，比如&#8220;MyColor.valueOf(&#8220;Red&#8221;)&#8221;会返回
&#8220;Color.Red&#8221;。静态方法name()则返回某一个具体枚举元素的名字，比如&#8220;MyColor.Red.name()&#8221;会返回&#8220;Red&#8221;。类似的
方法还有不少。此外，enum自身还可以有构造方法。<br />
<br />
<strong>5.静态引用</strong><br />
<br />
代码示例<br />
<br />
当我们要获取一个随即数时，1.5版本以前的写法是：<br />
<br />
import java.lang.Math; //程序开头处<br />
<br />
...<br />
<br />
double x = Math.random();<br />
<br />
而在1.5版本中可以写为：<br />
<br />
import static java.lang.Math.random; //程序开头处<br />
<br />
&#8230;<br />
<br />
double x = random();<br />
<br />
静态引用使我们可以象调用本地方法一样调用一个引入的方法，当我们需要引入同一个类的多个方法时，只需写为&#8220;import static java.lang.Math.*&#8221;即可。这样的引用方式对于枚举也同样有效。<br />
<br />
<strong>6.总结</strong><br />
<br />
以上对J2SE1.5的部分新特征做了一些简单的介绍。总而言之，1.5版本的Java确实给我们带来了很多令人激动的变革，如同以上介绍的那样，很多功能以前的版本也能实现，但是不能实现得这样简单、漂亮。相信这次变革会给Java带来更多的追随者。 <br />
<a href="http://www.linuxpk.com/43860.html">本文来自：http://www.linuxpk.com/43860.html</a></font><br />
<img src ="http://www.blogjava.net/bourn/aggbug/142537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-09-04 10:37 <a href="http://www.blogjava.net/bourn/articles/142537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Code Engine基本技术demo2</title><link>http://www.blogjava.net/bourn/articles/142384.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Mon, 03 Sep 2007 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/142384.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/142384.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/142384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/142384.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/142384.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">关于如何生成字段的编辑页面；</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">首先应该读取</span>domain<span style="font-family: 宋体;">对象，从而获取</span>field<span style="font-family: 宋体;">列表；</span></p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp; /**</p>
<p style="margin-left: 18pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp; * getDomainFields via jsp name, and should
remove the super fields, like lastUpdatedBy, lastUpdatedDate</span></p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp; * @param name of jsp</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp; * @return list of field</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p style="margin-left: 18pt;"><span>&nbsp;&nbsp;&nbsp; public static List&lt;Field&gt;
getDomainFields(String name) {</span></p>
<p style="margin-left: 18pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Field&gt; ret = new
ArrayList&lt;Field&gt;();</span></p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p style="margin-left: 18pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class clz =
Class.forName(CodeEngineConfig.getDomainPackage() + "." +</span></p>
<p style="margin-left: 18pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>CodeEngineConfig.getControllerDomain(CodeEngineConfig.getJspRef(name)));</span></p>
<p style="margin-left: 18pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Field field :
clz.getDeclaredFields()) {</span></p>
<p style="margin-left: 18pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>if(!"lastUpdateDate".equalsIgnoreCase(field.getName())</span></p>
<p style="margin-left: 18pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;
!"lastUpdateBy".equalsIgnoreCase(field.getName())){</span></p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret.add(field);</p>
<p style="margin-left: 18pt;"><span>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>System.out.println("field.getName() + field.getType() = " +
(field.getName() + field.getType()));</span></p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ret;</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>2.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">将</span>Field List<span style="font-family: 宋体;">传递给</span>freemarker<span style="font-family: 宋体;">模板；之所以要传递</span>field<span style="font-family: 宋体;">而不仅仅是</span>name<span style="font-family: 宋体;">的原因是，因为希望在模板里根据</span>field<span style="font-family: 宋体;">的</span>type<span style="font-family: 宋体;">，从而生成不同的</span>html<span style="font-family: 宋体;">，比如</span>date<span style="font-family: 宋体;">可以生成使用</span>js calendar<span style="font-family: 宋体;">的，</span>boolean<span style="font-family: 宋体;">生成</span>radio<span style="font-family: 宋体;">，或</span>checkbox<span style="font-family: 宋体;">，其他的生成</span>text<span style="font-family: 宋体;">；</span></p>
<p style="margin-left: 42pt; text-indent: -21pt;"><span><span>a)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">定义</span>macro<span style="font-family: 宋体;">；</span></p>
<p>&lt;#macro getHtml field&gt;</p>
<p>&nbsp;&lt;#if field.type?ends_with('Boolean')&gt;</p>
<p><span>&lt;input type="radio"
id="${field.name}" name="${field.name}"
class="inp_txt_30" size="80"
value="${'$'}{${domain?uncap_first + '.' + field.name}}"&gt;</span></p>
<p>&nbsp;&lt;#elseif field.type?ends_with('Date')&gt;</p>
<p><span>&lt;input type="text"
id="${field.name}" name="${field.name}"
readonly="readonly" class="inp_txt_30" size="17"
value="&lt;fmt:formatDate value="${'$'}{${domain?uncap_first + '.' +
field.name}}" pattern="yyyy-MM-dd hh:mm"/&gt;"&gt;</span></p>
<p><span>&lt;button id="${field.name}Btn"
class="button" &gt;...&lt;/button&gt;</span></p>
<p><span>&lt;script
type="text/javascript"&gt;</span></p>
<p>Calendar.setup(</p>
<p>{</p>
<p>inputField&nbsp;: "${field.name}",&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;// id of the input field</p>
<p><span>ifFormat<span>&nbsp;&nbsp;&nbsp;
</span>: "%Y-%m-%d %H:%M",<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>// the date format</span></p>
<p>showsTime: true,</p>
<p><span>button<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>: "${field.name}Btn"<span>&nbsp;&nbsp;&nbsp;
</span>// id of the button</span></p>
<p>}</p>
<p>);</p>
<p>&lt;/script&gt;</p>
<p>&nbsp;&lt;#elseif field.type?ends_with('Text')&gt;</p>
<p><span>&lt;textarea id="${field.name}"
name="${field.name}" rows="15" cols="80"
style="width: 100%"&gt;${'$'}{${domain?uncap_first + '.' +
field.name}}&lt;/textarea&gt;</span></p>
<p>&nbsp;&lt;#else&gt;</p>
<p><span>&lt;input type="text"
id="${field.name}" name="${field.name}"
class="inp_txt_30" size="80" value="${'$'}{${domain?uncap_first
+ '.' + field.name}}"&gt;</span></p>
<p>&nbsp;&lt;/#if&gt;</p>
<p>&lt;/#macro&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b<span style="font-family: 宋体;">）调用</span>macro<span style="font-family: 宋体;">生成</span>html<span style="font-family: 宋体;">；</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;#list fields! as field&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td
class="txt_tit_s" &gt;&lt;spring:message code="${lbl + '.' +
domain?uncap_first + '.' + field.name}"/&gt;&lt;/td&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;@getHtml
field=field/&gt;&lt;/td&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/#list&gt;</span></p>
<img src ="http://www.blogjava.net/bourn/aggbug/142384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-09-03 17:12 <a href="http://www.blogjava.net/bourn/articles/142384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源框架的选型</title><link>http://www.blogjava.net/bourn/articles/142111.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Sun, 02 Sep 2007 11:23:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/142111.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/142111.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/142111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/142111.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/142111.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体;">如果你想用开源框架来开发</span>web<span style="font-family: 宋体;">项目，选择一套适用的组件是很关键的；</span>
<p><span style="font-family: 宋体;">不光要考虑开发的简单，还要考虑日后的升级；</span></p>
<p><span style="font-family: 宋体;">甚至足够充分的文档资料支持；还有现有团队的技术能力；以及项目时间等；</span></p>
<p style="margin-left: 31.5pt; text-indent: -31.5pt;">MVC<span style="font-family: 宋体;">：第一要素我个人觉得是要简单，因为在这个部分的中的代码量，通常相对后端是很多的；一个容易上手，并且大家都熟悉并且不讨厌；</span></p>
<p style="margin-left: 31.5pt; text-indent: -31.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SpringMVC<span style="font-family: 宋体;">，我个人觉得是很完备的</span>mvc<span style="font-family: 宋体;">，有着很強的灵活性，但正是这种灵活性，让很多人无所适从；</span></p>
<p style="margin-left: 31.5pt; text-indent: -31.5pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Struts 1
</span><span style="font-family: 宋体;">标签很糟糕；</span>form<span style="font-family: 宋体;">对象很别扭，繁琐的配置；</span></p>
<p style="margin-left: 31.5pt; text-indent: -31.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Struts2 <span style="font-family: 宋体;">没有用过，如果他还有</span>form<span style="font-family: 宋体;">我就不打算用；</span></p>
<p style="margin-left: 31.5pt;"><span style="font-family: 宋体;">学习</span>springside<span style="font-family: 宋体;">（以前）使用</span>Spring <span style="font-family: 宋体;">的</span>MultiActionController<span style="font-family: 宋体;">，减少了很多没有必要的配置；在一个</span>controller<span style="font-family: 宋体;">里面可以写多个</span>Action<span style="font-family: 宋体;">；</span>MultiActionController<span style="font-family: 宋体;">还可以很灵活的从</span>request<span style="font-family: 宋体;">中绑定</span>Domain<span style="font-family: 宋体;">对象，非常的方便；</span></p>
<p style="margin-left: 31.5pt;"><span>MultiActionController
</span><span style="font-family: 宋体;">加</span> Controller<span style="font-family: 宋体;">可以满足全部的需要；</span></p>
<p style="margin-left: 31.5pt;">JSP<span style="font-family: 宋体;">部分使用</span>spring form tag<span style="font-family: 宋体;">；</span></p>
<p>Tiles <span style="font-family: 宋体;">和</span> sitemesh<span style="font-family: 宋体;">；</span> <span style="font-family: 宋体;">考虑到使用</span>Ajax<span style="font-family: 宋体;">，而</span>sitemesh<span style="font-family: 宋体;">是利用</span>filter<span style="font-family: 宋体;">来修饰；选择</span>Tiles<span style="font-family: 宋体;">；</span></p>
<p>ORM<span style="font-family: 宋体;">用</span>ibatis,<span style="font-family: 宋体;">当前最实用，简单的</span>ORM<span style="font-family: 宋体;">；而且可以自动生成，又容易理解；何乐而不为；</span></p>
<p>FullTextSearch<span style="font-family: 宋体;">：</span> compass + lucene<span style="font-family: 宋体;">；</span></p>
<p>Others<span style="font-family: 宋体;">：</span>ActiveMQ + ApacheCXF</p>
<p><span>Form/Ajax Request &gt; Controller &gt;
Manager/Service &gt; GenericDao</span></p>
<p><span style="font-family: 宋体;">其他辅助工具：</span></p>
<p>EMS for mysql<span style="font-family: 宋体;">；</span></p>
<p>SVN as version control<span style="font-family: 宋体;">；</span></p>
<p>DB/web server<span style="font-family: 宋体;">：</span>mysql/resin</p>
<img src ="http://www.blogjava.net/bourn/aggbug/142111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-09-02 19:23 <a href="http://www.blogjava.net/bourn/articles/142111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实际项目中的Ajax</title><link>http://www.blogjava.net/bourn/articles/141683.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Fri, 31 Aug 2007 04:12:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/141683.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/141683.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/141683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/141683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/141683.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;"><br />
</span></p>
<p><span style="font-family: 宋体;">上一个项目使用的是</span><span>spring
MVC</span><span style="font-family: 宋体;">；</span> <span style="font-family: 宋体;">客户需要做</span>Ajax<span style="font-family: 宋体;">应用；所以就找了一些资料研究了一下，比如</span>DWR<span style="font-family: 宋体;">，</span>dojo<span style="font-family: 宋体;">，</span> prototype<span style="font-family: 宋体;">，</span>JSON-RPC, trimpath <span style="font-family: 宋体;">等等，发现很多不适合我们，比如</span>DWR<span style="font-family: 宋体;">要生成客户端</span>js<span style="font-family: 宋体;">，服务器端还要部署，麻烦；</span>dojo<span style="font-family: 宋体;">又太慢了；经过一轮淘汰剩下了</span>prototype<span style="font-family: 宋体;">和</span>trimpath<span style="font-family: 宋体;">；所以最终就选这</span>2<span style="font-family: 宋体;">个了；</span></p>
<p>Prototype<span style="font-family: 宋体;">在书写普通的</span>js<span style="font-family: 宋体;">时候，有很多好处，比如简单，实用的很多函数；比如</span>$()<span style="font-family: 宋体;">系列；</span></p>
<p>Trimpath<span style="font-family: 宋体;">提供一个客户端的</span>js<span style="font-family: 宋体;">模板，如果从服务器回来的数据很复杂，要动态改变</span>Html<span style="font-family: 宋体;">元素是比较费力的事情；用</span>trimpath<span style="font-family: 宋体;">就方便许多；</span></p>
<p><span style="font-family: 宋体;">在模板语言的世界里，总有</span>2<span style="font-family: 宋体;">个东西：模板和模板中的数据；</span>trimpath<span style="font-family: 宋体;">的模板接受的数据是</span>javascript object<span style="font-family: 宋体;">，模板则定义在一个不显示的</span>textarea<span style="font-family: 宋体;">里面；</span></p>
<p><span style="font-family: 宋体;">所以有个问题就是：怎么让</span>ajax<span style="font-family: 宋体;">调用返回一个</span>javascript<span style="font-family: 宋体;">对象？</span></p>
<p><span style="font-family: 宋体;">后来，我终于发现了（想起了刘若英）</span>JSON<span style="font-family: 宋体;">；发现</span>json<span style="font-family: 宋体;">是个好东东；比</span>xml<span style="font-family: 宋体;">轻量级，又可以很容易的转换为</span>javascript<span style="font-family: 宋体;">对象，而且还有</span>java api<span style="font-family: 宋体;">；唉，开源的世界多美妙；</span></p>
<p><span style="font-family: 宋体;">所以解决方案就是，在</span>springmvc<span style="font-family: 宋体;">框架中，用</span>response<span style="font-family: 宋体;">返回</span>json string<span style="font-family: 宋体;">，给</span>ajax <span style="font-family: 宋体;">客户端，然后生成</span>javascript<span style="font-family: 宋体;">对象，然后，调用</span>trimpath<span style="font-family: 宋体;">模板，然后，动态修改页面。</span></p>
<p><span style="font-family: 宋体;">代码片段：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>public ModelAndView getClient(HttpServletRequest request,
HttpServletResponse response) throws Exception {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>JSONObject jsonObject = new JSONObject();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Client
client=clientMgr.getClientByPk(Long.parseLong(request.getParameter("clientId")));</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>jsonObject.add("client", client);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>return ajaxResponse(jsonObject, response);</span></p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>protected ModelAndView ajaxResponse(JSONObject jsonObject,
HttpServletResponse response) throws Exception {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>response.setContentType("application/x-json;charset=UTF-8");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>response.getWriter().print(jsonObject);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>return null;</span></p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<img src ="http://www.blogjava.net/bourn/aggbug/141683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-08-31 12:12 <a href="http://www.blogjava.net/bourn/articles/141683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Code Engine基本技术demo</title><link>http://www.blogjava.net/bourn/articles/141672.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Fri, 31 Aug 2007 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/141672.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/141672.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/141672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/141672.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/141672.html</trackback:ping><description><![CDATA[<p>Code Engine <span style="font-family: 宋体;">主要用来生成</span>web<span style="font-family: 宋体;">相关的代码，可以把</span>orm<span style="font-family: 宋体;">的部分集成进来，形成一条完整的生产线；</span></p>
<p><span style="font-family: 宋体;">利用</span>xpath<span style="font-family: 宋体;">，</span>freemarker<span style="font-family: 宋体;">等技术，使得用户通过</span>xml<span style="font-family: 宋体;">配置文件，模板等简单的方式，快速开发代码和根据需求调整模板；</span></p>
<p>Dom4j<span style="font-family: 宋体;">对实现了</span>xpath 1.0<span style="font-family: 宋体;">，</span> <span style="font-family: 宋体;">非常的好用；</span></p>
<p><span style="font-family: 宋体;">所需</span>jar <span style="font-family: 宋体;">：</span>dom4j-1.6.1.jar<span style="font-family: 宋体;">，</span> jaxen-1.1-beta-7.jar</p>
<p>Code<span style="font-family: 宋体;">：</span></p>
<p>import junit.framework.TestCase;</p>
<p>import org.dom4j.*;</p>
<p>import org.dom4j.io.SAXReader;</p>
<p>import java.util.List;</p>
<p>import java.util.Iterator;</p>
<p>import java.io.File;</p>
<p>/**</p>
<p><span>&nbsp;*
Created by IntelliJ IDEA.</span></p>
<p><span>&nbsp;*
User: duanbin</span></p>
<p><span>&nbsp;*
Date: 2007-8-15</span></p>
<p><span>&nbsp;*
Time: 9:47:17</span></p>
<p><span>&nbsp;* To
change this template use File | Settings | File Templates.</span></p>
<p>&nbsp;*/</p>
<p>public class XPathTest extends TestCase {</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>public void testXPathViaDom4jXpathV1() {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>printSelectedNodeValue("D:""xpath""src""test.xml");</span></p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>/**</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>* </span><span style="font-family: 宋体;">利用</span>XPath<span style="font-family: 宋体;">操作</span>XML<span style="font-family: 宋体;">文件，打印指定节点或者属性的值</span>, using xpath 1.0</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>*</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>* @param filename String </span><span style="font-family: 宋体;">待操作的</span>XML<span style="font-family: 宋体;">文件（相对路径或者绝对路径）</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>*/</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>public void printSelectedNodeValue(String filename) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>try {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>SAXReader saxReader = new SAXReader();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Document document = saxReader.read(new File(filename));</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>List list;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>list =
document.selectNodes("//qn1:college/@leader[.!='leader1']");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>for (Object aList : list) {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Attribute attribute =
(Attribute) aList;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("//qn1:college/@leader:&nbsp;" + attribute.getValue());</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>}</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>//</span><span style="font-family: 宋体;">打印所有</span>student<span style="font-family: 宋体;">节点的属性</span>age<span style="font-family: 宋体;">值，如果有的话</span></p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list =
document.selectNodes("/students/student/@age");</span></p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Object aList : list) {</p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Attribute attribute =
(Attribute) aList;</span></p>
<p><span>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>System.out.println("/students/student/@age</span><span style="font-family: 宋体;">：</span>" + attribute.getValue());</p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>//</span><span style="font-family: 宋体;">打印所有</span>college<span style="font-family: 宋体;">节点值，如果有的话</span></p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list =
document.selectNodes("/students/student");</span></p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Object aList1 : list) {</p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element bookElement = (Element)
aList1;</span></p>
<p><span>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator iterator =
bookElement.elementIterator("college");</span></p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (iterator.hasNext()) {</p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element titleElement =
(Element) iterator.next();</span></p>
<p><span>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>System.out.println("/students/student/college</span><span style="font-family: 宋体;">：</span>" + titleElement.getText());</p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>//</span><span style="font-family: 宋体;">测试节点的一些方法</span></p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list =
document.selectNodes("//city");</span></p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Object aList2 : list) {</p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element titleElement =
(Element) aList2;</span></p>
<p><span>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("//telephone</span><span style="font-family: 宋体;">：</span><span>getName:" +
titleElement.getName());</span></p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;##getNodeType:" +
titleElement.getNodeType());</span></p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;##getTextTrim:" +
titleElement.getTextTrim());</span></p>
<p><span>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("&nbsp;##getNamespaceURI:" +
titleElement.getNamespaceURI());</span></p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;##getNodeTypeName:" +
titleElement.getNodeTypeName());</span></p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;##getQualifiedName:" +
titleElement.getQualifiedName());</span></p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;##getUniquePath:" +
titleElement.getUniquePath());</span></p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("&nbsp;##getPath:" + titleElement.getPath());</p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>//</span><span style="font-family: 宋体;">打印所有</span>name<span style="font-family: 宋体;">节点值，如果有的话，与上面</span>college<span style="font-family: 宋体;">的取法不一样</span></p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list =
document.selectNodes("/students/student/name");</span></p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator iter = list.iterator();</p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Object aList3 : list) {</p>
<p>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element titleElement = (Element)
aList3;</span></p>
<p><span>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>System.out.println("/students/student/name</span><span style="font-family: 宋体;">：</span>" + titleElement.getText());</p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>} catch (Exception ex) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>ex.printStackTrace();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>}</span></p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>Test.xml:</p>
<p><span>&lt;?xml version="1.0"
encoding="UTF-8"?&gt;</span></p>
<p><span>&lt;students
xmlns:qn1="http://qn1.com"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;student age="259911911911"&gt;&lt;!--</span><span style="font-family: 宋体;">如果没有</span>age<span style="font-family: 宋体;">属性，默认的为</span>20--&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;qn1:name&gt;</span><span style="font-family: 宋体;">崔卫兵</span>&lt;/qn1:name&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;college&gt;PC</span><span style="font-family: 宋体;">学院</span>&lt;/college&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;telephone&gt;62354666&lt;/telephone&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;notes&gt;</span><span style="font-family: 宋体;">男</span>,1982<span style="font-family: 宋体;">年生</span>,<span style="font-family: 宋体;">硕士，现就读于北京邮电大学</span>&lt;/notes&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;addr&gt;&lt;city&gt;Beijing&lt;/city&gt;&lt;/addr&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;/student&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;student&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;name&gt;cwb&lt;/name&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;qn1:college leader="</span><span style="font-family: 宋体;">学院领导</span>"&gt;PC<span style="font-family: 宋体;">学院</span>&lt;/qn1:college&gt;&lt;!--<span style="font-family: 宋体;">如果没有</span>leader<span style="font-family: 宋体;">属性，默认的为</span>leader--&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;telephone&gt;62358888&lt;/telephone&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;notes&gt;</span><span style="font-family: 宋体;">男</span>,1987<span style="font-family: 宋体;">年生</span>,<span style="font-family: 宋体;">硕士，现就读于中国农业大学</span>&lt;/notes&gt;</p>
<p>&nbsp;&nbsp; &nbsp;&lt;/student&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;student&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;name&gt;xxxxx&lt;/name&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;college leader=""&gt;xxx</span><span style="font-family: 宋体;">学院</span>&lt;/college&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;telephone&gt;66666666&lt;/telephone&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;notes&gt;</span><span style="font-family: 宋体;">注视中，注释中</span>&lt;/notes&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;/student&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;student age="9911911911"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;name&gt;yyyyyy&lt;/name&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;qn1:college leader="leader1"&gt;yyyy</span><span style="font-family: 宋体;">学院</span>&lt;/qn1:college&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;telephone&gt;88888888&lt;/telephone&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;notes&gt;</span><span style="font-family: 宋体;">注视中</span>111<span style="font-family: 宋体;">，注释中</span>222&lt;/notes&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;/student&gt;</span></p>
<p>&lt;/students&gt;</p>
<p>Freemarker<span style="font-family: 宋体;">基本示例：</span></p>
<p>import freemarker.template.Configuration;</p>
<p><span>import
freemarker.template.DefaultObjectWrapper;</span></p>
<p>import freemarker.template.Template;</p>
<p>import java.io.File;</p>
<p>import java.io.Writer;</p>
<p>import java.io.OutputStreamWriter;</p>
<p>import java.io.FileOutputStream;</p>
<p>import java.util.Map;</p>
<p>import java.util.HashMap;</p>
<p>import org.apache.log4j.Logger;</p>
<p>/**</p>
<p><span>&nbsp;*
Created by IntelliJ IDEA.</span></p>
<p><span>&nbsp;*
User: duanbin</span></p>
<p><span>&nbsp;*
Date: 2007-8-21</span></p>
<p><span>&nbsp;*
Time: 22:30:13</span></p>
<p><span>&nbsp;* To
change this template use File | Settings | File Templates.</span></p>
<p>&nbsp;*/</p>
<p>public abstract class BaseGenerator {</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>protected Configuration cfg;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>protected final Logger logger = Logger.getLogger(this.getClass());</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>public BaseGenerator() {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>try {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>cfg = getConfiguration(CodeEngineConfig.getTemplateDir());</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>} catch (Exception e) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>e.printStackTrace();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>}</span></p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>public abstract void generate();</span></p>
<p><span>&nbsp;&nbsp;&nbsp; protected
void generateFile(String template, Map root, String fileName){</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>try {</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File dist = new File(fileName);</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream fos = new
FileOutputStream(dist);</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Writer out = new
OutputStreamWriter(fos);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Writer out2 = new
OutputStreamWriter(System.out);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>cfg.getTemplate(template).process(root, out);</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.flush();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.info("Generated
File: "&nbsp;+ fileName);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>} catch (Exception e) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>e.printStackTrace();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>}</span></p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>protected Configuration getConfiguration(String tempDir) throws
Exception {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Configuration cfg = new Configuration();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>// Specify the data source where the template files come from.</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>// Here I set a file directory for it:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>cfg.setDirectoryForTemplateLoading(</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new File(tempDir));</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>// Specify how templates will see the data model. This is an advanced
topic...</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>// but just use this:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>cfg.setObjectWrapper(new DefaultObjectWrapper());</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>return cfg;</span></p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p><span style="font-family: 宋体;">模板文件示例：</span></p>
<p>package ${package}.application.web;</p>
<p><span>import
biz.web.framework.web.BaseController;</span></p>
<p>&lt;#list managers! as mgr&gt;</p>
<p>import ${package}.application.manager.${mgr};</p>
<p>&lt;/#list&gt;</p>
<p>&lt;#list services! as svc&gt;</p>
<p><span>import
${package}.application.service.${svc};</span></p>
<p>&lt;/#list&gt;</p>
<p>/**</p>
<p><span>&nbsp;*
Created by IntelliJ IDEA.</span></p>
<p><span>&nbsp;*
User: ${author!'admin'}&nbsp;"${r"${build.dir}"}&nbsp;"${'$'}{cfg.startDate}</span></p>
<p><span>&nbsp;*
Date: Sep 1, 2006</span></p>
<p><span>&nbsp;*
Time: 9:19:17 AM</span></p>
<p><span>&nbsp;* To
change this template use File | Settings | File Templates.</span></p>
<p>&nbsp;*/</p>
<p><span>public class ${name}Controller extends
BaseController {</span></p>
<p>&lt;#list managers! as mgr&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>protected ${mgr} ${mgr?uncap_first};</span></p>
<p>&lt;/#list&gt;</p>
<p>&lt;#list services! as svc&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>protected ${svc} ${svc?uncap_first};</span></p>
<p>&lt;/#list&gt;</p>
<p>&lt;#list managers! as mgr&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>public void set${mgr}(${mgr} ${mgr?uncap_first}) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>this.${mgr?uncap_first} = ${mgr?uncap_first};</span></p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&lt;/#list&gt;</p>
<p>&lt;#list services! as svc&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>public void set${svc}(${svc} ${svc?uncap_first}) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>this.${svc?uncap_first} = ${svc?uncap_first};</span></p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&lt;/#list&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>public ModelAndView list${name}(HttpServletRequest request,
HttpServletResponse response) throws Exception {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>ModelAndView mav = new
ModelAndView("update_${name?uncap_first}");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Long user = getUserId();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>mav.addObject("userId", user);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>return mav;</span></p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>} </p>
<img src ="http://www.blogjava.net/bourn/aggbug/141672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-08-31 11:38 <a href="http://www.blogjava.net/bourn/articles/141672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于使用Tomcat Manager来deploy一个应用</title><link>http://www.blogjava.net/bourn/articles/141548.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Thu, 30 Aug 2007 15:06:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/141548.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/141548.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/141548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/141548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/141548.html</trackback:ping><description><![CDATA[<p><br></p>
<p>初始的tomcat 5.0.28是无法使用manager <br>
app的，因为没有权限，找到/conf/tomcat-users.xml; <br>
打开后编辑如下两句，保存并启动tomcat， <br>
请求<a href="http://localhost:8080/" target="_blank">http://localhost:8080</a>,
<br>
使用用户名和密码都是tomcat登录即可； </p>
<p>加入：&lt;role rolename="manager"/&gt; <br>
修改：&lt;user username="tomcat"
password="tomcat" roles="tomcat"/&gt; 为 <br>
&nbsp; &nbsp; &nbsp; &lt;user username="tomcat"
password="tomcat" <br>
roles="tomcat,manager"/&gt; </p>
<br> <img src ="http://www.blogjava.net/bourn/aggbug/141548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-08-30 23:06 <a href="http://www.blogjava.net/bourn/articles/141548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中文问题</title><link>http://www.blogjava.net/bourn/articles/141546.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Thu, 30 Aug 2007 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/141546.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/141546.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/141546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/141546.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/141546.html</trackback:ping><description><![CDATA[<p>
</p>
<p>之前一直以为我们搞定了中文，所以一直没有怀疑我们的配置，今天和立国发现一个问题： <br>
就是用ajax的方式去创建一个记录，然后用jsp的方式去取数据，出现乱码； <br>
但是用ajax的方式取此记录，正常； <br>
后来发现，我们提交数据的方式，不管是ajax的，还是form表单提交，所使用的编码通通没有指定！！，虽然我们在页面上加上了&lt;%@
<br>
page contentType="text/html;charset=UTF-8" language="java" <br>
%&gt;，但这一句主要是负责response的数据显示； <br>
查了资料后才发现需要加上：&lt;%@
page &nbsp;pageEncoding="utf-8" <br>
%&gt;； <br>
而之前我们都没有指定request的charset，所以按照servlet标准，大多数web <br>
server（Resin，Tomcat）默认按照iso-8859-1来处理，而我们的数据库是utf-8的，所以放到数据库中的数据并不是utf-8的；所以用jsp显示时候出错；但用ajax的方式为什么没出错，还没有搞明白； <br>
解决方案： <br>
1.ajax方式 <br>
#1：prototype.js
[line707]contentType: <br>
'application/x-www-form-urlencoded;charset=UTF-8', <br>
#2：BaseController
[line135] response.setCharacterEncoding("UTF-8"); <br>
以上两行保证了ajax请求和相应的方式一致，并都是utf8； <br>
2.form表单方式； <br>
#3：在jsp加上：&lt;%@ page
&nbsp;pageEncoding="utf-8" %&gt;； <br>
#4：和&lt;%@ page
contentType="text/html;charset=utf-8" language="java" <br>
%&gt; <br>
3.我在web。xml中加了一个encodefilter，保证了当请求中没有指定charset的时候，使用utf-8方式，所以以上#1和#3处的指定charset是可选的！! <br>
请大家注意更新以上3个文件；prototype.js,BaseController <br>
.java, web.xml</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>同意以上所述，更新3个文件：prototype.js, <br>
BaseController.java, web.xml ，顶。</p>
<br> <img src ="http://www.blogjava.net/bourn/aggbug/141546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-08-30 23:04 <a href="http://www.blogjava.net/bourn/articles/141546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Resin下debug的问题</title><link>http://www.blogjava.net/bourn/articles/141545.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Thu, 30 Aug 2007 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/141545.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/141545.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/141545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/141545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/141545.html</trackback:ping><description><![CDATA[<p>关于在Resin下debug的问题，也很简单，首先将为httpd.exe建立一个快捷方式，然后右键属性，在D:\resin-pro-3.0.18\httpd.exe <br>
后面添加 -Xdebug
-Xnoagent -Djava.compiler=NONE <br>
-Xrunjdwp:transport=dt_socket,address=1183,suspend=n,server=y <br>
语句，启动resin后，就可发现第一行就会有提示的；</p>
<p>我发现直接按照以上的配置resin还有问题，就是无法加载applicationContext_manager.xml;
<br>
我费了很大劲才搞明白，是resin用自己的xmlparser所以不识别spring2.0的xml <br>
schema 配置；已经找到解决办法： <br>
1.将&lt;web-app id="/wiczone"
document-directory="你自己的wiczone war </p>
<p>目录G:/IdeaProjects/wiczone/trunk/wiczone/war"/&gt; 改为： <br>
&lt;web-app id="/wiczone" <br>
document-directory="D:/wiczone/trunk/wiczone/war"&gt; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &lt;!-- xml --&gt; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &lt;system-property
javax.xml.parsers.DocumentBuilderFactory= <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;"org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"/&gt; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&lt;system-property javax.xml.parsers.SAXParserFactory= <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;"org.apache.xerces.jaxp.SAXParserFactoryImpl"/&gt; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;!-- &nbsp;xslt --&gt; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &lt;system-property
javax.xml.transform.TransformerFactory= <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;"org.apache.xalan.processor.TransformerFactoryImpl"/&gt; <br>
&nbsp; &nbsp; &nbsp; &lt;/web-app&gt;; <br>
2.得最新web-inf\lib下的jar包；多加了一个xml解析器； <br>
另外，\trunk\web <br>
server\resin下面有resin服务器，和resin配置文件； </p>
<br> <img src ="http://www.blogjava.net/bourn/aggbug/141545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-08-30 23:02 <a href="http://www.blogjava.net/bourn/articles/141545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 2.0 AOP 配置</title><link>http://www.blogjava.net/bourn/articles/141543.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Thu, 30 Aug 2007 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/141543.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/141543.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/141543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/141543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/141543.html</trackback:ping><description><![CDATA[<span style="font-size: 8pt;">
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">springside</span><span style="font-size: 12pt; font-family: 宋体;">的文档中有<span lang="EN-US">aop</span>的配置；<span lang="EN-US"><a href="http://wiki.springside.org.cn/display/springside/Spring+Aop" target="_blank">http://wiki.springside.org.cn/display/springside/Spring+Aop</a>
<br>
</span>里面有关于<span lang="EN-US">pointcut </span>表达式语言的表述；<span lang="EN-US"> <o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">里面也有官方文档中文版的链接：<span lang="EN-US"><a href="http://www.redsaga.com/spring_ref/2.0/html/aop.html" target="_blank">http://www.redsaga.com/spring_ref/2.0/html/aop.html</a> <br>
</span>我们用<span lang="EN-US">scheme-based aop </span>配置方式：<span lang="EN-US"> <br>
&nbsp;&lt;aop:config&gt; ...... &nbsp; &nbsp;&lt;/aop:config&gt; <o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">Advisor</span><span style="font-size: 12pt; font-family: 宋体;">方式：<span lang="EN-US"> <br>
</span>假设我们有一个<span lang="EN-US">MethodBeforeAdvice </span>叫<span lang="EN-US">TestAdvice
<br>
</span>；用于打印将要执行的方面名；<span lang="EN-US"> <br>
public class TestAdvice implements MethodBeforeAdvice { <o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; public void before(Method method, Object[] objects, Object
object) <br>
throws Throwable { <br>
&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("method.getName() = "
+ method.getName()); <br>
&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("TestAdvice
testing..." ); <br>
&nbsp; &nbsp; } <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-bottom: 12pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">} <o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">配置如下：<span lang="EN-US"> <br>
&nbsp;&lt;bean id="testAdvice" <br>
class="biz.pxzit.application.service.TestAdvice"/&gt; <br>
&nbsp;&lt;aop:config&gt; <br>
&nbsp; &nbsp; &nbsp; &lt;aop:advisor pointcut="execution(*
biz..*Mgr.save*(..))" <br>
advice-ref="testAdvice" order="1"/&gt; <o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; &nbsp; ...... <br>
&nbsp; &nbsp;&lt;/aop:config&gt; <o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">order</span><span style="font-size: 12pt; font-family: 宋体;">是可选的，指定执行的次序；上面的配置语意是，在执行<span lang="EN-US">biz</span>开头的<span lang="EN-US">package</span>下面任意以<span lang="EN-US">Mgr</span>结尾的<span lang="EN-US">manager</span>的<span lang="EN-US">save</span>开头的方法时候，执行<span lang="EN-US">testAdvice</span>，因为是<span lang="EN-US">MethodBeforeAdvice <br>
</span>所以在<span lang="EN-US">save</span>开头方法执行前执行；<span lang="EN-US"> <o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">Aspect</span><span style="font-size: 12pt; font-family: 宋体;">方式：<span lang="EN-US"> <br>
public class TestAdvice2 &nbsp;{ <o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; public void goAfter(JoinPoint joinPoint) throws Throwable { <br>
&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("TestAdvice2.goAfter <br>
testing..."+joinPoint.getTarget()); <br>
&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("TestAdvice2.goAfter
testing..." ); <br>
&nbsp; &nbsp; } <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-bottom: 12pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">} <o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">配置如下：<span lang="EN-US"> <o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&lt;bean id="testAdvice2" <br>
class="biz.pxzit.application.service.TestAdvice2"/&gt; <br>
&nbsp;&lt;aop:config&gt; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;...... <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;aop:aspect
id="ddAspect" ref="testAdvice2"&gt; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;aop:after
method="goAfter" <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; pointcut="execution(* biz..*Mgr.*(..))" <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /&gt; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ....... <br>
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/aop:aspect&gt; <o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&lt;/aop:config&gt; <br>
</span><span style="font-size: 12pt; font-family: 宋体;">注意<span lang="EN-US">TestAdvice2</span>的方法参数，这里用的是<span lang="EN-US">JoinPoint <br>
joinPoint</span>，还有很多细节，具体可以看文档；<span lang="EN-US"> <br>
</span>要使用<span lang="EN-US">&lt;aop:aspect &gt;</span>节点，还需<span lang="EN-US">asm.jar
<br>
</span>（<span lang="EN-US">3</span>个，在<span lang="EN-US">springframework</span>的<span lang="EN-US">lib</span>下有）否则会报<span lang="EN-US">noclassfound <br>
exception</span>；<span lang="EN-US"> <o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">注意我之前配置的<span lang="EN-US">pointcut</span>表达式是错的，正确的是<span lang="EN-US">execution(* <br>
biz..*Mgr.*(..))"</span>；<span lang="EN-US"> <o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
</span> <img src ="http://www.blogjava.net/bourn/aggbug/141543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-08-30 22:57 <a href="http://www.blogjava.net/bourn/articles/141543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>