﻿<?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/LeungXin/category/16257.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 12 Dec 2007 11:00:42 GMT</lastBuildDate><pubDate>Wed, 12 Dec 2007 11:00:42 GMT</pubDate><ttl>60</ttl><item><title>Tomcat内存溢出的处理办法</title><link>http://www.blogjava.net/LeungXin/articles/167053.html</link><dc:creator>梁昕</dc:creator><author>梁昕</author><pubDate>Tue, 11 Dec 2007 12:52:00 GMT</pubDate><guid>http://www.blogjava.net/LeungXin/articles/167053.html</guid><description><![CDATA[Tomcat默认可以使用的内存为128MB，在较大型的应用项目中，这点内存是不够的，轻微时，会使系统性能急剧下降，严重时,将导致系统无法运行，影响系统的稳定性。当内存不够用时，常见的问题就是报tomcat内存益处错误，从儿导致客户端包500错误的，如下：解决方法主要是加大TOMCAT可利用内存，并在程序当中加大内存使用。因此根据应用的需求，有必要调整JVM使用内存的大小。现在将手工修改tomcat内存的方法及注意事项列出，希望能对新人有所帮助。<br />
<br />
　　tomcat提供了两种安装模式，即免安装（*.zip）和安装（*.exe）方式。针对不同的安装方式下修改tomcat内存大小的方法几注意问题（windows环境）：<br />
<br />
　　方式1：当选择安装方式时，可以在安装tomcat的过程进行设置tomcat初始化内存的大小。但是假如说在安装时没有选择，或者应用改变了，需要增加tomcat内存时怎么半呢？此时，我们就要手工修改tomcat的一些文件了。<br />
<br />
　　看了很多网上的资料，都是说修改＜CATALINA_HOME＞bincatalina.bat文件的内容，即在里面增加一行代码：<br />
<br />
set JAVA_OPTS=-Xms512m -Xmx512m //表示初始化最小可用内存和最大可用内存都是512MB（修改相应值即可）<br />
<br />
　　如在catalina.bat的<br />
<br />
rem ----- Execute The Requested Command<br />
echo Using CATALINA_BASE: %CATALINA_BASE%<br />
echo Using CATALINA_HOME: %CATALINA_HOME%<br />
echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%<br />
echo Using JAVA_HOME: %JAVA_HOME%<br />
<br />
　　这一栏改为<br />
<br />
rem ----- Execute The Requested Command<br />
set JAVA_OPTS=-Xms512m -Xmx512m<br />
echo Using CATALINA_BASE: %CATALINA_BASE%<br />
echo Using CATALINA_HOME: %CATALINA_HOME%<br />
echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%<br />
echo Using JAVA_HOME: %JAVA_HOME%<br />
<br />
　　就可以将JAVA虚拟机分配内存 508.0625MB的!<br />
<br />
　　但是很多人修改后，发现修改并没有起作用，即通过windows的服务启动tomcat时，实际的内存还是默认的，修改的设置并没有起作用；而通过＜CATALINA_HOME＞binstartup.bat 启动却是生效的。这是为什么呢？因为在安装过程中，JVM的初始化参数已经写在注册表中了，由于没有修改注册表中相关参数，所以以windows服务方式启动时，修改的并没有生效。而通过＜CATALINA_HOME＞binstartup.bat 启动直接是通过＜CATALINA_HOME＞bincatalina.bat文件中的配置的。你需要重新加载到系统服务中才生效，或者你手工在注册表中查找修改启动值，加载到服务中的时候参数已经配置好了，自己修改artup.bat不会改变注册表中的参数设置。<br />
<br />
　　解决方法：修改注册表中的参数，加入JVM初始化内存的参数：<br />
<br />
HKEY_LOCAL_MACHINESOFTWAREApache Software FoundationTomcat Service ManagerTomcat5ParametersJavaOptions<br />
<br />
　　值为<br />
<br />
-Dcatalina.home="C:ApacheGroupTomcat 5.0"<br />
-Djava.endorsed.dirs="C:ApacheGroupTomcat 5.0commonendorsed"<br />
-Xrs<br />
<br />
　　如加入 -Xms512m -Xmx800m<br />
<br />
　　方式2：针对免安装的用户，也可以通过将tomcat注册为windows的一个服务的方式来实现：我们可以对service.bat文件做一些其他修改，使tomcat更加能满足我们各种不同需求时的要求<br />
<br />
1. 如果让tomcat编译jsp文件，就在PR_CLASSPATH中加入J2SDK的tools.jar<br />
<br />
　　修改前：<br />
<br />
set PR_CLASSPATH=%CATALINA_HOME%binbootstrap.jar<br />
<br />
　　修改后：<br />
<br />
set PR_CLASSPATH=%JAVA_HOME%libtools.jar; %CATALINA_HOME%binbootstrap.jar<br />
<br />
　　2.要使用一个特定的JVM，就要修改jvm的参数；要使注册的windows服务的启动方式为自动，增加--Startup Automatic，这个是比较常用的；要用定制的server.xml配置文件并且传递多个参数给StartClass，要修改StartParams的值，各个值之间用分号分隔：<br />
<br />
　　修改前：<br />
<br />
"%EXECUTABLE%" //IS//%SERVICE_NAME% --Jvm auto<br />
--StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap<br />
--StartParams start --StopParams stop<br />
<br />
　　修改后：<br />
<br />
"%EXECUTABLE%" //IS//%SERVICE_NAME% --Jvm "%JAVA_HOME%jrebinserverjvm.dll"<br />
--StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap<br />
--StartParams "-config; %CUSTOM_SERVERXML_FILE%; -nonaming; start" --StopParams stop<br />
--Startup Automatic<br />
<br />
　　3. 指定最大和最小的内存限制，要增加jvm的初始参数<br />
<br />
　　修改前：<br />
<br />
"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions<br />
"-Dcatalina.base=%CATALINA_BASE%; -Dcatalina.home=%CATALINA_HOME%; -Djava.endorsed.dirs=%CATALINA_HOME%commonendorsed"<br />
--StartMode jvm --StopMode jvm<br />
<br />
　　修改后：<br />
<br />
"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions<br />
"-Xms128M; -Xmx256M; -Dcatalina.base=%CATALINA_BASE%; -Dcatalina.home=%CATALINA_HOME%; -Djava.endorsed.dirs=%CATALINA_HOME%commonendorsed"<br />
--StartMode jvm --StopMode jvm<br />
<br />
　　4.有时注册windows服务成功后，但是启动服务时显示&#8220;发生服务特定错误: 0.&#8221;就是因为jvm没有指定，修改Jvm auto为Jvm "%JAVA_HOME%jrebinserverjvm.dll"后重新注册windows服务就可以启动了。
 <img src ="http://www.blogjava.net/LeungXin/aggbug/167053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LeungXin/" target="_blank">梁昕</a> 2007-12-11 20:52 <a href="http://www.blogjava.net/LeungXin/articles/167053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用dtree构建动态树型菜单</title><link>http://www.blogjava.net/LeungXin/articles/152176.html</link><dc:creator>梁昕</dc:creator><author>梁昕</author><pubDate>Thu, 11 Oct 2007 15:13:00 GMT</pubDate><guid>http://www.blogjava.net/LeungXin/articles/152176.html</guid><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天看到这个例子做了一个树形菜单,感觉真的很好,我不知道这篇文章的出处是哪里,但是我在此感谢作者共享的精神.需要注意的是这里用的createTree方法是老版本dtree脚本tree.js里的方法.<br />
<br />
好了下面是原文:<br />
<br />
dtree是一个免费的javascript脚本，只需定义有限的几个参数，就可以做出漂亮的树型菜单。下载目录：<a href="http://www.destroydrop.com/javascripts/tree/"><font color="#990000">http://www.destroydrop.com/javascripts/tree/</font></a><br />
&nbsp;以下是dtree的用法示例：<br />
&nbsp;1）初始化菜单<br />
&nbsp;&lt;script&nbsp;type="text/javascript"&gt;<br />
&nbsp;&nbsp;&lt;!--<br />
&nbsp;&nbsp;var&nbsp;Tree&nbsp;=&nbsp;new&nbsp;Array;<br />
&nbsp;&nbsp;//&nbsp;nodeId&nbsp;|&nbsp;parentNodeId&nbsp;|&nbsp;nodeName&nbsp;|&nbsp;nodeUrl<br />
&nbsp;&nbsp;Tree[0]&nbsp;&nbsp;=&nbsp;"1|0|Page&nbsp;1|#";<br />
&nbsp;&nbsp;Tree[1]&nbsp;&nbsp;=&nbsp;"2|1|Page&nbsp;1.1|#";<br />
&nbsp;&nbsp;Tree[2]&nbsp;&nbsp;=&nbsp;"3|1|Page&nbsp;1.2|#";<br />
&nbsp;&nbsp;Tree[3]&nbsp;&nbsp;=&nbsp;"4|3|Page&nbsp;1.2.1|#";<br />
&nbsp;&nbsp;Tree[4]&nbsp;&nbsp;=&nbsp;"5|1|Page&nbsp;1.3|#";<br />
&nbsp;&nbsp;Tree[5]&nbsp;&nbsp;=&nbsp;"6|2|Page&nbsp;1.1.1|#";<br />
&nbsp;&nbsp;Tree[6]&nbsp;&nbsp;=&nbsp;"7|6|Page&nbsp;1.1.1.1|#";<br />
&nbsp;&nbsp;Tree[7]&nbsp;&nbsp;=&nbsp;"8|6|Page&nbsp;1.1.1.2|#";<br />
&nbsp;&nbsp;Tree[8]&nbsp;&nbsp;=&nbsp;"9|1|Page&nbsp;1.4|#";<br />
&nbsp;&nbsp;Tree[9]&nbsp;&nbsp;=&nbsp;"10|9|Page&nbsp;1.4.1|#";<br />
&nbsp;&nbsp;Tree[10]&nbsp;=&nbsp;"11|0|Page&nbsp;2|#";<br />
&nbsp;&nbsp;//--&gt;<br />
&nbsp;&lt;/script&gt;<br />
&nbsp;2）调用函数<br />
&nbsp;&lt;div&nbsp;class="tree"&gt;<br />
&nbsp;&nbsp;&lt;script&nbsp;type="text/javascript"&gt;<br />
&nbsp;&nbsp;&lt;!--<br />
&nbsp;&nbsp;&nbsp;createTree(Tree,1,7);&nbsp;&nbsp;//&nbsp;starts&nbsp;the&nbsp;tree&nbsp;at&nbsp;the&nbsp;top&nbsp;and&nbsp;open&nbsp;it&nbsp;at&nbsp;node&nbsp;nr.&nbsp;7<br />
&nbsp;&nbsp;//--&gt;<br />
&nbsp;&nbsp;&lt;/script&gt;<br />
&nbsp;&lt;/div&gt; </p>
<p>&nbsp;</p>
<p>2。jsp动态实现<br />
&nbsp;&nbsp;&nbsp;分以下步骤实现动态的树型菜单：<br />
&nbsp;&nbsp;&nbsp;1）在数据库建tree_info表，有nodeId，parentNodeId，nodeName，nodeUrl四个字段，来存储节点信息。<br />
&nbsp;&nbsp;&nbsp;2）编写java类，用于从数据库找出节点信息，并且生成javascript脚本。<br />
&nbsp;&nbsp;&nbsp;3）编写tag类。用于封装逻辑，简化jsp的开发。<br />
&nbsp;&nbsp;&nbsp;4）建一个web程序进行测试。</p>
<p>3。详细过程<br />
&nbsp;&nbsp;&nbsp;1）在数据库建表，脚本如下：<br />
&nbsp;&nbsp;&nbsp;CREATE&nbsp;TABLE&nbsp;`test`.`tree_info`&nbsp;(<br />
&nbsp;&nbsp;&nbsp;`node_id`&nbsp;INTEGER&nbsp;UNSIGNED&nbsp;NOT&nbsp;NULL&nbsp;DEFAULT&nbsp;-1,<br />
&nbsp;&nbsp;&nbsp;`parent_id`&nbsp;INTEGER&nbsp;UNSIGNED&nbsp;NOT&nbsp;NULL&nbsp;DEFAULT&nbsp;-1,<br />
&nbsp;&nbsp;&nbsp;`node_name`&nbsp;VARCHAR(45)&nbsp;NOT&nbsp;NULL,<br />
&nbsp;&nbsp;&nbsp;`ref_url`&nbsp;VARCHAR(45)&nbsp;NOT&nbsp;NULL,<br />
&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY(`node_id`)<br />
&nbsp;)<br />
&nbsp;我使用mysql数据库，如果脚本细节有出入，请自行修改<br />
&nbsp;&nbsp;&nbsp;&nbsp;按照上面的dTree示例插入数据<br />
&nbsp;&nbsp;&nbsp;2）编写TreeInfo.java，这个类用于封装节点信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package&nbsp;com.diegoyun.web.tree;<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;*&nbsp;@author&nbsp;Diegoyun<br />
&nbsp;&nbsp;&nbsp;*&nbsp;@version&nbsp;1.0<br />
&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;public&nbsp;class&nbsp;TreeInfo&nbsp;{<br />
&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;nodeId&nbsp;=&nbsp;-1;//node&nbsp;id<br />
&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;parentId&nbsp;=&nbsp;-1;//parentId<br />
&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;nodeName&nbsp;=&nbsp;null;//node&nbsp;name<br />
&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;url&nbsp;=&nbsp;null;//url&nbsp;references</p>
<p>&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getNodeId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nodeId;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setNodeId(int&nbsp;nodeId)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.nodeId&nbsp;=&nbsp;nodeId;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getParentId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;parentId;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setParentId(int&nbsp;parentId)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.parentId&nbsp;=&nbsp;parentId;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getNodeName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nodeName;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setNodeName(String&nbsp;nodeName)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.nodeName&nbsp;=&nbsp;nodeName;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getUrl()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;url;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setUrl(String&nbsp;url)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.url&nbsp;=&nbsp;url;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;编写TreeUtil.java，用于从数据库得到节点信息，封装到TreeInfo对象，并生成javascript脚本<br />
&nbsp;&nbsp;&nbsp;TreeUtil.java<br />
&nbsp;&nbsp;&nbsp;package&nbsp;com.diegoyun.web.tree;<br />
&nbsp;&nbsp;import&nbsp;java.util.Collection;<br />
&nbsp;&nbsp;import&nbsp;java.util.ArrayList;<br />
&nbsp;&nbsp;import&nbsp;java.util.Iterator;<br />
&nbsp;&nbsp;import&nbsp;java.util.List;<br />
&nbsp;&nbsp;import&nbsp;java.sql.PreparedStatement;<br />
&nbsp;&nbsp;import&nbsp;java.sql.ResultSet;<br />
&nbsp;&nbsp;import&nbsp;java.sql.Connection;<br />
&nbsp;&nbsp;import&nbsp;java.sql.DriverManager;</p>
<p>&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;*&nbsp;@author&nbsp;Diegoyun<br />
&nbsp;&nbsp;&nbsp;*&nbsp;@version&nbsp;1.0<br />
&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;public&nbsp;class&nbsp;TreeUtil&nbsp;{<br />
&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;List&nbsp;retrieveNodeInfos(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;coll&nbsp;=&nbsp;new&nbsp;ArrayList();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;driverName&nbsp;=&nbsp;"com.mysql.jdbc.Driver";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;host&nbsp;=&nbsp;"localhost";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;port&nbsp;=&nbsp;":3306";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;serverID&nbsp;=&nbsp;"test";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;userName&nbsp;=&nbsp;"root";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;userPwd&nbsp;=&nbsp;"root";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;=&nbsp;"jdbc:mysql://"&nbsp;+&nbsp;host&nbsp;+&nbsp;port&nbsp;+&nbsp;"/"&nbsp;+&nbsp;serverID&nbsp;;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;null&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement&nbsp;ps&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(driverName).newInstance();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;=&nbsp;DriverManager.getConnection(url&nbsp;,&nbsp;userName&nbsp;,&nbsp;userPwd);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;=&nbsp;"select&nbsp;*&nbsp;from&nbsp;tree_info";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps&nbsp;=&nbsp;conn.prepareStatement(sql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;=&nbsp;ps.executeQuery();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeInfo&nbsp;info&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(rs!=null&nbsp;&amp;&amp;&nbsp;rs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;=&nbsp;new&nbsp;TreeInfo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.setNodeId(rs.getInt(1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.setParentId(rs.getInt(2));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.setNodeName(rs.getString(3));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.setUrl(rs.getString(4));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coll.add(info);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rs!=null){<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close();<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs=null;<br />
&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;if(ps!=null){<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps.close();<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps=null;<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;coll;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;String&nbsp;createTreeInfo(List&nbsp;alist){<br />
&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;contents&nbsp;=&nbsp;new&nbsp;StringBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;contents.append("&lt;!--\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;contents.append("var&nbsp;Tree&nbsp;=&nbsp;new&nbsp;Array;");//create&nbsp;a&nbsp;array&nbsp;in&nbsp;javascript<br />
&nbsp;&nbsp;&nbsp;&nbsp;TreeInfo&nbsp;info&nbsp;=null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;max&nbsp;=&nbsp;alist.size(),i=0;i&lt;max;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;=&nbsp;(TreeInfo)alist.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//define&nbsp;elements&nbsp;of&nbsp;array<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append("Tree[");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append("]=\"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(info.getNodeId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append("|");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(info.getParentId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append("|");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(info.getNodeName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append("|");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(info.getUrl());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append("\";");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;contents.append("//--&gt;");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;contents.toString();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;alist&nbsp;=&nbsp;TreeUtil.retrieveNodeInfos();<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeInfo&nbsp;info&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(Iterator&nbsp;i&nbsp;=&nbsp;c.iterator();i.hasNext();){<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;=&nbsp;(TreeInfo)i.next();<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("*****"&nbsp;+&nbsp;info.getNodeName());<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(TreeUtil.createTreeInfo(alist));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;3)编写标签类<br />
&nbsp;InitTreeTag.java<br />
&nbsp;package&nbsp;com.diegoyun.web.taglibs;<br />
&nbsp;import&nbsp;com.diegoyun.web.tree.TreeUtil;<br />
&nbsp;import&nbsp;javax.servlet.jsp.tagext.TagSupport;<br />
&nbsp;import&nbsp;javax.servlet.jsp.JspException;<br />
&nbsp;import&nbsp;java.io.IOException;</p>
<p>&nbsp;/**<br />
&nbsp;&nbsp;*&nbsp;@author&nbsp;Diegoyun<br />
&nbsp;&nbsp;*&nbsp;@version&nbsp;1.0<br />
&nbsp;&nbsp;*/<br />
&nbsp;public&nbsp;class&nbsp;InitTreeTag&nbsp;extends&nbsp;TagSupport{</p>
<p>&nbsp;&nbsp;public&nbsp;int&nbsp;doEndTag()&nbsp;throws&nbsp;JspException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;tree&nbsp;=&nbsp;new&nbsp;StringBuffer();<br />
&nbsp;&nbsp;&nbsp;tree.append("&lt;script&nbsp;type=\"text/javascript\"&gt;\n");<br />
&nbsp;&nbsp;&nbsp;tree.append(TreeUtil.createTreeInfo(TreeUtil.retrieveNodeInfos()));<br />
&nbsp;&nbsp;&nbsp;tree.append("&lt;/script&gt;\n");<br />
&nbsp;&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;pageContext.getOut().println(tree.toString());<br />
&nbsp;&nbsp;&nbsp;}catch(IOException&nbsp;ioe){<br />
&nbsp;&nbsp;&nbsp;&nbsp;ioe.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return&nbsp;super.doEndTag();<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp;ShowTreeTag.java&nbsp;:&nbsp;</p>
<p>&nbsp;package&nbsp;com.diegoyun.web.taglibs;</p>
<p>&nbsp;import&nbsp;javax.servlet.jsp.tagext.TagSupport;<br />
&nbsp;import&nbsp;javax.servlet.jsp.JspException;<br />
&nbsp;import&nbsp;java.io.IOException;</p>
<p>&nbsp;/**<br />
&nbsp;&nbsp;*&nbsp;@author&nbsp;Diegoyun<br />
&nbsp;&nbsp;*&nbsp;@version&nbsp;1.0<br />
&nbsp;&nbsp;*/<br />
&nbsp;public&nbsp;class&nbsp;ShowTreeTag&nbsp;extends&nbsp;TagSupport{<br />
&nbsp;&nbsp;public&nbsp;int&nbsp;doEndTag()&nbsp;throws&nbsp;JspException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;buffer&nbsp;=&nbsp;showTree();<br />
&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;pageContext.getOut().println(buffer.toString());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;catch&nbsp;(IOException&nbsp;ioe)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;ioe.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return&nbsp;super.doEndTag();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;private&nbsp;StringBuffer&nbsp;showTree(){<br />
&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb&nbsp;=&nbsp;new&nbsp;StringBuffer();<br />
&nbsp;&nbsp;&nbsp;sb.append("&lt;div&nbsp;class=\"tree\"&gt;\n");<br />
&nbsp;&nbsp;&nbsp;sb.append("&lt;script&nbsp;type=\"text/javascript\"&gt;\n");<br />
&nbsp;&nbsp;&nbsp;sb.append("&lt;!--\n");<br />
&nbsp;&nbsp;&nbsp;sb.append("createTree(Tree，1，7);\n");<br />
&nbsp;&nbsp;&nbsp;sb.append("//--&gt;\n");<br />
&nbsp;&nbsp;&nbsp;sb.append("&lt;/script&gt;\n");<br />
&nbsp;&nbsp;&nbsp;sb.append("&lt;/div&gt;\n");<br />
&nbsp;&nbsp;&nbsp;return&nbsp;sb;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;}</p>
<p>&nbsp;标签的tld如下：<br />
&nbsp;&lt;?xml&nbsp;version="1.0"&nbsp;encoding="ISO-8859-1"&nbsp;?&gt;<br />
&nbsp;&lt;!DOCTYPE&nbsp;taglib<br />
&nbsp;&nbsp;&nbsp;PUBLIC&nbsp;"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;JSP&nbsp;Tag&nbsp;Library&nbsp;1.2//EN"<br />
&nbsp;&nbsp;&nbsp;"<a href="http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"><font color="#990000">http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd</font></a>"&gt;<br />
&nbsp;&lt;taglib&gt;<br />
&nbsp;&nbsp;&lt;tlib-version&gt;1.0&lt;/tlib-version&gt;<br />
&nbsp;&nbsp;&lt;jsp-version&gt;1.2&lt;/jsp-version&gt;<br />
&nbsp;&nbsp;&lt;short-name&gt;tree&lt;/short-name&gt;<br />
&nbsp;&nbsp;&lt;!--initTreeTag--&gt;<br />
&nbsp;&nbsp;&lt;tag&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;name&gt;init&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;tag-class&gt;com.diegoyun.web.taglibs.InitTreeTag&lt;/tag-class&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;body-content&gt;empty&lt;/body-content&gt;<br />
&nbsp;&nbsp;&lt;/tag&gt;<br />
&nbsp;&nbsp;&lt;!--ShowTreeTag--&gt;<br />
&nbsp;&nbsp;&lt;tag&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;name&gt;show&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;tag-class&gt;com.diegoyun.web.taglibs.ShowTreeTag&lt;/tag-class&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;body-content&gt;empty&lt;/body-content&gt;<br />
&nbsp;&nbsp;&lt;/tag&gt;<br />
&nbsp;&lt;/taglib&gt;</p>
<p>&nbsp;4）建立web过程，编写jsp进行测试。</p>
<p>&nbsp;index.jsp如下：<br />
&nbsp;&lt;%@&nbsp;page&nbsp;language="java"%&gt;<br />
&nbsp;&lt;%@&nbsp;taglib&nbsp;uri="/WEB-INF/tlds/tree.tld"&nbsp;prefix="tree"%&gt;</p>
<p><br />
&nbsp;&lt;html&gt;<br />
&nbsp;&lt;head&gt;<br />
&nbsp;&nbsp;&lt;title&gt;Tree&nbsp;example&lt;/title&gt;<br />
&nbsp;&nbsp;&lt;meta&nbsp;http-equiv="Content-Type"&nbsp;content="text/html;&nbsp;charset=iso-8859-1"&gt;<br />
&nbsp;&nbsp;&lt;link&nbsp;rel="StyleSheet"&nbsp;href="tree.css"&nbsp;type="text/css"&gt;<br />
&nbsp;&nbsp;&lt;script&nbsp;type="text/javascript"&nbsp;src="tree.js"&gt;&lt;/script&gt;<br />
&nbsp;&nbsp;&lt;tree:init/&gt;<br />
&nbsp;&lt;/head&gt;</p>
<p>&nbsp;&lt;body&gt;</p>
<p><br />
&nbsp;&lt;b&gt;Tree&nbsp;example&nbsp;:&lt;/b&gt;&lt;br&nbsp;/&gt;&lt;br&nbsp;/&gt;<br />
&nbsp;&lt;tree:show/&gt;<br />
&nbsp;&lt;br&nbsp;/&gt;&lt;br&nbsp;/&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;&lt;/body&gt;<br />
&nbsp;&lt;/html&gt;</p>
<img src ="http://www.blogjava.net/LeungXin/aggbug/152176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LeungXin/" target="_blank">梁昕</a> 2007-10-11 23:13 <a href="http://www.blogjava.net/LeungXin/articles/152176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts+Hibernate开发实践 分页的实现 </title><link>http://www.blogjava.net/LeungXin/articles/151573.html</link><dc:creator>梁昕</dc:creator><author>梁昕</author><pubDate>Tue, 09 Oct 2007 15:06:00 GMT</pubDate><guid>http://www.blogjava.net/LeungXin/articles/151573.html</guid><description><![CDATA[<p><span style="font-size: 10pt"><font face="宋体">在进行</font><font face="宋体">web应用开发的时候经常要进行分页处理，经常看到一些人在问分页处理的问题，现在我把自己的处理方法写在这儿，希望能对需要进行分页处理的朋友有所帮助。<br />
<br />
<strong>一、在struts中分页有两种结构：</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;1. 在Action中通过DAO查询出所有的记录，然后加到session或request对象中，传到客户端，由JSP进行分页。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种方法对于在数据量少的时候很方便，也不影响速度。<br />
&nbsp;&nbsp; &nbsp;2.在Action中每次通过DAO只查询出一页的记录，再传给JSP页面。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种结构对于数据量大的程序很好，但对于数据量小的情况，会增加对服务器的请求，加大服务器的负载。<br />
<strong>二、Hibernate查询</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;由于在Hibernate中直接提供了对数据库定点定量的查询方法，所以我采用的是第2种方法。<br />
<br />
如：<br />
从第1万条开始取出100条记录</font></span></p>
<table style="margin-left: 11.25pt; width: 333pt" cellspacing="0" cellpadding="0" width="444" border="1">
    <tbody>
        <tr>
            <td style="border-right: #d4d0c8; padding-right: 1.5pt; border-top: #d4d0c8; padding-left: 1.5pt; background: #e6e6e6; padding-bottom: 1.5pt; border-left: #d4d0c8; width: 333pt; padding-top: 1.5pt; border-bottom: #d4d0c8" width="444">
            <pre style="layout-grid-mode: char; line-height: 150%"><font size="2"><font face="黑体">Query q = session.createQuery("from Cat as c");<br />
            q.setFirstResult(10000);<br />
            q.setMaxResults(100);<br />
            List l = q.list();</font></font></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><span style="font-size: 10pt"><br />
<font face="宋体"><strong>三、具体实现</strong><br />
<br />
<strong>1.Pager类</strong></font></span></p>
<table style="margin-left: 11.25pt; width: 333pt" cellspacing="0" cellpadding="0" width="444" border="1">
    <tbody>
        <tr>
            <td style="border-right: #d4d0c8; padding-right: 1.5pt; border-top: #d4d0c8; padding-left: 1.5pt; background: #e6e6e6; padding-bottom: 1.5pt; border-left: #d4d0c8; width: 333pt; padding-top: 1.5pt; border-bottom: #d4d0c8" width="444">
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">package com.jpcf.db.helper;</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">import java.math.*;</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">public class Pager {<br />
            &nbsp; private int totalRows; //总行数<br />
            &nbsp; private int pageSize = 10; //每页显示的行数<br />
            &nbsp; private int currentPage; //当前页号<br />
            &nbsp; private int totalPages; //总页数<br />
            &nbsp; private int startRow; //当前页在数据库中的起始行</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public Pager() {<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public Pager(int _totalRows) {<br />
            &nbsp;&nbsp;&nbsp; totalRows = _totalRows;<br />
            &nbsp;&nbsp;&nbsp; totalPages=totalRows/pageSize;<br />
            &nbsp;&nbsp;&nbsp; int mod=totalRows%pageSize;<br />
            &nbsp;&nbsp;&nbsp; if(mod&gt;0){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totalPages++;<br />
            &nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; currentPage = 1;<br />
            &nbsp;&nbsp;&nbsp; startRow = 0;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public int getStartRow() {<br />
            &nbsp;&nbsp;&nbsp; return startRow;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;public int getTotalPages() {<br />
            &nbsp;&nbsp;&nbsp; return totalPages;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public int getCurrentPage() {<br />
            &nbsp;&nbsp;&nbsp; return currentPage;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public int getPageSize() {<br />
            &nbsp;&nbsp;&nbsp; return pageSize;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public void setTotalRows(int totalRows) {<br />
            &nbsp;&nbsp;&nbsp; this.totalRows = totalRows;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public void setStartRow(int startRow) {<br />
            &nbsp;&nbsp;&nbsp; this.startRow = startRow;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public void setTotalPages(int totalPages) {<br />
            &nbsp;&nbsp;&nbsp; this.totalPages = totalPages;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public void setCurrentPage(int currentPage) {<br />
            &nbsp;&nbsp;&nbsp; this.currentPage = currentPage;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public void setPageSize(int pageSize) {<br />
            &nbsp;&nbsp;&nbsp; this.pageSize = pageSize;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public int getTotalRows() {<br />
            &nbsp;&nbsp;&nbsp; return totalRows;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public void first() {&nbsp; //首页<br />
            &nbsp;&nbsp;&nbsp; currentPage = 1;<br />
            &nbsp;&nbsp;&nbsp; startRow = 0;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public void previous() {&nbsp; //上一页<br />
            &nbsp;&nbsp;&nbsp; if (currentPage == 1) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
            &nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; currentPage--;<br />
            &nbsp;&nbsp;&nbsp; startRow = (currentPage - 1) * pageSize;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public void next() {&nbsp;&nbsp; //下一页<br />
            &nbsp;&nbsp;&nbsp; if (currentPage &lt; totalPages) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currentPage++;<br />
            &nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; startRow = (currentPage - 1) * pageSize;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public void last() {&nbsp; //尾页<br />
            &nbsp;&nbsp;&nbsp; currentPage = totalPages;<br />
            &nbsp;&nbsp;&nbsp; startRow = (currentPage - 1) * pageSize;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public void refresh(int _currentPage) {<br />
            &nbsp;&nbsp;&nbsp; currentPage = _currentPage;<br />
            &nbsp;&nbsp;&nbsp; if (currentPage &gt; totalPages) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; last();<br />
            &nbsp;&nbsp;&nbsp; }<br />
            &nbsp; }</font></span></p>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">}</font></font></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><span style="font-size: 10pt"><br />
<font face="宋体">Pager类用于计算首页、前一页、下一页、尾页的在数据库中的起始行，当前的页码。<br />
<br />
<strong>2.PagerHelp类</strong></font></span></p>
<table style="margin-left: 11.25pt; width: 378pt" cellspacing="0" cellpadding="0" width="504" border="1">
    <tbody>
        <tr>
            <td style="border-right: #d4d0c8; padding-right: 1.5pt; border-top: #d4d0c8; padding-left: 1.5pt; background: #e6e6e6; padding-bottom: 1.5pt; border-left: #d4d0c8; width: 378pt; padding-top: 1.5pt; border-bottom: #d4d0c8" width="504">
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">package com.jpcf.db.helper;</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">import javax.servlet.http.*;</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">public class PagerHelper {</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public static Pager getPager(HttpServletRequest httpServletRequest,<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; int totalRows) {</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;&nbsp; //定义pager对象，用于传到页面<br />
            &nbsp;&nbsp;&nbsp; Pager pager = new Pager(totalRows);</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;&nbsp; //从Request对象中获取当前页号<br />
            &nbsp;&nbsp;&nbsp; String currentPage = httpServletRequest.getParameter("currentPage");</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;&nbsp; //如果当前页号为空，表示为首次查询该页<br />
            &nbsp;&nbsp;&nbsp; //如果不为空，则刷新pager对象，输入当前页号等信息<br />
            &nbsp;&nbsp;&nbsp; if (currentPage != null) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pager.refresh(Integer.parseInt(currentPage));<br />
            &nbsp;&nbsp;&nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;&nbsp; //获取当前执行的方法，首页，前一页，后一页，尾页。<br />
            &nbsp;&nbsp;&nbsp; String pagerMethod = httpServletRequest.getParameter("pageMethod");</font></span></p>
            <pre style="layout-grid-mode: char"><font face="黑体" size="2">if (pagerMethod != null) {</font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><font face="黑体"> if (pagerMethod.equals("first")) {</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><font face="黑体"> pager.first();</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><font face="黑体"> } else if (pagerMethod.equals("previous")) {</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><font face="黑体"> pager.previous();</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><font face="黑体"> } else if (pagerMethod.equals("next")) {</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><font face="黑体"> pager.next();</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><font face="黑体"> } else if (pagerMethod.equals("last")) {"</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><font face="黑体"> pager.last();</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><font face="黑体"> }</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;</span><font face="黑体"> }</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;</span><font face="黑体"> return pager;</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font>&nbsp;<font face="黑体"> }</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">}</font></font></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><span style="font-size: 10pt"><br />
<font face="宋体">PageHelper这个类，我不用说应该也知道用来干嘛了<br />
<br />
<strong>3.DAO类</strong></font></span></p>
<table style="margin-left: 11.25pt; width: 360pt" cellspacing="0" cellpadding="0" width="480" border="1">
    <tbody>
        <tr>
            <td style="border-right: #d4d0c8; padding-right: 1.5pt; border-top: #d4d0c8; padding-left: 1.5pt; background: #e6e6e6; padding-bottom: 1.5pt; border-left: #d4d0c8; width: 360pt; padding-top: 1.5pt; border-bottom: #d4d0c8" width="480">
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">package com.jpcf.db.dao;</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">import com.jpcf.db.model.*;<br />
            import com.jpcf.db.helper.HibernateUtil;<br />
            import net.sf.hibernate.*;<br />
            import java.util.*;<br />
            import com.jpcf.db.controller.*;</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">public class VehiclePropertyDAO {</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public Collection findWithPage(int pageSize, int startRow) throws<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateException {<br />
            &nbsp;&nbsp;&nbsp; Collection vehicleList = null;<br />
            &nbsp;&nbsp;&nbsp; Transaction tx = null;<br />
            &nbsp;&nbsp;&nbsp; try {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session session = HibernateUtil.currentSession();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx = session.beginTransaction();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query q = session.createQuery("<span style="color: blue">from VehicleProperty vp</span>");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.setFirstResult(startRow);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.setMaxResults(pageSize);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vehicleList = q.list();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.commit();<br />
            &nbsp;&nbsp;&nbsp; } catch (HibernateException he) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tx != null) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.rollback();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw he;<br />
            &nbsp;&nbsp;&nbsp; } finally {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateUtil.closeSession();<br />
            &nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; return vehicleList;<br />
            &nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp; public int getRows(String query) throws<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateException {<br />
            &nbsp;&nbsp;&nbsp; int totalRows = 0;<br />
            &nbsp;&nbsp;&nbsp; Transaction tx = null;<br />
            &nbsp;&nbsp;&nbsp; try {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session session = HibernateUtil.currentSession();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx = session.beginTransaction();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totalRows = ((Integer) session.iterate(query).next()).<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intValue();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.commit();<br />
            &nbsp;&nbsp;&nbsp; } catch (HibernateException he) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tx != null) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.rollback();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw he;<br />
            &nbsp;&nbsp;&nbsp; } finally {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateUtil.closeSession();<br />
            &nbsp;&nbsp;&nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;&nbsp; return totalRows;<br />
            &nbsp; }</font></span></p>
            <pre style="layout-grid-mode: char"><font face="黑体" size="2">}</font></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><span style="font-size: 10pt"><br />
<font face="宋体">DAO类我就贴这些分页需要的代码了。<br />
<span style="color: blue">&#8220;from VehicleProperty vp&#8221;</span></font><font face="宋体"><span style="color: black">也可以用一个参数传进来，有兴趣的自己改一下吧<br />
</span><br />
<strong>4.Action</strong></font><strong><br />
<font face="宋体">下面是在Action中用到的代码：/</font></span></p>
<table style="margin-left: 11.25pt; width: 441pt" cellspacing="0" cellpadding="0" width="588" border="1">
    <tbody>
        <tr>
            <td style="border-right: #d4d0c8; padding-right: 1.5pt; border-top: #d4d0c8; padding-left: 1.5pt; background: #e6e6e6; padding-bottom: 1.5pt; border-left: #d4d0c8; width: 441pt; padding-top: 1.5pt; border-bottom: #d4d0c8" width="588">
            <pre style="layout-grid-mode: char"><font size="2">&nbsp;<font face="黑体"> public ActionForward queryWithPage(ActionMapping actionMapping,</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&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;</span><font face="黑体"> ActionForm actionForm,</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&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;</span><font face="黑体"> HttpServletRequest httpServletRequest,</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&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;</span><font face="黑体">HttpServletResponse httpServletresponse) {</font></font></pre>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;&nbsp; Collection clInfos = null;//用于输出到页面的记录集合</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;&nbsp; int totalRows;//记录总行数</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;&nbsp; VehiclePropertyDAO vehicleDAO = new VehiclePropertyDAO();</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;&nbsp; //取得当前表中的总行数<br />
            &nbsp;&nbsp;&nbsp; try {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totalRows = vehicleDAO.getRows("<span style="color: green">select count(*) from VehicleProperty</span>");<br />
            &nbsp;&nbsp;&nbsp; } catch (Exception ex) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; servlet.log(ex.toString());<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return actionMapping.findForward(Constants.FAILURE);<br />
            &nbsp;&nbsp;&nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;&nbsp; //通过PagerHelper类来获取用于输出到页面的pager对象<br />
            &nbsp;&nbsp;&nbsp; Pager pager=PagerHelper.getPager(httpServletRequest,totalRows);</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;&nbsp; //取出从startRow开始的pageSize行记录<br />
            &nbsp;&nbsp;&nbsp; try {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clInfos = vehicleDAO.findWithPage(pager.getPageSize(), pager.getStartRow());<br />
            &nbsp;&nbsp;&nbsp; } catch (Exception ex) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; servlet.log(ex.toString());<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return actionMapping.findForward(Constants.FAILURE);<br />
            &nbsp;&nbsp;&nbsp; }</font></span></p>
            <p style="layout-grid-mode: char"><span style="font-size: 10pt"><font face="宋体">&nbsp;&nbsp;&nbsp; //把输出的记录集和pager对象保存到request对象中<br />
            &nbsp;&nbsp;&nbsp; httpServletRequest.setAttribute("CLINFOS", clInfos);<br />
            &nbsp;&nbsp;&nbsp; httpServletRequest.setAttribute("PAGER", pager);</font></span></p>
            <pre style="layout-grid-mode: char; text-indent: 20pt"><font face="黑体" size="2">return actionMapping.findForward(Constants.SUCCESS);<br />
            }</font></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><span style="font-size: 10pt"><font face="宋体">查询语句<span style="color: green">select count(*) from VehicleProperty</span></font><font face="宋体"> 也可以换成你需要的任意的条件（select count(*) from VehicleProperty where ..）<br />
<br />
<strong>5.JSP页面使用</strong></font><strong><br />
<font face="宋体">下面就是在JSP中的应用了：</font></span></p>
<table style="margin-left: 11.25pt; width: 450pt" cellspacing="0" cellpadding="0" width="600" border="1">
    <tbody>
        <tr>
            <td style="border-right: #d4d0c8; padding-right: 1.5pt; border-top: #d4d0c8; padding-left: 1.5pt; background: #e6e6e6; padding-bottom: 1.5pt; border-left: #d4d0c8; width: 450pt; padding-top: 1.5pt; border-bottom: #d4d0c8" width="600">
            <pre style="layout-grid-mode: char"><font face="黑体" size="2">&lt;td colspan="8" align="right" class="head"&gt;</font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;</span><font face="黑体"> 第&lt;bean:write name="PAGER" property="currentPage"/&gt;页&amp;nbsp;</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;</span><font face="黑体"> 共&lt;bean:write name="PAGER" property="totalPages"/&gt;页&amp;nbsp;</font></font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;</span></font><font face="黑体" size="2"> &lt;html:link action<span style="color: purple">="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;amp;pageMethod=first" <br />
            paramName="PAGER" paramProperty="currentPage" paramId="currentPage"&gt;首页&lt;/html:link&gt;</font></span></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;</span></font><font face="黑体" size="2"> &lt;html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;amp;pageMethod=previous"<br />
            paramName="PAGER" paramProperty="currentPage" paramId="currentPage"&gt;上一页&lt;/html:link&gt;</font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;</span></font><font face="黑体" size="2"> &lt;html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;amp;pageMethod=next" <br />
            paramName="PAGER" paramProperty="currentPage" paramId="currentPage"&gt;下一页&lt;/html:link&gt;</font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&nbsp; </font><span style="font-family: 'Courier New'">&nbsp;&nbsp;</span><font face="黑体"> &lt;html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;amp;pageMethod=last" </font></font></pre>
            <pre style="layout-grid-mode: char"><font face="黑体" size="2">paramName="PAGER" paramProperty="currentPage" paramId="currentPage"&gt;尾页&lt;/html:link&gt;</font></pre>
            <pre style="layout-grid-mode: char"><font size="2"><font face="黑体">&lt;/td&gt;</font></font></pre>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 20.25pt"><span style="font-size: 10pt"><br />
<font face="宋体"><span style="color: purple">解释一下这一行:<br />
"/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;amp;pageMethod=first<br />
method=queryWithPage </span><span style="color: black">是由于我的Action继承的是DispatchAction,需要一个method参数</span></font><span style="color: purple"><br />
<font face="宋体">pageMethod=first </font></span><font face="宋体"><span style="color: black">是用来在PageHelper类中判断执行哪个操作<br />
<br />
四、总结<br />
<br />
我做的这个也只是一个借鉴，还有很多没有实现的，比如还可以加一下 go 直接到第n页的功能。<br />
<br />
其实最关键的是把</span><span style="color: blue">当前页号</span><span style="color: black">和要执行的是</span><span style="color: blue">功能(上一页，下一页)的参数</span><span style="color: black">从页面传进来，在Action中就可以根据这两个参数去取下一个页面上要显示的记录集了。</span></font></span></p>
</strong></strong>
<img src ="http://www.blogjava.net/LeungXin/aggbug/151573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LeungXin/" target="_blank">梁昕</a> 2007-10-09 23:06 <a href="http://www.blogjava.net/LeungXin/articles/151573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss 的一些配置(端口,虚拟目录,虚拟主机,中文问题,数据库连接)  </title><link>http://www.blogjava.net/LeungXin/articles/151572.html</link><dc:creator>梁昕</dc:creator><author>梁昕</author><pubDate>Tue, 09 Oct 2007 15:01:00 GMT</pubDate><guid>http://www.blogjava.net/LeungXin/articles/151572.html</guid><description><![CDATA[<div class="postText">
<p>1、访问端口配置<br />
编辑%jboss-4.0.2%\server\default\deploy\jbossweb-tomcat55.sar\server.xml<br />
将8080改为你希望访问的端口（8888）<br />
&nbsp;&nbsp;&nbsp; &lt;!-- A HTTP/1.1 Connector on port 8080 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Connector port="8888" address="${jboss.bind.address}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="250" strategy="ms" maxHttpHeaderSize="8192"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emptySessionPath="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="100"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/&gt;<br />
<br />
2、虚拟目录配置：<br />
编辑%jboss-4.0.2%\server\default\deploy\jbossweb-tomcat55.sar\server.xml<br />
在&lt;/Host&gt;之前增加：<br />
&nbsp;&lt;Context path="/test" docBase="F:\\test" debug="1" reloadable="true" override="true" crossContext="true"/&gt;<br />
&nbsp;其中path 为虚拟目录名，docBase为硬盘路径（可为绝对路径）reloadable为类变更时是否重新加载<br />
<br />
3、解决附件汉字问题：<br />
a.编辑<br />
%jboss-4.0.2%\server\default\deploy\jbossweb-tomcat55.sar\server.xml<br />
在Connector 属性最后增加：URIEncoding="UTF-8" <br />
&nbsp;&lt;!-- A HTTP/1.1 Connector on port 8080 --&gt;<br />
&nbsp; &lt;Connector port="8888" address="$"<br />
&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="250" strategy="ms" maxHttpHeaderSize="8192"<br />
&nbsp;&nbsp;&nbsp;&nbsp; emptySessionPath="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="100"<br />
&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/&gt;<br />
b.页面处理<br />
将生成的附件名称进行编码转换：<br />
&lt;%<br />
String n2="Redhat9中文官方文档.rar";<br />
n2=java.net.URLEncoder.encode(n2,"UTF-8");<br />
%&gt;<br />
&lt;a href="Redhat9"&gt;http://192.168.1.112:8080/zlsf/&lt;%=n2%&gt;"&gt;Redhat9中文官方文档&lt;/a&gt;<br />
<br />
4、解决汉字问题。<br />
在：项目/WEB-INFweb.xml中增加：<br />
&nbsp;&lt;filter&gt;<br />
&nbsp;&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />
&nbsp;&lt;filter-class&gt;filters.SetCharacterEncodingFilter&lt;/filter-class&gt;<br />
&nbsp;&lt;init-param&gt;<br />
&nbsp;&lt;param-name&gt;encoding&lt;/param-name&gt;<br />
&nbsp;&lt;param-value&gt;GBK&lt;/param-value&gt;<br />
&nbsp;&lt;/init-param&gt;<br />
&nbsp;&lt;/filter&gt;<br />
&nbsp;&lt;filter-mapping&gt;<br />
&nbsp;&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />
&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;<br />
&nbsp;其中<br />
&lt;param-value&gt;GBK&lt;/param-value&gt; 这里要设置GBK，而不是UTF8。为了解决标单提交后的中文问题。<br />
filters.SetCharacterEncodingFilter&nbsp; 类文件在TOMCAT lib 目录下filters.jar文件中。<br />
你只需要把filters.jar放入你应用目录下的LIB中即可。<br />
<br />
5、虚拟主机配置<br />
a.编辑<br />
%jboss-4.0.2%\server\default\deploy\jbossweb-tomcat55.sar\server.xml<br />
在 &lt;/Engine&gt;之前添加：<br />
&lt;Host name="<a href="http://www.ytiic.com/">www.ytiic.com</a>"&gt;<br />
&lt;Alias&gt;www2.ytiic.com&lt;/Alias&gt;--〉别名，通过这个名字可以访问<a href="http://www.ytiic.com/">www.ytiic.com</a>下的应用。<br />
&lt;Alias&gt;ytiic.com&lt;/Alias&gt;--〉同上<br />
&lt;!-- Default context parameters --&gt;<br />
&lt;DefaultContext cookies="true" crossContext="true" override="true"/&gt;<br />
&lt;/Host&gt;<br />
b.在这个目录下：%jboss-4.0.2%\server\default\deploy<br />
创建一个目录：test.war(你的虚拟目录加.war)之后在其下创建WEB-INF目录<br />
在WEB-INF下创建：jboss-web.xml 文件,内容如下：<br />
&lt;jboss-web&gt;<br />
&lt;context-root&gt;/&lt;/context-root&gt; <br />
&lt;virtual-host&gt;www.ytiic.com&lt;/virtual-host&gt; <br />
&lt;/jboss-web&gt;<br />
虚拟主机配置完成！<br />
当jboss启动后，会自动对应2个配置文件中的虚拟主机名。<br />
<br />
6、数据库配置：<br />
去这个 %jboss-4.0.2%\docs\examples\jca 目录找一个你想用的数据库文件： <br />
拷贝到%jboss-4.0.2%\server\default\deploy 下，打开编辑。<br />
在%jboss-4.0.2%\server\default\deploy目录下自己建了一个文件：<br />
test这个名字自己定义，后面需要保留。<br />
test-ds.xml<br />
内容如下：<br />
&lt; xml version="1.0" encoding="UTF-8" &gt;<br />
&lt;!-- ===================================================================== --&gt;<br />
&lt;!--&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;&nbsp; --&gt;<br />
&lt;!--&nbsp; JBoss Server Configuration&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; --&gt;<br />
&lt;!--&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;&nbsp; --&gt;<br />
&lt;!-- ===================================================================== --&gt;<br />
&lt;!-- $Id: mssql-ds.xml,v 1.3 2004/09/15 14:37:40 loubyansky Exp $ --&gt;<br />
&nbsp; &lt;!-- ======================================================================--&gt;<br />
&nbsp; &lt;!-- New ConnectionManager setup for Microsoft SQL Server 2000&nbsp; driver&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;!-- You may download the latest Microsoft JDBC driver from *Microsoft*&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;!-- <a href="http://msdn.microsoft.com/downloads/default.asp">http://msdn.microsoft.com/downloads/default.asp</a> url=/downloads/sample.asp url=/MSDN-<br />
FILES/027/001/779/msdncompositedoc.xml&amp;frame=true --&gt;<br />
&nbsp; &lt;!-- ===================================================================== --&gt;<br />
&lt;datasources&gt;<br />
&nbsp; &lt;local-tx-datasource&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;jndi-name&gt;test&lt;/jndi-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;connection-url&gt;jdbc:mysql://192.168.1.1/test&lt;/connection-url&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;driver-class&gt;org.gjt.mm.mysql.Driver&lt;/driver-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;user-name&gt;root&lt;/user-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;password&gt;password&lt;/password&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- sql to call when connection is created<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;new-connection-sql&gt;some arbitrary sql&lt;/new-connection-sql&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- The minimum connections in a pool/sub-pool. Pools are lazily constructed on first use --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;min-pool-size&gt;5&lt;/min-pool-size&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- The maximum connections in a pool/sub-pool --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;max-pool-size&gt;20&lt;/max-pool-size&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- sql to call on an existing pooled connection when it is obtained from pool <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;check-valid-connection-sql&gt;some arbitrary sql&lt;/check-valid-connection-sql&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- The time before an unused connection is destroyed --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- NOTE: This is the check period. It will be destroyed somewhere between 1x and 2x this timeout after last use--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- TEMPORARY FIX! - Disable idle connection removal, HSQLDB has a problem with not reaping threads on closed connections --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;idle-timeout-minutes&gt;1&lt;/idle-timeout-minutes&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;metadata&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type-mapping&gt;mysql&lt;/type-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/metadata&gt;<br />
&nbsp; &lt;/local-tx-datasource&gt;<br />
&lt;/datasources&gt;</p>
<p>数据库配置完成。<br />
连接数据源名为：java:/test</p>
<p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />
所有配置完成！！</p>
<p>注意问题：<br />
(1)、你的应用下的LIB库不要和%jboss-4.0.2%\server\default\lib 下的类库相冲突。<br />
(2)、数据库配置参考：%jboss-4.0.2%\docs\examples\jca&nbsp; 下的文件<br />
<br />
7、禁止文件目录列表<br />
编辑%jboss-4.0.2%\server\default\deploy\jbossweb-tomcat55.sar\conf\web.xml<br />
把listing设置为false&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;default&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;0&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;listings&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/servlet&gt; </p>
</div>
 <img src ="http://www.blogjava.net/LeungXin/aggbug/151572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LeungXin/" target="_blank">梁昕</a> 2007-10-09 23:01 <a href="http://www.blogjava.net/LeungXin/articles/151572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse启动参数大全</title><link>http://www.blogjava.net/LeungXin/articles/145443.html</link><dc:creator>梁昕</dc:creator><author>梁昕</author><pubDate>Sat, 15 Sep 2007 16:17:00 GMT</pubDate><guid>http://www.blogjava.net/LeungXin/articles/145443.html</guid><description><![CDATA[<strong style="color: black; background-color: #ffff66">Eclipse</strong> 运行命令行参数大全&nbsp; <br />
&nbsp; 包括英文版本和中文版本两种的说明, 特别需要值得一提的是那个 -nl 参数, 可以指定程序启动时所使用的语言. 例如:<br />
<strong style="color: black; background-color: #ffff66">eclipse</strong> -nl en_US<br />
将启动英文语言, 这个特性在安装了国际化语言包以后特别有用, 可以方便的切换各个语言的版本. 注意 IBM WSAD v5.1 也支持这个功能.
<p>运行 <strong style="color: black; background-color: #ffff66">Eclipse</strong><br />
将 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 驱动程序安装（解压缩）到某个目录（例如，c:\<strong style="color: black; background-color: #ffff66">eclipse</strong>）中之后，通过运行顶级安装目录中的 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 可执行文件来启动"工作台"。在 Windows 系统上，该可执行文件称为 <strong style="color: black; background-color: #ffff66">eclipse</strong>.exe，而在 Linux 系统上称为 <strong style="color: black; background-color: #ffff66">eclipse</strong>。注意：下列讨论描述 Windows 系统上的设置。Linux 上的设置是相似的。</p>
<p>如果您没有另行指定，则平台将缺省工作区目录创建为可执行文件的兄弟目录（例如 c:\<strong style="color: black; background-color: #ffff66">eclipse</strong>\workspace）。此工作区目录用作项目的缺省内容区，还用于保存任何必需的元数据。要进行共享安装或多工作区安装，应明确指出工作区的位置而不是使用缺省值。有两种控制工作区位置的方法：使用当前工作目录或使用 -data 命令行自变量。</p>
<p>将工作区位置设置为在当前工作目录内<br />
在此方案中，工作区位置将是当前工作目录中称为 workspace 的目录。</p>
<p>实现此目的最容易的方法可能是使用下列步骤来创建快捷方式：</p>
<p>导航到 Windows 资源管理器中的 <strong style="color: black; background-color: #ffff66">eclipse</strong>.exe 并使用右键拖动来创建 <strong style="color: black; background-color: #ffff66">eclipse</strong>.exe 的快捷方式。 <br />
编辑快捷方式的属性，以使启动位置：字段标识工作区位置的父目录（例如，c:\users\robert）。 <br />
关闭属性对话框并双击快捷方式（如果提供的目录为 c:\users\robert，则工作区位置将为 c:\users\robert\workspace）。 <br />
当然，您也可以使用命令提示符（通过将目录切换为工作区父目录然后运行 <strong style="color: black; background-color: #ffff66">eclipse</strong>.exe）来获得同样的效果。</p>
<p>使用 -data 设置工作区的特定位置<br />
要使用 -data 命令行自变量，只要将 -data your_workspace_location（例如，-data c:\users\robert\myworkspace）添加至快捷方式属性中的目标字段或显式地将它包括在命令行上。</p>
<p>使用 -vm 设置 java VM<br />
建议显式指定在运行 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 时要使用哪个 Java VM。使用 -vm 命令行自变量（例如，-vm c:\jre\bin\javaw.exe）可以实现此目的。如果不使用 -vm，则 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 将使用在 O/S 路径上找到的一个 Java VM。当安装其它产品时，它们可更改您的路径，导致在下一次启动 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 时使用另一 Java VM。</p>
<p>运行 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 中的高级主题<br />
<strong style="color: black; background-color: #ffff66">Eclipse</strong> 可执行文件及平台本身提供了人们感兴趣的开发或调试 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 各部件的许多执行选项。运行 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 可执行文件的一般格式是：</p>
<p><strong style="color: black; background-color: #ffff66">eclipse</strong> [platform options] [-vmargs [Java VM arguments]]<br />
<strong style="color: black; background-color: #ffff66">Eclipse</strong> <strong style="color: black; background-color: #a0ffff">启动参数</strong>&nbsp; 命令 描述&nbsp; 原因 <br />
-arch architecture<br />
&nbsp;定义 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台在其上运行的处理器体系结构。<strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台通常使用 Java os.arch 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台使用的值。此处指定的值可作为 BootLoader.getOSArch() 用于插件。示例值有："x86"、"sparc"、"PA-RISC"和"ppc"。 2.0 <br />
-application applicationId<br />
&nbsp;要运行的应用程序。应用程序由向 org.<strong style="color: black; background-color: #ffff66">eclipse</strong>.core.runtime.applications 扩展点提供扩展的插件来声明。通常不需要此自变量。如果指定了此项，则该值会覆盖配置提供的值。如果不指定此项，则会运行"<strong style="color: black; background-color: #ffff66">Eclipse</strong> 工作台"。 1.0 <br />
-boot bootJarURL<br />
&nbsp;（建议不使用；用 -configuration 代替；支持 1.0 兼容）。<strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台的引导插件代码（boot.jar）的位置，表示为 URL。如果指定此项，则会用它来为装入 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台引导程序类装入器的类装入器设置类路径。仅当更改 startup.jar 和 boot.jar 的相对位置时才需要它。注意，不允许使用相对 URL。&nbsp; *1.0 <br />
-classloaderproperties [file]<br />
&nbsp;如果指定的话，则使用给定位置处的类装入器属性文件来激活平台类类装入器增强。文件自变量可以是文件路径或 URL。注意，不允许使用相对 URL。单击此处以获得更多详细信息。 2.0.2 <br />
-configuration configurationFileURL<br />
&nbsp;<strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台配置文件的位置，表示为 URL。配置文件确定 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台、可用插件集和主要功能部件的位置。注意，不允许使用相对 URL。当安装或更新 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台时配置文件被写至此位置。&nbsp; 2.0 <br />
-consolelog<br />
&nbsp;将 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台的错误日志镜像到用来运行 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 的控制台。与 -debug 组合时很方便使用。 1.0 <br />
-data workspacePath<br />
&nbsp;要运行 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台的工作区的路径。工作区位置也是项目的缺省位置。相对于从中启动 <strong style="color: black; background-color: #ffff66">eclipse</strong> 的目录来解释相对路径。 1.0 <br />
-debug [optionsFile]<br />
&nbsp;将平台置于调试方式，并从给定位置处的文件装入调试选项（如果指定的话）。此文件指示哪些调试点可用于插件以及是否已启用它们。如果未给出文件位置，则平台在启动 <strong style="color: black; background-color: #ffff66">eclipse</strong> 的目录中查找称为".options"的文件。URL 和文件系统路径都可作为文件位置。 1.0 <br />
-dev [classpathEntries]<br />
&nbsp;将平台置于开发方式。将可选类路径条目（用逗号分隔的列表）添加至每个插件的运行时类路径。例如，当工作区包含要开发的插件时，指定 -dev bin 会为每个插件项目的名为 bin 的目录添加类路径条目，允许在其中存储最新生成的类文件。除去了冗余或不存在的类路径条目。 1.0 <br />
-endsplash params<br />
&nbsp;用于在 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台启动并运行时关闭闪屏的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0 <br />
-feature featureId<br />
&nbsp;主要功能部件的标识。主要功能部件为 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 的已启动实例提供了产品个性，并确定使用的产品定制信息。 2.0 <br />
-keyring keyringFilePath<br />
&nbsp;磁盘上授权数据库（或"密钥环"文件）的位置。此自变量必须与 -password 选项配合使用。相对于从中启动 <strong style="color: black; background-color: #ffff66">eclipse</strong> 的目录来解释相对路径。 1.0 <br />
-nl locale<br />
&nbsp;定义 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台在其上运行的语言环境的名称。<strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台通常自动计算最佳设置。如果在此处指定该项，则这是 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台使用的值。此处指定的值可作为 BootLoader.getNL() 用于插件。示例值有："en_US"和"fr_FR_EURO"。 2.0 <br />
-nolazyregistrycacheloading<br />
&nbsp;取消激活装入优化的平台插件注册表高速缓存。缺省情况下，仅当需要时才从注册表高速缓存（可用时）中装入扩展的配置元素，以减少内存占用。此选项将在启动时强制完全装入注册表高速缓存。 2.1 <br />
-noregistrycache<br />
&nbsp;绕过读写内部插件注册表高速缓存文件。 2.0 <br />
-nosplash<br />
&nbsp;运行平台而不显示闪屏。 1.0 <br />
-os operatingSystem<br />
&nbsp;定义 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台在其上运行的操作系统。<strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台使用的值。此处指定的值可作为 BootLoader.getOS() 用于插件，并用于解析插件清单文件中提及的路径中 $os$ 变量的出现。示例值有："win32"、"linux"、"hpux"、"solaris"和"aix"。 1.0 <br />
-password password<br />
&nbsp;授权数据库的密码。与 -keyring 选项配合使用。 1.0 <br />
-perspective perspectiveId<br />
&nbsp;启动时要在活动工作台窗口中打开的透视图。如果没有指定该参数，则将打开关闭时活动的透视图。 1.0 <br />
-plugincustomization&nbsp;&nbsp; propertiesFile<br />
&nbsp;包含插件首选项缺省设置的属性文件的位置。这些缺省设置覆盖在主要功能部件中指定的缺省设置。相对于从中启动 <strong style="color: black; background-color: #ffff66">eclipse</strong> 的目录来解释相对路径。 2.0 <br />
-plugins pluginsFileURL<br />
&nbsp;（建议不使用；用 -configuration 代替；支持 1.0 兼容）。 指定 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台查找插件的文件的位置，表示为 URL。该文件为属性文件格式，其中键是任意用户定义名称，值是指向 plugin.xml 文件的显式路径或指向包含插件的目录的路径的用逗号分隔的列表。注意，不允许使用相对 URL。如果指定此项，则此选项会导致创建适当的临时配置。 *1.0 <br />
-refresh <br />
&nbsp;启动时执行工作区的全局刷新的选项。这将使从上次平台运行以来在文件系统中所做的任何更改一致。 1.0 <br />
-showlocation <br />
&nbsp;用于在窗口标题栏中显示工作区的位置的选项。在发行版 2.0 中，此选项仅与 -data 命令行自变量一起使用。 2.0 <br />
-showsplash params<br />
&nbsp;用于显示闪屏（由可执行的 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台启动器执行）的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0 <br />
-vm vmPath<br />
&nbsp;要用来运行 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台的"Java 运行时环境"（JRE）的位置。如果不指定此项，则 JRE 位于 jre（它是 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 可执行文件的兄弟目录）。相对于从中启动 <strong style="color: black; background-color: #ffff66">eclipse</strong> 的目录来解释相对路径。 1.0 <br />
-ws windowSystem<br />
&nbsp;定义 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台在其上运行的 Windows 系统。<strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 平台使用的值。此处指定的值可作为 BootLoader.getWS() 用于插件、用于配置 SWT 以及用于解析插件清单文件中提及的路径中 $ws$ 变量的出现。示例值有："win32"、"motif"和"gtk"。 1.0 </p>
<p>将 -vmargs 条目后面的所有自变量（但不包括 -vmargs）作为虚拟机自变量（即，在要运行的类的前面）直接传递到所指示的 Java VM。注意：如果 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 启动在 Java vm 自变量（-vmargs）之后提供的自变量（例如，-data），则 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 将不会启动并且您将接收到"JVM 已终止。出口代码为 1"的错误。</p>
<p>在不同的 VM 上运行 <br />
在 J9 上运行 <strong style="color: black; background-color: #ffff66">Eclipse</strong><br />
当在 J9 版本 1.5 上运行 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 时，建议使用以下 VM 选项： </p>
<p><strong style="color: black; background-color: #ffff66">eclipse</strong>.exe [<strong style="color: black; background-color: #ffff66">eclipse</strong> arguments] -vm path_to_j9w.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -vmargs -ms:32 -mm:2048 -mo:32768 -moi:32768 -mca:32 -mco:128 -mx:2000000<br />
当在 J9 版本 2.0 上运行 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 时，J9W 选择的缺省自变量应为合适的选项。但是，要覆盖 <strong style="color: black; background-color: #ffff66">Eclipse</strong> 可执行文件以内部方式自动设置的参数，必须指定 -vmargs 不带任何参数，如下所示： </p>
<p><strong style="color: black; background-color: #ffff66">eclipse</strong>.exe [<strong style="color: black; background-color: #ffff66">eclipse</strong> arguments] -vm path_to_j9w.exe -vmargs<br />
有关进一步信息，参考 J9 VM 文档和帮助。</p>
<p>在 IBM Developer Kit, Java(TM) Technology Edition VM 上运行 <strong style="color: black; background-color: #ffff66">Eclipse</strong><br />
IBM Developer Kit, Java(TM) Technology Edition 1.3 Linux 的缺省 VM 设置适合进行初期研究工作，但在进行大型开发时是不够的。对于大型开发，应修改 VM 自变量以使有更多的堆可用。例如，下列设置将允许 Java 堆增大为 256MB：<br />
<br />
<strong style="color: black; background-color: #ffff66">eclipse</strong>启动<strong style="color: black; background-color: #99ff99">参数</strong>设置，加大<strong style="color: black; background-color: #a0ffff">内存</strong>使用率，避免出现<strong style="color: black; background-color: #a0ffff">内存</strong>不足<br />
<br />
<strong style="color: black; background-color: #ffff66">eclipse</strong>.exe -vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M -Xms64M -Xmx512M<img style="cursor: pointer" onclick="javascript:window.open(this.src);" height="1" src="http://www.zaoxue.com/Article/readcourse/bianchengwendang/Java/down_info.asp?id=37734" width="1" onload="return imgzoom(this,550)"  alt="" /><br />
<br />
速度非常快，也能解决eclipse工程目录视图显示不出Java文件的刷新问题！</p>
<img src ="http://www.blogjava.net/LeungXin/aggbug/145443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LeungXin/" target="_blank">梁昕</a> 2007-09-16 00:17 <a href="http://www.blogjava.net/LeungXin/articles/145443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse中常用的快捷键</title><link>http://www.blogjava.net/LeungXin/articles/145442.html</link><dc:creator>梁昕</dc:creator><author>梁昕</author><pubDate>Sat, 15 Sep 2007 16:14:00 GMT</pubDate><guid>http://www.blogjava.net/LeungXin/articles/145442.html</guid><description><![CDATA[<p>Ctrl+1 快速修复(最经典的快捷键,就不用多说了)</p>
<p>Ctrl+D: 删除当前行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>Ctrl+Alt+&#8595; 复制当前行到下一行(复制增加)</p>
<p>Ctrl+Alt+&#8593; 复制当前行到上一行(复制增加)</p>
<p>Alt+&#8595;&nbsp; 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)</p>
<p>Alt+&#8593;&nbsp; &nbsp;当前行和上面一行交互位置(同上)</p>
<p>Alt+&#8592;&nbsp; 前一个编辑的页面</p>
<p>Alt+&#8594;&nbsp; 下一个编辑的页面(当然是针对上面那条来说了)</p>
<p>Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性</p>
<p>Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)</p>
<p>Shift+Ctrl+Enter 在当前行插入空行(原理同上条)</p>
<p>Ctrl+Q&nbsp;&nbsp; 定位到最后编辑的地方</p>
<p>Ctrl+L&nbsp; 定位在某行&nbsp; (对于程序超过100的人就有福音了)</p>
<p>Ctrl+M 最大化当前的Edit或View (再按则反之)</p>
<p>Ctrl+/&nbsp;&nbsp; 注释当前行,再按则取消注释</p>
<p>Ctrl+O&nbsp;&nbsp; 快速显示 OutLine</p>
<p>Ctrl+T&nbsp;&nbsp; 快速显示当前类的继承结构</p>
<p>Ctrl+W&nbsp; 关闭当前Editer</p>
<p>Ctrl+K&nbsp;&nbsp; 参照选中的Word快速定位到下一个</p>
<p>Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)</p>
<p>Ctrl+/(小键盘) 折叠当前类中的所有代码</p>
<p>Ctrl+&#215;(小键盘) 展开当前类中的所有代码</p>
<p>Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)</p>
<p>Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)</p>
<p>Ctrl+J&nbsp; 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)</p>
<p>Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)</p>
<p>Ctrl+Shift+F4 关闭所有打开的Editer</p>
<p>Ctrl+Shift+X&nbsp;&nbsp; 把当前选中的文本全部变味小写</p>
<p>Ctrl+Shift+Y&nbsp;&nbsp; 把当前选中的文本全部变为小写</p>
<p>Ctrl+Shift+F&nbsp; 格式化当前代码</p>
<p>Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)</p>
<p>下面的快捷键是<font color="#0000ff">重构</font>里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)</p>
<p>Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)</p>
<p>Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)</p>
<p>Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)</p>
<p>Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)</p>
<p>Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)</p>
<p>Alt+Shift+I 合并变量(可能这样说有点不妥Inline) </p>
<p>Alt+Shift+V 移动函数和变量(不怎么常用)</p>
<p>Alt+Shift+Z 重构的后悔药(Undo)</p>
<p>Ctrl+Shift+U 选择选中的文字后非常类似于UE的列表查询</p>
 <img src ="http://www.blogjava.net/LeungXin/aggbug/145442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LeungXin/" target="_blank">梁昕</a> 2007-09-16 00:14 <a href="http://www.blogjava.net/LeungXin/articles/145442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2与Struts1的对比</title><link>http://www.blogjava.net/LeungXin/articles/78426.html</link><dc:creator>梁昕</dc:creator><author>梁昕</author><pubDate>Wed, 01 Nov 2006 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/LeungXin/articles/78426.html</guid><description><![CDATA[
		<table class="confluenceTable" style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; BORDER-LEFT: 1px solid; BORDER-BOTTOM: 1px solid" bordercolor="#000000" cellspacing="1" bgcolor="#c0c0c0">
				<tbody>
						<tr>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#000000">
										<font size="2">特性 </font>
								</th>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#000000">
										<font size="2">Struts 1 </font>
								</th>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#000000">
										<font size="2">Struts 2 </font>
								</th>
						</tr>
						<tr>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Action 类</font>
								</th>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<p>
												<font size="2">Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。</font>
										</p>
								</td>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<p>
												<font size="2">Struts 2 Action类可以实现一个Action接口，也可实现其他接口，使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的，任何有execute标识的POJO对象都可以用作Struts2的Action对象。</font>
										</p>
								</td>
						</tr>
						<tr>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">线程模式</font>
								</th>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts1 Action是单例模式并且必须是线程安全的，因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事，并且要在开发时特别小心。Action资源必须是线程安全的或同步的。</font>
								</td>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts2 Action对象为每一个请求产生一个实例，因此没有线程安全问题。（实际上，servlet容器给每个请求产生许多可丢弃的对象，并且不会导致性能和垃圾回收问题）</font>
								</td>
						</tr>
						<tr>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Servlet 依赖 </font>
								</th>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。</font>
								</td>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts 2 Action不依赖于容器，允许Action脱离容器单独被测试。如果需要，Struts2 Action仍然可以访问初始的request和response。但是，其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。</font>
								</td>
						</tr>
						<tr>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">可测性</font>
								</th>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">测试Struts1 Action的一个主要问题是execute方法暴露了servlet API（这使得测试要依赖于容器）。一个第三方扩展－－Struts TestCase－－提供了一套Struts1的模拟对象（来进行测试）。</font>
								</td>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts 2 Action可以通过初始化、设置属性、调用方法来测试，“依赖注入”支持也使测试更容易。</font>
								</td>
						</tr>
						<tr>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">捕获输入</font>
								</th>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm，开发者经常创建多余的类捕获输入。动态Bean（DynaBeans）可以作为创建传统ActionForm的选择，但是，开发者可能是在重新描述(创建)已经存在的JavaBean（仍然会导致有冗余的javabean）。<br clear="all" />　</font>
								</td>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts 2直接使用Action属性作为输入属性，消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型，包括业务对象，能够用作输入/输出对象。这种ModelDriven 特性简化了taglib对POJO输入对象的引用。</font>
								</td>
						</tr>
						<tr>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">表达式语言</font>
								</th>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts1 整合了JSTL，因此使用JSTL EL。这种EL有基本对象图遍历，但是对集合和索引属性的支持很弱。</font>
								</td>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts2可以使用JSTL，但是也支持一个更强大和灵活的表达式语言－－"Object Graph Notation Language" (OGNL). </font>
								</td>
						</tr>
						<tr>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">绑定值到页面（view）</font>
								</th>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts 1使用标准JSP机制把对象绑定到页面中来访问。</font>
								</td>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts 2 使用 "ValueStack"技术，使taglib能够访问值而不需要把你的页面（view）和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面（view）。<br clear="all" />　</font>
								</td>
						</tr>
						<tr>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">类型转换</font>
								</th>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器，对每一个实例来说是不可配置的。 </font>
										<p>
												<font size="2">　</font>
										</p>
								</td>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。</font>
								</td>
						</tr>
						<tr>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">校验 </font>
								</th>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts 1支持在ActionForm的validate方法中手动校验，或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容，但不能校验子对象。</font>
								</td>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#808080">
										<font size="2">Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验，来支持chain校验子属性 </font>
								</td>
						</tr>
						<tr>
								<th class="confluenceTh" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#000000">
										<font size="2">Action执行的控制</font>
								</th>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#000000">
										<font size="2">Struts1支持每一个模块有单独的Request Processors（生命周期），但是模块中的所有Action必须共享相同的生命周期。</font>
								</td>
								<td class="confluenceTd" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid" bordercolor="#000000">
										<font size="2">Struts2支持通过拦截器堆栈（Interceptor Stacks）为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。</font>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/LeungXin/aggbug/78426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LeungXin/" target="_blank">梁昕</a> 2006-11-01 10:58 <a href="http://www.blogjava.net/LeungXin/articles/78426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Struts的Token机制解决表单的重复提交</title><link>http://www.blogjava.net/LeungXin/articles/74822.html</link><dc:creator>梁昕</dc:creator><author>梁昕</author><pubDate>Thu, 12 Oct 2006 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/LeungXin/articles/74822.html</guid><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent"> 
<p>Struts的Token（令牌）机制能够很好的解决表单重复提交的问题，基本原理是：服务器端在处理到达的请求之前，会将<i>请求中包含的令牌值</i>与保存在当前用户会话中的令牌值进行比较，看是否匹配。在处理完该请求后，且在答复发送给客户端之前，将会产生一个新的令牌，该令牌除传给客户端以外，也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话，客户端传过来的令牌就和服务器端的令牌不一致，从而有效地防止了重复提交的发生。</p><p>这时其实也就是两点，第一：你需要在请求中有这个令牌值，请求中的令牌值如何保存，其实就和我们平时在页面中保存一些信息是一样的，通过隐藏字段来保存，保存的形式如： 〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉，这个value是TokenProcessor类中的generateToken()获得的，是根据当前用户的session id和当前时间的long值来计算的。第二：在客户端提交后，我们要根据判断在请求中包含的值是否和服务器的令牌一致，因为服务器每次提交都会生成新的Token，所以，如果是重复提交，客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交。</p><p>在Action中的add方法中，我们需要将Token值明确的要求保存在页面中，只需增加一条语句：saveToken(request);，如下所示： <br /><font color="#ff0000">public ActionForward add(ActionMapping mapping, ActionForm form, <br />HttpServletRequest request, HttpServletResponse response)<br />//前面的处理省略<br />saveToken(request);<br />return mapping.findForward("add");<br />}</font>在Action的insert方法中，我们根据表单中的Token值与服务器端的Token值比较，如下所示：<br /><font color="#ff0000">public ActionForward insert(ActionMapping mapping, ActionForm form, <br />HttpServletRequest request, HttpServletResponse response)<br />if (isTokenValid(request, true)) {<br />// 表单不是重复提交<br />//这里是保存数据的代码<br />} else {<br />//表单重复提交<br />saveToken(request);<br />//其它的处理代码<br />}<br />}</font></p><p>其实使用起来很简单，举个最简单、最需要使用这个的例子：<br />一般控制重复提交主要是用在对数据库操作的控制上，比如插入、更新、删除等，由于更新、删除一般都是通过id来操作（例如：updateXXXById, removeXXXById），所以这类操作控制的意义不是很大（不排除个别现象），重复提交的控制也就主要是在插入时的控制了。<br /><br />先说一下，我们目前所做项目的情况：<br />目前的项目是用Struts＋Spring＋Ibatis，页面用jstl，Struts复杂View层，Spring在Service层提供事务控制，Ibatis是用来代替JDBC，所有页面的访问都不是直接访问jsp，而是访问Structs的Action，再由Action来Forward到一个Jsp，所有针对数据库的操作，比如取数据或修改数据，都是在Action里面完成，所有的Action一般都继承BaseDispatchAction，这个是自己建立的类，目的是为所有的Action做一些统一的控制，在Struts层，对于一个功能，我们一般分为两个Action，一个Action里的功能是不需要调用Struts的验证功能的（常见的方法名称有add,edit,remove,view,list），另一个是需要调用Struts的验证功能的（常见的方法名称有insert,update）。<br /><br />就拿论坛发贴来说吧，论坛发贴首先需要跳转到一个页面，你可以填写帖子的主题和内容，填写完后，单击“提交”，贴子就发表了，所以这里经过两个步骤：<br />1、转到一个新增的页面，在Action里我们一般称为add，例如：<br />public ActionForward add(ActionMapping mapping, ActionForm form,<br />            HttpServletRequest request, HttpServletResponse response)<br />            throws Exception {<br />        //这一句是输出调试信息，表示代码执行到这一段了<br />        log.debug(":: action - subject add");    <br />     <br />        //your code here<br /><br />       //这里保存Token值<br />        saveToken(request);<br />        <br />       //跳转到add页面，在Structs-config.xml里面定义，例如，跳转到subjectAdd.jsp<br />        return mapping.findForward("add");<br />    }</p><p>2、在填写标题和内容后，选择 提交 ，会提交到insert方法，在insert方法里判断，是否重复提交了。<br />public ActionForward insert(ActionMapping mapping, ActionForm form, <br />HttpServletRequest request, HttpServletResponse response){<br />if (isTokenValid(request, true)) {<br />// 表单不是重复提交<br />//这里是保存数据的代码<br />} else {<br />//表单重复提交<br />saveToken(request);<br />//其它的处理代码<br />}<br />}</p><p>下面更详细一点（注意，下面所有的代码使用全角括号）：<br />1、你想发贴时，点击“我要发贴”链接的代码可以里这样的：<br />〈html:link action="subject.do?method=add"〉我要发贴〈/html:link〉<br />subject.do 和 method 这些在struct-config.xml如何定义我就不说了，点击链接后，会执行subject.do的add方法，代码如上面说的，跳转到subjectAdd.jsp页面。页面的代码大概如下：<br />〈html:form action="subjectForm.do?method=insert"〉<br />  〈html:text property="title" /〉<br />  〈html:textarea property="content" /〉<br />  〈html:submit property="发表" /〉<br />  〈html:reset property="重填" /〉<br />〈html:form〉<br />如果你在add方法里加了“saveToken(request);”这一句，那在subjectAdd.jsp生成的页面上，会多一个隐藏字段，类似于这样〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉，</p><p>2、点击发表后，表单提交到subjectForm.do里的insert方法后，你在insert方法里要将表单的数据插入到数据库中，如果没有进行重复提交的控制，那么每点击一次浏览器的刷新按钮，都会在数据库中插入一条相同的记录，增加下面的代码，你就可以控制用户的重复提交了。<br />if (isTokenValid(request, true)) {<br />// 表单不是重复提交<br />//这里是保存数据的代码<br />} else {<br />//表单重复提交<br />saveToken(request);<br />//其它的处理代码<br />}<br />注意，你必须在add方法里使用了saveToken(request)，你才能在insert里判断，否则，你每次保存操作都是重复提交。<br />记住一点，Struts在你每次访问Action的时候，都会产生一个令牌，保存在你的Session里面，如果你在Action里的函数里面，使用了saveToken(request);，那么这个令牌也会保存在这个Action所Forward到的jsp所生成的静态页面里。<br />如果你在你Action的方法里使用了isTokenValid，那么Struts会将你从你的request里面去获取这个令牌值，然后和Session里的令牌值做比较，如果两者相等，就不是重复提交，如果不相等，就是重复提交了。<br /><br />由于我们项目的所有Action都是继承自BaseDispatchAction这个类，所以我们基本上都是在这个类里面做了表单重复提交的控制，默认是控制add方法和insert方法，如果需要控制其它的方法，就自己手动写上面这些代码，否则是不需要手写的，控制的代码如下：<br />public abstract class BaseDispatchAction extends BaseAction {<br />protected ActionForward perform(ActionMapping mapping, ActionForm form,<br />    HttpServletRequest request, HttpServletResponse response)<br />    throws Exception {<br />        String parameter = mapping.getParameter();<br />        String name = request.getParameter(parameter);<br />if (null == name) { //如果没有指定 method ，则默认为 list<br />            name = "list";<br />        }<br /><br />        if ("add".equals(name)) {<br />            if ("add".equals(name)) {<br />                saveToken(request);<br />            }<br />        } else if ("insert".equals(name)) {<br />            if (!isTokenValid(request, true)) {<br />                resetToken(request);<br />                saveError(request, new ActionMessage("error.repeatSubmit"));<br />                log.error("重复提交！");<br />                return mapping.findForward("error");<br />            }<br />        }<br />        return dispatchMethod2(mapping, form, request, response, name);<br />    }<br />}</p></span>
		<br />
		<div style="FONT-SIZE: 14px; LINE-HEIGHT: 25px">
				<strong>作者Blog：</strong>
				<a id="ArticleContent1_ArticleContent1_AuthorBlogLink" href="http://blog.csdn.net/chinaewolf/" target="_blank">http://blog.csdn.net/chinaewolf/</a>
		</div>
<img src ="http://www.blogjava.net/LeungXin/aggbug/74822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LeungXin/" target="_blank">梁昕</a> 2006-10-12 17:14 <a href="http://www.blogjava.net/LeungXin/articles/74822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>