??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩亚洲人成在线综合,亚洲综合精品伊人久久,亚洲一区AV无码少妇电影☆http://m.tkk7.com/lifenote/category/28021.html&nbsp; Try to find something different in your life and then write it down&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Java乐园Q?lt;a target='_blank'><font color='red' size="+1">www.java-bj.cn</font></a> 资料下蝲</strong> zh-cnFri, 22 Feb 2008 09:01:28 GMTFri, 22 Feb 2008 09:01:28 GMT60《J2EE核心模式?DAO模式)http://m.tkk7.com/lifenote/archive/2008/02/15/180110.htmlLifeNoteLifeNoteFri, 15 Feb 2008 09:09:00 GMThttp://m.tkk7.com/lifenote/archive/2008/02/15/180110.htmlhttp://m.tkk7.com/lifenote/comments/180110.htmlhttp://m.tkk7.com/lifenote/archive/2008/02/15/180110.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/180110.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/180110.html很多的J2EE应用E序需要用持久性数?数据库、文件等)。不同的E序Q持久性存储是各不相同的,q且用来讉Kq些不同的持久性存储机制的API也有很大的不同。如果应用程序要在不同的持久性存储间q移Q这些访问特定持久存储层的代码将面重写?br /> 如何解决q个问题?且看"DAO模式"

数据讉K对象(Data Acess Object) 模式
一.环境
Ҏ(gu)数据源不同,数据讉K也不同。根据存储的cd(关系数据库、面向对象数据库、文件等{?和供应商实现不同Q持久性存?比如数据?的访问差别也很大

?问题
许多真是的J2EE应用E序需要在一定程度上使用持久性数据。对于许多应用程序,持久性存储是使用不同的机制实现的,q且用来讉Kq些不同的持久性存储机制的API也有很大的不同?br /> 比如Q应用程序用实体bean(q里应该是指BMP的beanQCMP的bean已大大降低了与RDBMS的耦合)的分布式lg来表C持久性数据,或者用JDBC API来访问驻留在某关pL据库理pȝ(RDBMS)中的数据Q这些组件中包含q接性性和数据讉K代码会引入这些组件与数据源实C间的紧密耦合。组件中q类代码依赖性应用E序从某U数据源q移到其他种cȝ数据源将变得非常ȝ和困难。当数据源变化时Q组件也需要改变,以便于能够处理新cd的数据源

(举个例子来说Q我们UPTELpȝ是用JDBC API?nbsp;ORACLE数据库进行连接和数据讉K的,q些JDBC API与SQL语句散布在系l中Q当我们需要将UPTELq移到其他RDBMSӞ比如曄q移到INFORMIXQ就面重写数据库连接和讉K数据的模块?

?作用?br /> 1.诸如bean理的实体bean、会话bean、servlet{组件往往需要从持久性存储数据源中检索数据,以及q行数据存储{操作?br /> 2.Ҏ(gu)产品供应商的不同Q持久性存储API差别也很大,q些API和其能力同样Ҏ(gu)存储的类型不同也有差别,q样存在以下~点Q即讉Kq些独立pȝ的API很不l一?br /> 3.lg需要透明于实际的持久性存储或者数据源实现Q以便于提供C同供应商产品、不同存储类型和不同数据源类型的更容易的UL性?/p>

?解决Ҏ(gu)
使用数据讉K对象(DAO)模式来抽象和装所有对数据源的讉K。DAO理着与数据源的连接以便检索和存储数据?br /> DAO实现了用来操作数据源的访问机制。数据源可以时RDBMS,LDAP,File{。依赖于DAO的业务组件ؓ其客L使用DAO提供更简单的接口。DAO完全向客L隐藏了数据源实现l节。由于当低层数据源实现变化时QDAO向客L提供的接口不会变化,所有该模式允许DAO调整C同的存储模式Q而不会媄响其客户端或者业务组件。重要的?DAO充当lg和数据源之间的适配器?/p>

(按照q个理论Q如果我们UPTELpȝ使用了DAO模式,可以无~的从ORACLEq移CQ何一个RDBMS了。梦xL很完的Q且看看DAO模式如何实现)



LifeNote 2008-02-15 17:09 发表评论
]]>
JSF中文输入q问题解决Ҏ(gu)http://m.tkk7.com/lifenote/archive/2008/01/31/178680.htmlLifeNoteLifeNoteThu, 31 Jan 2008 07:05:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/31/178680.htmlhttp://m.tkk7.com/lifenote/comments/178680.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/31/178680.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/178680.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/178680.html该方法已知适用的版本tomact5.0.18,tomcat5.0.9?br /> 已知不适用的版本ؓtomcat5.0.28?br /> 问题描述Q?br /> 在inputtext中输入中文,然后在输出,昄Zؕ码?br /> 解决Ҏ(gu)Q?br /> 1、自定义转器
package util;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.convert.Converter;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;

public class StringConverter implements Converter {
 public Object getAsObject(FacesContext context, UIComponent component,
   String newValues) throws ConverterException {
  String newstr = "";
  if (newValues == null) {
   newValues = "";
  }
  byte[] byte1 = null;
  try {
   byte1 = newValues.getBytes("ISO-8859-1");
   newstr = new String(byte1, "GB2312");
   UIInput input=(UIInput)component;//
   input.setSubmittedValue(newstr);
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }

  return newstr;

 }

 public String getAsString(FacesContext context, UIComponent component,
   Object Values) throws ConverterException { 
  return (String) Values;
 }
}

2、注册{换器
faces-config.xml片段
<converter>
  <converter-id>util.stringconverter</converter-id>
  <converter-class>util.StringConverter</converter-class>
</converter>

3、在面使用转换?br /> <h:inputText id="account" value="#{util.account}" required="true" styleClass="input" > 
 <f:converter converterId="utilstringconverter"/>



LifeNote 2008-01-31 15:05 发表评论
]]>
Tomcat,Weblogic {服务器 SSL 安全登陆的例?--附证书文件生成器http://m.tkk7.com/lifenote/archive/2008/01/15/175432.htmlLifeNoteLifeNoteTue, 15 Jan 2008 04:32:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/15/175432.htmlhttp://m.tkk7.com/lifenote/comments/175432.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/15/175432.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/175432.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/175432.html公司今天一个登陆的地方要修改,需要加一个SSL安全登陆,于是查些资料qȝ如下Q希望对有用的着的朋友有帮助
文g打包地址Qhttp://m.tkk7.com/Files/lifenote/tomcat配置ssl.rar
一下ؓ帮助说明Q?br />
1.1. 安全d SSL
1.1.1  WebLogic下面SSL配置Q?br /> 1Q生?keystoreFileQ?br />  * keystoreFile 文g的生成:
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks

 * csr 文g的生成:
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks

 * 注意Q?http 的默认端口是80Qhttps 的默认端口是433Qftp 的默认端口是21?br /> 2Q部|keystore 文g
?<http://hostname:7001/console>  中配|刚才生成的 testKey.jks 文g?/p>

1.1.2 Tomcat 下面SSL配置


1Q生?keystoreFileQ?br />  * keystoreFile 文g的生成:
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks

Example for inner testQ?br /> [root@localhost ~]#
/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
Enter keystore password:  someday2007
What is your first and last name?
  [Unknown]:  lifenote
What is the name of your organizational unit?
  [Unknown]:  Java
What is the name of your organization?
  [Unknown]:  Sunxc
What is the name of your City or Locality?
  [Unknown]:  Beijing
What is the name of your State or Province?
  [Unknown]:  Beijing
What is the two-letter country code for this unit?
  [Unknown]:  ZH
Is CN=lifenote, OU=Java, O=Sunxc, L=Beijing, ST=Beijing, C=ZH correct?
  [no]:  y

Enter key password for <localhost-tomcat>
        (RETURN if same as keystore password):  someday2007
[root@localhost ~]#

 

 * csr 文g的生成:
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks

 * 注意Q?http 的默认端口是80Qhttps 的默认端口是433Qftp 的默认端口是21?/p>


2Q部|keystore 文g
  打开 server.xml 文gQ修改内容如下:
 
 * 只需L server.xml 中对SSL定义的注释,在加?keystoreFile、keystorePass q两个属性即可?br />   <Service
      name="Catalina">
    <Connector
        port="8080"
  ...
    </Connector>
   
 <!-- Define a SSL HTTP/1.1 Connector on port 8443 --------------------- 要加入的内容在这?-->
    <Connector port="8443" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
      keystoreFile="e:/temp_E/ssl/testKey.jks"
      keystorePass="aaaaaa"/>

    <Connector
        port="8009"
  ...
    </Connector>
 ...
Example for inner testQ?br />     <Connector port="443" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
      keystoreFile="/home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks"
      keystorePass="password"/>


 注意需默认要?443 而不?8443Q要使用8443要在apache中配|,保证从apachehtomcat 采用 <https://ip:8443/>... 的格式?/p>


1.1.3 使用http讉KWebService s的客L配置
Servlet服务器配|好SSL之后Q客L可以使用https讉K了?br /> 对于用户使用览器访问https的方式,览器会弹出安装证书的对话框Q确认之后可以正怋用https讉K?br />  对于WebService 通过https方式讉KQ按照一下步骤:
1Q?nbsp;WebService客户端要先取得keyStore文gQ?br /> 2Q?nbsp;虚拟机系l?System.setProperties(…) 讄keyStore信息Q?br /> 3Q?nbsp;使用 url=<https://ip:port/...> 讉KWebService服务

 

 



LifeNote 2008-01-15 12:32 发表评论
]]>
一个Struts的上传下载文件的E序http://m.tkk7.com/lifenote/archive/2008/01/14/175299.htmlLifeNoteLifeNoteMon, 14 Jan 2008 13:24:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/14/175299.htmlhttp://m.tkk7.com/lifenote/comments/175299.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/14/175299.html#Feedback3http://m.tkk7.com/lifenote/comments/commentRss/175299.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/175299.html Z节省I间Q文件中没有导入java包,导入eclipse后请自行加入java?br />
http://m.tkk7.com/Files/lifenote/
使用struts实现文g上传下蝲.rar

要把上面的地址都复制哦

LifeNote 2008-01-14 21:24 发表评论
]]>
java.lang.OutOfMemoryError 的解军_?/title><link>http://m.tkk7.com/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://m.tkk7.com/lifenote/archive/2008/01/09/173982.html</guid><wfw:comment>http://m.tkk7.com/lifenote/comments/173982.html</wfw:comment><comments>http://m.tkk7.com/lifenote/archive/2008/01/09/173982.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/lifenote/comments/commentRss/173982.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lifenote/services/trackbacks/173982.html</trackback:ping><description><![CDATA[最q在使用Tomcat +Tapestry的时候遇见一个问题,׃Tapestry修改些内容后要重新启动(即配置了一下那参数有时候也要重启)当我修改了页面的内容 需要调试不断刷斎ͼ发现面昄的速度来慢 最后就出现?500错误java.lang.OutOfMemoryError  内存溢出Q在|上查了一下资?br /> 最后ȝ如下希望可以帮你解决同样的问?br /> 解决java.lang.OutOfMemoryError的方法有如下几种Q?br /> 1。增加jvm的内存大。方法有Q?nbsp;<br />              1Q在执行某个class文g时候,可以使用java -Xmx256M aa.class来设|运行aa.class时jvm所允许占用的最大内存ؓ256M?br />              2Q对tomcat容器Q可以在启动时对jvm讄内存限度。对tomcatQ可以在catalina.bat中添加:<br />   set CATALINA_OPTS=-Xms128M -Xmx256M<br />    set JAVA_OPTS=-Xms128M -Xmx256M<br /> 或者把%CATALINA_OPTS%?JAVA_OPTS%代替?Xms128M -Xmx256M <p>             3Q对resin容器Q同样可以在启动时对jvm讄内存限度。在bin文g夹下创徏一个startup.bat文gQ内容如下:<br />                   @echo off<br />                    call "httpd.exe"  "-Xms128M" "-Xmx256M"<br />                    :end <br />                    其中"-Xms128M"为最内存,"-Xmx256M"为最大内存?/p> <p> 2.    优化E序Q释攑֞圾?/p> <img src ="http://m.tkk7.com/lifenote/aggbug/173982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lifenote/" target="_blank">LifeNote</a> 2008-01-09 13:27 <a href="http://m.tkk7.com/lifenote/archive/2008/01/09/173982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多模块Struts应用E序的几个问题(及部分解x法)http://m.tkk7.com/lifenote/archive/2008/01/04/172726.htmlLifeNoteLifeNoteFri, 04 Jan 2008 05:35:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/04/172726.htmlhttp://m.tkk7.com/lifenote/comments/172726.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/04/172726.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/172726.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/172726.htmlStruts?.1版本开始支持把应用E序分ؓ多个模块Q每个模块可以看作独立的应用E序Q在带来方便的同Ӟ我也发现了一些问题。比如有一?a class="UBBWordLink" target="_blank">struts应用E序分了大约十个模块Q现在有以下问题不知道大家一般是怎么解决的:

1、因q行验证Q所以在每个模块对应的资源文仉都要?#8220;errors.required={0} is required.”{资源,有没有只用在一个文仉定义的方法?


2、用tiles的时候,要在每个模块对应的tiles-defs.xml里定义几乎相同的definitionQ有没有只用在一个文仉定义的方法?Q我试过在缺省模块里定义一个definitionQ然后在模块里extends它,但不行,extendsg只找当前模块Q?/p>

3、用ExceptionHandler的时候,Z么在exception标签里指定了bundle属性还是只在当前模块里找资源?我希望把一些重复用的异常处理声明在一个文仉Q例如NotLoginException、NoSuchObjectException{等Qƈ且它们对应的key也指向同一个资源文仉的资源(利用bundle属性)Q怎么实现Q?/p>

l过一D|间的摸烦Q第一个和W三个问题基本上解决了,其实它们可以看作同一c问题,是资源的问题。在struts-config-xxx.xml里定义资源文件时Q可以指定一个factory属性,不指定时使用~省?#8220;org.apache.struts.util.PropertyMessageResourcesFactory”cR我的解x法是自定义一个CustomMessageResourcesFactoryc,多个资源文件以逗号分隔的Ş式作为参敎ͼ即message-resources的parameter属性)传给它,在需要资源的地方会遍历它们进行查找。同时还要自定义一个CustomMessageResourcesc,它的getMessage()Ҏ(gu)里是查找资源的关键代码,而factory只是解析逗号分隔的参数构造ƈq回CustomMessageResources实例?/p>

CustomMessageResourcesFactory的代码比较简单,如下所C:



package eg;

import java.util.Arrays;

import org.apache.struts.util.MessageResources;
import org.apache.struts.util.MessageResourcesFactory;

public class CustomMessageResourcesFactory extends MessageResourcesFactory{

    public MessageResources createResources(String config) {
        
        return new CustomMessageResources(Arrays.asList(config.split(",")));
    }

}
 

 


CustomMessageResourcesq微复杂一些,不过很幸q,我在|上扑ֈ了一个完全符合自p求的c,下蝲地址?A&NBSP;HREF="HTTP: javaboutique.internet.com tutorials Dynaform source.zip?>

<message-resources factory="eg.CustomMessageResourcesFactory" 
    parameter="eg.ApplicationResources,eg.ErrorResources" />
 

 


上面参考了q篇文章



LifeNote 2008-01-04 13:35 发表评论
]]>
★★oracle易忘函数用法★★http://m.tkk7.com/lifenote/archive/2007/12/14/167677.htmlLifeNoteLifeNoteFri, 14 Dec 2007 02:02:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/14/167677.htmlhttp://m.tkk7.com/lifenote/comments/167677.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/14/167677.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/167677.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/167677.html===================★★oracle易忘函数用法★★=====================================
                                                                开发积累资?br />                                                                 Author:SunXianchao
                                                                2006q于湖南长沙
==============================================================================
一般的to_char是这L的to_char(sysdate,'YYYY-MM-DD hh:mi:ss AM') Q也有几个突出点的用法:

to_char(sysdate, 'dd') 查看今天是几号to_char(sysdate, 'ww') 查看q是q个月第几个星期

to_char(sysdate, 'mm')  查看q是一q中W几个月

to_char(sysdate, 'yyyy') 查看q䆾last_day(to_date('2007-02-01','YYYY-MM-DD'))查看一个月的最后一天,add_months(sysdate,10)查看若干个月后的今天Qnext_day(sysdate,'星期?)l个日期查看后面的最q的星期几的日期Q不q这个星期五要是换成英文居然有问题,W?个参数可以是数字1-7Q分别表C周日到周六?/p>

下面贴个全的Q需要的时候顺便查一下?/p>

一、PL/SQL单行函数和组函数详解

函数是一U有零个或多个参数ƈ且有一个返回值的E序。在SQL中Oracle内徏了一pd函数Q这些函数都可被UCؓSQL或PL/SQL语句Q函C要分Z大类Q单行函数和l函数?/p>

本文讨论如何利用单行函C及用规则?br /> 1、SQL中的单行函数

SQL和PL/SQL中自带很多类型的函数Q有字符、数字、日期、{换、和混合型等多种函数用于处理单行数据Q因此这些都可被l称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY{子句中Q例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX{单行函数?/p>

SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)


单行函数也可以在其他语句中用,如update的SET子句QINSERT的VALUES子句QDELET的WHERE子句,认证考试特别注意在SELECT语句中用这些函敎ͼ所以我们的注意力也集中在SELECT语句中?/p>

2、NULL和单行函?/p>

在如何理解NULL上开始是很困隄Q就是一个很有经验的Z然对此感到困惑。NULLDCZ个未知数据或者一个空|术操作W的M一个操作数为NULL|l果均ؓ提个NULL?q个规则也适合很多函数Q只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL倹{在q些中NVL函数时最重要的,因ؓ他能直接处理NULL|NVL有两个参?NVL(x1,x2),x1和x2都式表达式,当x1为null时返回X2,否则q回x1?/p>

下面我们看看emp数据表它包含了薪水、奖金两,需要计ȝ补偿?/p>

column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2


不是单的薪水和奖金加v来就可以了,如果某一行是null值那么结果就是nullQ比如下面的例子Q?/p>

update empset salary=(salary+bonus)*1.1


q个语句中,雇员的工资和奖金都将更新Z个新的|但是如果没有奖金Q即 salary + null,那么׃得出错误的结论,q个时候就要用nvl函数来排除null值的影响?/p>

所以正的语句是:

update empset salary=(salary+nvl(bonus,0)*1.1


3、单行字W串函数

单行字符串函数用于操作字W串数据Q他们大多数有一个或多个参数Q其中绝大多数返回字W串?/p>

ASCII()

c1是一字符Ԍq回c1W一个字母的ASCII码,他的逆函数是CHR()

SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122


CHR()[NCHAR_CS]

i是一个数字,函数q回十进制表C的字符?/p>

select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B


CONCAT(,)

c1,c2均ؓ字符Ԍ函数c2q接到c1的后面,如果c1为null,返回c2.如果c2为null,则返回c1Q如果c1、c2都ؓnullQ则q回null。他和操作符||q回的结果相?/p>

select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda
INITCAP()

c1Z字符丌Ӏ函数将每个单词的第一个字母大写其它字母小写返回。单词由I格Q控制字W,标点W号限制?/p>

select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici


INSTR(,[,[,]])

c1,c2均ؓ字符Ԍi,j为整数。函数返回c2在c1中第jơ出现的位置Q搜索从c1的第i个字W开始。当没有发现需要的字符时返?,如果i敎ͼ那么搜烦从叛_左进行,但是位置的计还是从左到叻Ii和j的缺省gؓ1?/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


INSTRB(,[,i[,j])

与INSTR()函数一P只是他返回的是字节,对于单字节INSTRB(){于INSTR()?/p>

LENGTH()

c1为字W串Q返回c1的长度,如果c1为nullQ那么将q回null倹{?/p>

select LENGTH('Ipso Facto') ergo from dualergo10


LENGTHb()

与LENGTH()一Pq回字节?/p>

lower()

q回c的小写字W,l常出现在where子串中?/p>

select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite


LPAD(,[,])

c1,c2均ؓ字符Ԍi为整数。在c1的左侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ单空|参见RPAD?/p>

select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe


LTRIM(,)

把c1中最左边的字W去掉,使其W一个字W不在c2中,如果没有c2Q那么c1׃会改变?/p>

select LTRIM('Mississippi','Mis') from dualLTRppi


RPAD(,[,])

在c1的右侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ单空?其他与LPAD怼?/p>

RTRIM(,)

把c1中最双的字W去掉,使其W后一个字W不在c2中,如果没有c2Q那么c1׃会改变?/p>

REPLACE(,[,])

c1,c2,c3都是字符Ԍ函数用c3代替出现在c1中的c2后返回?/p>

select REPLACE('uptown','up','down') from dualREPLACEdowntown


STBSTR(,[,])

c1Z字符Ԍi,j为整敎ͼ从c1的第i位开始返回长度ؓj的子字符Ԍ如果j为空Q则直到串的N?/p>

select SUBSTR('Message',1,4) from dualSUBSMess


SUBSTRB(,[,])

与SUBSTR大致相同Q只是I,J是以字节计算?/p>

SOUNDEX()

q回与c1发音怼的词?/p>

select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250


TRANSLATE(,,)

c1中与c2相同的字W以c3代替

select TRANSLATE('fumble','uf','ar') test from dualTEXTramble


TRIM([[]] from c3)

c3串中的第一个,最后一个,或者都删除?/p>

select TRIM(' space padded ') trim from dual TRIMspace padded


UPPER()

q回c1的大写,常出现where子串?/p>

select name from dual where UPPER(name) LIKE 'KI%'NAMEKING


4、单行数字函?/p>

单行数字函数操作数字数据Q执行数学和术q算。所有函数都有数字参数ƈq回数字倹{所有三角函数的操作数和值都是弧度而不是角度,oracle没有提供内徏的弧度和角度的{换函数?/p>

ABS()

q回n的绝对?/p>

ACOS()

反余弦函敎ͼq回-1?之间的数。n表示弧度

select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0


ASIN()

反正弦函敎ͼq回-1?Qn表示弧度

ATAN()

反正切函敎ͼq回n的反正切|n表示弧度?/p>

CEIL()

q回大于或等于n的最整数?/p>

COS()

q回n的余玄|n为弧?/p>

COSH()

q回n的双曲余玄|n 为数字?/p>

select COSH(<1.4>) FROM dualCOSH(1.4)2.15089847


EXP()

q回e的nơ幂Qe=2.71828183.

FLOOR()

q回于{于N的最大整数?/p>

LN()

q回N的自然对敎ͼN必须大于0

LOG(,)

q回以n1为底n2的对?/p>

MOD()

q回n1除以n2的余?br /> POWER(,)

q回n1的n2ơ方

ROUND(,)

q回舍入数点右边n2位的n1的|n2的缺省gؓ0Q这回将数Ҏ(gu)接近的整敎ͼ如果n2数就舍入到小数点左边相应的位上,n2必须是整数?/p>

select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54


SIGN()

如果n敎ͼq回-1,如果n为正敎ͼq回1Q如果n=0q回0

SIN()

q回n的正玄?n为弧度?/p>

SINH()

q回n的双曲正玄?n为弧度?/p>

SQRT()

q回n的^Ҏ(gu),n为弧?/p>

TAN()

q回n的正切?n为弧?/p>

TANH()

q回n的双曲正切?n为弧?/p>

TRUNC(,)

q回截尾到n2位小数的n1的|n2~省讄?Q当n2为缺省设|时会将n1截尾为整敎ͼ如果n2|截֜数点左边相应的位上?/p>

5、单行日期函?/p>

单行日期函数操作DATA数据cdQ绝大多数都有DATA数据cd的参敎ͼl大多数q回的也是DATA数据cd的倹{?/p>

ADD_MONTHS(,)

q回日期d加上i个月后的l果。i可以使Q意整数。如果i是一个小敎ͼ那么数据库将隐式的他转换成整敎ͼ会截去数点后面的部分?/p>

LAST_DAY()

函数q回包含日期d的月份的最后一?/p>

MONTHS_BETWEEN(,)

q回d1和d2之间月的数目,如果d1和d2的日的日期都相同Q或者都使该月的最后一天,那么返回一个整敎ͼ否则会返回的l果包含一个分数?/p>

NEW_TIME(,,)

d1是一个日期数据类型,当时区tz1中的日期和时间是dӞq回时区tz2中的日期和时间。tz1和tz2时字W串?/p>

NEXT_DAY(,)

q回日期d后由dowl出的条件的W一天,dow使用当前会话中给出的语言指定了一周中的某一天,q回的时间分量与d的时间分量相同?/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


ROUND([,])

日期d按照fmt指定的格式舍入,fmt为字W串?/p>

SYADATE

函数没有参数Q返回当前日期和旉?/p>

TRUNC([,])

q回由fmt指定的单位的日期d
6、单行{换函?/p>

单行转换函数用于操作多数据类型,在数据类型之间进行{换?/p>

CHARTORWID()

c 使一个字W串Q函数将c转换为RWID数据cd?/p>

SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')


CONVERT(,[,])

c֭W串Qdset、sset是两个字W集Q函数将字符串c由sset字符集{换ؓdset字符集,sset的缺省设|ؓ数据库的字符集?/p>

HEXTORAW()

x?6q制的字W串Q函数将16q制的x转换为RAW数据cd?/p>

RAWTOHEX()

x是RAW数据cd字符Ԍ函数RAW数据c{换ؓ16q制的数据类型?/p>

ROWIDTOCHAR()

函数ROWID数据cd转换为CHAR数据cd?/p>

TO_CHAR([[,)

x是一个data或number数据cdQ函数将x转换成fmt指定格式的char数据cdQ如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制q回的月份和日䆾所使用的语a。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定数位和千分位的分隔W,以及货币W号?/p>

NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"


TO_DATE([,[,)

c表示字符Ԍfmt表示一U特D格式的字符丌Ӏ返回按照fmt格式昄的c,nlsparm表示使用的语a。函数将字符串c转换成date数据cd?/p>

TO_MULTI_BYTE()

c表示一个字W串Q函数将c的担子截字符转换成多字节字符?/p>

TO_NUMBER([,[,)

c表示字符Ԍfmt表示一个特D格式的字符Ԍ函数q回值按照fmt指定的格式显C。nlsparm表示语言Q函数将q回c代表的数字?/p>

TO_SINGLE_BYTE()

字W串c中得多字节字W{化成{h(hun)的单字节字符。该函数仅当数据库字W集同时包含单字节和多字节字W时才?/p>

7、其它单行函?/p>

BFILENAME(,)


dir是一个directorycd的对象,fileZ文g名。函数返回一个空的BFILE位置值指C符Q函数用于初始化BFILE变量或者是BFILE列?/p>

DECODE(,,[,,,[])

x是一个表辑ּQm1是一个匹配表辑ּQx与m1比较Q如果m1{于xQ那么返回r1,否则,x与m2比较Q依ơ类推m3,m4,m5....直到有返回结果?/p>

DUMP(,[,[,[,]]])

x是一个表辑ּ或字W,fmt表示8q制?0q制?6q制、或则单字符。函数返回包含了有关x的内部表CZ息的VARCHAR2cd的倹{如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回?/p>

EMPTY_BLOB()

该函数没有参敎ͼ函数q回 一个空的BLOB位置指示W。函数用于初始化一个BLOB变量或BLOB列?/p>

EMPTY_CLOB()

该函数没有参敎ͼ函数q回 一个空的CLOB位置指示W。函数用于初始化一个CLOB变量或CLOB列?/p>

GREATEST()

exp_list是一列表辑ּQ返回其中最大的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,那么q回的结果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?br /> LEAST()

exp_list是一列表辑ּQ返回其中最的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,返回的l果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?/p>

UID

该函数没有参敎ͼq回唯一标示当前数据库用L整数?/p>

USER

q回当前用户的用户名

USERENV()

Zoptq回包含当前会话信息。opt的可选gؓQ?/p>

ISDBA  会话中SYSDBA脚色响应Q返回TRUE

SESSIONID  q回审计会话标示W?/p>

ENTRYID q回可用的审计项标示W?/p>

INSTANCE在会话连接后Q返回实例标C符。该值只用于q行Parallel 服务器ƈ且有 多个实例的情况下使用?/p>

LANGUAGEq回语言、地域、数据库讄的字W集?/p>

LANGq回语言名称的ISO~写?/p>

TERMINAL为当前会话用的l端或计机q回操作pȝ的标C符?/p>

VSIZE()            x是一个表辑ּ。返回x内部表示的字节数?/p>

二、SQL中的l函?/p>

l函C叫集合函敎ͼq回Z多个行的单一l果Q行的准数量无法确定,除非查询被执行ƈ且所有的l果都被包含在内。与单行函数不同的是Q在解析时所有的行都是已知的。由于这U差别ɾl函C单行函数有在要求和行Z有微的差异.

1、组(多行)函数

与单行函数相比,oracle提供了丰富的Zl的Q多行的函数。这些函数可以在select或select的having子句中用,当用于select子串时常帔R和GROUP BY一起用?/p>

AVG([{DISYINCT|ALL}])

q回数值的q_倹{缺省设|ؓALL

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


COUNT({*|DISTINCT|ALL} )

q回查询中行的数目,~省讄是ALL,*表示q回所有的行?/p>

MAX([{DISTINCT|ALL}])

q回选择列表目的最大|如果x是字W串数据cdQ他q回一个VARCHAR2数据cdQ如果X是一个DATA数据cdQ返回一个日期,如果X是numeric数据cdQ返回一个数字。注意distinct和all不v作用Q应为最大gq两U设|是相同的?/p>

MIN([{DISTINCT|ALL}])

q回选择列表目的最倹{?/p>

STDDEV([{DISTINCT|ALL}])

q回选者的列表目的标准差Q所谓标准差是方差的qx栏V?/p>

SUM([{DISTINCT|ALL}])

q回选择列表目的数值的d?/p>

VARIANCE([{DISTINCT|ALL}])

q回选择列表目的统计方差?/p>

2、用GROUP BYl数据分l?/p>

正如题目暗示的那L函数是操作那些已经分好l的数据Q我们告诉数据库用GROUP BY怎样l数据分l或者分c,当我们在SELECT语句的SELECT子句中用组函数Ӟ我们必须把ؓ分组或非常数列放|在GROUP BY子句中,如果没有用group byq行专门处理Q那么缺省的分类是将整个l果设ؓ一cR?/p>

select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982


在这个例子中Q我们用state字段分类;如果我们要将l果按照zip_codes排序,可以用ORDER BY语句QORDER BY子句可以使用列或l函数?/p>

select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982


3、用HAVING子句限制分组数据

现在你已l知道了在查询的SELECT语句和ORDER BY子句中用主函数Q组函数只能用于两个子串中,l函C能用于WHERE子串中,例如下面的查询是错误的:

错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk

q个语句中数据库不知道SUM()是什么,当我们需要指C数据库对行分组Q然后限制分l后的行的输出时Q正的Ҏ(gu)是用HAVING语句Q?/p>

SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;


4、嵌套函?/p>

函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可l承的执行过E。但函数的优先权只是Z位置Q函数遵循由内到外,由左到右的原则。嵌套技术一般用于象DECODEq样的能被用于逻辑判断语句IF....THEN...ELSE的函数?/p>

嵌套函数可以包括在组函数中嵌套单行函敎ͼ或者组函数嵌套入单行函数或l函C。比如下面的例子Q?/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


 



LifeNote 2007-12-14 10:02 发表评论
]]>
Java 软gI间http://m.tkk7.com/lifenote/archive/2007/12/14/167656.htmlLifeNoteLifeNoteFri, 14 Dec 2007 01:23:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/14/167656.htmlhttp://m.tkk7.com/lifenote/comments/167656.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/14/167656.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/167656.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/167656.html注册了一个网站,使用的是下面的这个空_常来|,无限I间大小完全免费Q上传速度很不错,感觉挺好推荐l大Ӟ来注册一个空间上传资料?br /> http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99


LifeNote 2007-12-14 09:23 发表评论
]]>
告诉你如何获得request response session 对象http://m.tkk7.com/lifenote/archive/2007/12/11/166934.htmlLifeNoteLifeNoteTue, 11 Dec 2007 06:24:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/11/166934.htmlhttp://m.tkk7.com/lifenote/comments/166934.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/11/166934.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/166934.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/166934.html         众所周知在struts1?
public ActionForward execute(ActionMapping mapping, ActionForm form,
     HttpServletRequest request, HttpServletResponse response) { } 
有request Qrespongse对象

那么在struts2中有两种方式可以得到q些对象

1、非IoC方式

要获得上q对象,关键Struts 2?a >com.opensymphony.xwork2.ActionContextcR我们可以通过它的静态方法getContext()获取当前Action的上下文对象。有了这个对象我们想获得其他几个对象好办了

ActionContext ctx = ActionContext.getContext();
        Map session 
= ctx.getSession();

l心的朋友可以发现这里的session是个map对象在Struts2中底层的session都被装成了Mapcd我们可以直接操作q个map q行对session的写入和d操作而不用去直接操作HttpSession对象

另外Q?a >org.apache.struts2.ServletActionContext作ؓ辅助c(Helper ClassQ,可以帮助(zhn)快捷地获得q几个对象?

HttpServletRequest request = ServletActionContext.getRequest(); 
HttpServletResponse response 
= ServletActionContext.getResponse(); 
HttpSession session 
= request.getSession();

 如果你只是想讉Ksession的属性(AttributeQ,你也可以通过ActionContext.getContext().getSession()获取或添加session范围QScopedQ的对象?br />


2、IoC方式Q这U方式在tapestry中也是这样实现的Q?br />      要用IoC方式Q我们首先要告诉IoC容器QContainerQ想取得某个对象的意愿,通过实现相应的接口做到这炏V具体实?/p>

publicclass IoCServlet extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {
    
private String message;
    
private Map att;
    
private HttpServletRequest request;
    
private HttpServletResponse response;    
    
    
public String getMessage() {
        
return message;        
    }
    
    publicvoid setSession(Map att) {
        
this.att = att;
    }
    
    publicvoid setServletRequest(HttpServletRequest request) {
        
this.request = request;
    }
    
    publicvoid setServletResponse(HttpServletResponse response) {
        
this.response = response;
    }
    
    @Override
    
public String execute() {        
        att.put(
"msg""Hello World from Session!");
        
        HttpSession session 
= request.getSession();
        
        StringBuffer sb 
=new StringBuffer("Message from request: ");
        sb.append(request.getParameter(
"msg"));
        sb.append(
"<br>Response Buffer Size: ");
        sb.append(response.getBufferSize());
        sb.append(
"<br>Session ID: ");
        sb.append(session.getId());
        
        message 
= sb.toString();
        
return SUCCESS;
    }
}

 


 



LifeNote 2007-12-11 14:24 发表评论
]]>
Struts2 ?Struts1.x比较 http://m.tkk7.com/lifenote/archive/2007/12/11/166924.htmlLifeNoteLifeNoteTue, 11 Dec 2007 05:53:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/11/166924.htmlhttp://m.tkk7.com/lifenote/comments/166924.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/11/166924.html#Feedback4http://m.tkk7.com/lifenote/comments/commentRss/166924.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/166924.html

但是Q正所?#8220;没有最好,只有更好”QStruts1.x自n也有不少的缺点:需要编写的代码q多Q容易引?#8220;cȝ?#8221;、单元测试困难。这些缺炚w着Web的发展越来越明显。这׃生了Struts 2Q它的诞生能很好的解决上q问题?

一、引a

Struts的第一个版本是?001q?月䆾发布的。它的最初设x通过l合JSP和ServletQWeb应用的视囑֒业务/应用逻辑得以清晰地分d来。在Struts之前Q最常见的做法是在JSP中加入业务和应用逻辑Q或者在Servlet中通过println()来生成视图?

自从W一版发布以来,Struts实际上已成ؓ业界公认的Web应用标准。它的炙手可热也己带来了改进和变_所以不但要跟上对Web应用框架不断变化的需求,而且要与日渐增多竞争Ȁ烈的众多框架的特性相融合?

到最后,产生了几个下一代Struts的解x案。其中两个最受瞩目的Ҏ(gu)是Shale和Struts Ti。Shale是一个基于构件的框架Qƈ在最q成为Apache的顶U项目。而Struts Ti则是在Struts的成功经验基上l坚持对前端控制器(Front ControllerQ和MVCQmodel-view-controllerQ模式进行改q?

 

WebWork目是在2002q?月发布的Q它对Struts式框架进行了革命性改q,引进了不新的思想、概念和功能Q但和原Struts代码q不兼容。WebWork是一个成熟的框架Q经q了好几ơ重大的改进与发布?

 

?005q?2月,WebWork与Struts Ti宣布合ƈ。与此同ӞStruts Ti改名为Struts Action Framework 2.0Q成为Struts真正的承者?

 

最后要注意的是Qƈ不是说Struts或WebWork目已经停止开发了。由于h们对q两个项目的兴趣仍然很高Q而且也有很多开发者仍然愿意用它们,因此q两个项目还在l开发中Ql修复BugQ改q功能和l箋d新功能?

 

二?Action的区?/strong>

 

对于有着丰富的Struts1.x开发经验的朋友来说Q都十分的清楚Action是整个Struts框架的核心内容,当然Struts2也不例外。不q,Struts1.x与Struts2的Action模型很大的区别?

 

Struts2和Struts1.x的差别,最明显的就是Struts2是一个pull-MVC架构。这是什么意思呢Q从开发者角度看Q就是说需要显C给用户的数据可以直接从Action中获取,而不像Struts1.x那样Q必L相应的Bean存到Page、Request或者Session中才能获取。Struts1.x 必须l承org.apache.struts.action.Action或者其子类Q表单数据封装在FormBean中。Struts 2无须l承Mcd或实CQ何接口,表单数据包含在Action中,通过Getter和Setter获取Q如下面的ActionForStruts2的代码示例)?

 

虽然Q在理论上Struts2的Action无须实现M接口或者是l承M的类Q但是,在实际编E过E中Qؓ了更加方便的实现ActionQ大多数情况下都会承com.opensymphony.xwork2.ActionSupportc,q且重蝲QOverrideQ此c里的String execute()Ҏ(gu)。如下所C:

package ActionDiffer;
            
import java.text.DateFormat;
            
import java.util.Date;
            
import com.opensymphony.xwork2.ActionSupport;
            
public class ActionForStruts2 extends ActionSupport {
            
private String message;
            
public String getMessage() {
            
return message;
            }
            @Override
            
public String execute() {
            message 
= " This is hello from strtuts2. Now is: " +
            DateFormat.getInstance().format( 
new Date());
            
return SUCCESS;
            }
            }

 

 

首先Q从ActionForStruts2可以看出Q返回的对象不是ActionForwardQ而是String。如果你不喜Ƣ以字符串的形式出现在你的代码中Q有个Helper接口Action可以以常量方式提供常见结果,?#8220;success”?#8220;none”?#8220;error”?#8220;input”?#8220;login”?

 

另外Q?按照惯例Q在Struts1.x中只?#8220;execute”Ҏ(gu)能调用Action, 但在Struts2中ƈ非必要,M声明为public String methodName() Ҏ(gu)Q都能通过配置来调用Action?

 

最后,和Struts1.x最大的革命性的不同是,Struts2处理Actionq程中调用的Ҏ(gu)Q?#8220;execute”Ҏ(gu)Q是不带参数的。那如何获取所需要的对象呢?{案是用IoCQ反转控ӞInversion of Control)Q也?#8220;依赖注入QDependency InjectionQ?#8221;的模式(x多地了解q方面信息请看Martin Fowler的文章http://www.martinfowler.com/articles/injection.htmlQ。Spring框架使得q个模式行hQ然而Struts2的前w(WebWorkQ也同时应用上了q个模式?

 

三、IoC

 

IoC(Inversion of ControlQ以下译为控制反转)Q随着JavaC֌中轻量容器QLightweight ContianerQ的推广而越来越为大家耳熟能详。在此,无需再多费唇舌来解释“什么是控制反{”?#8220;Z么需要控制反?#8221;。因Z联网上已l有非常多的文章对诸如此cȝ问题作了_ֽ而准的回答。读者可以去M下Rod Johnson和Juergen Hoeller合著的《Expert one-on-one J2EE Development without EJB》或Martin Fowler所写的《Inversion of Control Containers and the Dependency Injection pattern》?/p>

众所周知QStruts2是以Webwork 2作ؓ基础发展出来。而在Webwork 2.2之前的Webwork版本Q其自n有一套控制反转的实现QWebwork 2.2在Spring 框架的如火如荼发展的背景下,军_攑ּ控制反{功能的开发,转由Spring实现。值得一提的是,Spring实是一个值得学习的框Ӟ因ؓ有越来越多的开源组Ӟ如iBATIS{)都放弃与Spring重叠的功能的开发。因此,Struts2推荐大家通过Spring实现控制反{?

 

Z更好C解反转控Ӟ下面来看一个例子,如何利用IoC在Action处理q程中可以访问到当前hHttpServerRequest对象?

 

在例子中Q用的依赖注入机制是接口注入。就如其名称一P接口注入需要的是已l被实现了的接口。这个接口包含了相应属性的setterQؓAction提供倹{例子中使用了ServletRequestAware接口Q如下:

public interface ServletRequestAware {
            
public void setServletRequest(HttpServletRequest request);
            }

 

当承这个接口后Q原本简单的Action看v来有点复杂了Q但是这时可以获取HttpServerRequest对象来用了?br />

public class IoCForStruts2 implements ServletRequestAware {
            
private HttpServletRequest request;
            
public void setServletRequest(HttpServletRequest request) {
            
this.request = request;
            }
            
public String execute() throws Exception {
            
// 可以开始用request对象q行工作?/span>
            return Action.SUCCESS;
            }
            }
 

 

看v来现在这些属性是cȝ别的Qƈ不是U程安全的,会出现问题。其实在Struts2里ƈ没有问题Q因为每个请求过来的时候都会生一个新的Action对象实例Q它q没有和其他h׃n一个对象,所以不需要考虑U程安全问题?

 

四、拦截器

 

InterceptorQ以下译为拦截器Q,在AOPQAspect-Oriented ProgrammingQ中用于在某个方法或字段被访问之前,q行拦截然后在之前或之后加入某些操作。拦截是AOP的一U实现策略?

 

在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一U机制可以开发者定义在一个action执行的前后执行的代码Q也可以在一个action执行前阻止其执行。同时也提供了一U可以提取action中可重用的部分的方式?

 

Struts1.x的标准框架中不提供Q何Ş式的拦截器,虽一个名为SAIF的附加项目则实现了这L功能Q但它的适用的范围还很有限?

 

拦截器是Struts2的一个强有力的工P有许多功能(featureQ都是构Z它之上,如国际化、{换器Q校验等。谈到拦截器Q还有一个流行的词——拦截器链(Interceptor ChainQ在Struts2中称为拦截器栈Interceptor StackQ。拦截器铑ְ是将拦截器按一定的序联结成一条链。在讉K被拦截的Ҏ(gu)或字D|Q拦截器链中的拦截器׃按其之前定义的顺序被调用?

 

Struts 2的拦截器实现相对比较单。当h到达Struts2的ServletDispatcherӞStruts 2会查N|文Ӟq根据其配置实例化相对的拦截器对象,然后串成一个列表(listQ,最后一一地调用列表中的拦截器?

 

Struts 2已经提供丰富多样功能齐全的拦截器实现。读者可以到struts2-all-2.0.6.jar或struts2-core-2.0.6.jar包的struts-default.xml查看关于默认的拦截器与拦截器铄配置?

 

作ؓ“框架QframeworkQ?#8221;Q可扩展性是不可~少的,因ؓ世上没有放之四v而皆准的东西。虽ӞStruts 2为我们提供如此丰富的拦截器实玎ͼ但是qƈ不意x们失d定义拦截器的能力Q恰恰相反,在Struts 2自定义拦截器是相当容易的一件事?

 

五、Struts2和Struts1.x的全面比?/strong>

 

Z对Struts2和Strtus1.xq行全面的比较,让读者了解这两种框架各自的优~点Q以便于在自q目中,Ҏ(gu)实际情况Q选择合适的框架Q对它们两者进行比较,ȝ了如下表分析比较?

 

Ҏ(gu)比?

 

Actionc?

Struts1.x要求Actionc要扩展自一个抽象基cRStruts1.x的一个共有的问题是面向抽象类~程而不是面向接口编E?

Struts2的ActioncdC一个Action接口Q连同其他接口一h实现可选择和自定义的服务。Struts2提供一个名叫ActionSupport的基cL实现一般用的接口。当ӞAction接口不是必须的。Q何用executeҎ(gu)的POJO对象可以被当作Struts 2的Action对象来用?

 

U程模型

Struts1.x ActioncL单例c,因ؓ只有一个实例来控制所有的h。单例类{略造成了一定的限制Qƈ且给开发带来了额外的烦恹{Action资源必须是线E安全或者同步的?

Struts2 Action对象为每一个请求都实例化对象,所以没有线E安全的问题。(实践中,servlet容器l每一个请求生许多丟弃的对象Qƈ且不会导致性能和垃圑֛攉题)?


Servlet 依赖

Struts1.x的ActioncM赖于servlet APIQ当Action被调用时Q以HttpServletRequest和HttpServletResponse作ؓ参数传给executeҎ(gu)?

Struts2的Action和容器无兟뀂Servlet上下文被表现为简单的MapsQ允许Action被独立的试。Struts2的Action可以讉K最初的h(如果需要的?。但是,可能避免或排除其他元素直接讉KHttpServletRequest或HttpServletResponse?

 

易测?

试Struts1.x的主要问题是executeҎ(gu)暴露了Servlet APIq得测试要依赖于容器)。第三方的扩展,如Struts TestCaseQ提供了一套Struts1的模拟对象(来进行测试)?

Struts2的Action可以通过初始化、设|属性、调用方法来试。依赖注入的支持也是试变得更简单?

 

捕获输入

Struts1.x使用ActionForm对象来捕莯入。象Action一P所有的ActionForm必须扩展基类。因为其他的JavaBean不能作ؓActionForm使用Q开发者经常创建多余的cL捕获输入。DynaBeans可以被用来作为替代ActionForm的类来创建。但是,开发者可能是在重新描q?创徏)已经存在的JavaBeanQ仍然会D有冗余的javabeanQ?

Struts2直接使用Action属性作入属性,消除了对W二个输入对象的需求。输入属性可能是有自??属性的rich对象cd。Action属性能够通过web面上的taglibs讉K。Struts2也支持ActionForm模式。rich对象cdQ包括业务对象,能够用作输入/输出对象。这UModelDriven Ҏ(gu)简化了taglib对POJO输入对象的引用?

 

表达式语a

Struts1.x整合JSTLQ所以它使用JSTL的表辑ּ语言。表辑ּ语言有基本的囑Ş对象UdQ但是对集合和烦引属性的支持很弱?

Struts2使用JSTLQ但是也支持一个更强大和灵zȝ表达式语aQ-"Object Graph Notation Language" (OGNL)?

 

值绑定到面

Struts1.x使用标准JSP机制来绑定对象到面上下文?

Struts2使用“ValueStack”技术,使taglib能够讉KD不需要把你的面QviewQ和对象l定h。ValueStack{略允许通过一pd名称相同但类型不同的属性重用页面(viewQ?

 

cd转换

Struts1.x的ActionForm属性经帔R是String。Struts 1.x使用Commons-Beanutils来进行类型{换。{换每一个类Q而不是ؓ每一个实例配|?

Struts2使用OGNLq行cd转换。提供基本和常用对象的{换器?

 

验证

Struts1.x支持在ActionForm的validateҎ(gu)中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容Q但不能校验子对象?

Struts2支持通过validateҎ(gu)和XWork校验框架来进行校验。XWork校验框架使用为属性类cd定义的校验和内容校验Q来支持chain校验子属?

 

Action执行控制

Struts1.x支持每一个模块有单独的Request ProcessorsQ生命周期)Q但是模块中的所有Action必须׃n相同的生命周期?

Struts2支持通过拦截器堆栈(Interceptor StacksQؓ每一个Action创徏不同的生命周期。堆栈能够根据需要和不同的Action一起用?

 

六、结?/strong>

 

前面已经要介l了Struts2的v源,q详l对比了Struts2和Struts1.x的差异,读者应该对Struts2的基有所了解了——包括高层的框架概念和基的请求流E,q理解Struts1.x和Struts2两者之间在Action斚w的差别,Struts2加强了对拦截器与IoC的支持,而在Struts1.x中,q些Ҏ(gu)是很难惌的?

 

同时Q读者应该明白:Struts2是WebWork的升U,而不是Struts 1.x的升U。虽然Struts 2提供了与Struts1.x的兼容,但已l不是Struts1.x的升U。对于已有Struts1.x开发经验的开发者而言QStruts1.x的开发经验对于Struts2q没有太大的帮助Q相反,对于已经有WebWork开发经验的开发者而言QWebWork的开发经验对Struts2的开发将有很好的借鉴意义?/p>

LifeNote 2007-12-11 13:53 发表评论
]]>
Struts2循序渐进http://m.tkk7.com/lifenote/archive/2007/12/11/166894.htmlLifeNoteLifeNoteTue, 11 Dec 2007 04:34:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/11/166894.htmlhttp://m.tkk7.com/lifenote/comments/166894.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/11/166894.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/166894.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/166894.html    Struts是一个非常流行ƈ被许多企业应用E序采用的WEB框架QStruts2在Struts1.x的基上进行了大量攚w,和WebWork合二ZQ引q了更多的新观念、新思想和新技术,使之更符合J2EE应用E序开发的需要?

学一门新技术时Q第一个应用程序非帔R要,本文单介l了下struts2写了一个hello worldE序Qƈ有部分讲解希望能够给struts爱好者提供一点点帮助

struts2与struts1.x有很大差异,struts2的配|文件ؓstruts.xml相当于struts1中的struts-config.xml文g 其次攄位置也不?struts.xml攑֜目的src下面使用myeclipse发布的时候会自动复制到classes下面
struts.xml代码

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    
<package name="com.struts2.demo" extends="struts-default">
        
<action name="Hello" class="com.struts2.demo.Hello">
            
<result>/index.jsp</result>
        
</action>
    
<!-- Add your actions here -->
    
</package>
</struts>

Struts2所带的qo器org.apache.struts2.dispatcher.FilterDispatcher配置到工E的web.xml文g中,默认情况下,该过滤器拦截h字符串中?actionl尾的请求,q将该请求委托给指定的Actionq行处理。最直观的表现就是调用Action的execute()Ҏ(gu)。代码如?
<filter> 
      
<filter-name>struts2</filter-name> 
      
<filter-class> 
        org.apache.struts2.dispatcher.FilterDispatcher 
      
</filter-class> 
  
</filter> 
  
<filter-mapping> 
      
<filter-name>struts2</filter-name> 
      
<url-pattern>/*</url-pattern> 
  </filter-mapping> 
我们的java文g 相当于用struts1的action 但这里是l承了ActionSupport 是webwork中的c?br />
package com.struts2.demo;

import com.opensymphony.xwork2.ActionSupport;

public class Hello extends ActionSupport{

    
    
private String message;

    
public void setMessage(String message){
        
this.message = message;
    }
    
public String getMessage(){
        
return message;
    }
    
    
public String execute() throws Exception{
        setMessage(
"Hello my first Struts2 demo");
        
return SUCCESS;
    }

    
}

注:ActionSupport是Struts2提供的类Q功能类gStruts1.x中的Actionc,该类装了几个有用的功能Q比如:
getText()Q从资源文g中获取国际化消息?br /> addFieldError()Q验证输入未通过时添加错误消息,支持国际化?br /> execute()Q该Ҏ(gu)一般会被重写,当客L向Action发送请求时Q会调用此方法?/p> 标签名称 说明
include 包含其他xml文gQ在CZ中,q意味着struts.xml可以讉K定义在struts-default.xml文g中的lg?

该元素可以得Struts2定义多个配置文gQ?#8220;分而治?#8221;?/p>

要注意的是,M一个struts2配置文g都应该和struts.xml有相同的格式Q包括doctypeQƈ且可以放在类路径下的M地方?br /> package 为Action或截拦器分组?/p>

nameQ名Uͼ必填,名称自定义,没特别要求。方便别的package引用?br /> extendsQpackage能承其他的packageQ即通过该属性实玎ͼgؓ另一个package的name?/p>

在示例中Qextends =”struts-default”是从struts-default.xml中承的?br /> action 定义ActionQname属性ؓ讉K时用到的名称Qclass属性是Action的类名?br /> result Ҏ(gu)Action的返回值定义页面导航?/p>

Action的预定义的返回值有Q?br /> String SUCCESS = "success";
String NONE    = "none";
String ERROR   = "error";
String INPUT   = "input";
String LOGIN   = "login";

比如Q当Actionq回SUCCESS时希望{到index.jsp面Q则可以q样写:
<result name=”success”>index.jsp</result>
    其中Qname的缺省ؓsuccess?/p> q回的页面代?

<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
    
<head>
        
<title>Hello World!</title>
    
</head>
    
<body>
        
<h2><s:property value="message" /></h2>
    
</body>
</html>


最后访?a >http://127.0.0.1:8081/Hello.action 可能和你建的目路径不同

q样完成了一个hello worldE序

q在学习?如果有好的资料希望可以分享一?最后还是希望可以提出宝贉|?

LifeNote 2007-12-11 12:34 发表评论
]]>
վ֩ģ壺 ޵һӰԺ| þþ97ɫ | Ʒ༤þþ| anպר| Ʒۺߵһ| ˳վ߹ۿ| һ˿wwwƵ߹ۿ һ˿ѹۿձƵwww | þþƷ| СƵ߲| žžAVƬ| ˿Ƶվ| ޷| ޹ղ뾫Ʒ| һһƬһëƬ| Ʒ10000| Ƭ߹ۿѴȫӰ | Ʒ޾߹ۿ| ϼ˳߹ۿƵ| aëƬƵۿ| ޵һƵվ| ޼VëƬþþƷ| ƷþþþóѶ| 1000žžδʮ| һƷһAVһ| ޾ƷƵ| videos| ޵Ӱѹۿ| ޾Ʒһ23Ŀ| ϵйƷƷ˿| ˮһ| ޾ƷҺ| ޹һƷ | Ʒվ| ŮƵaƵȫվɫ| ޹avŪŵ˸| ޳AVƬ߹ۿWWW| ɫƵ| һAVٸӰ| ˳߲վ| AVҹƬ| ۺϼ|