﻿<?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-一叶笑天</title><link>http://www.blogjava.net/zjrstar/</link><description> 雄关漫道真如铁,
 而今迈步从头越。
 从头越,
 苍山如海,
 残阳如血。 </description><language>zh-cn</language><lastBuildDate>Tue, 12 May 2026 22:29:20 GMT</lastBuildDate><pubDate>Tue, 12 May 2026 22:29:20 GMT</pubDate><ttl>60</ttl><item><title>Oracle BIEE 11G Installation</title><link>http://www.blogjava.net/zjrstar/archive/2011/08/13/356457.html</link><dc:creator>一叶笑天</dc:creator><author>一叶笑天</author><pubDate>Sat, 13 Aug 2011 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/zjrstar/archive/2011/08/13/356457.html</guid><wfw:comment>http://www.blogjava.net/zjrstar/comments/356457.html</wfw:comment><comments>http://www.blogjava.net/zjrstar/archive/2011/08/13/356457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zjrstar/comments/commentRss/356457.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zjrstar/services/trackbacks/356457.html</trackback:ping><description><![CDATA[<br />./Middleware_BI.5/instances/instance1/bin/opmnctl startproc ias-component=coreapplication_obips1<br /><br />./Middleware_BI.5/instances/instance1/bin/opmnctl status<img src ="http://www.blogjava.net/zjrstar/aggbug/356457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zjrstar/" target="_blank">一叶笑天</a> 2011-08-13 15:04 <a href="http://www.blogjava.net/zjrstar/archive/2011/08/13/356457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>雪</title><link>http://www.blogjava.net/zjrstar/archive/2010/03/17/315677.html</link><dc:creator>一叶笑天</dc:creator><author>一叶笑天</author><pubDate>Wed, 17 Mar 2010 07:15:00 GMT</pubDate><guid>http://www.blogjava.net/zjrstar/archive/2010/03/17/315677.html</guid><wfw:comment>http://www.blogjava.net/zjrstar/comments/315677.html</wfw:comment><comments>http://www.blogjava.net/zjrstar/archive/2010/03/17/315677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zjrstar/comments/commentRss/315677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zjrstar/services/trackbacks/315677.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 窗推雪花开，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;枝绕万朵立。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不把春来报，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 花落满人间。 
<img src ="http://www.blogjava.net/zjrstar/aggbug/315677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zjrstar/" target="_blank">一叶笑天</a> 2010-03-17 15:15 <a href="http://www.blogjava.net/zjrstar/archive/2010/03/17/315677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无题</title><link>http://www.blogjava.net/zjrstar/archive/2009/05/22/277286.html</link><dc:creator>一叶笑天</dc:creator><author>一叶笑天</author><pubDate>Fri, 22 May 2009 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/zjrstar/archive/2009/05/22/277286.html</guid><wfw:comment>http://www.blogjava.net/zjrstar/comments/277286.html</wfw:comment><comments>http://www.blogjava.net/zjrstar/archive/2009/05/22/277286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zjrstar/comments/commentRss/277286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zjrstar/services/trackbacks/277286.html</trackback:ping><description><![CDATA[朝发城铁站，<br />
晨入明光村。<br />
暮经大钟寺，<br />
夜归西二旗。 
<img src ="http://www.blogjava.net/zjrstar/aggbug/277286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zjrstar/" target="_blank">一叶笑天</a> 2009-05-22 13:22 <a href="http://www.blogjava.net/zjrstar/archive/2009/05/22/277286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>树的遍历（转贴）</title><link>http://www.blogjava.net/zjrstar/archive/2009/04/19/266438.html</link><dc:creator>一叶笑天</dc:creator><author>一叶笑天</author><pubDate>Sun, 19 Apr 2009 09:58:00 GMT</pubDate><guid>http://www.blogjava.net/zjrstar/archive/2009/04/19/266438.html</guid><wfw:comment>http://www.blogjava.net/zjrstar/comments/266438.html</wfw:comment><comments>http://www.blogjava.net/zjrstar/archive/2009/04/19/266438.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zjrstar/comments/commentRss/266438.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zjrstar/services/trackbacks/266438.html</trackback:ping><description><![CDATA[<p>之前的工作都没有接触到树，也就很少研究它。幸运地的是，在目前的工作中多次遇到树型结构的数据，那么访问树节点中的数据就是必然的了，而且还需要按照指定规则对节点中的数据进行额外处理。经过学习之后，对与树相关的基本算法有了一些认知，就计划写几篇小文。其实这样的文章早已是汗牛充栋，而我只是把它当作我的学习总结罢了，以加深记忆与理解，如能对其他朋友有所助益，则更感愉悦了 :-) (2009.04.03最后更新)<br>这次先从最基础的开始--树的遍历。本文使用了两种极常用的方法来遍历树中的所有节点--递归；迭代，但它们实现的都是深度优先(Depth-First)算法。<br><strong>1. 树节点与数据</strong><br>先定义树节点及数据(用户对象)，并创建测试用的数据。<br>TreeNode是树节点的定义。 <p>/**<br> * 树节点的定义。<br>*/<br>public interface TreeNode {<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 获取指定下标处的子节点。<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param index<br>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下标。<br>&nbsp;&nbsp;&nbsp;&nbsp; * @return 子节点。<br>*/<br>public TreeNode getChildAt(int index);<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 返回指定子节点的下标。<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param index<br>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下标。<br>&nbsp;&nbsp;&nbsp;&nbsp; * @return 子节点。<br>*/<br>public int getChildIndex(TreeNode index);<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 获取子节点的数量。<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @return 子节点的数量。<br>*/<br>public int getChildCount();<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 返回父节点。<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @return 父节点。<br>*/<br>public TreeNode getParent();<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 设置父节点。注：此处不需要改变父节点中的子节点元素。<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param parent<br>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 父节点。<br>*/<br>public void setParent(TreeNode parent);<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 获取所有的子节点。<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @return 子节点的集合。<br>*/<br>public List&lt;?&gt; getChildren();<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 是否为叶节点。<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @return 是叶节点，返回true；否则，返回false。<br>*/<br>public boolean isLeaf();<br>} <p>GenericTreeNode是一个通用的树节点实现。 <p>public class GenericTreeNode&lt;T&gt; implements TreeNode {<br>private T userObject = null;<br>private TreeNode parent = null;<br>private List&lt;GenericTreeNode&lt;T&gt;&gt; children = new ArrayList&lt;GenericTreeNode&lt;T&gt;&gt;();<br>public GenericTreeNode(T userObject) {<br>this.userObject = userObject;<br>&nbsp;&nbsp;&nbsp; }<br>public GenericTreeNode() {<br>this(null);<br>&nbsp;&nbsp;&nbsp; }<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 添加子节点。<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param child<br>*/<br>public void addChild(GenericTreeNode&lt;T&gt; child) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; children.add(child);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child.setParent(this);<br>&nbsp;&nbsp;&nbsp; }<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 删除指定的子节点。<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param child<br>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子节点。<br>*/<br>public void removeChild(TreeNode child) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removeChildAt(getChildIndex(child));<br>&nbsp;&nbsp;&nbsp; }<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 删除指定下标处的子节点。<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param index<br>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下标。<br>*/<br>public void removeChildAt(int index) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TreeNode child = getChildAt(index);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; children.remove(index);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child.setParent(null);<br>&nbsp;&nbsp;&nbsp; }<br>public TreeNode getChildAt(int index) {<br>return children.get(index);<br>&nbsp;&nbsp;&nbsp; }<br>public int getChildCount() {<br>return children.size();<br>&nbsp;&nbsp;&nbsp; }<br>public int getChildIndex(TreeNode child) {<br>return children.indexOf(child);<br>&nbsp;&nbsp;&nbsp; }<br>public List&lt;GenericTreeNode&lt;T&gt;&gt; getChildren() {<br>return Collections.unmodifiableList(children);<br>&nbsp;&nbsp;&nbsp; }<br>public void setParent(TreeNode parent) {<br>this.parent = parent;<br>&nbsp;&nbsp;&nbsp; }<br>public TreeNode getParent() {<br>return parent;<br>&nbsp;&nbsp;&nbsp; }<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 是否为根节点。<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @return 是根节点，返回true；否则，返回false。<br>*/<br>public boolean isRoot() {<br>return getParent() == null;<br>&nbsp;&nbsp;&nbsp; }<br>public boolean isLeaf() {<br>return getChildCount() == 0;<br>&nbsp;&nbsp;&nbsp; }<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 判断指定的节点是否为当前节点的子节点。<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param node<br>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 节点。<br>&nbsp;&nbsp;&nbsp;&nbsp; * @return 是当前节点的子节点，返回true；否则，返回false。<br>*/<br>public boolean isChild(TreeNode node) {<br>boolean result;<br>if (node == null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br>if (getChildCount() == 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = (node.getParent() == this);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>return result;<br>&nbsp;&nbsp;&nbsp; }<br>public T getUserObject() {<br>return userObject;<br>&nbsp;&nbsp;&nbsp; }<br>public void setUserObject(T userObject) {<br>this.userObject = userObject;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; @Override<br>public String toString() {<br>return userObject == null ? "" : userObject.toString();<br>&nbsp;&nbsp;&nbsp; }<br>} <p>UserObject是节点上的用户对象，相当于是数据。 <p>public class UserObject {<br>private String name = null;<br>private Integer value = Integer.valueOf(0);<br>public UserObject() {<br>&nbsp;&nbsp;&nbsp; }<br>public UserObject(String code, Integer value) {<br>this.name = code;<br>this.value = value;<br>&nbsp;&nbsp;&nbsp; }<br>public String getName() {<br>return name;<br>&nbsp;&nbsp;&nbsp; }<br>public void setName(String code) {<br>this.name = code;<br>&nbsp;&nbsp;&nbsp; }<br>public Integer getValue() {<br>return value;<br>&nbsp;&nbsp;&nbsp; }<br>public void setValue(Integer value) {<br>this.value = value;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; @Override<br>public String toString() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuilder result = new StringBuilder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append("[name=").append(name).append(", value=").append(value).append("]");<br>return result.toString();<br>&nbsp;&nbsp;&nbsp; }<br>} <p>TreeUtils是用于创建树的工具类。 <p>public class TreeUtils {<br>public static GenericTreeNode&lt;UserObject&gt; buildTree() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericTreeNode&lt;UserObject&gt; root = new GenericTreeNode&lt;UserObject&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root.setUserObject(new UserObject("ROOT", Integer.valueOf(0)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericTreeNode&lt;UserObject&gt; node1 = new GenericTreeNode&lt;UserObject&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node1.setUserObject(new UserObject("1", Integer.valueOf(0)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericTreeNode&lt;UserObject&gt; node2 = new GenericTreeNode&lt;UserObject&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node2.setUserObject(new UserObject("2", Integer.valueOf(0)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericTreeNode&lt;UserObject&gt; node3 = new GenericTreeNode&lt;UserObject&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node3.setUserObject(new UserObject("3", Integer.valueOf(5)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root.addChild(node1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root.addChild(node2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root.addChild(node3);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericTreeNode&lt;UserObject&gt; node11 = new GenericTreeNode&lt;UserObject&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node11.setUserObject(new UserObject("11", Integer.valueOf(0)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericTreeNode&lt;UserObject&gt; node21 = new GenericTreeNode&lt;UserObject&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node21.setUserObject(new UserObject("21", Integer.valueOf(0)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node1.addChild(node11);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node2.addChild(node21);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericTreeNode&lt;UserObject&gt; node111 = new GenericTreeNode&lt;UserObject&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node111.setUserObject(new UserObject("111", Integer.valueOf(3)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericTreeNode&lt;UserObject&gt; node112 = new GenericTreeNode&lt;UserObject&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node112.setUserObject(new UserObject("112", Integer.valueOf(9)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericTreeNode&lt;UserObject&gt; node211 = new GenericTreeNode&lt;UserObject&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node211.setUserObject(new UserObject("211", Integer.valueOf(6)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericTreeNode&lt;UserObject&gt; node212 = new GenericTreeNode&lt;UserObject&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node212.setUserObject(new UserObject("212", Integer.valueOf(3)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node11.addChild(node111);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node11.addChild(node112);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node21.addChild(node211);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node21.addChild(node212);<br>return root;<br>&nbsp;&nbsp;&nbsp; }<br>} <p><strong>2. 递归法</strong><br>使用递归法的最大好处就是--简单，但一般地，我们都认为递归的效率不高。 <p>private static void recursiveTravel(GenericTreeNode&lt;UserObject&gt; node) {<br>&nbsp;&nbsp;&nbsp; travelNode(node); // 访问节点，仅仅只是打印该节点罢了。<br>&nbsp;&nbsp;&nbsp; List&lt;GenericTreeNode&lt;UserObject&gt;&gt; children = node.getChildren();<br>for (int i = 0; i &lt; children.size(); i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recursiveTravel(children.get(i)); // 递归地访问当前节点的所有子节点。<br>&nbsp;&nbsp;&nbsp; }<br>} <p>大家肯定知道，系统在执行递归方法(对于其它方法也是如此)时是使用运行时栈。对方法的每一次调用，在栈中都会创建一份此次调用的活动记录--包括方法的参数，局部变量，返回地址，动态链接库，返回值等。<br>既然系统能够隐式地使用栈去执行递归方法，那么我们就可以显式地使用栈来执行上述递归程序，这也是将递归程序转化为迭代程序的常用思想。下面的iterativeTravel方法就运用了这一思想。<br><strong>3. 迭代法</strong> <p>private static void iterativeTravel(GenericTreeNode&lt;UserObject&gt; node) {<br>&nbsp;&nbsp;&nbsp; Stack&lt;GenericTreeNode&lt;UserObject&gt;&gt; nodes = new Stack&lt;GenericTreeNode&lt;UserObject&gt;&gt;();<br>&nbsp;&nbsp;&nbsp; nodes.push(node); // 将当前节点压入栈中。<br>while (!nodes.isEmpty()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericTreeNode&lt;UserObject&gt; bufNode = nodes.pop(); // 从栈中取出一个节点。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; travelNode(bufNode); // 访问节点。<br>if (!bufNode.isLeaf()) { // 如果该节点为分枝节点，则将它的子节点全部加入栈中。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nodes.addAll(bufNode.getChildren());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>} <p>与递归法相比，迭代法的代码略多了几行，但仍然很简单。<br><strong><br><strong>4. 小结</strong><br></strong>由于上述两种方法均(隐式或显式地)使用了运行栈，所以此处的迭代法并不能提高整个程序的效率。相反地，由于在应用程序中显式地使用栈(java.util.Stack)，iterativeTravel方法的效率可能反而更低。但iterativeTravel的最大好处是，能够有效地避免运行时栈溢出(java.lang.StackOverflowError)。<br>如果树的层次不太深，每层的子节点数不太多，那么使用递归法应该是没有问题的。毕竟，简洁地程序会提供更多的好处。 <p>原文位置：<a title="http://www.blogjava.net/jiangshachina/archive/2009/04/01/263241.html" href="http://www.blogjava.net/jiangshachina/archive/2009/04/01/263241.html">http://www.blogjava.net/jiangshachina/archive/2009/04/01/263241.html</a></p><img src ="http://www.blogjava.net/zjrstar/aggbug/266438.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zjrstar/" target="_blank">一叶笑天</a> 2009-04-19 17:58 <a href="http://www.blogjava.net/zjrstar/archive/2009/04/19/266438.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试Windows live writer</title><link>http://www.blogjava.net/zjrstar/archive/2009/04/17/266141.html</link><dc:creator>一叶笑天</dc:creator><author>一叶笑天</author><pubDate>Fri, 17 Apr 2009 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/zjrstar/archive/2009/04/17/266141.html</guid><wfw:comment>http://www.blogjava.net/zjrstar/comments/266141.html</wfw:comment><comments>http://www.blogjava.net/zjrstar/archive/2009/04/17/266141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zjrstar/comments/commentRss/266141.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zjrstar/services/trackbacks/266141.html</trackback:ping><description><![CDATA[<p>如何利用Windows live writer 写博客</p> <p>1、在菜单中选择Weblog，然后选择Another Weblog Service&amp;。  <p>2、在Weblog Homepage URL中输入你的Blog主页地址。<br>3、输入用户名与密码。<br>4、在Type of&nbsp; weblog that you are using中选择Metaweblog API。<br>5、Remote posting URL for your weblog中输入<a href="http://www.blogjava.net/Blog">http://www.blogjava.net/Blog</a>名/services/metaweblog.aspx。  <p>使用注意：用Windows Live Writer发布之后，Windows Live Writer并不改变当前窗口的状态(也没有明显的提示)，在当前窗口中会将刚发布的随笔处于编辑状态，如果修改并发布，会直接修改刚发布的随笔内容。</p><img src ="http://www.blogjava.net/zjrstar/aggbug/266141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zjrstar/" target="_blank">一叶笑天</a> 2009-04-17 13:53 <a href="http://www.blogjava.net/zjrstar/archive/2009/04/17/266141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>春</title><link>http://www.blogjava.net/zjrstar/archive/2009/04/17/266139.html</link><dc:creator>一叶笑天</dc:creator><author>一叶笑天</author><pubDate>Fri, 17 Apr 2009 05:32:00 GMT</pubDate><guid>http://www.blogjava.net/zjrstar/archive/2009/04/17/266139.html</guid><wfw:comment>http://www.blogjava.net/zjrstar/comments/266139.html</wfw:comment><comments>http://www.blogjava.net/zjrstar/archive/2009/04/17/266139.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zjrstar/comments/commentRss/266139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zjrstar/services/trackbacks/266139.html</trackback:ping><description><![CDATA[今日雅兴，写了几句。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 春<br />
四月春风梳新柳,<br />
去年旧袄换绿衫。<br />
江中小鸭拨涟漪，<br />
细雨无惊忘归途。<br />
<br />
<br />
<img src ="http://www.blogjava.net/zjrstar/aggbug/266139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zjrstar/" target="_blank">一叶笑天</a> 2009-04-17 13:32 <a href="http://www.blogjava.net/zjrstar/archive/2009/04/17/266139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse使用SVN[转]</title><link>http://www.blogjava.net/zjrstar/archive/2009/03/11/259221.html</link><dc:creator>一叶笑天</dc:creator><author>一叶笑天</author><pubDate>Wed, 11 Mar 2009 13:32:00 GMT</pubDate><guid>http://www.blogjava.net/zjrstar/archive/2009/03/11/259221.html</guid><wfw:comment>http://www.blogjava.net/zjrstar/comments/259221.html</wfw:comment><comments>http://www.blogjava.net/zjrstar/archive/2009/03/11/259221.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zjrstar/comments/commentRss/259221.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zjrstar/services/trackbacks/259221.html</trackback:ping><description><![CDATA[<p>由于原文地址不详，我转贴至：http://www.blogjava.net/mose2006/archive/2008/01/05/173070.html<br />
</p>
<p><strong>1.下载所需软件</strong><br />
&nbsp;&nbsp;&nbsp; 1.1SVN服务端(svn-1.4.3-setup.exe)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://subversion.tigris.org/project_packages.html<br />
&nbsp;&nbsp;&nbsp; 1.2把SVN设置成window服务(SVNService.exe)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我没有下载地址,如有需要,留下你的email<br />
&nbsp;&nbsp;&nbsp; 1.3Eclipse的SVN插件(用Eclipse插件下载):<br />
<br />
<strong>2.配置服务端</strong><br />
&nbsp;&nbsp;&nbsp; 2.1安装svn-1.4.3-setup.exe<br />
&nbsp;&nbsp;&nbsp; 2.2开始-&gt;运行-&gt;cmd-&gt;进入SVN服务端的安装目录下面的bin目录<br />
&nbsp;&nbsp;&nbsp; 2.3cmd下运行svnadmin create SVN库的位置(如:D:\SVN_PRJ)<br />
&nbsp;&nbsp;&nbsp; 2.4复制SVNService.exe到SVN服务端安装目录下的bin目录<br />
&nbsp;&nbsp;&nbsp; 2.5cmd下运行SVNService -install -d -r D:\SVN_PRJ(SVN库的位置)<br />
&nbsp;&nbsp;&nbsp; 2.6如果想撤消掉后台服务,则运行SVNService -remove<br />
&nbsp;&nbsp;&nbsp; 2.7进入D:\SVN_PRJ\conf目录下编辑svnserve.conf,内容如下(切记下面几行字前不能有空格)：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [general]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anon-access = read&nbsp;&nbsp;&nbsp; #匿名访问权限,取值为read,write,none<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auth-access = write&nbsp;&nbsp; #认证用户的权限<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password-db = passwd #认证用户数据库,即允许连到SVN的用户(当前目录下的passwd文件中存放的用户及密码)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; realm = TESTING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #在用户认证界面上出现的提示语句<br />
&nbsp;&nbsp;&nbsp; 2.8编辑D:\SVN_PRJ\conf\passwd文件,内容如下<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [users]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test = password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #这时你连接SVN的时候可以使用用户名为test密码为password来连接SVN<br />
&nbsp;&nbsp;&nbsp; 2.9开始-&gt;设置-&gt;控制面板-&gt;管理工具-&gt;服务-&gt;启动SVNService服务<br />
<br />
<strong>3.Eclipse下配置SVN插件</strong><br />
&nbsp;&nbsp;&nbsp; 3.1帮助-&gt;软件更新-&gt;查找并安装-&gt;搜索要安装的新功能部件-&gt;新建远程站点-&gt;输入一个任意的名称-&gt;URL输入<br />
<br />
http://subclipse.tigris.org/update_1.2.x-&gt;确定-&gt;选中你刚才添加的远程站点-&gt;完成-&gt;选中Subclipse-&gt;执行安装操作<br />
&nbsp;&nbsp;&nbsp; 3.2窗口-&gt;打开透视图-&gt;SVN资源库研究-&gt;右键-&gt;新建-&gt;资源库位置-&gt;URL中输入svn://127.0.0.1/-&gt;输入2.7定义的用户名test和密码<br />
<br />
password<br />
<br />
<strong>4.提交工程</strong><br />
&nbsp;&nbsp;&nbsp; 4.1右击工程-&gt;小组-&gt;共享项目-&gt;选择SVN-&gt;选择svn://127.0.0.1(如果没有,则创建一个新的资源库)-&gt;下一步-&gt;完成<br />
<br />
<strong>5.下载工程</strong><br />
&nbsp;&nbsp;&nbsp; 5.1在SVN资源库透视图下,点开svn://127.0.0.1,会显示出现在本机SVN上的所有工程,右击你想下载的工程-&gt;检出为-&gt;下一步-&gt;完成<br />
<br />
<strong>6.基本操作</strong><br />
&nbsp;&nbsp;&nbsp; 6.1同步<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在MyEclipse J2EE透视图下,右击你要同步的工程-&gt;小组-&gt;与资源库同步-&gt;这时会进入同步透视图,会显示出本机与SVN上内容有不同的文件,双击文件名,会显示出两个文件中哪里不同;<br />
&nbsp;&nbsp;&nbsp; 6.2提交<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在同步透视图下有"灰色向右的箭头,表示你本机修改过",右击该文件,可以选择提交操作;<br />
&nbsp;&nbsp;&nbsp; 6.3覆盖/更新<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在同步透视图下有"蓝色向左的箭头,表示你本机修改过",右击该文件,可以选择覆盖/更新操作;<br />
<br />
<strong>7.图标说明</strong><br />
&nbsp;&nbsp;&nbsp; 7.1灰色向右箭头:本地修改过<br />
&nbsp;&nbsp;&nbsp; 7.2蓝色向左箭头:SVN上修改过<br />
&nbsp;&nbsp;&nbsp; 7.3灰色向右且中间有个加号的箭头:本地比SVN上多出的文件<br />
&nbsp;&nbsp;&nbsp; 7.4蓝色向左且中间有个加号的箭头:SVN上比本地多出的文件<br />
&nbsp;&nbsp;&nbsp; 7.5灰色向右且中间有个减号的箭头:本地删除了,而SVN上未删除的文件<br />
&nbsp;&nbsp;&nbsp; 7.6蓝色向左且中间有个减号的箭头:SVN上删除了,而本地未删除的文件<br />
&nbsp;&nbsp;&nbsp; 7.7红色双向箭头:SVN上修改过,本地也修改过的文件<br />
<br />
<strong>8.一些我遇到的出错信息</strong><br />
&nbsp;&nbsp;&nbsp; 8.1在上面讲的3.2步输入URL(svn://127.0.0.1)点下一步出现"svnserve.conf:12: Option expected"错误<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你打开svnserve.conf文件中的第12行,该错误是由于该行的前面有空格引起的,把左边多出的空格删除掉即可;<br />
&nbsp;&nbsp;&nbsp; 8.2在上面讲的3.2步输入URL(svn://127.0.0.1/SVN_PRJ)点下一步出现"svn://127.0.0.1/SVN_PRJ non-existent in revision '7'"错误<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL错了,应该输入svn://127.0.0.1即可<br />
<strong>9.SVN服务端自带的基于命令行的操作语句</strong><br />
&nbsp;&nbsp;&nbsp; 9.1设置SVN服务端安装目录下的/bin到环境变量中;<br />
&nbsp;&nbsp;&nbsp; 9.2在命令行下运行svn import c:/test svn://127.0.0.1/test -m "initial import" --username test --password passwd可进行上传操作<br />
&nbsp;&nbsp;&nbsp; 9.3进入你要检出的目录,在命令行下运行svn checkout svn://127.0.0.1/test --username test -password passwd 可进行检出工程的操作<br />
&nbsp;&nbsp;&nbsp; 9.4在命令行下运行svn commit test.txt -m "modified" --username test -password passwd 可进行提交操作<br />
&nbsp;&nbsp;&nbsp; 9.5在命令行下运行svn update -r HEAD test.txt --username test -password passwd 可进行更新操作<br />
<br />
<strong>注:</strong>上面讲的127.0.0.1可以换成外网IP,或者局域网IP皆可(即,在家里创建一个SVN服务端,即可在公司去访问家里的SVN) </p>
<img src ="http://www.blogjava.net/zjrstar/aggbug/259221.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zjrstar/" target="_blank">一叶笑天</a> 2009-03-11 21:32 <a href="http://www.blogjava.net/zjrstar/archive/2009/03/11/259221.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 转贴：oracle SQL性能优化 </title><link>http://www.blogjava.net/zjrstar/archive/2009/02/10/254030.html</link><dc:creator>一叶笑天</dc:creator><author>一叶笑天</author><pubDate>Tue, 10 Feb 2009 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/zjrstar/archive/2009/02/10/254030.html</guid><wfw:comment>http://www.blogjava.net/zjrstar/comments/254030.html</wfw:comment><comments>http://www.blogjava.net/zjrstar/archive/2009/02/10/254030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zjrstar/comments/commentRss/254030.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zjrstar/services/trackbacks/254030.html</trackback:ping><description><![CDATA[<p>原文地址：http://www.blogjava.net/fuwei2241/archive/2006/10/01/oracleSQL.html<br />
<br />
我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享！ <br />
（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择最有效率的表名顺序 ( 只在基于规则的优化器中有效 ) ： <br />
ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名， FROM 子句中写在最后的表 ( 基础表 driving table) 将被最先处理，在 FROM 子句中包含多个表的情况下 , 你必须选择记录条数最少的表作为基础表。如果有 3 个以上的表连接查询 , 那就需要选择交叉表 (intersection table) 作为基础表 , 交叉表是指那个被其他表所引用的表 . <br />
（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE 子句中的连接顺序．： <br />
ORACLE 采用自下而上的顺序解析 WHERE 子句 , 根据这个原理 , 表之间的连接必须写在其他 WHERE 条件之前 , 那些可以过滤掉最大数量记录的条件必须写在 WHERE 子句的末尾 . <br />
（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT 子句中避免使用 &#8216; * &#8216; ： <br />
ORACLE 在解析的过程中 , 会将 '*' 依次转换成所有的列名 , 这个工作是通过查询数据字典完成的 , 这意味着将耗费更多的时间 <br />
（4）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 减少访问数据库的次数： <br />
ORACLE 在内部执行了许多工作 : 解析 SQL 语句 , 估算索引的利用率 , 绑定变量 , 读数据块等； <br />
（5）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 SQL*Plus , SQL*Forms 和 Pro*C 中重新设置 ARRAYSIZE 参数 , 可以增加每次数据库访问的检索数据量 , 建议值为 200 <br />
（6）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用 DECODE 函数来减少处理时间： <br />
使用 DECODE 函数可以避免重复扫描相同记录或重复连接相同的表 . <br />
（7）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 整合简单 , 无关联的数据库访问： <br />
如果你有几个简单的数据库查询语句 , 你可以把它们整合到一个查询中 ( 即使它们之间没有关系 ) <br />
（8）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 删除重复记录 ： <br />
最高效的删除重复记录方法 ( 因为使用了 ROWID) 例子： <br />
DELETE&nbsp; FROM&nbsp; EMP E&nbsp; WHERE&nbsp; E.ROWID &gt; (SELECT MIN(X.ROWID) <br />
FROM&nbsp; EMP X&nbsp; WHERE&nbsp; X.EMP_NO = E.EMP_NO); <br />
（9）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用 TRUNCATE 替代 DELETE ： <br />
当删除表中的记录时 , 在通常情况下 , 回滚段 (rollback segments ) 用来存放可以被恢复的信息 . 如果你没有 COMMIT 事务 ,ORACLE 会将数据恢复到删除之前的状态 ( 准确地说是 恢复到执行删除命令之前的状况 ) 而当运用 TRUNCATE 时 , 回滚段不再存放任何可被恢复的信息 . 当命令运行后 , 数据不能被恢复 . 因此很少的资源被调用 , 执行时间也会很短 . ( 译者按 : TRUNCATE 只在删除全表适用 ,TRUNCATE 是 DDL 不是 DML) <br />
（10）&nbsp; 尽量多使用 COMMIT ： <br />
只要有可能 , 在程序中尽量多使用 COMMIT, 这样程序的性能得到提高 , 需求也会因为 COMMIT 所释放的资源而减少 : <br />
COMMIT 所释放的资源 : <br />
a. 回滚段上用于恢复数据的信息 . <br />
b. 被程序语句获得的锁 <br />
c. redo log buffer 中的空间 <br />
d. ORACLE 为管理上述 3 种资源中的内部花费 <br />
（11）&nbsp; 用 Where 子句替换 HAVING 子句： <br />
避免使用 HAVING 子句 , HAVING 只会在检索出所有记录之后才对结果集进行过滤 . 这个处理需要排序 , 总计等操作 . 如果能通过 WHERE 子句限制记录的数目 , 那就能减少这方面的开销 . ( 非 oracle 中 ) on 、 where 、 having 这三个都可以加条件的子句中， on 是最先执行， where 次之， having 最后，因为 on 是先把不符合条件的记录过滤后才进行统计，它就可以减少中间运算要处理的数据，按理说应该速度是最快的， where 也应该比 having 快点的，因为它过滤数据后才进行 sum ，在两个表联接时才用 on 的，所以在一个表的时候，就剩下 where 跟 having 比较了。在这单表查询统计的情况下，如果要过滤的条件没有涉及到要计算字段，那它们的结果是一样的，只是 where 可以使用 rushmore 技术，而 having 就不能，在速度上后者要慢如果要涉及到计算的字段，就表示在没计算之前，这个字段的值是不确定的，根据上篇写的工作流程， where 的作用时间是在计算之前就完成的，而 having 就是在计算后才起作用的，所以在这种情况下，两者的结果会不同。在多表联接查询时， on 比 where 更早起作用。系统首先根据各个表之间的联接条件，把多个表合成一个临时表后，再由 where 进行过滤，然后再计算，计算完后再由 having 进行过滤。由此可见，要想过滤条件起到正确的作用，首先要明白这个条件应该在什么时候起作用，然后再决定放在那里 <br />
（12）&nbsp; 减少对表的查询： <br />
在含有子查询的 SQL 语句中 , 要特别注意减少对表的查询 . 例子： <br />
&nbsp;&nbsp;&nbsp;&nbsp; SELECT&nbsp; TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT <br />
TAB_NAME,DB_VER&nbsp; FROM&nbsp; TAB_COLUMNS&nbsp;&nbsp; WHERE&nbsp; VERSION = 604) <br />
（13）&nbsp; 通过内部函数提高 SQL 效率 . ： <br />
复杂的 SQL 往往牺牲了执行效率 . 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的 <br />
（14）&nbsp; 使用表的别名 (Alias) ： <br />
当在 SQL 语句中连接多个表时 , 请使用表的别名并把别名前缀于每个 Column 上 . 这样一来 , 就可以减少解析的时间并减少那些由 Column 歧义引起的语法错误 . <br />
（15）&nbsp; 用 EXISTS 替代 I N 、 用 NOT EXISTS 替代 NOT IN ： <br />
在许多基于基础表的查询中 , 为了满足一个条件 , 往往需要对另一个表进行联接 . 在这种情况下 , 使用 EXISTS( 或 NOT EXISTS) 通常将提高查询的效率 . 在子查询中 ,NOT IN 子句将执行一个内部的排序和合并 . 无论在哪种情况下 ,NOT IN 都是最低效的 ( 因为它对子查询中的表执行了一个全表遍历 ). 为了避免使用 NOT IN , 我们可以把它改写成外连接 (Outer Joins) 或 NOT EXISTS. <br />
例子： <br />
（ 高效 ） SELECT * FROM&nbsp; EMP ( 基础表 )&nbsp;&nbsp; WHERE&nbsp; EMPNO &gt; 0&nbsp;&nbsp; AND&nbsp;&nbsp; EXISTS ( SELECT &#8216;X'&nbsp;&nbsp; FROM DEPT&nbsp;&nbsp; WHERE&nbsp; DEPT.DEPTNO = EMP.DEPTNO&nbsp;&nbsp; AND&nbsp; LOC = &#8216;MELB') <br />
( 低效 ) SELECT&nbsp; * FROM&nbsp; EMP ( 基础表 )&nbsp;&nbsp; WHERE&nbsp; EMPNO &gt; 0&nbsp;&nbsp; AND&nbsp; DEPTNO IN (SELECT DEPTNO&nbsp;&nbsp; FROM&nbsp; DEPT&nbsp;&nbsp; WHERE&nbsp; LOC = &#8216;MELB' ) <br />
（16）&nbsp; 识别 ' 低效执行 ' 的 SQL 语句： <br />
虽然目前各种关于 SQL 优化的图形化工具层出不穷 , 但是写出自己的 SQL 工具来解决问题始终是一个最好的方法： <br />
SELECT&nbsp; EXECUTIONS , DISK_READS, BUFFER_GETS, <br />
ROUND ((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2 ) Hit_radio, <br />
ROUND (DISK_READS/EXECUTIONS,2) Reads_per_run, <br />
SQL_TEXT <br />
FROM&nbsp; V$SQLAREA <br />
WHERE&nbsp; EXECUTIONS&gt;0 <br />
AND&nbsp; BUFFER_GETS &gt; 0 <br />
AND&nbsp; (BUFFER_GETS-DISK_READS)/BUFFER_GETS &lt; 0.8 <br />
ORDER BY&nbsp;&nbsp; 4 DESC ; <br />
（17）&nbsp; 用索引提高效率： <br />
索引是表的一个概念部分 , 用来提高检索数据的效率， ORACLE 使用了一个复杂的自平衡 B-tree 结构 . 通常 , 通过索引查询数据比全表扫描要快 . 当 ORACLE 找出执行查询和 Update 语句的最佳路径时 , ORACLE 优化器将使用索引 . 同样在联结多个表时使用索引也可以提高效率 . 另一个使用索引的好处是 , 它提供了主键 (primary key) 的唯一性验证 . 。那些 LONG 或 LONG RAW 数据类型 , 你可以索引几乎所有的列 . 通常 , 在大型表中使用索引特别有效 . 当然 , 你也会发现 , 在扫描小表时 , 使用索引同样能提高效率 . 虽然使用索引能得到查询效率的提高 , 但是我们也必须注意到它的代价 . 索引需要空间来存储 , 也需要定期维护 , 每当有记录在表中增减或索引列被修改时 , 索引本身也会被修改 . 这意味着每条记录的 INSERT , DELETE , UPDATE 将为此多付出 4 , 5 次的磁盘 I/O . 因为索引需要额外的存储空间和处理 , 那些不必要的索引反而会使查询反应时间变慢 . 。定期的重构索引是有必要的 . ： <br />
ALTER&nbsp;&nbsp; INDEX &lt;INDEXNAME&gt; REBUILD &lt;TABLESPACENAME&gt; <br />
（18）&nbsp; 用 EXISTS 替换 DISTINCT ： <br />
当提交一个包含一对多表信息 ( 比如部门表和雇员表 ) 的查询时 , 避免在 SELECT 子句中使用 DISTINCT. 一般可以考虑用 EXIST 替换 , EXISTS 使查询更为迅速 , 因为 RDBMS 核心模块将在 子查询的条件一旦满足后 , 立刻返回结果 . 例子： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( 低效 ): <br />
SELECT&nbsp;&nbsp; DISTINCT&nbsp; DEPT_NO,DEPT_NAME&nbsp;&nbsp; FROM&nbsp; DEPT D , EMP E <br />
WHERE&nbsp; D.DEPT_NO = E.DEPT_NO <br />
( 高效 ): <br />
SELECT&nbsp; DEPT_NO,DEPT_NAME&nbsp;&nbsp; FROM&nbsp; DEPT D&nbsp;&nbsp; WHERE&nbsp;&nbsp; EXISTS ( SELECT &#8216;X' <br />
FROM&nbsp; EMP E&nbsp;&nbsp; WHERE&nbsp; E.DEPT_NO = D.DEPT_NO ) ; <br />
（19）&nbsp; sql 语句用大写的 ；因为 oracle 总是先解析 sql 语句，把小写的字母转换成大写的再执行 <br />
（20）&nbsp; 在 java 代码中尽量少用连接符&#8220;＋&#8221;连接字符串！<br />
（21）&nbsp; 避免在索引列上使用 NOT 通常 ，　 <br />
我们要避免在索引列上使用 NOT, NOT 会产生在和在索引列上使用函数相同的 影响 . 当 ORACLE&#8221; 遇到 &#8221;NOT, 他就会停止使用索引转而执行全表扫描 . <br />
（22）&nbsp; 避免在索引列上使用计算． <br />
WHERE 子句中，如果索引列是函数的一部分．优化器将不使用索引而使用全表扫描． <br />
举例 : <br />
低效： <br />
SELECT &#8230; FROM&nbsp; DEPT&nbsp; WHERE SAL * 12 &gt; 25000; <br />
高效 : <br />
SELECT &#8230; FROM DEPT WHERE SAL &gt; 25000/12; <br />
（23）&nbsp; 用 &gt;= 替代 &gt; <br />
高效 : <br />
SELECT * FROM&nbsp; EMP&nbsp; WHERE&nbsp; DEPTNO &gt;=4 <br />
低效 : <br />
SELECT * FROM EMP WHERE DEPTNO &gt;3 <br />
两者的区别在于 , 前者 DBMS 将直接跳到第一个 DEPT 等于 4 的记录而后者将首先定位到 DEPTNO=3 的记录并且向前扫描到第一个 DEPT 大于 3 的记录 . <br />
（24）&nbsp; 用 UNION 替换 OR ( 适用于索引列 ) <br />
通常情况下 , 用 UNION 替换 WHERE 子句中的 OR 将会起到较好的效果 . 对索引列使用 OR 将造成全表扫描 . 注意 , 以上规则只针对多个索引列有效 . 如果有 column 没有被索引 , 查询效率可能会因为你没有选择 OR 而降低 . 在下面的例子中 , LOC_ID 和 REGION 上都建有索引 . <br />
高效 : <br />
SELECT LOC_ID , LOC_DESC , REGION <br />
FROM LOCATION <br />
WHERE LOC_ID = 10 <br />
UNION <br />
SELECT LOC_ID , LOC_DESC , REGION <br />
FROM LOCATION <br />
WHERE REGION = &#8220;MELBOURNE&#8221; <br />
低效 : <br />
SELECT LOC_ID , LOC_DESC , REGION <br />
FROM LOCATION <br />
WHERE LOC_ID = 10 OR REGION = &#8220;MELBOURNE&#8221; <br />
如果你坚持要用 OR, 那就需要返回记录最少的索引列写在最前面 . <br />
（25）&nbsp; 用 IN 来替换 OR&nbsp;&nbsp; <br />
这是一条简单易记的规则，但是实际的执行效果还须检验，在 ORACLE8i 下，两者的执行路径似乎是相同的．　 <br />
低效 : <br />
SELECT &#8230;. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30 <br />
高效 <br />
SELECT &#8230; FROM LOCATION WHERE LOC_IN&nbsp;&nbsp; IN (10,20,30); <br />
（26）&nbsp; 避免在索引列上使用 IS NULL 和 IS NOT NULL <br />
避免在索引中使用任何可以为空的列， ORACLE 将无法使用该索引 ．对于单列索引，如果列包含空值，索引中将不存在此记录 . 对于复合索引，如果每个列都为空，索引中同样不存在此记录 . 　如果至少有一个列不为空，则记录存在于索引中． 举例 : 如果唯一性索引建立在表的 A 列和 B 列上 , 并且表中存在一条记录的 A,B 值为 (123,null) , ORACLE 将不接受下一条具有相同 A,B 值（ 123,null ）的记录 ( 插入 ). 然而如果 所有的索引列都为空， ORACLE 将认为整个键值为空而空不等于空 . 因此你可以插入 1000 条具有相同键值的记录 , 当然它们都是空 ! 因为空值不存在于索引列中 , 所以 WHERE 子句中对索引列进行空值比较将使 ORACLE 停用该索引 . <br />
低效 : ( 索引失效 ) <br />
SELECT &#8230; FROM&nbsp; DEPARTMENT&nbsp;&nbsp; WHERE&nbsp; DEPT_CODE IS NOT NULL ; <br />
高效 : ( 索引有效 ) <br />
SELECT &#8230; FROM&nbsp; DEPARTMENT&nbsp;&nbsp; WHERE&nbsp; DEPT_CODE &gt;= 0; <br />
（27）&nbsp; 总是使用索引的第一个列 ： <br />
如果索引是建立在多个列上 , 只有在它的第一个列 (leading column) 被 where 子句引用时 , 优化器才会选择使用该索引 . 这也是一条简单而重要的规则，当仅引用索引的第二个列时 , 优化器使用了全表扫描而忽略了索引 <br />
（28）&nbsp; 用 UNION-ALL 替换 UNION ( 如果有可能的话 ) ： <br />
当 SQL 语句需要 UNION 两个查询结果集合时 , 这两个结果集合会以 UNION-ALL 的方式被合并 , 然后在输出最终结果前进行排序 . 如果用 UNION ALL 替代 UNION, 这样排序就不是必要了 . 效率就会因此得到提高 . 需要注意的是 ， UNION ALL 将重复输出两个结果集合中相同记录 . 因此各位还是 要从业务需求分析使用 UNION ALL 的可行性 . UNION 将对结果集合排序 , 这个操作会使用到 SORT_AREA_SIZE 这块内存 . 对于这 块内存的优化也是相当重要的 . 下面的 SQL 可以用来查询排序的消耗量 <br />
低效： <br />
SELECT&nbsp; ACCT_NUM, BALANCE_AMT <br />
FROM&nbsp; DEBIT_TRANSACTIONS <br />
WHERE TRAN_DATE = '31-DEC-95' <br />
UNION <br />
SELECT ACCT_NUM, BALANCE_AMT <br />
FROM DEBIT_TRANSACTIONS <br />
WHERE TRAN_DATE = '31-DEC-95' <br />
高效 : <br />
SELECT ACCT_NUM, BALANCE_AMT <br />
FROM DEBIT_TRANSACTIONS <br />
WHERE TRAN_DATE = '31-DEC-95' <br />
UNION ALL <br />
SELECT ACCT_NUM, BALANCE_AMT <br />
FROM DEBIT_TRANSACTIONS <br />
WHERE TRAN_DATE = '31-DEC-95' <br />
（29）&nbsp; 用 WHERE 替代 ORDER BY ： <br />
ORDER BY 子句只在两种严格的条件下使用索引 . <br />
ORDER BY 中所有的列必须包含在相同的索引中并保持在索引中的排列顺序 . <br />
ORDER BY 中所有的列必须定义为非空 . <br />
WHERE 子句使用的索引和 ORDER BY 子句中所使用的索引不能并列 . <br />
例如 : <br />
表 DEPT 包含以下列 : <br />
DEPT_CODE PK NOT NULL <br />
DEPT_DESC NOT NULL <br />
DEPT_TYPE NULL <br />
低效 : ( 索引不被使用 ) <br />
SELECT DEPT_CODE&nbsp; FROM&nbsp; DEPT&nbsp;&nbsp; ORDER BY&nbsp; DEPT_TYPE <br />
高效 : ( 使用索引 ) <br />
SELECT DEPT_CODE&nbsp;&nbsp; FROM&nbsp; DEPT&nbsp;&nbsp; WHERE&nbsp; DEPT_TYPE &gt; 0 <br />
（30）&nbsp; 避免改变索引列的类型 .: <br />
当比较不同数据类型的数据时 , ORACLE 自动对列进行简单的类型转换 . <br />
假设 EMPNO 是一个数值类型的索引列 . <br />
SELECT &#8230;&nbsp;&nbsp; FROM EMP&nbsp;&nbsp; WHERE&nbsp;&nbsp; EMPNO = &#8216;123' <br />
实际上 , 经过 ORACLE 类型转换 , 语句转化为 : <br />
SELECT &#8230;&nbsp;&nbsp; FROM EMP&nbsp; WHERE&nbsp; EMPNO = TO_NUMBER(&#8216;123') <br />
幸运的是 , 类型转换没有发生在索引列上 , 索引的用途没有被改变 . <br />
现在 , 假设 EMP_TYPE 是一个字符类型的索引列 . <br />
SELECT &#8230;&nbsp;&nbsp; FROM EMP&nbsp;&nbsp; WHERE EMP_TYPE = 123 <br />
这个语句被 ORACLE 转换为 : <br />
SELECT &#8230;&nbsp;&nbsp; FROM EMP&nbsp;&nbsp; WHERE TO_NUMBER(EMP_TYPE)=123 <br />
因为内部发生的类型转换 , 这个索引将不会被用到 ! 为了避免 ORACLE 对你的 SQL 进行隐式的类型转换 , 最好把类型转换用显式表现出来 . 注意当字符和数值比较时 , ORACLE 会优先转换数值类型到字符类型 <br />
（31）&nbsp; 需要当心的 WHERE 子句 : <br />
某些 SELECT 语句中的 WHERE 子句不使用索引 . 这里有一些例子 . <br />
在下面的例子里 , (1) &#8216;!=' 将不使用索引 . 记住 , 索引只能告诉你什么存在于表中 , 而不能告诉你什么不存在于表中 . (2) &#8216;||' 是 字符连接函数 . 就象其他函数那样 , 停用了索引 . (3) &#8216;+' 是数学函数 . 就象其他数学函数那样 , 停用了索引 . (4) 相同的索引列不能互相比较 , 这将会启用全表扫描 . <br />
（32）&nbsp; a. 如果检索数据量超过 30% 的表中记录数 . 使用索引将没有显著的效率提高 . <br />
b. 在特定情况下 , 使用索引也许会比全表扫描慢 , 但这是同一个数量级上的区别 . 而通常情况下 , 使用索引比全表扫描要块几倍乃至几千倍 ! <br />
（33）&nbsp; 避免使用耗费资源的操作 : <br />
带有 DISTINCT,UNION,MINUS,INTERSECT,ORDER BY 的 SQL 语句会启动 SQL 引擎 <br />
执行耗费资源的排序 (SORT) 功能 . DISTINCT 需要一次排序操作 , 而其他的至少需要执行两次排序 . 通常 , 带有 UNION, MINUS , INTERSECT 的 SQL 语句都可以用其他方式重写 . 如果你的数据库的 SORT_AREA_SIZE 调配得好 , 使用 UNION , MINUS, INTERSECT 也是可以考虑的 , 毕竟它们的可读性很强 <br />
（34）&nbsp; 优化 GROUP BY: <br />
提高 GROUP BY 语句的效率 , 可以通过将不需要的记录在 GROUP BY 之前过滤掉 . 下面两个查询返回相同结果但第二个明显就快了许多 . <br />
低效 : <br />
SELECT JOB , AVG(SAL) <br />
FROM EMP <br />
GROUP JOB <br />
HAVING JOB = &#8216;PRESIDENT' <br />
OR JOB = &#8216;MANAGER' <br />
高效 : <br />
SELECT JOB , AVG(SAL) <br />
FROM EMP <br />
WHERE JOB = &#8216;PRESIDENT' <br />
OR JOB = &#8216;MANAGER' <br />
GROUP JOB </p>
<img src ="http://www.blogjava.net/zjrstar/aggbug/254030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zjrstar/" target="_blank">一叶笑天</a> 2009-02-10 11:16 <a href="http://www.blogjava.net/zjrstar/archive/2009/02/10/254030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2边学边练(3)-Struts2集成Hibernate完成CRUD操作</title><link>http://www.blogjava.net/zjrstar/archive/2009/01/08/250461.html</link><dc:creator>一叶笑天</dc:creator><author>一叶笑天</author><pubDate>Thu, 08 Jan 2009 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/zjrstar/archive/2009/01/08/250461.html</guid><wfw:comment>http://www.blogjava.net/zjrstar/comments/250461.html</wfw:comment><comments>http://www.blogjava.net/zjrstar/archive/2009/01/08/250461.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zjrstar/comments/commentRss/250461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zjrstar/services/trackbacks/250461.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在这个项目中,准备用Struts2集成hibernate来完成数据库的简单CRUD操作,暂时不涉及集成spring。项目需要的lib文件：antlr-2.7.6.jarcglib-nodep-2.1_3.jarcommons-collections-3.1.jarcommons-logging-1.0.4.jardom4j-1.6.1.jarehcache-1.2.3.ja...&nbsp;&nbsp;<a href='http://www.blogjava.net/zjrstar/archive/2009/01/08/250461.html'>阅读全文</a><img src ="http://www.blogjava.net/zjrstar/aggbug/250461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zjrstar/" target="_blank">一叶笑天</a> 2009-01-08 11:35 <a href="http://www.blogjava.net/zjrstar/archive/2009/01/08/250461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2边学边练(1)-HelloWorld</title><link>http://www.blogjava.net/zjrstar/archive/2009/01/06/250161.html</link><dc:creator>一叶笑天</dc:creator><author>一叶笑天</author><pubDate>Tue, 06 Jan 2009 11:20:00 GMT</pubDate><guid>http://www.blogjava.net/zjrstar/archive/2009/01/06/250161.html</guid><wfw:comment>http://www.blogjava.net/zjrstar/comments/250161.html</wfw:comment><comments>http://www.blogjava.net/zjrstar/archive/2009/01/06/250161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zjrstar/comments/commentRss/250161.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zjrstar/services/trackbacks/250161.html</trackback:ping><description><![CDATA[从今天开始，我将陆续发布自己学习Struts2中的感受和笔记。这也算是督促自己学些和总结学习经验的好方式。<br />
<br />
声明一下，我博客中所有的文章仅供本人学习之用，最近有人对我的文章评论过激，在此我希望您不要耽搁时间在我的博客中。如果文章中有什么不对之处，我欢迎大家指出，但是我希望您珍惜自己的言行。<br />
<br />
开发环境：<br />
<br />
<p>Web<span style="font-family: 宋体">服务器：</span>apache-tomcat-6.0.18<br />
<br />
Struts<span style="font-family: 宋体">版本：</span>struts-2.0.14</p>
<p>JDK<span style="font-family: 宋体">版本：</span>JDK1.5.0_12</p>
Eclipse版本：eclipse-jee-ganymede-SR1-win32 也就是eclipse的开发JEE版本，很多人都使用myeclipse，但是由于myeclipse是商业版本，所以觉得eclipse-jee-ganymede对于开发JEE的项目已经很不错了，所以我觉得没必要用myEclipse去开发。<br />
<br />
Struts2需要的jar包：<br />
<span style="font-family: 宋体"><br />
至少需要如下五个包</span>
<p>struts2-core-2.0.11.1.jar</p>
<p>xwork-2.0.4.jar</p>
<p>commons-logging-1.0.4.jar</p>
<p>freemarker-2.3.8.jar</p>
<p>ognl-2.6.11.jar<br />
<br />
在这个简单的例子中，我们将会完成以下步骤：<br />
1.配置web.xml<br />
2.编写jsp<br />
3.编写Action实现类<br />
4.配置Action<br />
5.发布运行<br />
<br />
1.配置web.xml<br />
Struts2<span style="font-family: 宋体">的入口点是一个</span>Filter,需要将这个入口点配置到web.xml：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">web-app&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="WebApp_ID"</span><span style="color: #ff0000">&nbsp;version</span><span style="color: #0000ff">="2.4"</span><span style="color: #ff0000">&nbsp;xmlns</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #ff0000">&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000">&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">display-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">HelloWorld</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">display-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">welcome-file-list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">welcome-file</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">index.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">welcome-file</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">welcome-file-list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">struts2</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.apache.struts2.dispatcher.FilterDispatcher</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">struts2</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
2. 编写jsp<br />
在这个例子中需要两个jsp，一个是index.jsp, 用于输入用户的名字。第二个jsp是welcome.jsp，用于向用户问候。<br />
<br />
在Struts2<span style="font-family: 宋体">中只需要一个标签库</span>/struts-tags<span style="font-family: 宋体">。这里面包含了所有的</span>Struts2<span style="font-family: 宋体">标签。但使用</span>Struts2<span style="font-family: 宋体">的标签大家要注意一下。在</span>&lt;s::form&gt;<span style="font-family: 宋体">中最好都使用</span>Struts2<span style="font-family: 宋体">标签，尽量不要用</span>HTML<span style="font-family: 宋体">或普通文本.<br />
<br />
index.jsp如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_2_93_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2_93_Open_Text.style.display='none'; Codehighlighter1_2_93_Closed_Image.style.display='inline'; Codehighlighter1_2_93_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2_93_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2_93_Closed_Text.style.display='none'; Codehighlighter1_2_93_Open_Image.style.display='inline'; Codehighlighter1_2_93_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000; background-color: #ffff00">&lt;%</span><span id="Codehighlighter1_2_93_Open_Text"><span style="color: #000000; background-color: #f5f5f5">@&nbsp;page&nbsp;language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;contentType</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">text/html;&nbsp;charset=ISO-8859-1</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">ISO-8859-1</span><span style="color: #000000; background-color: #f5f5f5">"</span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<img id="Codehighlighter1_99_137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_99_137_Open_Text.style.display='none'; Codehighlighter1_99_137_Closed_Image.style.display='inline'; Codehighlighter1_99_137_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_99_137_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_99_137_Closed_Text.style.display='none'; Codehighlighter1_99_137_Open_Image.style.display='inline'; Codehighlighter1_99_137_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span id="Codehighlighter1_99_137_Open_Text"><span style="color: #000000; background-color: #f5f5f5">@&nbsp;taglib&nbsp;prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/html4/loose.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">meta&nbsp;</span><span style="color: #ff0000">http-equiv</span><span style="color: #0000ff">="Content-Type"</span><span style="color: #ff0000">&nbsp;content</span><span style="color: #0000ff">="text/html;&nbsp;charset=ISO-8859-1"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">HelloWorld</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form&nbsp;</span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Hello"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="name"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="Please&nbsp;Input&nbsp;Your&nbsp;Name:"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">s:textfield</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">="Hello"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">s:submit</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<p>welcome.jsp如下：<br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_2_93_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2_93_Open_Text.style.display='none'; Codehighlighter1_2_93_Closed_Image.style.display='inline'; Codehighlighter1_2_93_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2_93_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2_93_Closed_Text.style.display='none'; Codehighlighter1_2_93_Open_Image.style.display='inline'; Codehighlighter1_2_93_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000; background-color: #ffff00">&lt;%</span><span id="Codehighlighter1_2_93_Open_Text"><span style="color: #000000; background-color: #f5f5f5">@&nbsp;page&nbsp;language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;contentType</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">text/html;&nbsp;charset=ISO-8859-1</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">ISO-8859-1</span><span style="color: #000000; background-color: #f5f5f5">"</span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<img id="Codehighlighter1_99_137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_99_137_Open_Text.style.display='none'; Codehighlighter1_99_137_Closed_Image.style.display='inline'; Codehighlighter1_99_137_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_99_137_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_99_137_Closed_Text.style.display='none'; Codehighlighter1_99_137_Open_Image.style.display='inline'; Codehighlighter1_99_137_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span id="Codehighlighter1_99_137_Open_Text"><span style="color: #000000; background-color: #f5f5f5">@&nbsp;taglib&nbsp;prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/html4/loose.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">meta&nbsp;</span><span style="color: #ff0000">http-equiv</span><span style="color: #0000ff">="Content-Type"</span><span style="color: #ff0000">&nbsp;content</span><span style="color: #0000ff">="text/html;&nbsp;charset=ISO-8859-1"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">HelloWorld</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;Hello&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:property&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">="name"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
</span>3.编写Action类<br />
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts2.x</span><span style="font-size: 10.5pt; font-family: 宋体">的Action需要从</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">com.opensymphony.xwork2.ActionSupport</span><span style="font-size: 10.5pt; font-family: 宋体">类继承。而且Action中已经包含了Struts1中的ActionForm类信息，所以不需要再写ActionForm类。<br />
<br />
在这个例子中只编写了一个HelloWorld.java类：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.struts2.action;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_123_423_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_423_Open_Text.style.display='none'; Codehighlighter1_123_423_Closed_Image.style.display='inline'; Codehighlighter1_123_423_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_123_423_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_123_423_Closed_Text.style.display='none'; Codehighlighter1_123_423_Open_Image.style.display='inline'; Codehighlighter1_123_423_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloWorld&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;</span><span id="Codehighlighter1_123_423_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_123_423_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">2567455771246284511L</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_248_266_Open_Image" onclick="this.style.display='none'; Codehighlighter1_248_266_Open_Text.style.display='none'; Codehighlighter1_248_266_Closed_Image.style.display='inline'; Codehighlighter1_248_266_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_248_266_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_248_266_Closed_Text.style.display='none'; Codehighlighter1_248_266_Open_Image.style.display='inline'; Codehighlighter1_248_266_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;</span><span id="Codehighlighter1_248_266_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_248_266_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_303_326_Open_Image" onclick="this.style.display='none'; Codehighlighter1_303_326_Open_Text.style.display='none'; Codehighlighter1_303_326_Closed_Image.style.display='inline'; Codehighlighter1_303_326_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_303_326_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_303_326_Closed_Text.style.display='none'; Codehighlighter1_303_326_Open_Image.style.display='inline'; Codehighlighter1_303_326_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setName(String&nbsp;name)&nbsp;</span><span id="Codehighlighter1_303_326_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_303_326_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_372_420_Open_Image" onclick="this.style.display='none'; Codehighlighter1_372_420_Open_Text.style.display='none'; Codehighlighter1_372_420_Closed_Image.style.display='inline'; Codehighlighter1_372_420_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_372_420_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_372_420_Closed_Text.style.display='none'; Codehighlighter1_372_420_Open_Image.style.display='inline'; Codehighlighter1_372_420_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_372_420_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_372_420_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setName(getName());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SUCCESS;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p><br />
4.配置Action类：<br />
在<span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts2.x</span><span style="font-size: 10.5pt; font-family: 宋体">中的配置文件一般为</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts.xml</span><span style="font-size: 10.5pt; font-family: 宋体">，放到</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">WEB-INF"classes</span><span style="font-size: 10.5pt; font-family: 宋体">目录中。下面是在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts.xml</span><span style="font-size: 10.5pt; font-family: 宋体">中配置动作类的代码：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="default"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Hello"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.struts2.action.HelloWorld"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="success"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/welcome.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
5.发布：<br />
<br />
在eclipse-jee-ganymede下配置tomcat服务器，很简单。<br />
Windows-&gt;Performance-&gt;Server-&gt;Runntime Environment-&gt;Add.随着向导就可以增加tomcat服务器了。<br />
然后鼠标右键点击项目的根目录，选择菜单的Run As-&gt;Run on Server就可以发布启动你的项目了。而且还有eclipse自带的浏览器，感觉很不错咯。<br />
<br />
<br />
<img height="491" alt="" src="http://www.blogjava.net/images/blogjava_net/zjrstar/index.JPG" width="764" border="0" /><br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/zjrstar/welcome.JPG" border="0" /><br />
</span><br />
<br />
</p>
<br />
<img src ="http://www.blogjava.net/zjrstar/aggbug/250161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zjrstar/" target="_blank">一叶笑天</a> 2009-01-06 19:20 <a href="http://www.blogjava.net/zjrstar/archive/2009/01/06/250161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>