??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲熟妇无码一区二区三区导航,337P日本欧洲亚洲大胆艺术图,亚洲欧洲无码一区二区三区http://www.tkk7.com/xzhoujun/zh-cnSun, 11 May 2025 15:32:05 GMTSun, 11 May 2025 15:32:05 GMT60Jakarta?/title><link>http://www.tkk7.com/xzhoujun/archive/2007/05/18/118264.html</link><dc:creator>银色qL</dc:creator><author>银色qL</author><pubDate>Fri, 18 May 2007 02:16:00 GMT</pubDate><guid>http://www.tkk7.com/xzhoujun/archive/2007/05/18/118264.html</guid><wfw:comment>http://www.tkk7.com/xzhoujun/comments/118264.html</wfw:comment><comments>http://www.tkk7.com/xzhoujun/archive/2007/05/18/118264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xzhoujun/comments/commentRss/118264.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xzhoujun/services/trackbacks/118264.html</trackback:ping><description><![CDATA[     摘要: 目 子项? ...  <a href='http://www.tkk7.com/xzhoujun/archive/2007/05/18/118264.html'>阅读全文</a><img src ="http://www.tkk7.com/xzhoujun/aggbug/118264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xzhoujun/" target="_blank">银色qL</a> 2007-05-18 10:16 <a href="http://www.tkk7.com/xzhoujun/archive/2007/05/18/118264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts+Spring+Hibernate内存泄漏http://www.tkk7.com/xzhoujun/archive/2007/05/18/118251.html银色qL银色qLFri, 18 May 2007 01:54:00 GMThttp://www.tkk7.com/xzhoujun/archive/2007/05/18/118251.htmlhttp://www.tkk7.com/xzhoujun/comments/118251.htmlhttp://www.tkk7.com/xzhoujun/archive/2007/05/18/118251.html#Feedback0http://www.tkk7.com/xzhoujun/comments/commentRss/118251.htmlhttp://www.tkk7.com/xzhoujun/services/trackbacks/118251.html对于q一句话,引用关于IntrospectorCleanupListener一D解?

引用
spring中的提供了一个名为org.springframework.web.util.IntrospectorCleanupListener的监听器。它主要负责处理由 JavaBeans Introspector的用而引L(fng)~冲泄露。spring中对它的描述如下Q它是一个在web应用关闭的时?清除JavaBeans Introspector的监听器.web.xml中注册这个listener.可以保证在web 应用关闭的时候释放与掉这个web 应用相关的class loader 和由它管理的cd果你使用了JavaBeans Introspector来分析应用中的类,Introspector ~冲中会(x)保留q些cȝ引用.l果在你的应用关闭的时?q些cM?qing)web 应用相关的class loader没有被垃圑֛?不幸的是,清除Introspector的唯一方式是刷新整个缓?q是因ؓ(f)我们没法判断哪些是属于你的应用的引用.所以删除被~冲的introspection?x)导致把q台?sh)脑上的所有应用的introspection都删?需要注意的?spring 托管的bean不需要用这个监听器.因ؓ(f)spring它自qintrospection所使用的缓冲在分析完一个类之后?x)被马上从javaBeans Introspector~冲中清除掉.应用E序中的cM来不直接使用JavaBeans Introspector.所以他们一般不?x)导致内部查看资源泄?但是一些类库和框架往往?x)生这个问?例如:Struts 和Quartz.单个的内部查看泄漏会(x)D整个的web应用的类加蝲器不能进行垃圑֛?在web应用关闭之后,你会(x)看到此应用的所有静态类资源(例如单例).q个错误当然不是p个类?w引L(fng).

用法很简单,是在web.xml中加?
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>

 



银色qL 2007-05-18 09:54 发表评论
]]>
rmi的实?/title><link>http://www.tkk7.com/xzhoujun/archive/2006/11/04/79033.html</link><dc:creator>银色qL</dc:creator><author>银色qL</author><pubDate>Sat, 04 Nov 2006 02:26:00 GMT</pubDate><guid>http://www.tkk7.com/xzhoujun/archive/2006/11/04/79033.html</guid><wfw:comment>http://www.tkk7.com/xzhoujun/comments/79033.html</wfw:comment><comments>http://www.tkk7.com/xzhoujun/archive/2006/11/04/79033.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xzhoujun/comments/commentRss/79033.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xzhoujun/services/trackbacks/79033.html</trackback:ping><description><![CDATA[RMIQ远E方法调用(Remote Method InvocationQ是Enterprise JavaBeans的支柱,是徏立分布式Java应用E序的方侉K径。RMI是非常容易用的Q但是它非常的强大?br />  RMI的基是接口,RMI构架Z一个重要的原理Q定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子,建立一个简单的q程计算服务和用它的客L(fng)?br /><br />  一个正常工作的RMIpȝ׃面几个部分组成:(x) <ul><li>q程服务的接口定? </li><li>q程服务接口的具体实? </li><li>桩(StubQ和框架QSkeletonQ文? </li><li>一个运行远E服务的服务? </li><li>一个RMI命名服务Q它允许客户端去发现q个q程服务 </li><li>cL件的提供者(一个HTTP或者FTP服务器) </li><li>一个需要这个远E服务的客户端程?</li></ul><p>相关代码如下Q?br />接口c?br />public interface RMI_Add extends java.rmi.Remote {<br /> public long add(long a, long b, long c) throws java.rmi.RemoteException;<br />}<br /><br /><br />实现c?br />import java.rmi.Naming;</p><p>public class RMI_AddImpl extends java.rmi.server.UnicastRemoteObject implements RMI_Add {<br /> public RMI_AddImpl() throws java.rmi.RemoteException {<br />  super();<br /> }</p><p> public long add(long a, long b, long c) throws java.rmi.RemoteException {<br />  return a + b + c;<br /> }</p><p> public static void main(String[] args) {<br />  try {<br />   RMI_Add d = new RMI_AddImpl();<br />   Naming.rebind("rmi://127.0.0.1:1099/RMI_AddService", d);<br />  } catch (Exception e) {<br />   e.printStackTrace();<br />  }<br /> }</p><p>}<br /><br />客户?br />import java.net.MalformedURLException;<br />import java.rmi.Naming;<br />import java.rmi.NotBoundException;<br />import java.rmi.RMISecurityManager;<br />import java.rmi.RemoteException;</p><p>public class Client {<br /> public static void main(String[] args) {<br />  System.setSecurityManager(new RMISecurityManager());</p><p>  try {<br />   RMI_Add t = (RMI_Add) Naming.lookup("rmi://127.0.0.1:1099/RMI_AddService");<br />   for (int i = 0; i < 10; i++)<br />    System.out.println("Perfect time =" + t.add(1, 2, 3));<br />  } catch (MalformedURLException e) {<br />   e.printStackTrace();<br />  } catch (RemoteException e) {<br />   e.printStackTrace();<br />  } catch (NotBoundException e) {<br />   e.printStackTrace();<br />  }<br /> }</p><p>}<br /><br /><br />一条最单的安全{略,它允怓Q何h做Q何事,对于你的更加关键性的应用,你必L定更加详l安全策略?br />grant {<br />  permission java.security.AllPermission "", "";<br />};<br /><br />相关命o(h)<br />rmic -classpath . -d . RMI_AddImpl<br />start rmiregistry 1099<br />java -Djava.rmi.server.codebase=file:///E:/workspace/rmi/ RMI_AddImpl<br />java -Djava.security.policy=policy.txt Client</p><img src ="http://www.tkk7.com/xzhoujun/aggbug/79033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xzhoujun/" target="_blank">银色qL</a> 2006-11-04 10:26 <a href="http://www.tkk7.com/xzhoujun/archive/2006/11/04/79033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL查询优化http://www.tkk7.com/xzhoujun/archive/2006/10/29/77912.html银色qL银色qLSun, 29 Oct 2006 08:54:00 GMThttp://www.tkk7.com/xzhoujun/archive/2006/10/29/77912.htmlhttp://www.tkk7.com/xzhoujun/comments/77912.htmlhttp://www.tkk7.com/xzhoujun/archive/2006/10/29/77912.html#Feedback1http://www.tkk7.com/xzhoujun/comments/commentRss/77912.htmlhttp://www.tkk7.com/xzhoujun/services/trackbacks/77912.htmlq个帖子主要ȝ提高查询速度的方法,涉及(qing)到减连接数据库ơ数、徏立烦引、优化语句等斚w?/p>

关于索引Q推荐{载的q篇文章
http://blog.csdn.net/dutguoyi/archive/2006/01/10/575617.aspx

改善SQL语句的效?br />http://community.csdn.net/Expert/topic/5087/5087396.xml?temp=.345669
数据量很大怎样加快索检速度
http://community.csdn.net/Expert/topic/5058/5058320.xml?temp=.1229517
索引建立Ҏ(gu)的区?br />http://community.csdn.net/Expert/topic/5068/5068154.xml?temp=.3010218
频繁插入删除数据需要更新烦?br />http://community.csdn.net/Expert/topic/4937/4937910.xml?temp=.8428614
试了一下sql server 2005 全文?br />http://community.csdn.net/Expert/topic/4878/4878430.xml?temp=.6049311

其他关于效率的高频问?/p>

判断一个表的数据不在另一个表中最优秀Ҏ(gu)Q?br />http://community.csdn.net/Expert/topic/5038/5038742.xml?temp=.4704553
删除千万U表中重复记录的办法
http://community.csdn.net/Expert/topic/5089/5089261.xml?temp=.7907068

数据库数据查询变得不正常cd问题

大数据量Q稳定运行一D|候以后无法得到查询结果?br />http://community.csdn.net/Expert/topic/4810/4810464.xml?temp=9.014529E-02



银色qL 2006-10-29 16:54 发表评论
]]>
EJBW记http://www.tkk7.com/xzhoujun/archive/2006/07/28/60486.html银色qL银色qLFri, 28 Jul 2006 02:06:00 GMThttp://www.tkk7.com/xzhoujun/archive/2006/07/28/60486.htmlhttp://www.tkk7.com/xzhoujun/comments/60486.htmlhttp://www.tkk7.com/xzhoujun/archive/2006/07/28/60486.html#Feedback0http://www.tkk7.com/xzhoujun/comments/commentRss/60486.htmlhttp://www.tkk7.com/xzhoujun/services/trackbacks/60486.htmlQ?Q?无状态会(x)话bean
不保存客h的会(x)话状?
优点Q用小量的实例卛_满大量的客戗每个实例都没有标识Q相互之间是{h(hun)的?
{?的无状态会(x)话beanQ?多次和一ơ调用的l果和效应相同?
在集中可以负蝲均衡 a 机器p|Q可以在b机器上重?
非等?的无状态会(x)话beanQ?如:(x)计数?
不能自动因故障而进行切换?
Q?Q?有状态会(x)话bean
保存客户机的?x)话状?
特点Q?在有?x)话状态会(x)话的bean例子中,出纳员的数量{于zd的顾客的数量Q这可以化编E模?
weblogic 通过内存复制技?在集中q行负蝲均衡
内存复制技术:(x) 每个有会(x)话状态的bean实例都将存储在两个服务器的内存中Q一个服务器作ؓ(f)L务器Q另一个作助服务器?
如果d败,辅助变ؓ(f)主,然后自动选择别的可用的服务器作ؓ(f)辅助?
遗憾Q?很难在Servlet 和JSP中用好有状态会(x)话bean。可能会(x)发生q发现象Q生RemoteException

weblogic ?lt;allow-concurrent-calls> 可以锁Mq发的调用?
同步Q?可以有选择地实?Javax.ejb.SessionSynchronization接口
afeterBegin() //q入事务?
beforeCompletion() //提交事务?用于提交前把~存的数据写到数据库?
afterCompletion() //提交事务?用于释放׃n资源或者更C务提交和l止斚w的统计信?
?x)话bean通过?SessionContext 对象中的 getUserTransaction() Ҏ(gu),取得对UserTransaction的应?
通常 SessionContext 被存攑֜成员变量?
** C是在调用ejb.create()Ҏ(gu)前调?setUserTransaction() Ҏ(gu)
利用?UserTransaction 的引用会(x)话可以?begin() 、commit()、rollback() Ҏ(gu)界定一个事?


Q?Q?实体 beanQ?
它有一个主健作为唯一的标识符
l成部分: 由本地接口、远E接口、beancR主健类和配|描q器l成?
本地接口Q?
扩展了javax.ejb.EJBHome接口Q包括createQ)、removeQ)、finder 和home{方?
1)createQ)Ҏ(gu)调用beancM的ejbCreateQ)Ҏ(gu)。相当于数据的insert Ҏ(gu)?
2)removeQ)Ҏ(gu)相当于数据库的delete操作?
3)finderQ)Ҏ(gu)Q客户能够查询和接收满x询条件的实体bean的引用。每个实体bean的本地接口中都必?
有一个findByPrimaryKey() Ҏ(gu)
4)home Ҏ(gu)Q类g无状态会(x)话bean?
dc:(x)
实体bean必须包括一个主健类Q主健类用于标识实体bean实例Q而且实体bean数据cd必须是唯一的?
dcd以是java的基本类型String Integer 也可以是用户自定义的?
也可以是多个字段的主健的复合d?
bean cdbean的上下文环境Q?
实现javax.ejb.EJBObject 接口,其中包含业务Ҏ(gu)的语法格式定?
bean cdCjavax.ejb.EntityBean接口,同javax.ejb.SessionBean接口一?EntityBean 接口包含了EJB
容器调用bean实例的语法格?
在bean的构造器执行之后,立即调用setEntityContext() Ҏ(gu),同时把bean实例的EntityContext 传递给?
beancdChomeҎ(gu)和远E接口中的业务方?homeҎ(gu)是针对匿名实例的Ҏ(gu)不应使用有关的主健?

分ؓ(f)Q?
容器理持久性(ContainerQManagerd PersistenceQCMP
特点Q?EJB 容器自动生成Q用于把实体bean的数据写入到数据库中?
优点Q?bean作者可以避免编写实体bean与关pL据库数据讉K斚w的代码。cmp自动处理这一q程?
个? 每一个cmp 实体bean 都有一l容器管理的字段,q些字段存储在数据库,q可从中加蝲.通常,每个容器理的字D都对应?
关系数据库中的一个列.
容器理的每个字D必dejb-jar.XML中定?q容器能够把容器管理的字段与beancM的set和getҎ(gu)q行匚w比较.
另外,bean作者可以增加另外一个cmp配置描述文g weblogic-cmp-rdbms.xml,其中包含数据库表名和每个容器理的字
D和相应的数据列的映?

bean理持久性(BeanQManagerd Persistence Q?BMP
特点Q?在bmp实体中,bean作者需要自q写数据库讉K代码Q也是~写JDBC代码Q插入、删除和查询数据库中的实体bean数据?
优点Q?可以让bean的作者完全灵zȝ处理实体bean的持久性数据,因ؓ(f)作者需要写数据讉K的代码,他几乎可以用Q何持久性存
储方式ejb2.0 cmp提供实体bean之间的标准关pL,使容器能自动理业务对象之间的交互?
cmp拥有更多的访问控Ӟ因此cmp比bmp有较好的性能?

Q?Q?消息 bean
把JMS 和EJB 成功l合在一P集成的结?
特点Q客h不需要调用消息bean 相反Q?客户机只需要发一个消息给jMS目的?
在消息到达以后,消息bean的onmessageQ)Ҏ(gu)被调用Q以处理q个消息?
消息bean用于在服务器中执行异步操作?

2。EJB l成
Q?Q远E接?
public interface HelloWord extents EJBObject
?
//EJBObject 接口Ҏ(gu)
EJBHome getEJBHome() throws RemoteException;

Object getPrimaryKey() throws RemoteException;

void remove() throws RemoteException, RemoveException;

Handle getHandle() throws RemoteException;

boolean isIdentical(EJBObject ejbObject) throws RemoteException;
?
Q?Q本地接?
本地接口是ejb工厂Q客h可以使用本地接口创徏、找出和删除ejb实例。只需写本地接口中的方法的语法调用格式
public class HelloWorldHome extends EJBHome
?
//EJBHome 接口Ҏ(gu)
void remove(Handle handle) throws RemoteException, RemoveException;

void remove(Object o) throws RemoteException, RemoveException;

EJBMetaData getEJBMetaData() throws RemoteException;

HomeHandle getHomeHandle() throws RemoteException;
// Home
public HelloWorld create() throws CreateException, RemoteException;
?

Q?Qbean c?

public class HelloWorldBean implements SessionBean
?
// SessionBean 中的Ҏ(gu)
public void setSessionContext(SessionContext sessionContext)
/**调用ơ方法会(x)话结?/
public void ejbRemove()
//ejb通过待命和活动的机制Q管理一l正在工作的有状态会(x)话bean实例
/**zd*/
public void ejbActivate()
/**待命*/
public void ejbPassivate()
// beanc?
// 每个home 的create Ҏ(gu)对应一个ejbCreateQ)Ҏ(gu)
// 有会(x)话状态有很多不同版本的createQ)Ҏ(gu)。而create Ҏ(gu)必须有ejbCreateQ)Ҏ(gu)与之一一对应
public void ejbCreate()


?

不要在ejbcMcM实现q程接口
3. EJB 配置描述?
Q?QejbQjar.xml
<ejb-jar> (注释)
<entERPrise-beans>
<session>
<ejb-name>HelloWorldQejbnameQ?lt;/ejb-name>
<home>com.dhc.helloworld.HelloWorldHomeQ本地接口类Q?lt;/home>
<remote>com.dhc.helloworld.HelloWorldQ远E接口类Q?lt;/remote>
<ejb-class>com.dhc.helloworld.HelloWorldBeanQbeanc)</ejb-class>
<session-type>StatelessQ无状态会(x)话)</session-type>
<transaction-type>BeanQbean理的事务)</transaction-type>
</session>
</enterprise-beans>
<container-transaction>
<method>
<ejb-name>ShoppingCartEjb</ejb-name>
<method-name>*Q说明ShoppingCartEjb的默认事务属性指定ؓ(f)RequiredQ?lt;/method-name>
</method>
<trans-attribute>RequiredQ容器管理的事务使用的属?Nerver、NotSupported
、Supports、Mandatory、Required、RequiredNewQ?lt;/trans-attribute>
</container-transaction>
</ejb-jar>
Q?Qweblogic-ejb-jar.xml (注释)
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
<ejb-name>HelloWorldQejb名称Q?lt;/ejb-name>
<jndi-name>HelloWorldEJBQjndi名称Q?lt;/jndi-name>
<max-bean-in-freepool>10Q限制不?x)有?0个无状态会(x)话beanq发q行Q?lt;/max-bean-in-freepool>
<max-bean-in-cache>10Q放到内存缓存中的有状态会(x)话bean的最大数量)</max-bean-in-cache>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>

4 . 建立ejb 档案文g
com/dhc/helloworld/QpackageQ?
com/dhc/helloworld/HelloWorldQ远E接口)
com/dhc/helloworld/HelloWorldHomeQ本地接口)
com/dhc/helloworld/HelloWorldBeanQbeanc)
META-INF
META-INF/ejbQjar.xmlQ配|描q器Q?
META-INF/weblogic-ejb-jar.xmlQweblogic服务器配|描q器Q?

说明Q?META-INF 必须为大?

5 . 容器理的事?
Nerver : 不参与事?如果参与产生RemoteException
NotSupported: 不能参与
Supports: 如果调用者正在参与事?相应的EJB调用也可以参与事?否则不能
Mandatory 如果调用者有一个事?相应的EJB可以参与事务,否则,TransactionRequiredException
Required 如果调用者有一个事?相应的EJB可以参与事务,否则,容器在调用相应的EJB之前,开始一个事?
当方法调用完成以?x交该事务.
RequiresNew 在调用相应的EJB之前,开始一个新的事?当方法调用返回时,x交这个事?


6、ejb 引用

在ejbQjar.xml
<ejb-ref>
<description> an EJB reference to the Widget EJB(描述)</description>
<ejb-ref-name>ejb/WidgetEJB</ejb-ref-name>
<ejb-ref-type>session</ejb-ref-type>
<home>com.dhc.WidgetHome</home>
<remote>com.dhc.Widget</remote>
</ejb-ref>

?weblogic-ejb-jar.xml
<ejb-reference-description>
<ejb-ref-name>ejb/WidgeEJB</ejb-ref-name>
<jndi-name>DeployedWidge</jndi-name>
</ejb-reference-description>

E序
Content ctx = new InitialContent();
Object h = ctx.lookup("java:/comp/env/ejb"); //环境变量是只ȝ,而且是当前ejb的本地变?
WidgetHome home = (WidgetHome)PortableRemoteObject.narrow(h,WidgeHome.class);

7. 资源理器的引用
定义资源理的引?
例子Q?建立 jdbc、DBPool与JDBC数据源的映射
在ejbQjar.xml
<resource-ref>
<description>(描述)</description>
<res-ref-name>jdbc/BDPool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

?weblogic-ejb-jar.xml
<resource-description>
<res-ref-name>jdbc/DBPool</res-ref-name>
<jndi-name>DBPool</jndi-name>
</resource-description>

config.xml

<JDBCTxDataSource
name="DBPool"
Targets="myserver"
JDDIName="DBPool" (jndi名称)
PoolName ="DevelopmentPool"
/>

引用的优?
我们用大量的映射和配|,才徏立了资源理器的引用Q但是还是很值得的?
以ؓ(f)便于部v人员重新配置应用而不需要修改实际的beancM码。甚至也不需要修改ejb的配|描q器
java bean 代码

Content ctx = new InitialContent();
DataSource dataSource = (DataSource)ctx.lookup("java:/comp/env/jdbc/DBPool");

8 . 句柄Q?作ؓ(f)一个串行化的对象,句柄中封装了_的信息,以便重徏对EJBObject的引用?
句柄可用于在两个怺合作的进E中传递EJBObject的引用。接受进E即可从句柄中取得EJBObject的引用?

Z取得句柄Q可以调用EJBObject接口的getHandleQ)Ҏ(gu)Q返回一个Handle实例
Z重徏EJBObject 引用。可以用Handle 接口的getEJBObjectQ)Ҏ(gu)?

例子Q?
HelloWorld hw = home.create();
javax.ejb.Handle handle = hw.getHandle();
HelloWorld helloworld = (HelloWorld)PortableRemoteObject.narrow(handle.getEJBObject(),HelloWorld.class);


HomeHandle:
cMhandle Q但不能用于引用EJBObject
HomeHandle 包含_的信息,可以重徏EJBHomeQ)的引用?
差异Q?
是调?getHomeHandleQ)Ҏ(gu) 和getEJBHomeQ)Ҏ(gu)
例子片断Q?
Content ctx Q?new InitialContext();
Object h = ctx.lookup("HelloWorldEJB");
HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(h,HelloWorldHome.class);
HomeHandle homehandle = home.getHomeHandle();
Object nh = homehandle.getEJBHome();
HelloWorldHome newHomeReference = (HelloWorldHome)PortableRemoteObject.narrow(nh,HelloWorldHome.class);

优点:
他们可以自动的存储重建引用所需的信?

9.使用事务的技?
(1) 一个事务不要涉?qing)太多的操?
(2) 容器理和bean理的事?
事务既耗费应用服务器中的资?又耗费数据库资?所以事务越短越?
量使用容器理事务而不要采用bean理事务的方?
(3) ejb遇到错误,需要强制事务回? 使用EJBObject.setRollbackOnly();
(4) 不能让事务涉?qing)web层和表示逻辑
(5) 企业应用中不应当选用supports 事务属?因ؓ(f)只有调用者开始一个事务后,ejb才能在事务中q行.


银色qL 2006-07-28 10:06 发表评论
]]>
J2EE工程实现中常见安全问题解军_{?/title><link>http://www.tkk7.com/xzhoujun/archive/2006/06/20/54030.html</link><dc:creator>银色qL</dc:creator><author>银色qL</author><pubDate>Tue, 20 Jun 2006 09:35:00 GMT</pubDate><guid>http://www.tkk7.com/xzhoujun/archive/2006/06/20/54030.html</guid><wfw:comment>http://www.tkk7.com/xzhoujun/comments/54030.html</wfw:comment><comments>http://www.tkk7.com/xzhoujun/archive/2006/06/20/54030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xzhoujun/comments/commentRss/54030.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xzhoujun/services/trackbacks/54030.html</trackback:ping><description><![CDATA[by fleshwound (<a target="_blank">http://www.smatrix.org</a>)<br />(注:(x)q是我们的完整设计中的一部分Q其它有些部分尚要求保密Q希望这个拙文能l做J2EE目的兄弟们带来点帮?有Q何关于JAVA安全和密码学理论和应用的问题可以来我们的论坛:<a target="_blank">http://bbs.smatrix.org</a>)<br />   q年来,随着互连|和计算机的普及(qing)Q电(sh)子商务和?sh)子政务成?f)当今C会(x)生活的重要组成部分,以网上订购和|上在线支付的ؓ(f)主要功能的网店系l?Web Shop System)是目前电(sh)子商务的热门技术?br />   JAVA以它“一ơ编译,处处q行”的神奇魅力和强大的安全技术支持,很快成ؓ(f)WEB信息pȝ开发的首选语aQ而J2EE是ZWEB应用开发而诞生的。目前J2EE的应用大部䆾都是多层l构? 良好的分层可以带来很多好处,例如可以使得代码l构清晰Q方便组件复用,可以快速适应应用的新需求。同ӞJAVAq提供了强大的安全技?例如:JCA,HTTPS,JSSA{?。对于电(sh)子商务系l而言,pȝq_的安全性和效率是其中的核心问题,而这些正好是J2EE?qing)其相关技术的强项?br /><br />0 pȝ中所要用的API?qing)其特点介?br />该系l中主要使用的技术和特点如下:<br />(1)EJB :主要是作为J2EE中间层,完成商业逻辑。目前主要有三种cd的EJB: ?x)?Bean (Session Bean)、实体Bean (Entity Bean)、消息驱动的BeanQMDBQ; <br />(2)JAAS:在J2EE 中用于处理认证和授权服务Q进行资源控Ӟ<br />(3)JSP和Java Servlets:用于J2EE的表C层Q生成用L(fng)面;<br />(4)JDBC:用于数据库(资源层)的连接和与数据库q行交互Q?<br />(5)JNDI:Java命名和目录接?该API实际上是用来讉KJ2EE的所有资源;<br />(6)JMS:Java消息传输服务Q配合MDB使用?br /><br />1 Session的安全问题与解决Ҏ(gu)<br />在项目中,保存Session一般有两种Ҏ(gu)Q一是分别放在客L(fng)Q一是集中放在服务器端。在客户端保存Session是指Session的状态串行化Q然后嵌入到q回l客L(fng)HTML面中。当Session中的信息很少Ӟq样实现比较Ҏ(gu)Q另外这U方法还消除了跨多个服务器复制状态的问题?br />  但是在客L(fng)保存Session状态时Q必考虑到由此带来的安全问题Q因为黑客可能通过嗅探dQSnifferQ获取敏感信息。ؓ(f)了不让敏感信息数据暴Ԍ解决的方法是Ҏ(gu)据进行加密或者用HTTPSQ采用SSL技术?br />  如果是要保存大量Session状态的应用Q最好的Ҏ(gu)是将Session状态统一攑֜服务器端。当状态被保存在服务器上时Q不?x)有客户端Session理的大和cd限制。此外,q避免了由此带来的安全问题,而且也不?x)遇到由于在每个h间传送Session状态带来的性能影响Q但是对服务器的性能要求比较高。网店系l的安全性要求较高,因此Sessionq是集中攑֜中间层服务器?同时对客L(fng)到服务器端采用SSLq接?br />2客户端的~存安全设计<br />大部分顾客用的WEB览器将览q的面~存在磁盘上Q这h们浏览网늚时候不需要重新向服务器发出HTTPhQ对于普通的|页不存在安全问题。但是对于需要保密的WEB应用Q会(x)带来安全隐?zhn)和泄漏隐U,因此对于客户端缓存,也必d适当的处理。最好的Ҏ(gu)是止使用~存Q但是对于大部分֮而言Q要求在客户端不用缓存是不现实的Q因此我们必d中间层解册问题Q方法是采用Servletqo(h)器技术。该技术是Servlet2.3以后才出现的Q在J2EE中的应用很广泛。要使用该技术,需要执行以下步骤:(x)<br />Q?Q?nbsp;   ~写一个Servletqo(h)器,实现javax.servlet.Filter接口Q?br />Q?Q?nbsp;   修改Web.xml文gQ容器知道qo(h)器在什么时候被调用?br />Javax.servlet.Filter主要?个方法:(x)<br />(1)init(FilterConfig cfg) :当开始?servlet qo(h)器服务时Q容器调用此Ҏ(gu)一ơ。传送给此方法的 FilterConfig 参数包含 servlet qo(h)器的初始化参敎ͼ<br />(2)destroy() :当不再?servlet qo(h)器服务时Q容器调用此Ҏ(gu)Q?br />(3)doFilter(ServletRequest req, ServletResponse res, FilterChain chain): 容器为每个映至此过滤器?servlet h调用此方法,然后才调用该 servlet 本n。传送至此方法的 FilterChain 参数可用来调用过滤器链中的下一个过滤器。当链中的最后一个过滤器调用 chain.doFilter() Ҏ(gu)Ӟ运行最初请求的 servlet。因此,所有过滤器都应该调?chain.doFilter() Ҏ(gu)。如果过滤器代码中的附加认证查导致故障,则不需要将原始 servlet 实例化。在q种情况下,不需要调?chain.doFilter() Ҏ(gu)Q相反,可将光定向臛_它一些错误页面?br />如果 servlet 映射臌?servlet qo(h)器,则按照应用程序的部v描述W(web.xmlQ中的先后出现的ơ序来调?servlet qo(h)器。这一部分的主要代码如下:(x)<br />//要引入的cd<br />import javax.servlet.*;<br />import javax.servlet.http.HttpServletResponse;<br />import java.io.*;<br />import java.security.*;<br />//讄servletqo(h)代码D?br />public class CacheFilter implements Filter {<br />protected FilterConfig filterConfig;<br />private String cachetp;<br />//初始?br />public void init(FilterConfig filterConfig) throws ServletException <br />{<br />  this.filterConfig = filterConfig;<br />  cachetp=config.getInitParameter("CacheControlType");<br />  if (cachetp==null)<br />  {<br />  throw new  ServletException("没有定义Cache控制cd");<br />  }<br />}<br />//<br />public void destroy() <br />{<br />  this.filterConfig = null;<br />}<br />//执行qo(h)器部?br />public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)<br />throws IOException, ServletException {<br />  if (response instanceof HttpServletResponse )<br />  {<br />      HttpServletResponse resp=(HttpServletResponse) response;<br />      resp.addHeader("Cache-Control",cachetp);<br />  } <br />  else<br />  {<br />    throw new  ServletException("非法相应!");<br />  }<br />    chain.doFilter(request, response);<br />  }<br /><br /><br />}<br />以下是在Web.xml中添加的对应的内?br /><br /><filter id="Filter_cache"><br />  <filter-name>CacheFilter</filter-name><br />  <filter-class>CacheFilter</filter-class><br />  <description>Cache filter</description><br />  <init-param><br />    <param-name>CacheControlType</param-name><br />    <param-value>no-store</param-value><br />  </init-param><br />  </filter-id><br /><filter-mapping><br />  <filter-name>CacheFilter</filter-name><br />  <url-pattern>/cachecontrol</url-pattern><br /></filter-mapping><br />3视图讉K的安全设|?br />  所有用户都必须登陆Q只有登陆才可以看到用户的角色和权限相对应的视图。因此一个重要的问题是如何防止一个视图或者部分的视图被一个未被授权的客户直接讉K?br />  在一些情况下Q资源被限制为完全不允许某些用户讉K,例如Q管理后台就不应该让普通顾客会(x)员访问。有几个Ҏ(gu)可以做到q一炏V一个方法是加入应用逻辑到处理控制器或者视囄E序中,止某些用户讉K。另一个方案是讄q行时的pȝQ对于一些资源,仅允许经由另一个应用资源内部调用。在q种情ŞQ对于这些资源的讉K必须被通过另一个表现层的应用资源进行,例如一个servlet控制器。对于这些受限制的资源不允许通过览器直接调用?br />  在J2EE中,可以利用Web容器中内|的安全技术来q行角色讉K资源的控制。根据最新版本的servlet和EJB规范Q安全限制在web.xml的配|描q文件中描述Q我们可以通过配置web.xml来控制角色访问,修改配置描述文gweb.xml可以达到快速修改安全策略的目的?br />  安全限制允许使用~程的方法根据用L(fng)角色来控制访问。资源可以被某些角色的用戯问,同时止其它的角色访问。另外,某个视图的一部分也可以根据用L(fng)角色来限制其讉K。如果某些资源完全不允许来自于浏览器的直接访问,那么q些资源可以配置只允怸些特D的安全角色讉KQ而这些安全角色不分配lQ何一个用戗这样只要不分配q个安全角色Q那么以q种方式配置的资源将止所有的览器直接访问。下面一个例子就是web.xml配置文g的一部分Q它定义了一个安全的角色以限制直接的览器访问。角色的名字?ldquo;vip”Q受限制资源的名字是specialgood1.jsp、specialgood2.jsp、specialgood3.jsp和bookinfo.jsp。除非一个用h者组被分配到“vip”角色Q否则这些客户都不可以直接访问这些JSP面。不q,׃内部的请求ƈ不受q些安全的限Ӟ一个初始时由某servlet控制器处理的h会(x)导向到这些受限制的页面,q样它们可以间接访问这些JSP面?<br />    Qsecurity-constraintQ?br />    Qweb-resource-collectionQ?br />    Qweb-resource-nameQspecialgood Q?web-resource-nameQ?br />    QdescriptionQspecial good infomationQ?descriptionQ?br />    Qurl-patternQ?shop/jsp/a1/specialgood1.jspQ?url-patternQ?br />    Qurl-patternQ?shop/jsp/a1/specialgood2.jspQ?url-patternQ?br />    Qurl-patternQ?shop/jsp/a1/specialgood3.jspQ?url-patternQ?br />Qurl-patternQ?shop/jsp/a1/bookinfo.jspQ?url-patternQ?br />    Qhttp-methodQGETQ?http-methodQ?br />    Qhttp-methodQPOSTQ?http-methodQ?br />    Q?web-resource-collectionQ?br />    Qauth-constraintQ?br />    Qrole-nameQvipQ?role-nameQ?br />    Q?auth-constraintQ?br />    Q?security-constraintQ?br />3 各层ơ间的耦合问题与解决策?br />  表现层的数据l构Q例如HttpServletRequestQ应该被限制在表现层上。如果将q些l节攑ֈ其它?主要是业务逻辑?中,大大降低了代码的的重用性,令代码变得复杂,q且增加了层间的耦合。解x法一个常用方法是不让表现层的数据l构和商业层׃nQ而是拯相关的状态到一个更常见的数据结构中再共享。你也可以选择p现层数据l构中将相关的状态分d来,作ؓ(f)独立的参数共享。另外在域对象暴露表现层的数据结构,如果诸如HttpServletRequest的请求处理数据结构和域对象共享,q样做也?x)增加了应用中两个不同方面的耦合。域对象应该是可重用的组Ӟ如果它们的实C赖协议或者层相关的细节,它们可重用性就很差Q同时维护和调试高耦合的应用更加困难。成熟的解决Ҏ(gu)是不通过传送一个HttpServletRequest对象作ؓ(f)一个参敎ͼ而是拯request对象的状态到一个更为常用的数据l构中,q且这个对象共享给域对象。你也可以选择由HttpServletRequest对象中将相关的状态分d来,q且每一个的状态作Z个独立的参数提供l域对象?br />4 EJB的安全设计与控制<br />EJB的执行过E一般是q样的:(x)(1)客户端通过JNDI索Home对象的引用;(2)JNDIq回Home对象的引用;(3)h创徏一个新的EJB对象Q?4)创徏EJB对象Q?5)q回EJB对象Q?6)调用商务Ҏ(gu)Q?7)调用Enterprise Bean.引vEJB的安全问题原因主要存在三个方?<br />(1)用包嗅探?Packet Sniffer)获取用户凭证信息q直接调用会(x)话BeanQ(2Q对实体Beanq行未授权访问;Q?Q对消息驱动的Bean的无效访?发布恶意或者虚假的消息).<br />以上安全问题可导致客L(fng)或者服务端ƺ骗d和DDOSd。解决问?1)的方法是使用JAVA中SSL技术来保护通讯Q解?2)的方法是对于实体Bean全部采用本地接口或者采用JAAS(文献[1])Q对?1)?2)Q我们可以同旉取以下措施:(x)让容器完成认证ƈ传输用户凭证信息,另外使用声明性或者程序设计的安全验证角色。对于问?3),J2EEq没有提供一个很好的Ҏ(gu)Q我们的解决Ҏ(gu)是采用数字签名技术来保证信息来自可信ȝ源。该Ҏ(gu)的结合代码简要说明如?消息采用JMS传递:(x)<br />//客户端,要用到消息发送者的U钥q行{֐<br />...<br />message.setString("userid",userid);<br />message.setString("useritem",useritem);<br />message.setInt("usersn",serialnum);//包含一个序列号<br />message.setString("usercertid",certid);<br />String signature=getSignature(userid+":"+useritem+":"+serialnum+":"+certid);<br />//q行{֐,其中getSignature为签名函敎ͼ要用到消息发送者的U钥q行{֐Q具体密码学技术可参考文献[2]Q?br />message.setString("signature",signature);<br />sendmessage(message);//发送信?br />...<br />//服务器端<br />String checkstr=userid+":"+message.getString("useritem")+":"+<br />message.getInt("usersn")+":"+usercertid;<br />boolean b_check=checkSignature(checkstr,msg.getString("signature"),<br />usercertid,userid);<br />//q行验证,其中checkSignature为验证函敎ͼ要用到消息发送者的公钥q行验证Q具体密码学技术可参考文献[2]Q?br />5 CA中心与证书的生成<br />前面我们已经提出在客L(fng)要用HTTPS和SSL,因此要徏立一个自qCA中心来管理分发证?加强客户端到中间层服务器端通讯的安全?建立CA中心的第一步是利用JAVA工具包中的Keytool生成一个X509证书,然后该证书交由权威CA中心Vertsign{֐,再将该证书设|ؓ(f)根证?建立自己的CA.每次有新用户注册交易的时候,都必ȝ发一个用L(fng)一无二的证书,关键的过E是如何{֏证书.{֏证书的过E如下:(x)<br />(1)从中间层CA服务器的密钥库中dCA的证书:(x)<br />FileInputStream in=new FileInputStream(ShopCAstorename);<br />        KeyStore ks=KeyStore.getInstance("JKS");<br />        ks.load(in,storepass);<br />        java.security.cert.Certificate c1=ks.getCertificate(alias);<br />(2)获得CA的私钥:(x)<br />PrivateKey caprk=(PrivateKey)ks.getKey(alias,cakeypass);<br />(3)从CA的证书中提取{֏者信息:(x)<br />byte[] encod1=c1.getEncoded();<br />        X509CertImpl shopcimp1=new X509CertImpl(encod1); <br />        X509CertInfo shopcinfo1=(X509CertInfo)shopcimp1.get(X509CertImpl.NAME+<br />"."+X509CertImpl.INFO);<br />        X500Name issuer=(X500Name)shopcinfo1.get(X509CertInfo.SUBJECT+<br />"."+CertificateIssuerName.DN_NAME);<br />(4)获取待签发的证书相关信息Q与Q?Q类|<br />(5)讄新证书的有效期、序列号、签发者和{֐法Q?br />//讄新证书有效期?q?br />       Date begindate =new Date();<br />       Date enddate =new Date(begindate.getTime()+3000*24*360*60*1000L);            CertificateValidity cv=new CertificateValidity(begindate,enddate);<br />       cinfo2.set(X509CertInfo.VALIDITY,cv);<br />     //讄新证书序列号<br />       int sn=(int)(begindate.getTime()/1000);<br />       CertificateSerialNumber csn=new CertificateSerialNumber(sn);<br />       cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);<br />       //讄新证书签发?br />       cinfo2.set(X509CertInfo.ISSUER+"."+<br />CertificateIssuerName.DN_NAME,issuer);<br />          //讄新证书算?br />       AlgorithmId algorithm = <br />new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);<br />       cinfo2.set(CertificateAlgorithmId.NAME+<br />"."+CertificateAlgorithmId.ALGORITHM, algorithm);<br />(6)创徏证书q签发:(x)<br />// 创徏证书<br />        X509CertImpl newcert=new X509CertImpl(cinfo2);<br />        // {֐<br />        newcert.sign(caprk,"MD5WithRSA");<br />(7)新证书提供l注册用Pq提C安?一般的做法是在用户注册成功后系l立卌回一个证书对象给中间层某个ServletQ由其返回给用户?br />                      参考文?br />[1]沈耀,陈昊?李新?EJB容器中基于JAAS 的安全机制的实现.[J]:计算机应用与软g 2004.9 16~18 <br />[2](?Jess Garms著,庞南{译. Java安全性编E指南[M].北京:?sh)子工业出版C?2002<br />[3] <a target="_blank">http://java.sun.com/j2ee/</a><br />[4] 蔡剑,景楠. Java |络E序设计QJ2EEQ含1.4最新功能)[M].北京: 清华大学出版C?2003<br />[5](?John Bell Tony Loton. Java Servlets 2.3~程指南[M].北京: ?sh)子工业出版C?2002<br />[6](?Joseph J.Bambara{著,刘堃{译. J2EE技术内q[M].北京:机械工业出版C?2002<br />[7](?Li Gong?JAVA 2q_安全技?mdash;—l构、API设计和实现[M].北京: 机械工业出版C?2000<br />[8](?Danny Ayers{著,曑֛q等? Java服务器高U编E[M].北京Q机械工业出版社 2005<br />[9]http://www.smatrix.org/bbs<br />[10]http://www.smatrix.cn/bbs<br />(Ƣ迎转蝲Q但需保留作者信息!Qby felshwound)<img src ="http://www.tkk7.com/xzhoujun/aggbug/54030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xzhoujun/" target="_blank">银色qL</a> 2006-06-20 17:35 <a href="http://www.tkk7.com/xzhoujun/archive/2006/06/20/54030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达?/title><link>http://www.tkk7.com/xzhoujun/archive/2006/05/05/44663.html</link><dc:creator>银色qL</dc:creator><author>银色qL</author><pubDate>Fri, 05 May 2006 10:11:00 GMT</pubDate><guid>http://www.tkk7.com/xzhoujun/archive/2006/05/05/44663.html</guid><wfw:comment>http://www.tkk7.com/xzhoujun/comments/44663.html</wfw:comment><comments>http://www.tkk7.com/xzhoujun/archive/2006/05/05/44663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xzhoujun/comments/commentRss/44663.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xzhoujun/services/trackbacks/44663.html</trackback:ping><description><![CDATA[ <p> <strong>前言</strong> </p> <p>正则表达式是烦琐的,但是强大的,学会(x)之后的应用会(x)让你除了提高效率外,?x)给你带来绝对的成就感。只要认真去阅读q些资料Q加上应用的时候进行一定的参考,掌握正则表达式不是问题?/p> <p> <strong>索引</strong> </p> <p> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#1._引子" target="_blank" rel="nofollow"> <font size="2">1._引子</font> </a> <font size="2"> <br /> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#2._正则表达式的历史" target="_blank" rel="nofollow">2._正则表达式的历史</a> <br /> </font> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#3._正则表达式定? target="_blank" rel="nofollow"> <font size="2">3._正则表达式定?/font> </a> </p> <blockquote> <p> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#3.1_普通字W? target="_blank" rel="nofollow"> <font size="2">3.1_普通字W?/font> </a> <font size="2"> <br /> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#3.2_非打印字W? target="_blank" rel="nofollow">3.2_非打印字W?/a> <br /> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#3.3_Ҏ(gu)字符" target="_blank" rel="nofollow">3.3_Ҏ(gu)字符</a> <br /> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#3.4_限定W? target="_blank" rel="nofollow">3.4_限定W?/a> <br /> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#3.5_定位W? target="_blank" rel="nofollow">3.5_定位W?/a> <br /> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#3.6_选择" target="_blank" rel="nofollow">3.6_选择</a> <br /> </font> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#3.7_后向引用" target="_blank" rel="nofollow"> <font size="2">3.7_后向引用</font> </a> </p> </blockquote> <p> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#4._各种操作W的q算优先U? target="_blank" rel="nofollow"> <font size="2">4._各种操作W的q算优先U?/font> </a> <font size="2"> <br /> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#5._全部W号解释" target="_blank" rel="nofollow">5._全部W号解释</a> <br /> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#6._部分例子" target="_blank" rel="nofollow">6._部分例子</a> <br /> </font> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#7._正则表达式匹配规? target="_blank" rel="nofollow"> <font size="2">7._正则表达式匹配规?/font> </a> </p> <blockquote> <p> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#7.1_基本模式匚w" target="_blank" rel="nofollow"> <font size="2">7.1_基本模式匚w</font> </a> <font size="2"> <br /> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#7.2_字符? target="_blank" rel="nofollow">7.2_字符?/a> <br /> </font> <a href="file://D:\LinkToneCodes\Tone\ToneRobot\正则表达?regular expression).htm#7.3_定重复出现" target="_blank" rel="nofollow"> <font size="2">7.3_定重复出现</font> </a> </p> </blockquote> <hr /> <h2> <a target="_blank" rel="nofollow" name="1._引子">1. 引子</a> </h2> <p>  目前Q正则表辑ּ已经在很多Y件中得到q泛的应用,包括*nixQLinux, Unix{)QHP{操作系l,PHPQC#QJava{开发环境,以及(qing)很多的应用Y件中Q都可以看到正则表达式的影子?/p> <p>  正则表达式的使用Q可以通过单的办法来实现强大的功能。ؓ(f)了简单有效而又不失强大Q造成了正则表辑ּ代码的难度较大,学习(fn)h也不是很Ҏ(gu)Q所以需要付Z些努力才行,入门之后参照一定的参考,使用hq是比较单有效的?/p> <blockquote> <p>例子Q?span style="BACKGROUND-COLOR: #00ffff"> ^.+@.+\\..+$ </span></p> </blockquote> <p>  q样的代码曾l多ơ把我自q吓退q。可能很多h也是被这L(fng)代码l吓跑的吧。l阅L文将让你也可以自由应用这L(fng)代码?/p> <p>  注意Q这里的W?部分跟前面的内容看v来似乎有些重复,目的是把前面表格里的部分重新描述了一ơ,目的是让q些内容更容易理解?/p> <h2> <strong> <a target="_blank" rel="nofollow" name="2._正则表达式的历史">2. 正则表达式的历史</a> </strong> </h2> <div class="sq482oi" id="nstext" valign="bottom">  正则表达式的“祖先”可以一直上溯至对hcȝl系l如何工作的早期研究。Warren McCulloch ?Walter Pitts q两位神l生理学家研I出一U数学方式来描述q些经|络? <p>  1956 q? 一位叫 Stephen Kleene 的数学家?McCulloch ?Pitts 早期工作的基上,发表了一标题ؓ(f)“神l网事g的表C法”的论文Q引入了正则表达式的概念。正则表辑ּ是用来描述他称为“正则集的代数”的表达式,因此采用“正则表辑ּ”这个术语?/p><p>  随后Q发现可以将q一工作应用于?Ken Thompson 的计搜索算法的一些早期研IӞKen Thompson ?Unix 的主要发明h。正则表辑ּ的第一个实用应用程序就?Unix 中的 <em>qed </em>~辑器?/p><p>  如他们所_(d)剩下的就是众所周知的历史了。从那时L(fng)至现在正则表辑ּ都是Z文本的编辑器和搜索工具中的一个重要部分?/p></div> <p> </p> <h2> <strong> <a target="_blank" rel="nofollow" name="3._正则表达式定?>3. 正则表达式定?/a> </strong> </h2> <p>  正则表达?regular expression)描述了一U字W串匚w的模式,可以用来查一个串是否含有某种子串、将匚w的子串做替换或者从某个串中取出W合某个条g的子串等?/p> <blockquote> <ul> <li> <span style="BACKGROUND-COLOR: #ffff00">列目录时Q dir *.txt或ls *.txt中的*.txt?/span> <font color="#ff0000"> <span style="BACKGROUND-COLOR: #ffff00">?/span> </font> <span style="BACKGROUND-COLOR: #ffff00">是一个正则表辑ּ,因ؓ(f)q里*与正则式?的含义是不同的?/span> </li> </ul> </blockquote> <p>  正则表达式是由普通字W(例如字符 a ?zQ以?qing)特D字W(UCؓ(f)元字W)l成的文字模式。正则表辑ּ作ؓ(f)一个模板,某个字W模式与所搜烦的字W串q行匚w?/p> <h3> <strong> <a target="_blank" rel="nofollow" name="3.1_普通字W?>3.1 普通字W?/a> </strong> </h3> <p>  由所有那些未昑ּ指定为元字符的打印和非打印字W组成。这包括所有的大写和小写字母字W,所有数字,所有标点符号以?qing)一些符受?</p> <h3> <a target="_blank" rel="nofollow" name="3.2_非打印字W?>3.2 非打印字W?/a> </h3> <table cellspacing="1" cellpadding="3" border="0"> <tbody> <tr> <th style="FONT-SIZE: 12px" align="left">字符 </th> <th style="FONT-SIZE: 12px" align="left">含义</th> </tr> <tr> <td style="FONT-SIZE: 12px">\cx </td> <td style="FONT-SIZE: 12px">匚w由x指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ(f) A-Z ?a-z 之一。否则,?c 视ؓ(f)一个原义的 'c' 字符?/td> </tr> <tr> <td style="FONT-SIZE: 12px">\f </td> <td style="FONT-SIZE: 12px">匚w一个换늬。等价于 \x0c ?\cL?/td> </tr> <tr> <td style="FONT-SIZE: 12px">\n </td> <td style="FONT-SIZE: 12px">匚w一个换行符。等价于 \x0a ?\cJ?/td> </tr> <tr> <td style="FONT-SIZE: 12px">\r </td> <td style="FONT-SIZE: 12px">匚w一个回车符。等价于 \x0d ?\cM?/td> </tr> <tr> <td style="FONT-SIZE: 12px">\s </td> <td style="FONT-SIZE: 12px">匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/td> </tr> <tr> <td style="FONT-SIZE: 12px">\S </td> <td style="FONT-SIZE: 12px">匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/td> </tr> <tr> <td style="FONT-SIZE: 12px">\t </td> <td style="FONT-SIZE: 12px">匚w一个制表符。等价于 \x09 ?\cI?/td> </tr> <tr> <td style="FONT-SIZE: 12px">\v </td> <td style="FONT-SIZE: 12px">匚w一个垂直制表符。等价于 \x0b ?\cK?/td> </tr> </tbody> </table> <br />  <h3><a target="_blank" rel="nofollow" name="3.3_Ҏ(gu)字符">3.3 Ҏ(gu)字符</a></h3>  所谓特D字W,是一些有Ҏ(gu)含义的字W,如上面说?*.txt"中的*Q简单的说就是表CZQ何字W串的意思。如果要查找文g名中有*的文Ӟ则需要对Q进行{义,卛_其前加一个\。ls \*.txt。正则表辑ּ有以下特D字W? <p> </p><table cellspacing="1" cellpadding="3" border="0"><tbody><tr><th style="FONT-SIZE: 12px" align="left">特别字符</th><th style="FONT-SIZE: 12px" align="left">说明</th></tr><tr><td style="FONT-SIZE: 12px">$</td><td style="FONT-SIZE: 12px">匚w输入字符串的l尾位置。如果设|了 RegExp 对象?Multiline 属性,?$ 也匹?'\n' ?'\r'。要匚w $ 字符本nQ请使用 \$?/td></tr><tr><td style="FONT-SIZE: 12px">( )</td><td style="FONT-SIZE: 12px">标记一个子表达式的开始和l束位置。子表达式可以获取供以后使用。要匚wq些字符Q请使用 \( ?\)?/td></tr><tr><td style="FONT-SIZE: 12px">*</td><td style="FONT-SIZE: 12px">匚w前面的子表达式零ơ或多次。要匚w * 字符Q请使用 \*?/td></tr><tr><td style="FONT-SIZE: 12px">+</td><td style="FONT-SIZE: 12px">匚w前面的子表达式一ơ或多次。要匚w + 字符Q请使用 \+?/td></tr><tr><td style="FONT-SIZE: 12px">.</td><td style="FONT-SIZE: 12px">匚w除换行符 \n之外的Q何单字符。要匚w .Q请使用 \?/td></tr><tr><td style="FONT-SIZE: 12px">[ </td><td style="FONT-SIZE: 12px">标记一个中括号表达式的开始。要匚w [Q请使用 \[?/td></tr><tr><td style="FONT-SIZE: 12px">?</td><td style="FONT-SIZE: 12px">匚w前面的子表达式零ơ或一ơ,或指明一个非贪婪限定W。要匚w ? 字符Q请使用 \??/td></tr><tr><td style="FONT-SIZE: 12px">\</td><td style="FONT-SIZE: 12px">下一个字W标Cؓ(f)或特D字W、或原义字符、或向后引用、或八进制{义符。例如, 'n' 匚w字符 'n'?\n' 匚w换行W。序?'\\' 匚w "\"Q?'\(' 则匹?"("?/td></tr><tr><td style="FONT-SIZE: 12px">^</td><td style="FONT-SIZE: 12px">匚w输入字符串的开始位|,除非在方括号表达式中使用Q此时它表示不接受该字符集合。要匚w ^ 字符本nQ请使用 \^?/td></tr><tr><td style="FONT-SIZE: 12px">{</td><td style="FONT-SIZE: 12px">标记限定W表辑ּ的开始。要匚w {Q请使用 \{?/td></tr><tr><td style="FONT-SIZE: 12px">|</td><td style="FONT-SIZE: 12px">指明两项之间的一个选择。要匚w |Q请使用 \|?/td></tr></tbody></table><blockquote><ul><li><strong style="FONT-WEIGHT: 400; BACKGROUND-COLOR: #ffff00">  构造正则表辑ּ的方法和创徏数学表达式的Ҏ(gu)一栗也是用多U元字符与操作符小的表辑ּl合在一h创徏更大的表辑ּ。正则表辑ּ的组件可以是单个的字W、字W集合、字W范围、字W间的选择或者所有这些组件的Ll合?/strong></li></ul></blockquote><p> </p><h3><a target="_blank" rel="nofollow" name="3.4_限定W?>3.4 限定W?/a></h3>  限定W用来指定正则表辑ּ的一个给定组件必要出现多少ơ才能满_配。有*??或{n}或{n,}或{n,m}?U?br />*??限定W都是贪婪的Q因为它们会(x)可能多的匹配文字,只有在它们的后面加上一?可以实现非贪婪或最匹配?br />  正则表达式的限定W有Q?br />  <table cellspacing="1" cellpadding="3" border="0"><tbody><tr><th style="FONT-SIZE: 12px" align="left">字符 </th><th style="FONT-SIZE: 12px" align="left">描述</th></tr><tr><td style="FONT-SIZE: 12px">* </td><td style="FONT-SIZE: 12px">匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及(qing) "zoo"? {h(hun)于{0,}?/td></tr><tr><td style="FONT-SIZE: 12px">+ </td><td style="FONT-SIZE: 12px">匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及(qing) "zoo"Q但不能匚w "z"? {h(hun)?{1,}?/td></tr><tr><td style="FONT-SIZE: 12px">? </td><td style="FONT-SIZE: 12px">匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h(hun)?{0,1}?/td></tr><tr><td style="FONT-SIZE: 12px">{n} </td><td style="FONT-SIZE: 12px">n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/td></tr><tr><td style="FONT-SIZE: 12px">{n,} </td><td style="FONT-SIZE: 12px">n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h(hun)?'o+'?o{0,}' 则等价于 'o*'?/td></tr><tr><td style="FONT-SIZE: 12px">{n,m} </td><td style="FONT-SIZE: 12px">m ?n 均ؓ(f)非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h(hun)?'o?'。请注意在逗号和两个数之间不能有空根{?/td></tr></tbody></table><h3><a target="_blank" rel="nofollow" name="3.5_定位W?>3.5 定位W?/a></h3>  用来描述字符串或单词的边界,^?分别指字W串的开始与l束Q\b描述单词的前或后边界Q\B表示非单词边界?font color="#ff0000">不能对定位符使用限定W?/font><h3><a target="_blank" rel="nofollow" name="3.6_选择">3.6 选择</a></h3>  用圆括号所有选择Ҏ(gu)hQ相?c)选择之间用|分隔。但用圆括号?x)有一个副作用Q是相关的匹配会(x)被缓存,此时可用?:攑֜W一个选项前来消除q种副作用?br />  其中?:是非捕获元之一Q还有两个非捕获元是?=?!Q这两个q有更多的含义,前者ؓ(f)正向预查Q在M开始匹配圆括号内的正则表达式模式的位置来匹配搜索字W串Q后者ؓ(f)负向预查Q在M开始不匚w该正则表辑ּ模式的位|来匚w搜烦字符丌Ӏ? <h3><a target="_blank" rel="nofollow" name="3.7_后向引用">3.7 后向引用</a></h3>  对一个正则表辑ּ模式或部分模式两Ҏ(gu)加圆括号导致相兛_配存储到一个(f)时缓冲区中,所捕获的每个子匚w都按照在正则表达式模式中从左臛_所遇到的内容存储。存储子匚w的缓冲区~号?1 开始,q箋~号直至最?99 个子表达式。每个缓冲区都可以?'\n' 讉KQ其?n Z个标识特定缓冲区的一位或两位十进制数?br />  可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匚w的保存? <h2><a target="_blank" rel="nofollow" name="4._各种操作W的q算优先U?>4. 各种操作W的q算优先U?/a></h2>  相同优先U的从左到右q行q算Q不同优先的运先高后低。各U操作符的优先从高C如下Q?br />  <table cellspacing="1" cellpadding="3" border="0"><tbody><tr><th style="FONT-SIZE: 12px" align="left">操作W?</th><th style="FONT-SIZE: 12px" align="left">描述</th></tr><tr><td style="FONT-SIZE: 12px">\ </td><td style="FONT-SIZE: 12px">转义W?/td></tr><tr><td style="FONT-SIZE: 12px">(), (?:), (?=), [] </td><td style="FONT-SIZE: 12px">圆括号和Ҏ(gu)?/td></tr><tr><td style="FONT-SIZE: 12px">*, +, ?, {n}, {n,}, {n,m} </td><td style="FONT-SIZE: 12px">限定W?/td></tr><tr><td style="FONT-SIZE: 12px">^, $, \anymetacharacter </td><td style="FONT-SIZE: 12px">位置和顺?/td></tr><tr><td style="FONT-SIZE: 12px">| </td><td style="FONT-SIZE: 12px">“或”操?/td></tr></tbody></table><h2><a target="_blank" rel="nofollow" name="5._全部W号解释">5. 全部W号解释</a></h2><table cellspacing="1" cellpadding="3" border="0"><tbody><tr><th style="FONT-SIZE: 12px" align="left">字符 </th><th style="FONT-SIZE: 12px" align="left">描述</th></tr><tr><td style="FONT-SIZE: 12px">\ </td><td style="FONT-SIZE: 12px">下一个字W标Cؓ(f)一个特D字W、或一个原义字W、或一?向后引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("?/td></tr><tr><td style="FONT-SIZE: 12px">^ </td><td style="FONT-SIZE: 12px">匚w输入字符串的开始位|。如果设|了 RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|?/td></tr><tr><td style="FONT-SIZE: 12px">$ </td><td style="FONT-SIZE: 12px">匚w输入字符串的l束位置。如果设|了RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|?/td></tr><tr><td style="FONT-SIZE: 12px">* </td><td style="FONT-SIZE: 12px">匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及(qing) "zoo"? {h(hun)于{0,}?/td></tr><tr><td style="FONT-SIZE: 12px">+ </td><td style="FONT-SIZE: 12px">匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及(qing) "zoo"Q但不能匚w "z"? {h(hun)?{1,}?/td></tr><tr><td style="FONT-SIZE: 12px">? </td><td style="FONT-SIZE: 12px">匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h(hun)?{0,1}?/td></tr><tr><td style="FONT-SIZE: 12px">{n} </td><td style="FONT-SIZE: 12px">n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/td></tr><tr><td style="FONT-SIZE: 12px">{n,} </td><td style="FONT-SIZE: 12px">n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h(hun)?'o+'?o{0,}' 则等价于 'o*'?/td></tr><tr><td style="FONT-SIZE: 12px">{n,m} </td><td style="FONT-SIZE: 12px">m ?n 均ؓ(f)非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h(hun)?'o?'。请注意在逗号和两个数之间不能有空根{?/td></tr><tr><td style="FONT-SIZE: 12px">? </td><td style="FONT-SIZE: 12px">当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'?/td></tr><tr><td style="FONT-SIZE: 12px">. </td><td style="FONT-SIZE: 12px">匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式?/td></tr><tr><td style="FONT-SIZE: 12px">(pattern) </td><td style="FONT-SIZE: 12px">匚w pattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在JScript 中则使用 $0?9 属性。要匚w圆括号字W,请?'\(' ?'\)'?/td></tr><tr><td style="FONT-SIZE: 12px">(?:pattern) </td><td style="FONT-SIZE: 12px">匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式?/td></tr><tr><td style="FONT-SIZE: 12px">(?=pattern) </td><td style="FONT-SIZE: 12px">正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_(d)该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始?/td></tr><tr><td style="FONT-SIZE: 12px">(?!pattern) </td><td style="FONT-SIZE: 12px">负向预查Q在M不匹?pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_(d)该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开?/td></tr><tr><td style="FONT-SIZE: 12px">x|y </td><td style="FONT-SIZE: 12px">匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"?/td></tr><tr><td style="FONT-SIZE: 12px">[xyz] </td><td style="FONT-SIZE: 12px">字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'?/td></tr><tr><td style="FONT-SIZE: 12px">[^xyz] </td><td style="FONT-SIZE: 12px">负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'?/td></tr><tr><td style="FONT-SIZE: 12px">[a-z] </td><td style="FONT-SIZE: 12px">字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符?/td></tr><tr><td style="FONT-SIZE: 12px">[^a-z] </td><td style="FONT-SIZE: 12px">负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符?/td></tr><tr><td style="FONT-SIZE: 12px">\b </td><td style="FONT-SIZE: 12px">匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'?/td></tr><tr><td style="FONT-SIZE: 12px">\B </td><td style="FONT-SIZE: 12px">匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'?/td></tr><tr><td style="FONT-SIZE: 12px">\cx </td><td style="FONT-SIZE: 12px">匚w?x 指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ(f) A-Z ?a-z 之一。否则,?c 视ؓ(f)一个原义的 'c' 字符?/td></tr><tr><td style="FONT-SIZE: 12px">\d </td><td style="FONT-SIZE: 12px">匚w一个数字字W。等价于 [0-9]?/td></tr><tr><td style="FONT-SIZE: 12px">\D </td><td style="FONT-SIZE: 12px">匚w一个非数字字符。等价于 [^0-9]?/td></tr><tr><td style="FONT-SIZE: 12px">\f </td><td style="FONT-SIZE: 12px">匚w一个换늬。等价于 \x0c ?\cL?/td></tr><tr><td style="FONT-SIZE: 12px">\n </td><td style="FONT-SIZE: 12px">匚w一个换行符。等价于 \x0a ?\cJ?/td></tr><tr><td style="FONT-SIZE: 12px">\r </td><td style="FONT-SIZE: 12px">匚w一个回车符。等价于 \x0d ?\cM?/td></tr><tr><td style="FONT-SIZE: 12px">\s </td><td style="FONT-SIZE: 12px">匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/td></tr><tr><td style="FONT-SIZE: 12px">\S </td><td style="FONT-SIZE: 12px">匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/td></tr><tr><td style="FONT-SIZE: 12px">\t </td><td style="FONT-SIZE: 12px">匚w一个制表符。等价于 \x09 ?\cI?/td></tr><tr><td style="FONT-SIZE: 12px">\v </td><td style="FONT-SIZE: 12px">匚w一个垂直制表符。等价于 \x0b ?\cK?/td></tr><tr><td style="FONT-SIZE: 12px">\w </td><td style="FONT-SIZE: 12px">匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'?/td></tr><tr><td style="FONT-SIZE: 12px">\W </td><td style="FONT-SIZE: 12px">匚wM非单词字W。等价于 '[^A-Za-z0-9_]'?/td></tr><tr><td style="FONT-SIZE: 12px">\xn </td><td style="FONT-SIZE: 12px">匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ(f)定的两个数字长。例如,'\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码?</td></tr><tr><td style="FONT-SIZE: 12px">\num </td><td style="FONT-SIZE: 12px">匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋的相同字W?/td></tr><tr><td style="FONT-SIZE: 12px">\n </td><td style="FONT-SIZE: 12px">标识一个八q制转义值或一个向后引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为向后引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{?/td></tr><tr><td style="FONT-SIZE: 12px">\nm </td><td style="FONT-SIZE: 12px">标识一个八q制转义值或一个向后引用。如?\nm 之前臛_?nm 个获得子表达式,?nm 为向后引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的向后引用。如果前面的条g都不满Q若 n ?m 均ؓ(f)八进制数?(0-7)Q则 \nm 匹配八q制转义?nm?/td></tr><tr><td style="FONT-SIZE: 12px">\nml </td><td style="FONT-SIZE: 12px">如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ(f)八进制数?(0-7)Q则匚w八进制{义?nml?/td></tr><tr><td style="FONT-SIZE: 12px">\un </td><td style="FONT-SIZE: 12px">匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (?)?/td></tr></tbody></table><p> </p><h2><a target="_blank" rel="nofollow" name="6._部分例子">6. 部分例子</a></h2><table cellspacing="1" cellpadding="3" border="0"><tbody><tr><th style="FONT-SIZE: 12px" align="left">正则表达?/th><th style="FONT-SIZE: 12px" align="left">说明</th></tr><tr><td style="FONT-SIZE: 12px">/\b([a-z]+) \1\b/gi</td><td style="FONT-SIZE: 12px">一个单词连l出现的位置</td></tr><tr><td style="FONT-SIZE: 12px">/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ </td><td style="FONT-SIZE: 12px">一个URL解析为协议、域、端口及(qing)相对路径</td></tr><tr><td style="FONT-SIZE: 12px">/^(?:Chapter|Section) [1-9][0-9]{0,1}$/</td><td style="FONT-SIZE: 12px">定位章节的位|?/td></tr><tr><td style="FONT-SIZE: 12px">/[-a-z]/</td><td style="FONT-SIZE: 12px">A至z?6个字母再加一?受?/td></tr><tr><td style="FONT-SIZE: 12px">/ter\b/</td><td style="FONT-SIZE: 12px">可匹配chapterQ而不能terminal</td></tr><tr><td style="FONT-SIZE: 12px">/\Bapt/</td><td style="FONT-SIZE: 12px">可匹配chapterQ而不能aptitude</td></tr><tr><td style="FONT-SIZE: 12px">/Windows(?=95 |98 |NT )/</td><td style="FONT-SIZE: 12px">可匹配Windows95或Windows98或WindowsNT,当找C个匹配后Q从Windows后面开始进行下一ơ的索匹配?/td></tr></tbody></table><p> </p><h2><a target="_blank" rel="nofollow" name="7._正则表达式匹配规?>7. 正则表达式匹配规?/a></h2><p><strong><a target="_blank" rel="nofollow" name="7.1_基本模式匚w">7.1 基本模式匚w</a></strong><br /><br />  一切从最基本的开始。模式,是正规表辑ּ最基本的元素,它们是一l描q字W串特征的字W。模式可以很单,由普通的字符串组成,也可以非常复杂,往往用特D的字符表示一个范围内的字W、重复出玎ͼ或表CZ下文。例如:(x)</p><blockquote><p>^once </p></blockquote><p>  q个模式包含一个特D的字符^Q表C模式只匹配那些以once开头的字符丌Ӏ例如该模式与字W串"once upon a time"匚wQ与"There once was a man from NewYork"不匹配。正如如^W号表示开头一P$W号用来匚w那些以给定模式结字符丌Ӏ?/p><blockquote><p>bucket$ </p></blockquote><p>  q个模式?Who kept all of this cash in a bucket"匚wQ与"buckets"不匹配。字W^?同时使用Ӟ表示_匚wQ字W串与模式一P。例如:(x)</p><blockquote><p>^bucket$ </p></blockquote><p>  只匹配字W串"bucket"。如果一个模式不包括^?Q那么它与Q何包含该模式的字W串匚w。例如:(x)模式</p><blockquote><p>once </p></blockquote><p>与字W串</p><blockquote><p>There once was a man from NewYork<br />Who kept all of his cash in a bucket.</p></blockquote><p>是匹配的?br /><br />  在该模式中的字母(o-n-c-e)是字面的字符Q也是_(d)他们表示该字母本w,数字也是一L(fng)。其他一些稍微复杂的字符Q如标点W号和白字符Q空根{制表符{)Q要用到转义序列。所有的转义序列都用反斜?\)打头。制表符的{义序列是Q\t。所以如果我们要一个字W串是否以制表符开_(d)可以用这个模式:(x)</p><blockquote><p>^\t </p></blockquote><p>cM的,用\n表示“新行”,\r表示回R。其他的Ҏ(gu)W号Q可以用在前面加上反斜杠Q如反斜杠本w用\\表示Q句?用\.表示Q以此类推?br /><br /><strong><a target="_blank" rel="nofollow" name="7.2_字符?>7.2 字符?/a></strong><br /><br />在INTERNET的程序中Q正规表辑ּ通常用来验证用户的输入。当用户提交一个form以后Q要判断输入的电(sh)话号码、地址、EMAIL地址、信用卡L(fng){是否有效,用普通的Z字面的字W是不够的?br /><br />所以要用一U更自由的描q我们要的模式的办法Q它?yu)是字符。要建立一个表C所有元韛_W的字符,把所有的元音字符攑֜一个方括号里:(x)</p><blockquote><p>[AaEeIiOoUu] </p></blockquote><p>q个模式与Q何元韛_W匹配,但只能表CZ个字W。用q字号可以表CZ个字W的范围Q如Q?/p><blockquote><p>[a-z] //匚w所有的写字母 <br />[A-Z] //匚w所有的大写字母 <br />[a-zA-Z] //匚w所有的字母 <br />[0-9] //匚w所有的数字 <br />[0-9\.\-] //匚w所有的数字Q句号和减号 <br />[ \f\r\t\n] //匚w所有的白字W?</p></blockquote><p>同样的,q些也只表示一个字W,q是一个非帔R要的。如果要匚w一个由一个小写字母和一位数字组成的字符Ԍ比如"z2"?t6"?g7"Q但不是"ab2"?r2d3" ?b52"的话Q用q个模式Q?/p><blockquote><p>^[a-z][0-9]$ </p></blockquote><p>管[a-z]代表26个字母的范围Q但在这里它只能与第一个字W是写字母的字W串匚w?br /><br />前面曄提到^表示字符串的开_(d)但它q有另外一个含义。当在一l方括号里用^是,它表C“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子Q我们要求第一个字W不能是数字Q?/p><blockquote><p>^[^0-9][0-9]$ </p></blockquote><p>q个模式?&5"?g7"?-2"是匹配的Q但?12"?66"是不匚w的。下面是几个排除特定字符的例子:(x)</p><blockquote><p>[^a-z] //除了写字母以外的所有字W?<br />[^\\\/\^] //除了(\)(/)(^)之外的所有字W?<br />[^\"\'] //除了双引?")和单引号(')之外的所有字W?</p></blockquote><p>Ҏ(gu)字符"." (点,句号)在正规表辑ּ中用来表C除了“新行”之外的所有字W。所以模?^.5$"与Q何两个字W的、以数字5l尾和以其他非“新行”字W开头的字符串匹配。模?."可以匚wM字符Ԍ除了IZ和只包括一个“新行”的字符丌Ӏ?br /><br />PHP的正规表辑ּ有一些内|的通用字符,列表如下Q?/p><blockquote><p>字符?含义 <br />[[:alpha:]] M字母 <br />[[:digit:]] M数字 <br />[[:alnum:]] M字母和数?<br />[[:space:]] M白字W?<br />[[:upper:]] M大写字母 <br />[[:lower:]] M写字母 <br />[[:punct:]] M标点W号 <br />[[:xdigit:]] M16q制的数字,相当于[0-9a-fA-F] </p></blockquote><p><strong><a target="_blank" rel="nofollow" name="7.3_定重复出现">7.3 定重复出现</a></strong><br /><br />到现在ؓ(f)止,你已l知道如何去匚w一个字母或数字Q但更多的情况下Q可能要匚w一个单词或一l数字。一个单词有若干个字母组成,一l数字有若干个单数组成。跟在字W或字符后面的花括?{})用来定前面的内容的重复出现的次数?</p><blockquote><p>字符?含义 <br />^[a-zA-Z_]$ 所有的字母和下划线 <br />^[[:alpha:]]{3}$ 所有的3个字母的单词 <br />^a$ 字母a <br />^a{4}$ aaaa <br />^a{2,4}$ aa,aaa或aaaa <br />^a{1,3}$ a,aa或aaa <br />^a{2,}$ 包含多于两个a的字W串 <br />^a{2,} 如:(x)aardvark和aaabQ但apple不行 <br />a{2,} 如:(x)baad和aaaQ但Nantucket不行 <br />\t{2} 两个制表W?<br />.{2} 所有的两个字符 </p></blockquote><p>q些例子描述了花括号的三U不同的用法。一个数字,{x}的意思是“前面的字符或字W簇只出现xơ”;一个数字加逗号Q{x,}的意思是“前面的内容出现x或更多的ơ数”;两个用逗号分隔的数字,{x,y}表示“前面的内容臛_出现xơ,但不过yơ”。我们可以把模式扩展到更多的单词或数字:(x)</p><blockquote><p>^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划U的字符?<br />^[0-9]{1,}$ //所有的正数 <br />^\-{0,1}[0-9]{1,}$ //所有的整数 <br />^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的数 </p></blockquote><p>最后一个例子不太好理解Q是吗?q么看吧Q与所有以一个可选的负号(\-{0,1})开?^)、跟着0个或更多的数?[0-9]{0,})、和一个可选的数?\.{0,1})再跟?个或多个数字([0-9]{0,})Qƈ且没有其他Q何东?$)。下面你知道能够用的更ؓ(f)单的Ҏ(gu)?br /><br />Ҏ(gu)字符"?"与{0,1}是相{的Q它们都代表着Q?个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以化ؓ(f)Q?/p><blockquote><p>^\-?[0-9]{0,}\.?[0-9]{0,}$ </p></blockquote><p>Ҏ(gu)字符"*"与{0,}是相{的Q它们都代表着?个或多个前面的内容”。最后,字符"+"?{1,}是相{的Q表C?个或多个前面的内容”,所以上面的4个例子可以写成:(x)</p><blockquote><p>^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划U的字符?<br />^[0-9]+$ //所有的正数 <br />^\-?[0-9]+$ //所有的整数 <br />^\-?[0-9]*\.?[0-9]*$ //所有的数 </p></blockquote><p>当然qƈ不能从技术上降低正规表达式的复杂性,但可以它们更容易阅诅R?/p><img src ="http://www.tkk7.com/xzhoujun/aggbug/44663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xzhoujun/" target="_blank">银色qL</a> 2006-05-05 18:11 <a href="http://www.tkk7.com/xzhoujun/archive/2006/05/05/44663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate的性能优化http://www.tkk7.com/xzhoujun/archive/2006/04/22/42500.html银色qL银色qLSat, 22 Apr 2006 08:31:00 GMThttp://www.tkk7.com/xzhoujun/archive/2006/04/22/42500.htmlhttp://www.tkk7.com/xzhoujun/comments/42500.htmlhttp://www.tkk7.com/xzhoujun/archive/2006/04/22/42500.html#Feedback0http://www.tkk7.com/xzhoujun/comments/commentRss/42500.htmlhttp://www.tkk7.com/xzhoujun/services/trackbacks/42500.html1、针对oracle数据库而言QFetch Size 是设定JDBC的Statementd数据的时候每ơ从数据库中取出的记录条敎ͼ一般设|ؓ(f)30?0?00。Oracle数据库的JDBC驱动默认的Fetch Size=15Q设|Fetch Size讄为:(x)30?0Q性能?x)有明显提升Q如果l增大,出100Q性能提升不明显,反而会(x)消耗内存?
卛_hibernate配制文g中进行配Ӟ(x)
1 <property name="hibernateProperties">
2 <props>
3 <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
4 <prop key="hibernate.show_sql">false</prop>
5 <!-- Create/update the database tables automatically when the JVM starts up
6 <prop key="hibernate.hbm2ddl.auto">update</prop> -->
7 <!-- Turn batching off for better error messages under PostgreSQL
8 <prop key="hibernate.jdbc.batch_size">100</prop> -->
9 <prop key="hibernate.jdbc.batch_size">50</prop>
10 </props>
11 </property>Fetch Size讄大Q读数据库的ơ数少Q速度快QFetch Size小Q读数据库的ơ数多Q速度慢?
2、如果是大的系l,生成htm文g。加快页面提升速度?
3、不要把所有的责Q推在hibernate上,对代码进行重构,减少Ҏ(gu)据库的操作,量避免在数据库查询时用in操作Q以?qing)避免递归查询操作Q代码质量、系l设计的合理性决定系l性能的高低?
4?对大数据量查询时Q慎用list()或者iterator()q回查询l果Q?
Q?Q? 使用List()q回l果ӞHibernate?x)所有查询结果初始化为持久化对象Q结果集较大Ӟ?x)占用很多的处理旉?
Q?Q? 而用iterator()q回l果Ӟ在每ơ调用iterator.next()q回对象q用对象时QHibernate才调用查询将对应的对象初始化Q对于大数据量时Q每调用一ơ查询都?x)花费较多的旉。当l果集较大,但是含有较大量相同的数据Q或者结果集不是全部都会(x)使用Ӟ使用iterator()才有优势?
5、在一对多、多对一的关pMQ用gq加载机Ӟ?x)不少的对象在使用时方会(x)初始化Q这样可使得节省内存I间以及(qing)减少数据库的负荷Q而且若PO中的集合没有被用时Q就可减互数据库的交互从而减处理时间?
6、对含有兌的POQ持久化对象Q时Q若default-cascade="all"或?“save-update”,新增POӞh意对PO中的集合的赋值操作,因ؓ(f)有可能得多执行一ơupdate操作?
7?对于大数据量新增、修攏V删除操作或者是对大数据量的查询Q与数据库的交互ơ数是决定处理时间的最重要因素Q减交互的ơ数是提升效率的最好途径Q所以在开发过E中Q请show_sql讄为trueQ深入了解Hibernate的处理过E,试不同的方式,可以使得效率提升。尽可能Ҏ(gu)个页面的昄Q对数据库的操作减少?00----150条以内。越越好?/span>

银色qL 2006-04-22 16:31 发表评论
]]>
Linux下的打包压羃http://www.tkk7.com/xzhoujun/archive/2006/04/21/42385.html银色qL银色qLFri, 21 Apr 2006 09:54:00 GMThttp://www.tkk7.com/xzhoujun/archive/2006/04/21/42385.htmlhttp://www.tkk7.com/xzhoujun/comments/42385.htmlhttp://www.tkk7.com/xzhoujun/archive/2006/04/21/42385.html#Feedback0http://www.tkk7.com/xzhoujun/comments/commentRss/42385.htmlhttp://www.tkk7.com/xzhoujun/services/trackbacks/42385.html阅读全文

银色qL 2006-04-21 17:54 发表评论
]]>
Linux常用的日志文?/title><link>http://www.tkk7.com/xzhoujun/archive/2006/04/21/42382.html</link><dc:creator>银色qL</dc:creator><author>银色qL</author><pubDate>Fri, 21 Apr 2006 09:48:00 GMT</pubDate><guid>http://www.tkk7.com/xzhoujun/archive/2006/04/21/42382.html</guid><wfw:comment>http://www.tkk7.com/xzhoujun/comments/42382.html</wfw:comment><comments>http://www.tkk7.com/xzhoujun/archive/2006/04/21/42382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xzhoujun/comments/commentRss/42382.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xzhoujun/services/trackbacks/42382.html</trackback:ping><description><![CDATA[ <span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">/var/log/boot.log<br /></span> <span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">  该文件记录了pȝ在引DE中发生的事Ӟ是<span lang="EN-US">Linux</span>pȝ开q程昄的信息?br /><br /><span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">/var/log/cron<br /></span><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">  该日志文件记?span lang="EN-US">crontab</span>守护q程<span lang="EN-US">crond</span>所z的子q程的动作,前面加上用户、登录时间和<span lang="EN-US">PID</span>Q以?qing)派生出的进E的动作?span lang="EN-US">CMD</span>的一个动作是<span lang="EN-US">cron</span>zZ个调度进E的常见情况?span lang="EN-US">REPLACE</span>Q替换)动作记录用户对它?span lang="EN-US">cron</span>文g的更斎ͼ该文件列Z要周期性执行的d调度?span lang="EN-US">RELOAD</span>动作?span lang="EN-US">REPLACE</span>动作后不久发生,q意味着<span lang="EN-US">cron</span>注意C个用L(fng)<span lang="EN-US">cron</span>文g被更新?span lang="EN-US">cron</span>需要把它重新装入内存。该文g可能?x)查C些反常的情况?br /><span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br />/var/log/maillog<br /></span><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">  该日志文件记录了每一个发送到pȝ或从pȝ发出的电(sh)子邮件的zd。它可以用来查看用户使用哪个pȝ发送工h把数据发送到哪个pȝ?/span></span></span> <img src ="http://www.tkk7.com/xzhoujun/aggbug/42382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xzhoujun/" target="_blank">银色qL</a> 2006-04-21 17:48 <a href="http://www.tkk7.com/xzhoujun/archive/2006/04/21/42382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://cswsfz.com" target="_blank">91վ߹ۿ</a>| <a href="http://hssw1688.com" target="_blank">˳77777ɫ߲</a>| <a href="http://51wdn.com" target="_blank">˳ëƬ߲ </a>| <a href="http://gsonlinet.com" target="_blank">Ʒѿþþ</a>| <a href="http://91packing.com" target="_blank">͵Ƶ߹ۿ99</a>| <a href="http://hssw1688.com" target="_blank">һëƬѹۿ</a>| <a href="http://0354888.com" target="_blank">777޾Ʒþþþþ </a>| <a href="http://jastrelax.com" target="_blank">޾Ʒ벻߲HE </a>| <a href="http://szmazida.com" target="_blank">jyzzjyzzѹۿ</a>| <a href="http://323c.com" target="_blank">պ˳վ</a>| <a href="http://zz773.com" target="_blank">¹Ʒ</a>| <a href="http://ymtphoto.com" target="_blank">1134Ʒâ </a>| <a href="http://dgyinhezy.com" target="_blank">ձƵһ߹ۿ</a>| <a href="http://xianliwang.com" target="_blank">˿wwwƵ</a>| <a href="http://zndijgch.com" target="_blank">һ3Ƶ</a>| <a href="http://929119.com" target="_blank">Ʒɫͼ</a>| <a href="http://0967c.com" target="_blank">޹ľƷ</a>| <a href="http://xianzijie.com" target="_blank">һɫƬ</a>| <a href="http://91ptv.com" target="_blank">һ</a>| <a href="http://wangquanai.com" target="_blank">þþþAVվ</a>| <a href="http://www222yy.com" target="_blank">av乾</a>| <a href="http://a8g8.com" target="_blank">һַ</a>| <a href="http://33uub.com" target="_blank">www޾Ʒþþ </a>| <a href="http://928288.com" target="_blank">ҹҹˬŮ8888Ƶѹۿ</a>| <a href="http://777mecom.com" target="_blank">ޱAAAר</a>| <a href="http://35633487.com" target="_blank">ɫ͵͵ۺav78 </a>| <a href="http://sdzsks.com" target="_blank">ƷһI6 </a>| <a href="http://0730jxpm.com" target="_blank">jizz</a>| <a href="http://438266.com" target="_blank">˾Ʒձ11</a>| <a href="http://cuuka.com" target="_blank">wwww߹ۿ</a>| <a href="http://dxjz120.com" target="_blank">鶹ɫۺվ</a>| <a href="http://se988.com" target="_blank">Ļ뱬app</a>| <a href="http://468862.com" target="_blank">þۺϾþۺ</a>| <a href="http://gs168sz.com" target="_blank">AVӰԺۿ</a>| <a href="http://yy9977.com" target="_blank">޾Ʒavɫ</a>| <a href="http://shmtweld.com" target="_blank">޾ƷҺһ</a>| <a href="http://www-456446.com" target="_blank">AV˵</a>| <a href="http://9hao66.com" target="_blank">ëƬ߹ۿ </a>| <a href="http://fns92.com" target="_blank">鶹߹ۿ</a>| <a href="http://igo98.com" target="_blank">ˬˬձƵ</a>| <a href="http://zjszbwzl.com" target="_blank">ŮڵƵվ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>