﻿<?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-LifeNote -随笔分类-struts</title><link>http://www.blogjava.net/lifenote/category/28021.html</link><description>&amp;nbsp;
Try to find something different in your life and then write it down&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;strong&gt;Java乐园：&lt;a href='http://www.java-bj.cn' target='_blank'&gt;&lt;font color='red' size="+1"&gt;www.java-bj.cn&lt;/font&gt;&lt;/a&gt;  资料下载&lt;/strong&gt;
</description><language>zh-cn</language><lastBuildDate>Fri, 22 Feb 2008 09:01:28 GMT</lastBuildDate><pubDate>Fri, 22 Feb 2008 09:01:28 GMT</pubDate><ttl>60</ttl><item><title>《J2EE核心模式》(DAO模式)</title><link>http://www.blogjava.net/lifenote/archive/2008/02/15/180110.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 15 Feb 2008 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/02/15/180110.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/180110.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/02/15/180110.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/180110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/180110.html</trackback:ping><description><![CDATA[<p>很多的J2EE应用程序需要使用持久性数据(数据库、文件等)。不同的程序，持久性存储是各不相同的，并且用来访问这些不同的持久性存储机制的API也有很大的不同。如果应用程序要在不同的持久性存储间迁移，这些访问特定持久存储层的代码将面临重写。<br />
如何解决这个问题?且看"DAO模式"</p>
<p>数据访问对象(Data&nbsp;Acess&nbsp;Object)&nbsp;模式<br />
一.环境<br />
根据数据源不同，数据访问也不同。根据存储的类型(关系数据库、面向对象数据库、文件等等)和供应商实现不同，持久性存储(比如数据库)的访问差别也很大</p>
<p>二.问题<br />
许多真是的J2EE应用程序需要在一定程度上使用持久性数据。对于许多应用程序，持久性存储是使用不同的机制实现的,并且用来访问这些不同的持久性存储机制的API也有很大的不同。<br />
比如，应用程序使用实体bean(这里应该是指BMP的bean，CMP的bean已大大降低了与RDBMS的耦合)的分布式组件来表示持久性数据，或者使用JDBC&nbsp;API来访问驻留在某关系数据库管理系统(RDBMS)中的数据，这些组件中包含连接性性和数据访问代码会引入这些组件与数据源实现之间的紧密耦合。组件中这类代码依赖性使应用程序从某种数据源迁移到其他种类的数据源将变得非常麻烦和困难。当数据源变化时，组件也需要改变，以便于能够处理新类型的数据源</p>
<p>(举个例子来说，我们UPTEL系统是使用JDBC&nbsp;API对&nbsp;ORACLE数据库进行连接和数据访问的，这些JDBC&nbsp;API与SQL语句散布在系统中，当我们需要将UPTEL迁移到其他RDBMS时，比如曾经迁移到INFORMIX，就面临重写数据库连接和访问数据的模块。)</p>
<p>三.作用力<br />
1.诸如bean管理的实体bean、会话bean、servlet等组件往往需要从持久性存储数据源中检索数据，以及进行数据存储等操作。<br />
2.根据产品供应商的不同，持久性存储API差别也很大，这些API和其能力同样根据存储的类型不同也有差别，这样存在以下缺点，即访问这些独立系统的API很不统一。<br />
3.组件需要透明于实际的持久性存储或者数据源实现，以便于提供到不同供应商产品、不同存储类型和不同数据源类型的更容易的移植性。</p>
<p>四.解决方案<br />
使用数据访问对象(DAO)模式来抽象和封装所有对数据源的访问。DAO管理着与数据源的连接以便检索和存储数据。<br />
DAO实现了用来操作数据源的访问机制。数据源可以时RDBMS,LDAP,File等。依赖于DAO的业务组件为其客户端使用DAO提供更简单的接口。DAO完全向客户端隐藏了数据源实现细节。由于当低层数据源实现变化时，DAO向客户端提供的接口不会变化，所有该模式允许DAO调整到不同的存储模式，而不会影响其客户端或者业务组件。重要的是,DAO充当组件和数据源之间的适配器。</p>
<p>(按照这个理论，如果我们UPTEL系统使用了DAO模式,就可以无缝的从ORACLE迁移到任何一个RDBMS了。梦想总是很完美的，且看看DAO模式如何实现)</p>
 <img src ="http://www.blogjava.net/lifenote/aggbug/180110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-02-15 17:09 <a href="http://www.blogjava.net/lifenote/archive/2008/02/15/180110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSF中文输入乱码问题解决方法</title><link>http://www.blogjava.net/lifenote/archive/2008/01/31/178680.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 31 Jan 2008 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/31/178680.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/178680.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/31/178680.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/178680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/178680.html</trackback:ping><description><![CDATA[<p class="content">该方法已知适用的版本tomact5.0.18,tomcat5.0.9。<br />
已知不适用的版本为tomcat5.0.28。<br />
问题描述：<br />
在inputtext中输入中文，然后在输出，显示为乱码。<br />
解决方法：<br />
1、自定义转器<br />
package util;<br />
import java.util.Map;<br />
import javax.faces.component.UIComponent;<br />
import javax.faces.convert.Converter;<br />
import javax.faces.context.FacesContext;<br />
import javax.faces.convert.ConverterException; </p>
<p class="content">public class StringConverter implements Converter {<br />
&nbsp;public Object getAsObject(FacesContext context, UIComponent component,<br />
&nbsp;&nbsp;&nbsp;String newValues) throws ConverterException {<br />
&nbsp;&nbsp;String newstr = "";<br />
&nbsp;&nbsp;if (newValues == null) {<br />
&nbsp;&nbsp;&nbsp;newValues = "";<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;byte[] byte1 = null;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;byte1 = newValues.getBytes("ISO-8859-1");<br />
&nbsp;&nbsp;&nbsp;newstr = new String(byte1, "GB2312");<br />
&nbsp;&nbsp;&nbsp;UIInput input=(UIInput)component;//<br />
&nbsp;&nbsp;&nbsp;input.setSubmittedValue(newstr);<br />
&nbsp;&nbsp;} catch (UnsupportedEncodingException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}</p>
<p class="content">&nbsp;&nbsp;return newstr;</p>
<p class="content">&nbsp;}</p>
<p class="content">&nbsp;public String getAsString(FacesContext context, UIComponent component,<br />
&nbsp;&nbsp;&nbsp;Object Values) throws ConverterException {&nbsp;<br />
&nbsp;&nbsp;return (String) Values;<br />
&nbsp;}<br />
}</p>
<p class="content">2、注册转换器<br />
faces-config.xml片段<br />
&lt;converter&gt;<br />
&nbsp; &lt;converter-id&gt;util.stringconverter&lt;/converter-id&gt;<br />
&nbsp; &lt;converter-class&gt;util.StringConverter&lt;/converter-class&gt;<br />
&lt;/converter&gt;</p>
<p class="content">3、在页面使用转换器<br />
&lt;h:inputText id="account" value="#{util.account}" required="true" styleClass="input" &gt;&nbsp;<br />
&nbsp;&lt;f:converter converterId="utilstringconverter"/&gt;</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/178680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-01-31 15:05 <a href="http://www.blogjava.net/lifenote/archive/2008/01/31/178680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat,Weblogic 等服务器  SSL 安全登陆的例子---附证书文件生成器</title><link>http://www.blogjava.net/lifenote/archive/2008/01/15/175432.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 15 Jan 2008 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/15/175432.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/175432.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/15/175432.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/175432.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/175432.html</trackback:ping><description><![CDATA[<p>公司今天一个登陆的地方要修改，需要加一个SSL安全登陆,于是查些资料并总结如下，希望对有用的着的朋友有帮助<br />
文件打包地址：http://www.blogjava.net/Files/lifenote/tomcat配置ssl.rar<br />
一下为帮助说明：<br />
<br />
1.1.&nbsp;安全登录 SSL<br />
1.1.1&nbsp;&nbsp;WebLogic下面SSL配置：<br />
1．生成 keystoreFile：<br />
&nbsp;* keystoreFile 文件的生成：<br />
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks</p>
<p>&nbsp;* csr 文件的生成：<br />
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks</p>
<p>&nbsp;* 注意： http 的默认端口是80，https 的默认端口是433，ftp 的默认端口是21。<br />
2．部署keystore 文件<br />
在 &lt;http://hostname:7001/console&gt;&nbsp; 中配置刚才生成的 testKey.jks 文件。</p>
<p>1.1.2&nbsp;Tomcat 下面SSL配置</p>
<p><br />
1．生成 keystoreFile：<br />
&nbsp;* keystoreFile 文件的生成：<br />
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks</p>
<p>Example for inner test：<br />
[root@localhost ~]# <br />
/home/tomcat/jdk1.5.0_12/bin/keytool -genkey -alias localhost-tomcat -keyalg RSA -validity 365 -keystore /home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks<br />
Enter keystore password:&nbsp; someday2007<br />
What is your first and last name?<br />
&nbsp; [Unknown]:&nbsp; lifenote<br />
What is the name of your organizational unit?<br />
&nbsp; [Unknown]:&nbsp; Java<br />
What is the name of your organization?<br />
&nbsp; [Unknown]:&nbsp; Sunxc<br />
What is the name of your City or Locality?<br />
&nbsp; [Unknown]:&nbsp; Beijing<br />
What is the name of your State or Province?<br />
&nbsp; [Unknown]:&nbsp; Beijing<br />
What is the two-letter country code for this unit?<br />
&nbsp; [Unknown]:&nbsp; ZH<br />
Is CN=lifenote, OU=Java, O=Sunxc, L=Beijing, ST=Beijing, C=ZH correct?<br />
&nbsp; [no]:&nbsp; y</p>
<p>Enter key password for &lt;localhost-tomcat&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (RETURN if same as keystore password):&nbsp; someday2007<br />
[root@localhost ~]#</p>
<p>&nbsp;</p>
<p>&nbsp;* csr 文件的生成：<br />
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks</p>
<p>&nbsp;* 注意： http 的默认端口是80，https 的默认端口是433，ftp 的默认端口是21。</p>
<p><br />
2．部署keystore 文件<br />
&nbsp; 打开 server.xml 文件，修改内容如下：<br />
&nbsp;<br />
&nbsp;* 只需去掉 server.xml 中对SSL定义的注释，在加上 keystoreFile、keystorePass 这两个属性即可。<br />
&nbsp; &lt;Service<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="Catalina"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;Connector<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port="8080"<br />
&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp; &lt;/Connector&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&lt;!-- Define a SSL HTTP/1.1 Connector on port 8443 --------------------- 要加入的内容在这里 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;Connector port="8443" maxHttpHeaderSize="8192"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" disableUploadTimeout="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptCount="100" scheme="https" secure="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientAuth="false" sslProtocol="TLS" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystoreFile="e:/temp_E/ssl/testKey.jks" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystorePass="aaaaaa"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Connector<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port="8009"<br />
&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp; &lt;/Connector&gt;<br />
&nbsp;...<br />
Example for inner test：<br />
&nbsp;&nbsp;&nbsp; &lt;Connector port="443" maxHttpHeaderSize="8192"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" disableUploadTimeout="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptCount="100" scheme="https" secure="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientAuth="false" sslProtocol="TLS" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystoreFile="/home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystorePass="password"/&gt;</p>
<p><br />
&nbsp;注意需默认要使用 443 而不是 8443，要使用8443要在apache中配置，保证从apache请求tomcat 采用 &lt;https://ip:8443/&gt;... 的格式。</p>
<p><br />
1.1.3&nbsp;使用http访问WebService s的客户端配置<br />
Servlet服务器配置好SSL之后，客户端可以使用https访问了。<br />
对于用户使用浏览器访问https的方式，浏览器会弹出安装证书的对话框，确认之后可以正常使用https访问。<br />
&nbsp;对于WebService 通过https方式访问，按照一下步骤：<br />
1．&nbsp;WebService客户端要先取得keyStore文件；<br />
2．&nbsp;虚拟机系统使用 System.setProperties(&#8230;) 设置keyStore信息；<br />
3．&nbsp;使用 url=&lt;https://ip:port/...&gt; 访问WebService服务</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/175432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-01-15 12:32 <a href="http://www.blogjava.net/lifenote/archive/2008/01/15/175432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个Struts的上传下载文件的程序</title><link>http://www.blogjava.net/lifenote/archive/2008/01/14/175299.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Mon, 14 Jan 2008 13:24:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/14/175299.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/175299.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/14/175299.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/175299.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/175299.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 参看了一些资料实现了一个Struts的上传下载文件的程序，提供下载学习，有什么不好的地方请留言多多指教<br />
为了节省空间，文件中没有导入java包，导入eclipse后请自行加入java包<br />
<a href="http://www.blogjava.net/Files/lifenote/"><br />
http://www.blogjava.net/Files/lifenote/</a>使用struts实现文件上传下载.rar<br />
<br />
要把上面的地址都复制哦
<img src ="http://www.blogjava.net/lifenote/aggbug/175299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-01-14 21:24 <a href="http://www.blogjava.net/lifenote/archive/2008/01/14/175299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.lang.OutOfMemoryError 的解决办法</title><link>http://www.blogjava.net/lifenote/archive/2008/01/09/173982.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Wed, 09 Jan 2008 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/09/173982.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/173982.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/09/173982.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/173982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/173982.html</trackback:ping><description><![CDATA[最近在使用Tomcat +Tapestry的时候遇见一个问题，由于Tapestry修改些内容后要重新启动（即使配置了一下那参数有时候也要重启）当我修改了页面的内容 需要调试不断刷新，发现页面显示的速度越来越慢 最后就出现了 500错误java.lang.OutOfMemoryError&nbsp; 内存溢出，在网上查了一下资料<br />
最后总结如下希望可以帮你解决同样的问题<br />
解决java.lang.OutOfMemoryError的方法有如下几种：<br />
1。增加jvm的内存大小。方法有：&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）在执行某个class文件时候，可以使用java&nbsp;-Xmx256M&nbsp;aa.class来设置运行aa.class时jvm所允许占用的最大内存为256M。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）对tomcat容器，可以在启动时对jvm设置内存限度。对tomcat，可以在catalina.bat中添加：<br />
&nbsp;&nbsp;set&nbsp;CATALINA_OPTS=-Xms128M&nbsp;-Xmx256M<br />
&nbsp;&nbsp;&nbsp;set&nbsp;JAVA_OPTS=-Xms128M&nbsp;-Xmx256M<br />
或者把%CATALINA_OPTS%和%JAVA_OPTS%代替为-Xms128M&nbsp;-Xmx256M
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3）对resin容器，同样可以在启动时对jvm设置内存限度。在bin文件夹下创建一个startup.bat文件，内容如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@echo&nbsp;off<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;"httpd.exe"&nbsp;&nbsp;"-Xms128M"&nbsp;"-Xmx256M"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:end&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中"-Xms128M"为最小内存，"-Xmx256M"为最大内存。</p>
<p>&nbsp;2.&nbsp;&nbsp;&nbsp;&nbsp;优化程序，释放垃圾。</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/173982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-01-09 13:27 <a href="http://www.blogjava.net/lifenote/archive/2008/01/09/173982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多模块Struts应用程序的几个问题（及部分解决方法）</title><link>http://www.blogjava.net/lifenote/archive/2008/01/04/172726.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 04 Jan 2008 05:35:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/04/172726.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/172726.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/04/172726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/172726.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/172726.html</trackback:ping><description><![CDATA[<a class="UBBWordLink" href="http://www.java-bj.cn/article/sort022/www.java-bj.cn" target="_blank">Struts</a>从1.1版本开始支持把应用程序分为多个模块，每个模块可以看作独立的应用程序，在带来方便的同时，我也发现了一些问题。比如有一个<a class="UBBWordLink" href="http://www.java-bj.cn/article/sort022/www.java-bj.cn" target="_blank">struts</a>应用程序分了大约十个模块，现在有以下问题不知道大家一般是怎么解决的：<br />
<div&nbsp;class=posttext><br />
<p>1、因为要进行验证，所以在每个模块对应的资源文件里都要有&#8220;errors.required={0}&nbsp;is&nbsp;required.&#8221;等资源，有没有只用在一个文件里定义的方法？</p>
<br />
<p>2、用tiles的时候，要在每个模块对应的tiles-defs.xml里定义几乎相同的definition，有没有只用在一个文件里定义的方法？（我试过在缺省模块里定义一个definition，然后在模块里extends它，但不行，extends似乎只找当前模块）</p>
<br />
<p>3、使用ExceptionHandler的时候，为什么在exception标签里指定了bundle属性还是只在当前模块里找资源？我希望把一些重复使用的异常处理声明在一个文件里，例如NotLoginException、NoSuchObjectException等等，并且它们对应的key也指向同一个资源文件里的资源（利用bundle属性），怎么实现？</p>
<br />
<p>经过一段时间的摸索，第一个和第三个问题基本上解决了，其实它们可以看作同一类问题，就是资源的问题。在<a class="UBBWordLink" href="http://www.java-bj.cn/article/sort022/www.java-bj.cn" target="_blank">struts</a>-config-xxx.xml里定义资源文件时，可以指定一个factory属性，不指定时使用缺省的&#8220;org.apache.<a class="UBBWordLink" href="http://www.java-bj.cn/article/sort022/www.java-bj.cn" target="_blank">struts</a>.util.PropertyMessageResourcesFactory&#8221;类。我的解决方法是自定义一个CustomMessageResourcesFactory类，将多个资源文件以逗号分隔的形式作为参数（即message-resources的parameter属性）传给它，在需要资源的地方会遍历它们进行查找。同时还要自定义一个CustomMessageResources类，它的getMessage()方法里是查找资源的关键代码，而factory只是解析逗号分隔的参数构造并返回CustomMessageResources实例。</p>
<br />
<p>CustomMessageResourcesFactory的代码比较简单，如下所示：</p>
<br />
<DIV&NBSP;STYLE="BACKGROUND:&NBSP;#E6E6E6;&NBSP;BORDER-BOTTOM:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;BORDER-LEFT:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;BORDER-RIGHT:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;BORDER-TOP:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;PADDING-BOTTOM:&NBSP;4PX;&NBSP;PADDING-LEFT:&NBSP;5.4PT;&NBSP;PADDING-RIGHT:&NBSP;5.4PT;&NBSP;PADDING-TOP:&NBSP;4PX;&NBSP;WIDTH:&NBSP;98%;&NBSP;WORD-BREAK:&NBSP;BREAK-ALL"><br />
<div><IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">package&nbsp;eg;<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />import&nbsp;java.util.Arrays;<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />import&nbsp;org.apache.<a class="UBBWordLink" href="http://www.java-bj.cn/article/sort022/www.java-bj.cn" target="_blank">struts</a>.util.MessageResources;<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />import&nbsp;org.apache.<a class="UBBWordLink" href="http://www.java-bj.cn/article/sort022/www.java-bj.cn" target="_blank">struts</a>.util.MessageResourcesFactory;<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />public&nbsp;class&nbsp;CustomMessageResourcesFactory&nbsp;extends&nbsp;MessageResourcesFactory{<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;MessageResources&nbsp;createResources(String&nbsp;config)&nbsp;{<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF">return</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">&nbsp;</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF">new</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">&nbsp;CustomMessageResources(Arrays.asList(config.split(</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">"</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">,</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">"</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">)));<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />}<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /></span>&nbsp;</div>
<br />
<p>&nbsp;</p>
<br />
<p>CustomMessageResources就稍微复杂一些，不过很幸运，我在网上找到了一个完全符合自己要求的类，下载地址在<A&NBSP;HREF="HTTP: javaboutique.internet.com tutorials Dynaform source.zip?><br />
<div><IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF">&lt;</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#800000">message-resources&nbsp;</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#FF0000">factory</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF">="eg.CustomMessageResourcesFactory"</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#FF0000">&nbsp;<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />&nbsp;&nbsp;&nbsp;&nbsp;parameter</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF">="eg.ApplicationResources,eg.ErrorResources"</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#FF0000">&nbsp;</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF">/&gt;</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"><br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /></span>&nbsp;</div>
<br />
<p>&nbsp;</p>
<br />
<p>上面参考了这篇文章</SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF"></SPAN&NBSP;STYLE="COLOR:&NBSP;#FF0000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF"></SPAN&NBSP;STYLE="COLOR:&NBSP;#FF0000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF"></SPAN&NBSP;STYLE="COLOR:&NBSP;#FF0000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#800000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF"></DIV&NBSP;STYLE="BACKGROUND:&NBSP;#E6E6E6;&NBSP;BORDER-BOTTOM:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;BORDER-LEFT:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;BORDER-RIGHT:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;BORDER-TOP:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;PADDING-BOTTOM:&NBSP;4PX;&NBSP;PADDING-LEFT:&NBSP;5.4PT;&NBSP;PADDING-RIGHT:&NBSP;5.4PT;&NBSP;PADDING-TOP:&NBSP;4PX;&NBSP;WIDTH:&NBSP;98%;&NBSP;WORD-BREAK:&NBSP;BREAK-ALL">
</SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF"></SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF"></SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></p>
<img src ="http://www.blogjava.net/lifenote/aggbug/172726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-01-04 13:35 <a href="http://www.blogjava.net/lifenote/archive/2008/01/04/172726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>★★oracle易忘函数用法★★</title><link>http://www.blogjava.net/lifenote/archive/2007/12/14/167677.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 14 Dec 2007 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/14/167677.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/167677.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/14/167677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/167677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/167677.html</trackback:ping><description><![CDATA[<p>===================★★oracle易忘函数用法★★=====================================<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;开发积累资料<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Author:SunXianchao<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006年于湖南长沙<br />
==============================================================================<br />
一般的to_char是这样用的to_char(sysdate,'YYYY-MM-DD hh:mi:ss AM') ，也有几个突出点的用法：</p>
<p>to_char(sysdate, 'dd') 查看今天是几号to_char(sysdate, 'ww') 查看这是这个月第几个星期</p>
<p>to_char(sysdate, 'mm')&nbsp; 查看这是一年中第几个月</p>
<p>to_char(sysdate, 'yyyy') 查看年份last_day(to_date('2007-02-01','YYYY-MM-DD'))查看一个月的最后一天，add_months(sysdate,10)查看若干个月后的今天，next_day(sysdate,'星期五')给个日期查看后面的最近的星期几的日期，不过这个星期五要是换成英文居然有问题，第2个参数可以是数字1-7，分别表示周日到周六。</p>
<p>下面贴个全的，需要的时候顺便查一下。</p>
<p>一、PL/SQL单行函数和组函数详解</p>
<p>函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数，这些函数都可被称为SQL或PL/SQL语句，函数主要分为两大类：单行函数和组函数。</p>
<p>本文将讨论如何利用单行函数以及使用规则。<br />
1、SQL中的单行函数</p>
<p>SQL和PL/SQL中自带很多类型的函数，有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据，因此这些都可被统称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY等子句中，例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等单行函数。</p>
<p>SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename) </p>
<p><br />
单行函数也可以在其他语句中使用，如update的SET子句，INSERT的VALUES子句，DELET的WHERE子句,认证考试特别注意在SELECT语句中使用这些函数，所以我们的注意力也集中在SELECT语句中。</p>
<p>2、NULL和单行函数</p>
<p>在如何理解NULL上开始是很困难的，就算是一个很有经验的人依然对此感到困惑。NULL值表示一个未知数据或者一个空值，算术操作符的任何一个操作数为NULL值，结果均为提个NULL值,这个规则也适合很多函数，只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL值。在这些中NVL函数时最重要的，因为他能直接处理NULL值，NVL有两个参数:NVL(x1,x2),x1和x2都式表达式，当x1为null时返回X2,否则返回x1。</p>
<p>下面我们看看emp数据表它包含了薪水、奖金两项，需要计算总的补偿。</p>
<p>column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2 </p>
<p><br />
不是简单的将薪水和奖金加起来就可以了，如果某一行是null值那么结果就将是null，比如下面的例子：</p>
<p>update empset salary=(salary+bonus)*1.1 </p>
<p><br />
这个语句中，雇员的工资和奖金都将更新为一个新的值，但是如果没有奖金，即 salary + null,那么就会得出错误的结论，这个时候就要使用nvl函数来排除null值的影响。</p>
<p>所以正确的语句是：</p>
<p>update empset salary=(salary+nvl(bonus,0)*1.1 </p>
<p><br />
3、单行字符串函数</p>
<p>单行字符串函数用于操作字符串数据，他们大多数有一个或多个参数，其中绝大多数返回字符串。</p>
<p>ASCII()</p>
<p>c1是一字符串，返回c1第一个字母的ASCII码，他的逆函数是CHR()</p>
<p>SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122 </p>
<p><br />
CHR()[NCHAR_CS]</p>
<p>i是一个数字，函数返回十进制表示的字符。</p>
<p>select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B </p>
<p><br />
CONCAT(,)</p>
<p>c1,c2均为字符串，函数将c2连接到c1的后面，如果c1为null,将返回c2.如果c2为null,则返回c1，如果c1、c2都为null，则返回null。他和操作符||返回的结果相同</p>
<p>select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda <br />
INITCAP()</p>
<p>c1为一字符串。函数将每个单词的第一个字母大写其它字母小写返回。单词由空格，控制字符，标点符号限制。</p>
<p>select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici </p>
<p><br />
INSTR(,[,[,]])</p>
<p>c1,c2均为字符串，i,j为整数。函数返回c2在c1中第j次出现的位置，搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数，那么搜索将从右到左进行，但是位置的计算还是从左到右，i和j的缺省值为1。</p>
<p>select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2 </p>
<p><br />
INSTRB(,[,i[,j])</p>
<p>与INSTR()函数一样，只是他返回的是字节，对于单字节INSTRB()等于INSTR()。</p>
<p>LENGTH()</p>
<p>c1为字符串，返回c1的长度，如果c1为null，那么将返回null值。</p>
<p>select LENGTH('Ipso Facto') ergo from dualergo10 </p>
<p><br />
LENGTHb()</p>
<p>与LENGTH()一样，返回字节。</p>
<p>lower()</p>
<p>返回c的小写字符，经常出现在where子串中。</p>
<p>select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite </p>
<p><br />
LPAD(,[,])</p>
<p>c1,c2均为字符串，i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格，参见RPAD。</p>
<p>select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe </p>
<p><br />
LTRIM(,)</p>
<p>把c1中最左边的字符去掉，使其第一个字符不在c2中，如果没有c2，那么c1就不会改变。</p>
<p>select LTRIM('Mississippi','Mis') from dualLTRppi </p>
<p><br />
RPAD(,[,])</p>
<p>在c1的右侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格,其他与LPAD相似。</p>
<p>RTRIM(,)</p>
<p>把c1中最右边的字符去掉，使其第后一个字符不在c2中，如果没有c2，那么c1就不会改变。</p>
<p>REPLACE(,[,])</p>
<p>c1,c2,c3都是字符串，函数用c3代替出现在c1中的c2后返回。</p>
<p>select REPLACE('uptown','up','down') from dualREPLACEdowntown </p>
<p><br />
STBSTR(,[,])</p>
<p>c1为一字符串，i,j为整数，从c1的第i位开始返回长度为j的子字符串，如果j为空，则直到串的尾部。</p>
<p>select SUBSTR('Message',1,4) from dualSUBSMess </p>
<p><br />
SUBSTRB(,[,])</p>
<p>与SUBSTR大致相同，只是I,J是以字节计算。</p>
<p>SOUNDEX()</p>
<p>返回与c1发音相似的词。</p>
<p>select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250 </p>
<p><br />
TRANSLATE(,,)</p>
<p>将c1中与c2相同的字符以c3代替</p>
<p>select TRANSLATE('fumble','uf','ar') test from dualTEXTramble </p>
<p><br />
TRIM([[]] from c3)</p>
<p>将c3串中的第一个，最后一个，或者都删除。</p>
<p>select TRIM(' space padded ') trim from dual TRIMspace padded </p>
<p><br />
UPPER()</p>
<p>返回c1的大写，常出现where子串中</p>
<p>select name from dual where UPPER(name) LIKE 'KI%'NAMEKING </p>
<p><br />
4、单行数字函数</p>
<p>单行数字函数操作数字数据，执行数学和算术运算。所有函数都有数字参数并返回数字值。所有三角函数的操作数和值都是弧度而不是角度，oracle没有提供内建的弧度和角度的转换函数。</p>
<p>ABS()</p>
<p>返回n的绝对值</p>
<p>ACOS()</p>
<p>反余弦函数，返回-1到1之间的数。n表示弧度</p>
<p>select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0 </p>
<p><br />
ASIN()</p>
<p>反正弦函数，返回-1到1，n表示弧度</p>
<p>ATAN()</p>
<p>反正切函数，返回n的反正切值，n表示弧度。</p>
<p>CEIL()</p>
<p>返回大于或等于n的最小整数。</p>
<p>COS()</p>
<p>返回n的余玄值，n为弧度</p>
<p>COSH()</p>
<p>返回n的双曲余玄值，n 为数字。</p>
<p>select COSH(&lt;1.4&gt;) FROM dualCOSH(1.4)2.15089847 </p>
<p><br />
EXP()</p>
<p>返回e的n次幂，e=2.71828183.</p>
<p>FLOOR()</p>
<p>返回小于等于N的最大整数。</p>
<p>LN()</p>
<p>返回N的自然对数，N必须大于0</p>
<p>LOG(,)</p>
<p>返回以n1为底n2的对数</p>
<p>MOD()</p>
<p>返回n1除以n2的余数<br />
POWER(,)</p>
<p>返回n1的n2次方</p>
<p>ROUND(,)</p>
<p>返回舍入小数点右边n2位的n1的值，n2的缺省值为0，这回将小数点最接近的整数，如果n2为负数就舍入到小数点左边相应的位上，n2必须是整数。</p>
<p>select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54 </p>
<p><br />
SIGN()</p>
<p>如果n为负数，返回-1,如果n为正数，返回1，如果n=0返回0</p>
<p>SIN()</p>
<p>返回n的正玄值,n为弧度。</p>
<p>SINH()</p>
<p>返回n的双曲正玄值,n为弧度。</p>
<p>SQRT()</p>
<p>返回n的平方根,n为弧度</p>
<p>TAN()</p>
<p>返回n的正切值,n为弧度</p>
<p>TANH()</p>
<p>返回n的双曲正切值,n为弧度</p>
<p>TRUNC(,)</p>
<p>返回截尾到n2位小数的n1的值，n2缺省设置为0，当n2为缺省设置时会将n1截尾为整数，如果n2为负值，就截尾在小数点左边相应的位上。</p>
<p>5、单行日期函数</p>
<p>单行日期函数操作DATA数据类型，绝大多数都有DATA数据类型的参数，绝大多数返回的也是DATA数据类型的值。</p>
<p>ADD_MONTHS(,)</p>
<p>返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数，那么数据库将隐式的他转换成整数，将会截去小数点后面的部分。</p>
<p>LAST_DAY()</p>
<p>函数返回包含日期d的月份的最后一天</p>
<p>MONTHS_BETWEEN(,)</p>
<p>返回d1和d2之间月的数目,如果d1和d2的日的日期都相同，或者都使该月的最后一天，那么将返回一个整数，否则会返回的结果将包含一个分数。</p>
<p>NEW_TIME(,,)</p>
<p>d1是一个日期数据类型，当时区tz1中的日期和时间是d时，返回时区tz2中的日期和时间。tz1和tz2时字符串。</p>
<p>NEXT_DAY(,)</p>
<p>返回日期d后由dow给出的条件的第一天，dow使用当前会话中给出的语言指定了一周中的某一天，返回的时间分量与d的时间分量相同。</p>
<p>select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004 </p>
<p><br />
ROUND([,])</p>
<p>将日期d按照fmt指定的格式舍入，fmt为字符串。</p>
<p>SYADATE</p>
<p>函数没有参数，返回当前日期和时间。</p>
<p>TRUNC([,])</p>
<p>返回由fmt指定的单位的日期d<br />
6、单行转换函数</p>
<p>单行转换函数用于操作多数据类型，在数据类型之间进行转换。</p>
<p>CHARTORWID()</p>
<p>c 使一个字符串，函数将c转换为RWID数据类型。</p>
<p>SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA') </p>
<p><br />
CONVERT(,[,])</p>
<p>c尾字符串，dset、sset是两个字符集，函数将字符串c由sset字符集转换为dset字符集，sset的缺省设置为数据库的字符集。</p>
<p>HEXTORAW()</p>
<p>x为16进制的字符串，函数将16进制的x转换为RAW数据类型。</p>
<p>RAWTOHEX()</p>
<p>x是RAW数据类型字符串，函数将RAW数据类转换为16进制的数据类型。</p>
<p>ROWIDTOCHAR()</p>
<p>函数将ROWID数据类型转换为CHAR数据类型。</p>
<p>TO_CHAR([[,)</p>
<p>x是一个data或number数据类型，函数将x转换成fmt指定格式的char数据类型，如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位和千分位的分隔符，以及货币符号。</p>
<p>NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string" </p>
<p><br />
TO_DATE([,[,)</p>
<p>c表示字符串，fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。</p>
<p>TO_MULTI_BYTE()</p>
<p>c表示一个字符串，函数将c的担子截字符转换成多字节字符。</p>
<p>TO_NUMBER([,[,)</p>
<p>c表示字符串，fmt表示一个特殊格式的字符串，函数返回值按照fmt指定的格式显示。nlsparm表示语言，函数将返回c代表的数字。</p>
<p>TO_SINGLE_BYTE()</p>
<p>将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用</p>
<p>7、其它单行函数</p>
<p>BFILENAME(,) </p>
<p><br />
dir是一个directory类型的对象，file为一文件名。函数返回一个空的BFILE位置值指示符，函数用于初始化BFILE变量或者是BFILE列。</p>
<p>DECODE(,,[,,,[])</p>
<p>x是一个表达式，m1是一个匹配表达式，x与m1比较，如果m1等于x，那么返回r1,否则,x与m2比较，依次类推m3,m4,m5....直到有返回结果。</p>
<p>DUMP(,[,[,[,]]])</p>
<p>x是一个表达式或字符，fmt表示8进制、10进制、16进制、或则单字符。函数返回包含了有关x的内部表示信息的VARCHAR2类型的值。如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回。</p>
<p>EMPTY_BLOB()</p>
<p>该函数没有参数，函数返回 一个空的BLOB位置指示符。函数用于初始化一个BLOB变量或BLOB列。</p>
<p>EMPTY_CLOB()</p>
<p>该函数没有参数，函数返回 一个空的CLOB位置指示符。函数用于初始化一个CLOB变量或CLOB列。</p>
<p>GREATEST()</p>
<p>exp_list是一列表达式，返回其中最大的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，那么返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。<br />
LEAST()</p>
<p>exp_list是一列表达式，返回其中最小的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，将返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。</p>
<p>UID</p>
<p>该函数没有参数，返回唯一标示当前数据库用户的整数。</p>
<p>USER</p>
<p>返回当前用户的用户名</p>
<p>USERENV()</p>
<p>基于opt返回包含当前会话信息。opt的可选值为：</p>
<p>ISDBA　 会话中SYSDBA脚色响应，返回TRUE</p>
<p>SESSIONID 　返回审计会话标示符</p>
<p>ENTRYID 返回可用的审计项标示符</p>
<p>INSTANCE在会话连接后，返回实例标示符。该值只用于运行Parallel 服务器并且有 多个实例的情况下使用。</p>
<p>LANGUAGE返回语言、地域、数据库设置的字符集。</p>
<p>LANG返回语言名称的ISO缩写。</p>
<p>TERMINAL为当前会话使用的终端或计算机返回操作系统的标示符。</p>
<p>VSIZE()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x是一个表达式。返回x内部表示的字节数。</p>
<p>二、SQL中的组函数</p>
<p>组函数也叫集合函数，返回基于多个行的单一结果，行的准确数量无法确定，除非查询被执行并且所有的结果都被包含在内。与单行函数不同的是，在解析时所有的行都是已知的。由于这种差别使组函数与单行函数有在要求和行为上有微小的差异.</p>
<p>1、组(多行)函数</p>
<p>与单行函数相比，oracle提供了丰富的基于组的，多行的函数。这些函数可以在select或select的having子句中使用，当用于select子串时常常都和GROUP BY一起使用。</p>
<p>AVG([{DISYINCT|ALL}])</p>
<p>返回数值的平均值。缺省设置为ALL</p>
<p>SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413 </p>
<p><br />
COUNT({*|DISTINCT|ALL} )</p>
<p>返回查询中行的数目，缺省设置是ALL,*表示返回所有的行。</p>
<p>MAX([{DISTINCT|ALL}])</p>
<p>返回选择列表项目的最大值，如果x是字符串数据类型，他返回一个VARCHAR2数据类型，如果X是一个DATA数据类型，返回一个日期，如果X是numeric数据类型，返回一个数字。注意distinct和all不起作用，应为最大值与这两种设置是相同的。</p>
<p>MIN([{DISTINCT|ALL}])</p>
<p>返回选择列表项目的最小值。</p>
<p>STDDEV([{DISTINCT|ALL}])</p>
<p>返回选者的列表项目的标准差，所谓标准差是方差的平方根。</p>
<p>SUM([{DISTINCT|ALL}])</p>
<p>返回选择列表项目的数值的总和。</p>
<p>VARIANCE([{DISTINCT|ALL}])</p>
<p>返回选择列表项目的统计方差。</p>
<p>2、用GROUP BY给数据分组</p>
<p>正如题目暗示的那样组函数就是操作那些已经分好组的数据，我们告诉数据库用GROUP BY怎样给数据分组或者分类，当我们在SELECT语句的SELECT子句中使用组函数时，我们必须把为分组或非常数列放置在GROUP BY子句中，如果没有用group by进行专门处理，那么缺省的分类是将整个结果设为一类。</p>
<p>select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982 </p>
<p><br />
在这个例子中，我们用state字段分类;如果我们要将结果按照zip_codes排序,可以用ORDER BY语句，ORDER BY子句可以使用列或组函数。</p>
<p>select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982 </p>
<p><br />
3、用HAVING子句限制分组数据</p>
<p>现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数，组函数只能用于两个子串中，组函数不能用于WHERE子串中，例如下面的查询是错误的：</p>
<p>错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)&gt;10000 GROUP BY sales_clerk</p>
<p>这个语句中数据库不知道SUM()是什么，当我们需要指示数据库对行分组，然后限制分组后的行的输出时，正确的方法是使用HAVING语句：</p>
<p>SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)&gt;10000; </p>
<p><br />
4、嵌套函数</p>
<p>函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置，函数遵循由内到外，由左到右的原则。嵌套技术一般用于象DECODE这样的能被用于逻辑判断语句IF....THEN...ELSE的函数。</p>
<p>嵌套函数可以包括在组函数中嵌套单行函数，或者组函数嵌套入单行函数或组函数中。比如下面的例子：</p>
<p>SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt,COUNT(DISTINCT job) jobs,COUNT(DISTINCT mgr) mgrsFROM empGROUP BY deptno;DEPTNO CNT JOBS MGRS------ --- ---- ----10 4 4 220 4 3 430 3 3 2 </p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/167677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2007-12-14 10:02 <a href="http://www.blogjava.net/lifenote/archive/2007/12/14/167677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 软件空间</title><link>http://www.blogjava.net/lifenote/archive/2007/12/14/167656.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 14 Dec 2007 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/14/167656.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/167656.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/14/167656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/167656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/167656.html</trackback:ping><description><![CDATA[<a href="http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99">注册了一个网站，使用的是下面的这个空间，常来网，无限空间大小完全免费，上传速度很不错，感觉挺好推荐给大家，来注册一个空间上传资料使用<br />
http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99</a><br />
  <img src ="http://www.blogjava.net/lifenote/aggbug/167656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2007-12-14 09:23 <a href="http://www.blogjava.net/lifenote/archive/2007/12/14/167656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>告诉你如何获得request response session 对象</title><link>http://www.blogjava.net/lifenote/archive/2007/12/11/166934.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 11 Dec 2007 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/11/166934.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/166934.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/11/166934.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/166934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/166934.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚刚写了一个小例子，可是发现页面的属性值都是通过setter getter方法赋值的，（这里感觉有些类似一些面向组建的框架如：tapestry，同样使用了功能强大的ognl表达式）如果我们想要通过request 得到某个值 那么struts2中是如何得到的呢<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 众所周知在struts1中
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ActionForward&nbsp;execute(ActionMapping&nbsp;mapping,&nbsp;ActionForm&nbsp;form,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;{&nbsp;}&nbsp;</span></div>
就有request ，respongse对象<br />
<br />
那么在struts2中有两种方式可以得到这些对象<br />
<p>1、非IoC方式</p>
<p>要获得上述对象，关键Struts 2中<a href="http://www.opensymphony.com/webwork/api/com/opensymphony/xwork/ActionContext.html">com.opensymphony.xwork2.ActionContext</a>类。我们可以通过它的静态方法getContext()获取当前Action的上下文对象。有了这个对象我们想获得其他几个对象就好办了 <br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">ActionContext&nbsp;ctx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ActionContext.getContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ctx.getSession();</span></div>
<p>细心的朋友可以发现这里的session是个map对象在Struts2中底层的session都被封装成了Map类型我们可以直接操作这个map 进行对session的写入和读取操作而不用去直接操作HttpSession对象<br />
<br />
另外，<a href="http://struts.apache.org/2.x/struts2-core/apidocs/org/apache/struts2/ServletActionContext.html">org.apache.struts2.ServletActionContext</a>作为辅助类（Helper Class），可以帮助您快捷地获得这几个对象。 </p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">HttpServletRequest&nbsp;request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ServletActionContext.getRequest();&nbsp;<br />
HttpServletResponse&nbsp;response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ServletActionContext.getResponse();&nbsp;<br />
HttpSession&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getSession();</span></div>
<p>&nbsp;如果你只是想访问session的属性（Attribute），你也可以通过ActionContext.getContext().getSession()获取或添加session范围（Scoped）的对象。<br />
<br />
<br />
<br />
2、IoC方式（这种方式在tapestry中也是这样实现的）<br />
&nbsp;&nbsp;&nbsp;&nbsp; 要使用IoC方式，我们首先要告诉IoC容器（Container）想取得某个对象的意愿，通过实现相应的接口做到这点。具体实现</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">publicclass&nbsp;IoCServlet&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;SessionAware,&nbsp;ServletRequestAware,&nbsp;ServletResponseAware&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Map&nbsp;att;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;HttpServletRequest&nbsp;request;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;HttpServletResponse&nbsp;response;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMessage()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;message;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;publicvoid&nbsp;setSession(Map&nbsp;att)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.att&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;att;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;publicvoid&nbsp;setServletRequest(HttpServletRequest&nbsp;request)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;publicvoid&nbsp;setServletResponse(HttpServletResponse&nbsp;response)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;response;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;att.put(</span><span style="color: #000000">"</span><span style="color: #000000">msg</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;World&nbsp;from&nbsp;Session!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpSession&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb&nbsp;</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuffer(</span><span style="color: #000000">"</span><span style="color: #000000">Message&nbsp;from&nbsp;request:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(request.getParameter(</span><span style="color: #000000">"</span><span style="color: #000000">msg</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&gt;Response&nbsp;Buffer&nbsp;Size:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(response.getBufferSize());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&gt;Session&nbsp;ID:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(session.getId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sb.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/166934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2007-12-11 14:24 <a href="http://www.blogjava.net/lifenote/archive/2007/12/11/166934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 与 Struts1.x比较 </title><link>http://www.blogjava.net/lifenote/archive/2007/12/11/166924.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 11 Dec 2007 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/11/166924.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/166924.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/11/166924.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/166924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/166924.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Struts作为MVC 2的Web框架，自推出以来不断受到开发者的追捧，得到广泛的应用。作为最成功的Web框架，Struts自然拥有众多的优点：MVC 2模型的使用、功能齐全的标志库（Tag Library）、开放源代码。<br />
<br />
<p style="text-indent: 2em">但是，正所谓&#8220;没有最好，只有更好&#8221;，Struts1.x自身也有不少的缺点：需要编写的代码过多，容易引起&#8220;类爆炸&#8221;、单元测试困难。这些缺点随着Web的发展越来越明显。这就促生了Struts 2，它的诞生能很好的解决上述问题。 </p>
<p style="text-indent: 2em"><strong>一、引言</strong> </p>
<p style="text-indent: 2em">Struts的第一个版本是在2001年5月份发布的。它的最初设想是通过结合JSP和Servlet，使Web应用的视图和业务/应用逻辑得以清晰地分离开来。在Struts之前，最常见的做法是在JSP中加入业务和应用逻辑，或者在Servlet中通过println()来生成视图。 </p>
<p style="text-indent: 2em">自从第一版发布以来，Struts实际上已成为业界公认的Web应用标准。它的炙手可热也为自己带来了改进和变更，所以不但要跟上对Web应用框架不断变化的需求，而且要与日渐增多竞争激烈的众多框架的特性相融合。 </p>
<p style="text-indent: 2em">到最后，产生了几个下一代Struts的解决方案。其中两个最受瞩目的方案是Shale和Struts Ti。Shale是一个基于构件的框架，并在最近成为Apache的顶级项目。而Struts Ti则是在Struts的成功经验基础上继续坚持对前端控制器（Front Controller）和MVC（model-view-controller）模式进行改进。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">WebWork项目是在2002年3月发布的，它对Struts式框架进行了革命性改进，引进了不少新的思想、概念和功能，但和原Struts代码并不兼容。WebWork是一个成熟的框架，经过了好几次重大的改进与发布。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">在2005年12月，WebWork与Struts Ti宣布合并。与此同时，Struts Ti改名为Struts Action Framework 2.0，成为Struts真正的继承者。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">最后要注意的是，并不是说Struts或WebWork项目已经停止开发了。由于人们对这两个项目的兴趣仍然很高，而且也有很多开发者仍然愿意使用它们，因此这两个项目还在继续开发中，继续修复Bug，改进功能和继续添加新功能。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><strong>二、 Action的区别</strong> </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">对于有着丰富的Struts1.x开发经验的朋友来说，都十分的清楚Action是整个Struts框架的核心内容，当然Struts2也不例外。不过，Struts1.x与Struts2的Action模型很大的区别。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Struts2和Struts1.x的差别，最明显的就是Struts2是一个pull-MVC架构。这是什么意思呢？从开发者角度看，就是说需要显示给用户的数据可以直接从Action中获取，而不像Struts1.x那样，必须把相应的Bean存到Page、Request或者Session中才能获取。Struts1.x 必须继承org.apache.struts.action.Action或者其子类，表单数据封装在FormBean中。Struts 2无须继承任何类型或实现任何接口，表单数据包含在Action中，通过Getter和Setter获取（如下面的ActionForStruts2的代码示例）。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">虽然，在理论上Struts2的Action无须实现任何接口或者是继承任何的类，但是，在实际编程过程中，为了更加方便的实现Action，大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类，并且重载（Override）此类里的String execute()方法。如下所示： </p>
<p style="text-indent: 2em"><ccid_nobr></ccid_nobr></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;ActionDiffer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.text.DateFormat;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Date;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ActionForStruts2&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMessage()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;message;<br />
&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;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;This&nbsp;is&nbsp;hello&nbsp;from&nbsp;strtuts2.&nbsp;Now&nbsp;is:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateFormat.getInstance().format(&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Date());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SUCCESS;<br />
&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;}</span></div>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">首先，从ActionForStruts2可以看出，返回的对象不是ActionForward，而是String。如果你不喜欢以字符串的形式出现在你的代码中，有个Helper接口Action可以以常量方式提供常见结果，如&#8220;success&#8221;、&#8220;none&#8221;、&#8220;error&#8221;、&#8220;input&#8221;和&#8220;login&#8221;。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">另外， 按照惯例，在Struts1.x中只有&#8220;execute&#8221;方法能调用Action,　但在Struts2中并非必要，任何声明为public String methodName() 方法，都能通过配置来调用Action。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">最后，和Struts1.x最大的革命性的不同是，Struts2处理Action过程中调用的方法（&#8220;execute&#8221;方法）是不带参数的。那如何获取所需要的对象呢？答案是使用IoC（反转控制，Inversion of Control)，也叫&#8220;依赖注入（Dependency Injection）&#8221;的模式（想更多地了解这方面信息请看Martin Fowler的文章http://www.martinfowler.com/articles/injection.html）。Spring框架使得这个模式流行起来，然而Struts2的前身（WebWork）也同时应用上了这个模式。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><strong>三、IoC</strong> </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">IoC(Inversion of Control，以下译为控制反转），随着Java社区中轻量级容器（Lightweight Contianer）的推广而越来越为大家耳熟能详。在此，无需再多费唇舌来解释&#8220;什么是控制反转&#8221;和&#8220;为什么需要控制反转&#8221;。因为互联网上已经有非常多的文章对诸如此类的问题作了精彩而准确的回答。读者可以去读一下Rod Johnson和Juergen Hoeller合著的《Expert one-on-one J2EE Development without EJB》或Martin Fowler所写的《Inversion of Control Containers and the Dependency Injection pattern》。</p>
<p style="text-indent: 2em">众所周知，Struts2是以Webwork 2作为基础发展出来。而在Webwork 2.2之前的Webwork版本，其自身有一套控制反转的实现，Webwork 2.2在Spring 框架的如火如荼发展的背景下，决定放弃控制反转功能的开发，转由Spring实现。值得一提的是，Spring确实是一个值得学习的框架，因为有越来越多的开源组件（如iBATIS等）都放弃与Spring重叠的功能的开发。因此，Struts2推荐大家通过Spring实现控制反转。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">为了更好地了解反转控制，下面来看一个例子，如何利用IoC在Action处理过程中可以访问到当前请求HttpServerRequest对象。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">在例子中，使用的依赖注入机制是接口注入。就如其名称一样，接口注入需要的是已经被实现了的接口。这个接口包含了相应属性的setter，为Action提供值。例子中使用了ServletRequestAware接口，如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ServletRequestAware&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setServletRequest(HttpServletRequest&nbsp;request);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">当继承这个接口后，原本简单的Action看起来有点复杂了，但是这时可以获取HttpServerRequest对象来使用了。<br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;IoCForStruts2&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ServletRequestAware&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;HttpServletRequest&nbsp;request;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setServletRequest(HttpServletRequest&nbsp;request)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request;<br />
&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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;可以开始使用request对象进行工作了</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;Action.SUCCESS;<br />
&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;}<br />
&nbsp;<br />
</span></div>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">看起来现在这些属性是类级别的，并不是线程安全的，会出现问题。其实在Struts2里并没有问题，因为每个请求过来的时候都会产生一个新的Action对象实例，它并没有和其他请求共享一个对象，所以不需要考虑线程安全问题。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><strong>四、拦截器</strong> </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Interceptor（以下译为拦截器），在AOP（Aspect-Oriented Programming）中用于在某个方法或字段被访问之前，进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码，也可以在一个action执行前阻止其执行。同时也提供了一种可以提取action中可重用的部分的方式。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Struts1.x的标准框架中不提供任何形式的拦截器，虽一个名为SAIF的附加项目则实现了这样的功能，但它的适用的范围还很有限。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">拦截器是Struts2的一个强有力的工具，有许多功能（feature）都是构建于它之上，如国际化、转换器，校验等。谈到拦截器，还有一个流行的词——拦截器链（Interceptor Chain，在Struts2中称为拦截器栈Interceptor Stack）。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时，拦截器链中的拦截器就会按其之前定义的顺序被调用。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Struts 2的拦截器实现相对比较简单。当请求到达Struts2的ServletDispatcher时，Struts 2会查找配置文件，并根据其配置实例化相对的拦截器对象，然后串成一个列表（list），最后一一地调用列表中的拦截器。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Struts 2已经提供丰富多样功能齐全的拦截器实现。读者可以到struts2-all-2.0.6.jar或struts2-core-2.0.6.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">作为&#8220;框架（framework）&#8221;，可扩展性是不可缺少的，因为世上没有放之四海而皆准的东西。虽然，Struts 2为我们提供如此丰富的拦截器实现，但是这并不意味我们失去创建自定义拦截器的能力，恰恰相反，在Struts 2自定义拦截器是相当容易的一件事。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><strong>五、Struts2和Struts1.x的全面比较</strong> </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">为了对Struts2和Strtus1.x进行全面的比较，让读者了解这两种框架各自的优缺点，以便于在自己的项目中，根据实际情况，选择合适的框架，对它们两者进行比较，总结了如下表分析比较。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">特性比较: </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Action类 </p>
<p style="text-indent: 2em">Struts1.x要求Action类要扩展自一个抽象基类。Struts1.x的一个共有的问题是面向抽象类编程而不是面向接口编程。 </p>
<p style="text-indent: 2em">Struts2的Action类实现了一个Action接口，连同其他接口一起来实现可选择和自定义的服务。Struts2提供一个名叫ActionSupport的基类来实现一般使用的接口。当然，Action接口不是必须的。任何使用execute方法的POJO对象可以被当作Struts 2的Action对象来使用。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">线程模型 </p>
<p style="text-indent: 2em">Struts1.x Action类是单例类，因为只有一个实例来控制所有的请求。单例类策略造成了一定的限制，并且给开发带来了额外的烦恼。Action资源必须是线程安全或者同步的。 </p>
<p style="text-indent: 2em">Struts2 Action对象为每一个请求都实例化对象，所以没有线程安全的问题。（实践中，servlet容器给每一个请求产生许多丟弃的对象，并且不会导致性能和垃圾回收问题）。 <br />
</p>
<br />
<p style="text-indent: 2em">Servlet 依赖 </p>
<p style="text-indent: 2em">Struts1.x的Action类依赖于servlet API，当Action被调用时，以HttpServletRequest和HttpServletResponse作为参数传给execute方法。 </p>
<p style="text-indent: 2em">Struts2的Action和容器无关。Servlet上下文被表现为简单的Maps，允许Action被独立的测试。Struts2的Action可以访问最初的请求(如果需要的话)。但是，尽可能避免或排除其他元素直接访问HttpServletRequest或HttpServletResponse。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">易测性 </p>
<p style="text-indent: 2em">测试Struts1.x的主要问题是execute方法暴露了Servlet API这使得测试要依赖于容器）。第三方的扩展，如Struts TestCase，提供了一套Struts1的模拟对象（来进行测试）。 </p>
<p style="text-indent: 2em">Struts2的Action可以通过初始化、设置属性、调用方法来测试。依赖注入的支持也是测试变得更简单。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">捕获输入 </p>
<p style="text-indent: 2em">Struts1.x使用ActionForm对象来捕获输入。象Action一样，所有的ActionForm必须扩展基类。因为其他的JavaBean不能作为ActionForm使用，开发者经常创建多余的类来捕获输入。DynaBeans可以被用来作为替代ActionForm的类来创建。但是，开发者可能是在重新描述(创建)已经存在的JavaBean（仍然会导致有冗余的javabean）。 </p>
<p style="text-indent: 2em">Struts2直接使用Action属性作为输入属性，消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型，包括业务对象，能够用作输入/输出对象。这种ModelDriven 特性简化了taglib对POJO输入对象的引用。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">表达式语言 </p>
<p style="text-indent: 2em">Struts1.x整合JSTL，所以它使用JSTL的表达式语言。表达式语言有基本的图形对象移动，但是对集合和索引属性的支持很弱。 </p>
<p style="text-indent: 2em">Struts2使用JSTL，但是也支持一个更强大和灵活的表达式语言－－"Object Graph Notation Language" (OGNL)。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">将值绑定到页面 </p>
<p style="text-indent: 2em">Struts1.x使用标准JSP机制来绑定对象到页面上下文。 </p>
<p style="text-indent: 2em">Struts2使用&#8220;ValueStack&#8221;技术，使taglib能够访问值而不需要把你的页面（view）和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面（view）。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">类型转换 </p>
<p style="text-indent: 2em">Struts1.x的ActionForm属性经常都是String。Struts 1.x使用Commons-Beanutils来进行类型转换。转换每一个类，而不是为每一个实例配置。 </p>
<p style="text-indent: 2em">Struts2使用OGNL进行类型转换。提供基本和常用对象的转换器。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">验证 </p>
<p style="text-indent: 2em">Struts1.x支持在ActionForm的validate方法中手动校验，或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容，但不能校验子对象。 </p>
<p style="text-indent: 2em">Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验，来支持chain校验子属性 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Action执行控制 </p>
<p style="text-indent: 2em">Struts1.x支持每一个模块有单独的Request Processors（生命周期），但是模块中的所有Action必须共享相同的生命周期。 </p>
<p style="text-indent: 2em">Struts2支持通过拦截器堆栈（Interceptor Stacks）为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><strong>六、结论</strong> </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">前面已经简要介绍了Struts2的起源，并详细对比了Struts2和Struts1.x的差异，读者应该对Struts2的基础有所了解了——包括高层的框架概念和基础的请求流程，并理解Struts1.x和Struts2两者之间在Action方面的差别，Struts2加强了对拦截器与IoC的支持，而在Struts1.x中，这些特性是很难想象的。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">同时，读者应该明白：Struts2是WebWork的升级，而不是Struts 1.x的升级。虽然Struts 2提供了与Struts1.x的兼容，但已经不是Struts1.x的升级。对于已有Struts1.x开发经验的开发者而言，Struts1.x的开发经验对于Struts2并没有太大的帮助；相反，对于已经有WebWork开发经验的开发者而言，WebWork的开发经验对Struts2的开发将有很好的借鉴意义。</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/166924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2007-12-11 13:53 <a href="http://www.blogjava.net/lifenote/archive/2007/12/11/166924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2循序渐进</title><link>http://www.blogjava.net/lifenote/archive/2007/12/11/166894.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 11 Dec 2007 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/11/166894.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/166894.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/11/166894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/166894.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/166894.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; Struts是一个非常流行并被许多企业级应用程序采用的WEB框架，Struts2在Struts1.x的基础上进行了大量改造，和WebWork合二为一，引进了更多的新观念、新思想和新技术，使之更符合J2EE应用程序开发的需要。 </p>
<p>学一门新技术时，第一个应用程序非常重要，本文简单介绍了下struts2写了一个hello world程序，并有部分讲解希望能够给struts爱好者提供一点点帮助<br />
<br />
struts2与struts1.x有很大差异，struts2的配置文件为struts.xml相当于struts1中的struts-config.xml文件 其次放的位置也不同 struts.xml放在项目的src下面使用myeclipse发布的时候会自动复制到classes下面<br />
struts.xml代码</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;!</span><span style="color: #000000">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
</span><span style="color: #000000">"</span><span style="color: #000000">-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #000000">"</span><span style="color: #000000">http://struts.apache.org/dtds/struts-2.0.dtd</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;</span><span style="color: #000000">struts</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.struts2.demo</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">struts-default</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">action&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">Hello</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.struts2.demo.Hello</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">result</span><span style="color: #000000">&gt;/</span><span style="color: #000000">index.jsp</span><span style="color: #000000">&lt;/</span><span style="color: #000000">result</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">action</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;!--</span><span style="color: #000000">&nbsp;Add&nbsp;your&nbsp;actions&nbsp;here&nbsp;</span><span style="color: #000000">--&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #0000ff">package</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;/</span><span style="color: #000000">struts</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<br />
</span></div>
将Struts2所带的过滤器org.apache.struts2.dispatcher.FilterDispatcher配置到工程的web.xml文件中，默认情况下，该过滤器拦截请求字符串中以.action结尾的请求，并将该请求委托给指定的Action进行处理。最直观的表现就是调用Action的execute()方法。代码如下
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">struts2</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.dispatcher.FilterDispatcher&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">mapping</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">struts2</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">url</span><span style="color: #000000">-</span><span style="color: #000000">pattern</span><span style="color: #000000">&gt;</span><span style="color: #008000">/*</span><span style="color: #008000">&lt;/url-pattern&gt;&nbsp;<br />
&nbsp;&nbsp;&lt;/filter-mapping&gt;&nbsp;</span></div>
我们的java文件 相当于使用struts1的action 但这里是继承了ActionSupport 是webwork中的类<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.struts2.demo;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Hello&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;message;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setMessage(String&nbsp;message){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMessage(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setMessage(</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;my&nbsp;first&nbsp;Struts2&nbsp;demo</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
<br />
<p>注：ActionSupport是Struts2提供的类，功能类似于Struts1.x中的Action类，该类封装了几个有用的功能，比如：<br />
getText()：从资源文件中获取国际化消息。<br />
addFieldError()：验证输入未通过时添加错误消息，支持国际化。<br />
execute()：该方法一般会被重写，当客户端向Action发送请求时，会调用此方法。</p>
标签名称 说明<br />
include 包含其他xml文件，在示例中，这意味着struts.xml可以访问定义在struts-default.xml文件中的组件。
<p>该元素可以使得Struts2定义多个配置文件，&#8220;分而治之&#8221;。</p>
<p>要注意的是，任何一个struts2配置文件都应该和struts.xml有相同的格式，包括doctype，并且可以放在类路径下的任何地方。<br />
package 为Action或截拦器分组。</p>
<p>name：名称，必填项，名称自定义，没特别要求。方便别的package引用。<br />
extends：package能继承其他的package，即通过该属性实现，值为另一个package的name。</p>
<p>在示例中，extends =&#8221;struts-default&#8221;是从struts-default.xml中继承的。<br />
action 定义Action，name属性为访问时用到的名称，class属性是Action的类名。<br />
result 根据Action的返回值定义页面导航。</p>
<p>Action的预定义的返回值有：<br />
String SUCCESS = "success";<br />
String NONE&nbsp;&nbsp;&nbsp; = "none";<br />
String ERROR&nbsp;&nbsp; = "error";<br />
String INPUT&nbsp;&nbsp; = "input";<br />
String LOGIN&nbsp;&nbsp; = "login";</p>
<p>比如，当Action返回SUCCESS时希望转到index.jsp页面，则可以这样写：<br />
&lt;result name=&#8221;success&#8221;&gt;index.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp; 其中，name的缺省为success。</p>
返回的页面代码
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;%</span><span style="color: #000000">@&nbsp;taglib&nbsp;prefix</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">s</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;uri</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/struts-tags</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #000000">&lt;</span><span style="color: #000000">html</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">head</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">title</span><span style="color: #000000">&gt;</span><span style="color: #000000">Hello&nbsp;World</span><span style="color: #000000">!&lt;/</span><span style="color: #000000">title</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">head</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">body</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">h2</span><span style="color: #000000">&gt;&lt;</span><span style="color: #000000">s:property&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">message</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;&lt;/</span><span style="color: #000000">h2</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">body</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;/</span><span style="color: #000000">html</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<br />
最后访问<a href="http://127.0.0.1:8081/Hello.action">http://127.0.0.1:8081/Hello.action</a> 可能和你建的项目路径不同<br />
<br />
这样就完成了一个hello world程序<br />
<br />
还在学习中 如果有好的资料希望可以分享一下 最后还是希望可以提出宝贵意见
 <img src ="http://www.blogjava.net/lifenote/aggbug/166894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2007-12-11 12:34 <a href="http://www.blogjava.net/lifenote/archive/2007/12/11/166894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>