<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6989973461873230399</id><updated>2024-09-04T15:47:35.415-04:00</updated><category term="Flash"/><category term="java"/><category term="Extjs"/><category term="JSF"/><category term="ClassLoader"/><category term="XML"/><category term="JNDI"/><category term="Axis"/><category term="Blogger"/><category term="FTP"/><category term="HTML and CSS"/><category term="Hibernate"/><category term="Log4j"/><category term="Oracle"/><category term="Regular Expression"/><category term="Tomcat"/><category term="dotNet"/><category term="javascript"/><category term="jboss"/><category term="solr"/><category term="spring"/><category term="sqlserver"/><title type='text'>Code Resource</title><subtitle type='html'>This blogger is recording some code samples,technical skill of java,.Net,javascript, css, html for myself use. All articles are coming from my own experience and my collections which are from internet world. If you find any material have copy right issue please leave a comment to me. I will delete it immediately. These articles are writing in English or Chinese. Hope these information can help other technical guys. Thanks for reading.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>60</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-9048963468051322584</id><published>2021-11-19T23:45:00.001-05:00</published><updated>2021-11-19T23:45:48.766-05:00</updated><title type='text'>SpringBoot2异常处理回滚事务详解(自动回滚/手动回滚/部分回滚）</title><content type='html'>&lt;p&gt;&amp;nbsp;1 问题背景&lt;/p&gt;&lt;p&gt;有时候，我们总是需要再SpringBoot2中对一个Service方法做一个完整的事务，发现异常时，进行回滚，然后又能返回错误信息。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;事务定义&lt;/p&gt;&lt;p&gt;事务，就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行，我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行，我们称该事务被提交。由于其中的一部分或多步执行失败，导致没有步骤被提交，则事务必须回滚到最初的系统状态。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;事务特点&lt;/p&gt;&lt;p&gt;1.原子性：一个事务中所有对数据库的操作是一个不可分割的操作序列，要么全做要么全不做&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2.一致性：数据不会因为事务的执行而遭到破坏&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3.隔离性：一个事物的执行，不受其他事务的干扰，即并发执行的事物之间互不干扰&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4.持久性：一个事物一旦提交，它对数据库的改变就是永久的。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2 @Transactional 事务实现机制&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;（1）编程式事务指的是通过编码方式实现事务；&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;（2）声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 声明式事务有两种方式：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;（1）一种是在配置文件（xml）中做相关的事务规则声明，&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;（2）另一种是基于@Transactional 注解的方式。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;注释配置是目前流行的使用方式，因此本文将着重介绍基于@Transactional 注解的事务管理。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;在应用系统调用声明了 @Transactional 的目标方法时，Spring Framework 默认使用 AOP 代理，在代码运行时生成一个代理对象，根据 @Transactional 的属性配置信息，这个代理对象决定该声明 @Transactional 的目标方法是否由拦截器 TransactionInterceptor 来使用拦截，在 TransactionInterceptor 拦截时，会在目标方法开始执行之前创建并加入事务，并执行目标方法的逻辑, 最后根据执行情况是否出现异常，利用抽象事务管理器 AbstractPlatformTransactionManager 操作数据源 DataSource 提交或回滚事务。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Spring AOP 代理有 CglibAopProxy 和 JdkDynamicAopProxy 两种，以 CglibAopProxy 为例，对于 CglibAopProxy，需要调用其内部类的 DynamicAdvisedInterceptor 的 intercept 方法。对于 JdkDynamicAopProxy，需要调用其 invoke 方法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;开启事务&lt;/p&gt;&lt;p&gt;方式1：在 xml 配置中的事务配置信息&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;tx:annotation-driven /&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;bean id=&quot;transactionManager&quot;&lt;/p&gt;&lt;p&gt;class=&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot; /&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/bean&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;方式2：使用@EnableTransactionManagement 注解也可以启用事务管理功能&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3 场景&lt;/p&gt;&lt;p&gt;3.1 场景一：自动回滚（直接抛出，不try/catch）&lt;/p&gt;&lt;p&gt;@Override&lt;/p&gt;&lt;p&gt;@Transactional(rollbackFor = Exception.class)&lt;/p&gt;&lt;p&gt;public Object submitOrder() throws Exception {&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;success();&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;//假如exception这个操作数据库的方法会抛出异常，方法success()对数据库的操作会回滚。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;exception();&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return ApiReturnUtil.success();&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3.2 场景二：手动回滚（进行try/catch，回滚并抛出）&lt;/p&gt;&lt;p&gt;@Override&lt;/p&gt;&lt;p&gt;@Transactional(rollbackFor = Exception.class)&lt;/p&gt;&lt;p&gt;public Object submitOrder (){&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; success();&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; try {&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exception();&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Exception e) {&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; e.printStackTrace();&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //手工回滚异常&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return ApiReturnUtil.error();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; return ApiReturnUtil.success();&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3.3 补充：回滚部分异常&lt;/p&gt;&lt;p&gt;使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); 设置回滚点。&lt;/p&gt;&lt;p&gt;使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滚到savePoint。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;@Override&lt;/p&gt;&lt;p&gt;@Transactional(rollbackFor = Exception.class)&lt;/p&gt;&lt;p&gt;public Object submitOrder (){&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; success();&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; //只回滚以下异常，&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; try {&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exception();&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Exception e) {&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; e.printStackTrace();&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //手工回滚异常&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return ApiReturnUtil.error();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; return ApiReturnUtil.success();&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3.4 使用DataSourceTransactionManager&lt;/p&gt;&lt;p&gt;springboot 开启事务以及手动提交事务，可以在服务类上加上两个注解&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;@Autowired&lt;/p&gt;&lt;p&gt;DataSourceTransactionManager dataSourceTransactionManager;&lt;/p&gt;&lt;p&gt;@Autowired&lt;/p&gt;&lt;p&gt;TransactionDefinition transactionDefinition;&lt;/p&gt;&lt;p&gt;手动开启事务&lt;/p&gt;&lt;p&gt;TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);&lt;/p&gt;&lt;p&gt;手动提交事务&lt;/p&gt;&lt;p&gt;dataSourceTransactionManager.commit(transactionStatus);//提交&lt;/p&gt;&lt;p&gt;手动回滚事务&lt;/p&gt;&lt;p&gt;dataSourceTransactionManager.rollback(transactionStatus);//最好是放在catch 里面,防止程序异常而事务一直卡在哪里未提交&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4 spring boot controller设置 @Transactional 不回滚的解决办法&lt;/p&gt;&lt;p&gt;在spring boot 中，使用事务非常简单，直接在方法上面加入@Transactional 就可以实现，以下是我的做法&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; @GetMapping(&quot;delete&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; @ResponseBody&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; @Transactional&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; public void delete(@RequestParam(&quot;id&quot;) int id) {&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;try {&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //delete country&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.repository.delete(id);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(id == 1){&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw Exception(&quot;测试事务&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//delete city&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.repository.deleteByCountryId(id);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }catch (Exception e){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; logger.error(&quot;delete false:&quot; + e.getMessage());&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return new MessageBean(101,&quot;delete false&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;发现事务不回滚，即 this.repository.delete(id); 成功把数据删除了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;原因：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 默认spring事务只在发生未被捕获的 RuntimeException 时才回滚。&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; spring aop&amp;nbsp; 异常捕获原理：被拦截的方法需显式抛出异常，并不能经任何处理，这样aop代理才能捕获到方法的异常，才能进行回滚，默认情况下aop只捕获 RuntimeException 的异常，但可以通过配置来捕获特定的异常并回滚。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion（），这样程序异常时才能被aop捕获进而回滚。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;解决方案：&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 方案1：例如service层处理事务，那么service中的方法中不做异常捕获，或者在catch语句中最后增加throw new RuntimeException()语句，以便让aop捕获异常再去回滚，并且在service上层（webservice客户端，view层action）要继续捕获这个异常并处理&lt;/p&gt;&lt;p&gt;&amp;nbsp; 方案2：在service层方法的catch语句中增加：TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句，手动回滚，这样上层就无需去处理异常&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;@GetMapping(&quot;delete&quot;)&amp;nbsp;&lt;/p&gt;&lt;p&gt;@ResponseBody&amp;nbsp;&lt;/p&gt;&lt;p&gt;@Transactional&amp;nbsp;&lt;/p&gt;&lt;p&gt;public Object delete(@RequestParam(&quot;id&quot;) int id){&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if (id &amp;lt; 1){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new MessageBean(101,&quot;parameter wrong: id = &quot; + id) ;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;try {&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//delete country&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.countryRepository.delete(id);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //delete city&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.cityRepository.deleteByCountryId(id);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return new MessageBean(200,&quot;delete success&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }catch (Exception e){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; logger.error(&quot;delete false:&quot; + e.getMessage());&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return new MessageBean(101,&quot;delete false&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5 避免 Spring 的 AOP 的自调用问题&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 在 Spring 的 AOP 代理下，只有目标方法由外部调用，目标方法才由 Spring 生成的代理对象来管理，这会造成自调用问题。若同一类中的其他没有@Transactional 注解的方法内部调用有@Transactional 注解的方法，有@Transactional 注解的方法的事务被忽略，不会发生回滚。见清单 5 举例代码展示。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;清单 5.自调用问题举例&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;@Service&lt;/p&gt;&lt;p&gt;public class OrderService {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; private void insert() {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; insertOrder();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; @Transactional&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; public void insertOrder() {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //insert log info&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //insertOrder&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //updateAccount&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;insertOrder 尽管有@Transactional 注解，但它被内部方法 insert()调用，事务被忽略，出现异常事务不会发生回滚。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;这样一个错org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope&lt;/p&gt;&lt;p&gt;比如例子:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;下面我们来看两种写法，第一种&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;@Transactional&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; public UserEntity login1(UserEntity user) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; userDao.update(6);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(userDao.update(6)){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return user;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;第二种&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; public UserEntity login(UserEntity user) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.test();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return user;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; @Transactional&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; public void test(){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; userDao.update(6);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(userDao.update(6)){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 第一种写法的时候，回滚是起作用的.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 第二种写法的时候就会报错，错误就是一开始提到的: org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;为什么会这样呢？&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 此错在没有Transaction无法回滚事务。自调用导致@Transactional 失效。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; spring里事务是用注解配置的，当一个方法没有接口，单单只是一个方法不是服务时，事务的注解是不起作用的，需要回滚时就会报错。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 出现这个问题的根本原因在于AOP的实现原理。由于@Transactional 的实现原理是AOP，AOP的实现原理是动态代理，换句话说，自调用时不存在代理对象的调用，这时不会产生我们注解@Transactional 配置的参数，自然无效了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 虽然可以直接从容器中获取代理对象，但这样有侵入之嫌，不推荐。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;也是在此记录一笔：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 事务必须用在服务上，且一个服务一个事务，不得嵌套。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; sping的事务是通过注解配置上去的，而下面的那个方法并没有接口，在实现类里面只是一个简单的方法而已，对于事务的注解来说没有任何作用，所以在这个方法里面调用回滚的方法自然就报错了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 所以在以后的项目中如果你要使用事务，那么请记住，一个服务一个事务，一次请求一个事务，千万不要想着用调用方法，然后再一个方法上面加事务。你只能调用另外一个服务，在另外一个服务上面加事务。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;解决方法：&lt;/p&gt;&lt;p&gt;1、可以在类服务上加事务：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;@Transactional&lt;/p&gt;&lt;p&gt;public class MyTransactional {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; public UserEntity login(UserEntity user) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.test();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return user;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; //@Transactional&amp;nbsp; 服务上加了@Transactional后&amp;nbsp; 这里可以不加&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; public void test(){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; userDao.update(6);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(userDao.update(6)){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;2、使用AspectJ 取代 Spring AOP 代理&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 上面的两个问题@Transactional 注解只应用到 public 方法和自调用问题，是由于使用 Spring AOP 代理造成的。为解决这两个问题，使用 AspectJ 取代 Spring AOP 代理。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;需要将下面的 AspectJ 信息添加到 xml 配置信息中。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;清单 6. AspectJ 的 xml 配置信息&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;tx:annotation-driven mode=&quot;aspectj&quot; /&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;bean id=&quot;transactionManager&quot;&lt;/p&gt;&lt;p&gt;class=&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot; /&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/bean&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/bean&lt;/p&gt;&lt;p&gt;class=&quot;org.springframework.transaction.aspectj.AnnotationTransactionAspect&quot;&lt;/p&gt;&lt;p&gt;factory-method=&quot;aspectOf&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;property name=&quot;transactionManager&quot; ref=&quot;transactionManager&quot; /&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/bean&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;同时在 Maven 的 pom 文件中加入 spring-aspects 和 aspectjrt 的 dependency 以及 aspectj-maven-plugin。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;清单 7. AspectJ 的 pom 配置信息&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;dependency&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;spring-aspects&amp;lt;/artifactId&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;4.3.2.RELEASE&amp;lt;/version&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;dependency&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;aspectjrt&amp;lt;/artifactId&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;1.8.9&amp;lt;/version&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/dependency&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;plugin&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;artifactId&amp;gt;aspectj-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;version&amp;gt;1.9&amp;lt;/version&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;configuration&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;showWeaveInfo&amp;gt;true&amp;lt;/showWeaveInfo&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;aspectLibraries&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;aspectLibrary&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;spring-aspects&amp;lt;/artifactId&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/aspectLibrary&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/aspectLibraries&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/configuration&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;executions&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;execution&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;goals&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;goal&amp;gt;compile&amp;lt;/goal&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;goal&amp;gt;test-compile&amp;lt;/goal&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/goals&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/execution&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/executions&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/plugin&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5 详细说明&lt;/p&gt;&lt;p&gt;5.1 事务管理方式&lt;/p&gt;&lt;p&gt;在Spring中，事务有两种实现方式，分别是编程式事务管理和声明式事务管理两种方式。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;编程式事务管理： 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理，spring推荐使用TransactionTemplate。&lt;/p&gt;&lt;p&gt;声明式事务管理： 建立在AOP之上的。其本质是对方法前后进行拦截，然后在目标方法开始之前创建或者加入一个事务，在执行完目标方法之后根据执行情况提交或者回滚事务。&lt;/p&gt;&lt;p&gt;声明式事务管理不需要入侵代码，通过@Transactional就可以进行事务操作，更快捷而且简单，推荐使用。&lt;/p&gt;&lt;p&gt;5.2 事务处理 @Transactional注解的使用&lt;/p&gt;&lt;p&gt;Spring团队的建议是你在具体的类（或类的方法）上使用 @Transactional 注解，而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解，但是这将只能当你设置了基于接口的代理时它才生效。因为注解是不能继承的，这就意味着如果你正在使用基于类的代理时，那么事务的设置将不能被基于类的代理所识别，而且对象也将不会被事务代理所包装（将被确认为严重的）。因此，请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。&lt;/p&gt;&lt;p&gt;@Transactional 注解应该只被应用到 public 修饰的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解，它也不会报错， 但是这个被注解的方法将不会展示已配置的事务设置。&lt;/p&gt;&lt;p&gt;Spring的AOP即声明式事务管理默认是针对unchecked exception回滚。也就是默认对RuntimeException()异常或是其子类进行事务回滚。checked异常,即Exception可try{}捕获的不会回滚，因此对于我们自定义异常，通过rollbackFor进行设定。&lt;/p&gt;&lt;p&gt;如果我们需要捕获异常后，同时进行回滚，通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行手动回滚操作。&lt;/p&gt;&lt;p&gt;使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); 设置回滚点，使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滚到savePoint。&lt;/p&gt;&lt;p&gt;5.3 事务提交方式&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;默认情况下，数据库处于自动提交模式。每一条语句处于一个单独的事务中，在这条语句执行完毕时，如果执行成功则隐式的提交事务，如果执行失败则隐式的回滚事务。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;对于正常的事务管理，是一组相关的操作处于一个事务之中，因此必须关闭数据库的自动提交模式。不过，这个我们不用担心，spring会将底层连接的自动提交特性设置为false。也就是在使用spring进行事物管理的时候，spring会将是否自动提交设置为false，等价于JDBC中的 connection.setAutoCommit(false);，在执行完之后在进行提交，connection.commit(); 。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5.4 注解@Transactional常用配置&lt;/p&gt;&lt;p&gt;参 数 名 称&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;功 能 描 述&lt;/p&gt;&lt;p&gt;readOnly&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;该属性用于设置当前事务是否为只读事务，设置为true表示只读，false则表示可读写，默认值为false。例如：@Transactional(readOnly=true)&lt;/p&gt;&lt;p&gt;rollbackFor&amp;nbsp; &amp;nbsp; &lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;rollbackFor&amp;nbsp; &amp;nbsp; 该属性用于设置需要进行回滚的异常类数组，当方法中抛出指定异常数组中的异常时，则进行事务回滚。例如：指定单一异常类：@Transactional(rollbackFor=RuntimeException.class)指定多个异常类：@Transactional(rollbackFor={RuntimeException.class, Exception.class})&lt;/p&gt;&lt;p&gt;rollbackForClassName&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;该属性用于设置需要进行回滚的异常类名称数组，当方法中抛出指定异常名称数组中的异常时，则进行事务回滚。例如：指定单一异常类名称@Transactional(rollbackForClassName=”RuntimeException”)指定多个异常类名称：@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})&lt;/p&gt;&lt;p&gt;noRollbackFor&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;该属性用于设置不需要进行回滚的异常类数组，当方法中抛出指定异常数组中的异常时，不进行事务回滚。例如：指定单一异常类：@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类：@Transactional(noRollbackFor={RuntimeException.class, Exception.class})&lt;/p&gt;&lt;p&gt;noRollbackForClassName&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;该属性用于设置不需要进行回滚的异常类名称数组，当方法中抛出指定异常名称数组中的异常时，不进行事务回滚。例如：指定单一异常类名称：@Transactional(noRollbackForClassName=”RuntimeException”)指定多个异常类名称：@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})&lt;/p&gt;&lt;p&gt;propagation&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;该属性用于设置事务的传播行为。例如：@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)&lt;/p&gt;&lt;p&gt;isolation&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;该属性用于设置底层数据库的事务隔离级别，事务隔离级别用于处理多事务并发的情况，通常使用数据库的默认隔离级别即可，基本不需要进行设置&lt;/p&gt;&lt;p&gt;timeout&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;该属性用于设置事务的超时秒数，默认值为-1表示永不超时&lt;/p&gt;&lt;p&gt;事物超时设置: @Transactional(timeout=30) //默认是30秒&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5.5 Propagation的属性（事务的传播行为）&lt;/p&gt;&lt;p&gt;例如：@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Propagation属性&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;含义&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;REQUIRED&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;默认值 在有transaction状态下执行；如当前没有transaction，则创建新的transaction；&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;SUPPORTS&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;如当前有transaction，则在transaction状态下执行；如果当前没有transaction，在无transaction状态下执行；&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;MANDATORY&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;必须在有transaction状态下执行，如果当前没有transaction，则抛出异常IllegalTransactionStateException；&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;REQUIRES_NEW&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;创建新的transaction并执行；如果当前已有transaction，则将当前transaction挂起；&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;NOT_SUPPORTED&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在无transaction状态下执行；如果当前已有transaction，则将当前transaction挂起；&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;NEVER&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在无transaction状态下执行；如果当前已有transaction，则抛出异常IllegalTransactionStateException。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5.6 事务5种隔离级别&lt;/p&gt;&lt;p&gt;例如：@Transactional(isolation = Isolation.READ_COMMITTED)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;隔离级别&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;含义&lt;/p&gt;&lt;p&gt;DEFAULT&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;这是一个PlatfromTransactionManager默认的隔离级别，使用数据库默认的事务隔离级别.&lt;/p&gt;&lt;p&gt;另外四个与JDBC的隔离级别相对应；&lt;/p&gt;&lt;p&gt;READ_UNCOMMITTED&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;最低的隔离级别。事实上我们不应该称其为隔离级别，因为在事务完成前，其他事务可以看到该事务所修改的数据。而在其他事务提交前，该事务也可以看到其他事务所做的修改。可能导致脏，幻，不可重复读&lt;/p&gt;&lt;p&gt;READ_COMMITTED&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;大多数数据库的默认级别。在事务完成前，其他事务无法看到该事务所修改的数据。遗憾的是，在该事务提交后，你就可以查看其他事务插入或更新的数据。这意味着在事务的不同点上，如果其他事务修改了数据，你就会看到不同的数据。可防止脏读，但幻读和不可重复读仍可以发生。&lt;/p&gt;&lt;p&gt;REPEATABLE_READ&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;比ISOLATION_READ_COMMITTED更严格，该隔离级别确保如果在事务中查询了某个数据集，你至少还能再次查询到相同的数据集，即使其他事务修改了所查询的数据。然而如果其他事务插入了新数据，你就可以查询到该新插入的数据。可防止脏读，不可重复读，但幻读仍可能发生。&lt;/p&gt;&lt;p&gt;SERIALIZABLE&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;完全服从ACID的隔离级别，确保不发生脏读、不可重复读和幻影读。这在所有隔离级别中也是最慢的，因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。代价最大、可靠性最高的隔离级别，所有的事务都是按顺序一个接一个地执行。避免所有不安全读取。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5.7 事务回滚规则&lt;/p&gt;&lt;p&gt;指示spring事务管理器回滚一个事务的推荐方法是在当前事务的上下文内抛出异常。spring事务管理器会捕捉任何未处理的异常，然后依据规则决定是否回滚抛出异常的事务。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;默认配置下，spring只有在抛出的异常为运行时unchecked异常时才回滚该事务，也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚)，而抛出checked异常则不会导致事务回滚。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;可以明确的配置在抛出那些异常时回滚事务，包括checked异常。也可以明确定义那些异常抛出时不回滚事务。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5.8 事物注意事项&lt;/p&gt;&lt;p&gt;要根据实际的需求来决定是否要使用事物，最好是在编码之前就考虑好，不然到以后就难以维护；&lt;/p&gt;&lt;p&gt;如果使用了事物，请务必进行事物测试，因为很多情况下以为事物是生效的，但是实际上可能未生效！&lt;/p&gt;&lt;p&gt;事物@Transactional的使用要放再类的公共(public)方法中，需要注意的是在 protected、private 方法上使用 @Transactional 注解，它也不会报错(IDEA会有提示)，但事务无效。&lt;/p&gt;&lt;p&gt;事物@Transactional是不会对该方法里面的子方法生效！也就是你在公共方法A声明的事物@Transactional，但是在A方法中有个子方法B和C，其中方法B进行了数据操作，但是该异常被B自己处理了，这样的话事物是不会生效的！反之B方法声明的事物@Transactional，但是公共方法A却未声明事物的话，也是不会生效的！如果想事物生效，需要将子方法的事务控制交给调用的方法，在子方法中使用rollbackFor注解指定需要回滚的异常或者将异常抛出交给调用的方法处理。一句话就是在使用事物的时候子方法最好将异常抛出！&lt;/p&gt;&lt;p&gt;事物@Transactional由spring控制的时候，它会在抛出异常的时候进行回滚。如果自己使用catch捕获了处理了，是不生效的，如果想生效可以进行手动回滚或者在catch里面将异常抛出，比如throw new RuntimeException();。&lt;/p&gt;&lt;p&gt;@Transactional可以放在Controller下面直接起作用，看到网上好多同学说要放到@Component下面或者@Service下面，经过试验，可以不用放在这两个下面也起作用。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;@Transactional引入包问题，她有两个包：import javax.transaction.Transactional; 和 import org.springframework.transaction.annotation.Transactional; 这两个都可以用，对比了一下他们两个的方法和属性，发现后面的比前面的强大。建议后后面的。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;PlatformTransactionManager 这个接口中定义了三个方法 getTransaction创建事务，commit 提交事务，rollback 回滚事务。她的实现类是 AbstractPlatformTransactionManager这个。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5.9 事务并发会产生什么问题&lt;/p&gt;&lt;p&gt;术语&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;含义&lt;/p&gt;&lt;p&gt;脏读&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;A事务读取到了B事务还未提交的数据，如果B未提交的事务回滚了，那么A事务读取的数据就是无效的，这就是数据脏读&lt;/p&gt;&lt;p&gt;不可重复读&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;在同一个事务中，多次读取同一数据返回的结果不一致，这是由于读取事务在进行操作的过程中，如果出现更新事务，它必须等待更新事务执行成功提交完成后才能继续读取数据，这就导致读取事务在前后读取的数据不一致的状况出现&lt;/p&gt;&lt;p&gt;幻读&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;A事务读取了几行记录后，B事务插入了新数据，并且提交了插入操作，在后续操作中A事务就会多出几行原本不存在的数据，就像A事务出现幻觉，这就是幻读&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1）第一类丢失更新：&lt;/p&gt;&lt;p&gt;在没有事务隔离的情况下，两个事务都同时更新一行数据，但是第二个事务却中途失败退出， 导致对数据的两个修改都失效了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;张三的工资为5000，事务A中获取工资为5000，事务B获取工资为5000，汇入100，并提交数据库，工资变为5100，&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;随后&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;事务A发生异常，回滚了，恢复张三的工资为5000，这样就导致事务B的更新丢失了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2）脏读：&lt;/p&gt;&lt;p&gt;脏读就是指当一个事务正在访问数据，并且对数据进行了修改，而这种修改还没有提交到数据库中，这时，另外一个事务也访问这个数据，然后使用了这个数据。&lt;/p&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;p&gt;　　张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。&lt;/p&gt;&lt;p&gt;　　与此同时，&lt;/p&gt;&lt;p&gt;　　事务B正在读取张三的工资，读取到张三的工资为8000。&lt;/p&gt;&lt;p&gt;　　随后，&lt;/p&gt;&lt;p&gt;　　事务A发生异常，而回滚了事务。张三的工资又回滚为5000。&lt;/p&gt;&lt;p&gt;　　最后，&lt;/p&gt;&lt;p&gt;　　事务B读取到的张三工资为8000的数据即为脏数据，事务B做了一次脏读。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3）不可重复读：&lt;/p&gt;&lt;p&gt;是指在一个事务内，多次读同一数据。在这个事务还没有结束时，另外一个事务也访问该同一数据。那么，在第一个事务中的两次读数据之间，由于第二个事务的修改，那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的，因此称为是不可重复读。&lt;/p&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;p&gt;　　在事务A中，读取到张三的工资为5000，操作没有完成，事务还没提交。&lt;/p&gt;&lt;p&gt;　　与此同时，&lt;/p&gt;&lt;p&gt;　　事务B把张三的工资改为8000，并提交了事务。&lt;/p&gt;&lt;p&gt;　　随后，&lt;/p&gt;&lt;p&gt;　　在事务A中，再次读取张三的工资，此时工资变为8000。在一个事务中前后两次读取的结果并不致，导致了不可重复读。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4）第二类丢失更新：&lt;/p&gt;&lt;p&gt;不可重复读的特例。&lt;/p&gt;&lt;p&gt;有两个并发事务同时读取同一行数据，然后其中一个对它进行修改提交，而另一个也进行了修改提交。这就会造成第一次写操作失效。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在事务A中，读取到张三的存款为5000，操作没有完成，事务还没提交。&lt;/p&gt;&lt;p&gt;　　与此同时，&lt;/p&gt;&lt;p&gt;　　事务B，存储1000，把张三的存款改为6000，并提交了事务。&lt;/p&gt;&lt;p&gt;　　随后，&lt;/p&gt;&lt;p&gt;　　在事务A中，存储500，把张三的存款改为5500，并提交了事务，这样事务A的更新覆盖了事务B的更新。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5）幻读：&lt;/p&gt;&lt;p&gt;是指当事务不是独立执行时发生的一种现象，例如第一个事务对一个表中的数据进行了修改，这种修改涉及到表中的全部数据行。同时，第二个事务也修改这个表中的数据，这种修改是向表中插入一行新数据。那么，以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行，就好象发生了幻觉一样。&lt;/p&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;p&gt;　　目前工资为5000的员工有10人，事务A读取所有工资为5000的人数为10人。&lt;/p&gt;&lt;p&gt;　　此时，&lt;/p&gt;&lt;p&gt;　　事务B插入一条工资也为5000的记录。&lt;/p&gt;&lt;p&gt;　　这是，事务A再次读取工资为5000的员工，记录为11人。此时产生了幻读。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;提醒：&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 不可重复读的重点是修改，同样的条件，你读取过的数据，再次读取出来发现值不一样了&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 幻读的重点在于新增或者删除，同样的条件，第 1 次和第 2 次读出来的记录数不一样&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;6 结语&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;由于本人才接触SprintBoot，文中如有没说清楚的地方，希望大家能在评论区指出，以帮助我将博文写得更好。&lt;/p&gt;&lt;p&gt;————————————————&lt;/p&gt;&lt;p&gt;版权声明：本文为CSDN博主「zzhongcy」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&lt;/p&gt;&lt;p&gt;原文链接：https://blog.csdn.net/zzhongcy/article/details/102893309&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/9048963468051322584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/9048963468051322584' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/9048963468051322584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/9048963468051322584'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2021/11/springboot2.html' title='SpringBoot2异常处理回滚事务详解(自动回滚/手动回滚/部分回滚）'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-9106910347447449087</id><published>2013-12-28T21:39:00.000-05:00</published><updated>2013-12-28T21:39:06.802-05:00</updated><title type='text'>ServiceMix Process Examples</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;strong style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: large; line-height: 22px; text-indent: 28px;&quot;&gt;1.HTTP-binding(ServiceMix)&lt;/strong&gt;&lt;br /&gt;
&lt;strong style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: large; line-height: 22px; text-indent: 28px;&quot;&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRh0_inMmcpdiPu7VsBzpyVJNkWsIvo4hJrDw0hd3Jt4A60N5gu_Z09IEuw0bLcq5aCoynPM3Rcx2AVqLBE3UvZa3IsK5rUgBUjOyV2mJdoCRDAQIKwZf6KWJMzlcVkr9DhA5NKm2ygso/s1600/1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRh0_inMmcpdiPu7VsBzpyVJNkWsIvo4hJrDw0hd3Jt4A60N5gu_Z09IEuw0bLcq5aCoynPM3Rcx2AVqLBE3UvZa3IsK5rUgBUjOyV2mJdoCRDAQIKwZf6KWJMzlcVkr9DhA5NKm2ygso/s1600/1.jpg&quot; height=&quot;203&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;strong style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: large; line-height: 22px; text-indent: 28px;&quot;&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;1.4&amp;nbsp;&lt;/span&gt;&lt;/span&gt;各组件间传递消息流的过程如下：&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;HttpClient&lt;/span&gt;&lt;/span&gt;：&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;Http&lt;/span&gt;&lt;/span&gt;客户端运行一个独立的&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;Java&lt;/span&gt;&lt;/span&gt;客户端程序，通过其中的&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;URLConnection&lt;/span&gt;&lt;/span&gt;类连接到&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;a href=&quot;http://localhost:8912/&quot; style=&quot;color: #006bad; text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #336699; font-family: &#39;Times New Roman&#39;;&quot;&gt;http://localhost:8912&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;，将&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;request.xml&lt;/span&gt;&lt;/span&gt;文件发送到此端口。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;HttpReceiver&lt;/span&gt;&lt;/span&gt;：在&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;Http&lt;/span&gt;&lt;/span&gt;服务器上&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;(Http server)&lt;/span&gt;&lt;/span&gt;，&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;HttpReceiver&lt;/span&gt;&lt;/span&gt;通过监听&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;http://localhost:8912&lt;/span&gt;&lt;/span&gt;端口，得到此消息。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;HttpReceiver&lt;/span&gt;&lt;/span&gt;根据消息的&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;destinationService(&lt;/span&gt;&lt;/span&gt;目标服务&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;属性中的信息，将此消息通过&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;NMR&lt;/span&gt;&lt;/span&gt;发送给相应的&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;stockQuote&lt;/span&gt;&lt;/span&gt;服务。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;stockQuote&lt;/span&gt;&lt;/span&gt;再将此消息发送给另一个服务——&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;soapEndpoint&lt;/span&gt;&lt;/span&gt;来处理。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;5.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;soapEndpoint&lt;/span&gt;&lt;/span&gt;处理之后，将响应消息返回给&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;stockQuote&lt;/span&gt;&lt;/span&gt;。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;6.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;stockQuote&lt;/span&gt;&lt;/span&gt;通过&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;NMR&lt;/span&gt;&lt;/span&gt;将此相应消息发送给&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;httpReceiver&lt;/span&gt;&lt;/span&gt;。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;7.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;httpReceiver&lt;/span&gt;&lt;/span&gt;将相应消息发送到&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;a href=&quot;http://localhost:8912/&quot; style=&quot;color: #006bad; text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #336699; font-family: &#39;Times New Roman&#39;;&quot;&gt;http://localhost:8912&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;端口。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;8.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;HttpClient&lt;/span&gt;&lt;/span&gt;从端口读取该响应消息。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;9.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;最终响应消息在控制台输出。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 16px; line-height: 22px; text-indent: 28px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;2.Jms-binding&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 16px; line-height: 22px; text-indent: 28px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;(ServiceMix)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-size: 16px; line-height: 22px; text-indent: 28px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLKdn0N-MKfYDTyZ9VDG_lYTPwGFx9oexS6uQ0_fXzTdjBtOc3f-Olf1VYQGs37Y5RGNeU2Dbx7sv9ZUNafTOQtRqIVacX4JNqeYEUV49dD417FwSYKOeSmO7ciJqc4Kzdp8q9Llgy6DU/s1600/2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLKdn0N-MKfYDTyZ9VDG_lYTPwGFx9oexS6uQ0_fXzTdjBtOc3f-Olf1VYQGs37Y5RGNeU2Dbx7sv9ZUNafTOQtRqIVacX4JNqeYEUV49dD417FwSYKOeSmO7ciJqc4Kzdp8q9Llgy6DU/s1600/2.jpg&quot; height=&quot;222&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;2.4&lt;/span&gt;&lt;/span&gt;消息流按以下方式通过各个组件：&lt;/div&gt;
&lt;ol style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 1.4em; margin: 5px 0px 5px 35px; padding: 0px;&quot;&gt;
&lt;li class=&quot;MsoNormal&quot; style=&quot;font-size: 1em; line-height: 12pt; margin: 0cm 0cm 0pt; padding: 2px 0px; text-align: left;&quot;&gt;JMSClient,&amp;nbsp;通过&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;ActiveMQConnectionFactory,&amp;nbsp;&lt;/span&gt;连接到一个叫&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&quot;demo.org.servicemix.source&quot;&lt;/span&gt;的主题&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;并发送一个文本消息。&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot; style=&quot;font-size: 1em; line-height: 12pt; margin: 0cm 0cm 0pt; padding: 2px 0px; text-align: left;&quot;&gt;jencks (JCA资源适配器&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;)&amp;nbsp;&lt;/span&gt;在端口&lt;span style=&quot;color: windowtext; font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;61616&lt;/span&gt;&lt;/span&gt;上监听消息&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot; style=&quot;font-size: 1em; line-height: 12pt; margin: 0cm 0cm 0pt; padding: 2px 0px; text-align: left;&quot;&gt;inputReceiver&amp;nbsp;通过&lt;span style=&quot;color: windowtext; font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;jencks&lt;/span&gt;&lt;/span&gt;订阅&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&quot;demo.org.servicemix.source&quot;&amp;nbsp;&lt;/span&gt;主题并接收&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;JMS&lt;/span&gt;消息&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot; style=&quot;font-size: 1em; line-height: 12pt; margin: 0cm 0cm 0pt; padding: 2px 0px; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;inputReceiver&lt;/span&gt;规格化&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;JMS&lt;/span&gt;消息并通过规格化消息路由器（&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;NMR&lt;/span&gt;）把它发送到&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;outputSender&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot; style=&quot;font-size: 1em; margin: 0cm 0cm 0pt; padding: 2px 0px;&quot;&gt;outputSender&amp;nbsp;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;outputSender&lt;/span&gt;&lt;/span&gt;把规格化的消息&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;marshal&lt;/span&gt;&lt;/span&gt;为一个&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;JMS&lt;/span&gt;&lt;/span&gt;消息，并使用&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;jmsTemplate&lt;/span&gt;&lt;/span&gt;在&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&quot;demo.org.servicemix.result&quot;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;主题上发布消息。&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot; style=&quot;font-size: 1em; line-height: 12pt; margin: 0cm 0cm 0pt; padding: 2px 0px; text-align: left;&quot;&gt;jmsTemplate在&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&quot;demo.org.servicemix.result&quot;&amp;nbsp;&lt;/span&gt;主题上发布消息，使用&lt;span style=&quot;color: windowtext; font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;jmsFactory&lt;/span&gt;&lt;/span&gt;获得一个到结果主题的连接。&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot; style=&quot;font-size: 1em; line-height: 12pt; margin: 0cm 0cm 0pt; padding: 2px 0px; text-align: left;&quot;&gt;JMSClient, &quot;demo.org.servicemix.result,&quot;&amp;nbsp;主题的另一个订阅者接收这个消息。&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot; style=&quot;font-size: 1em; margin: 0cm 0cm 0pt; padding: 2px 0px;&quot;&gt;响应在控制台上打印。&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;strong style=&quot;background-color: white; font-size: large; line-height: 22px; text-indent: 28px;&quot;&gt;&amp;nbsp;3.BPEL Example(ServiceMix)&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;strong style=&quot;background-color: white; font-size: large; line-height: 22px; text-indent: 28px;&quot;&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBG77Xnup1wIXi-q4npVtE4Nhawh_rxu7htp7amP7Y5kZ_YM-yMLNA81xVuiZqxD-SY8hZ2uKrJYsMXIx0_pMjbL1VDY82twLe0M-gETeH4u7WoDdYhn09fc71_ND0Bj-gpT1W0XgaZws/s1600/3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBG77Xnup1wIXi-q4npVtE4Nhawh_rxu7htp7amP7Y5kZ_YM-yMLNA81xVuiZqxD-SY8hZ2uKrJYsMXIx0_pMjbL1VDY82twLe0M-gETeH4u7WoDdYhn09fc71_ND0Bj-gpT1W0XgaZws/s1600/3.jpg&quot; height=&quot;256&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;strong style=&quot;background-color: white; font-size: large; line-height: 22px; text-indent: 28px;&quot;&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;3.5&lt;/span&gt;&lt;/span&gt;程序的逻辑流：&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;JMSClient&lt;/span&gt;&lt;/span&gt;，通过&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;ActiveMQConnectionFactory&lt;/span&gt;连接到一个叫&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&quot;demo.org.servicemix.source&quot;&lt;/span&gt;的主题上，并发送一个包含&lt;tt&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;message.soap&lt;/span&gt;&lt;/tt&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;file.&lt;/span&gt;的文本消息。&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;myComponent, &quot;demo.org.servicemix.source,&quot;主题的一个订阅者，接收这个消息。&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;tt&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 12pt;&quot;&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/tt&gt;myComponent&amp;nbsp;实现类，&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;JmsServiceComponent,&lt;/span&gt;通过&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;ServiceMix&lt;/span&gt;总线发送消息至PxeBpelEngine，执行它的&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;onMessage()&lt;/span&gt;方法。&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;destinationService&lt;/span&gt;属性定了了消息的目的地。注意：&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;destinationService&lt;/span&gt;属性在文件&lt;tt&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;servicemix.xml&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;中。&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/tt&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;PxeBpelEngine通过ServiceMix总线、NMR发送一个响应至myComponent&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;。&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
5.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myComponent&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;使用&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;jmsTemplate bean&amp;nbsp;&lt;/span&gt;发布消息。&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;6.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;jmsTemplate&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;使用&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;jmsFactory bean&lt;/span&gt;获得一个到和&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;JMS&amp;nbsp;&lt;/span&gt;&lt;/span&gt;主题&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&quot;demo.org.servicemix.source.&quot;&lt;/span&gt;&lt;/span&gt;相关的端口的连接。这个消息被发布在&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&quot;demo.org.servicemix.source&quot;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;主题&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
7.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JMSClient&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;, &quot;demo.org.servicemix.source,&quot;&lt;/span&gt;主题的订阅者，&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;接收这个消息。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;8.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;响应在控制台上打印。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;strong style=&quot;font-size: large; line-height: 22px; text-indent: 28px;&quot;&gt;4.RSS-binding(ServiceMix)&lt;/strong&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;strong style=&quot;font-size: large; line-height: 22px; text-indent: 28px;&quot;&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgktK8oqZSEaHPrHCMPhTdUvtOpkHOq-HLh40Hh1lLzVGQTqWS9WFzAMeYZ4fGjJJANmhrNx6tvlbohuNiaUm3lSfdZf9bMqWf-zwNJu4FXRrSOlQ72hE-7qjSf2rqBdmNb96rkWKzI4ZQ/s1600/4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgktK8oqZSEaHPrHCMPhTdUvtOpkHOq-HLh40Hh1lLzVGQTqWS9WFzAMeYZ4fGjJJANmhrNx6tvlbohuNiaUm3lSfdZf9bMqWf-zwNJu4FXRrSOlQ72hE-7qjSf2rqBdmNb96rkWKzI4ZQ/s1600/4.jpg&quot; height=&quot;253&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;strong style=&quot;font-size: large; line-height: 22px; text-indent: 28px;&quot;&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;strong style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: large; line-height: 22px; text-indent: 28px;&quot;&gt;5.File binding(ServiceMix)&lt;/strong&gt;&lt;span style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 22px; text-indent: 28px;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 22px; text-indent: 28px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZlNEVzG_B1hcg-xy7N_DkgNSBw6FYJNdgEoOTWvrfKlDrvYcg6wTC74Rs0WK9kZRB50VexTgX43T_28UwcrRqv_JVG-qC2Ut9gZGtOh37hk8Ig12T_IxBA2VmmmWS2ce3_3UVKTNhgpw/s1600/5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZlNEVzG_B1hcg-xy7N_DkgNSBw6FYJNdgEoOTWvrfKlDrvYcg6wTC74Rs0WK9kZRB50VexTgX43T_28UwcrRqv_JVG-qC2Ut9gZGtOh37hk8Ig12T_IxBA2VmmmWS2ce3_3UVKTNhgpw/s1600/5.jpg&quot; height=&quot;264&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;5.4&lt;/span&gt;&lt;/span&gt;程序的逻辑流：&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;FilePoller&amp;nbsp;&lt;/span&gt;&lt;/span&gt;每&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;1000ms&lt;/span&gt;&lt;/span&gt;检索收件箱目录一次寻找一个文件&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;一旦在收件箱目录中找到一个文件，&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;filePoller&lt;/span&gt;&lt;/span&gt;从&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;workManager&lt;/span&gt;&lt;/span&gt;处获得一个线程。这个线程用来处理这个文件。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;filePoller&lt;/span&gt;&lt;/span&gt;创建一个包含了将要被传输的文件的规格化的消息，它把这个规格化的消息发送到&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;NMR&lt;/span&gt;&lt;/span&gt;。&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;NMR&lt;/span&gt;&lt;/span&gt;把这个消息路由到&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;fileSender&lt;/span&gt;&lt;/span&gt;组件。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;fileSender&lt;/span&gt;&lt;/span&gt;把规格化的消息转换到一个文件并“发送”（放置）到发件箱目录。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
文件传输过程中，日志信息被写到控制台。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;strong style=&quot;font-family: &#39;Times New Roman&#39;; font-size: large;&quot;&gt;6.Basic(ServiceMix)&lt;/strong&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;strong style=&quot;font-family: &#39;Times New Roman&#39;; font-size: large;&quot;&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;strong style=&quot;font-family: &#39;Times New Roman&#39;; font-size: large;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDE9P2R1V7e_ktUcvSvYh8yU1E9RpPXQu0F2qehg3hQfy33DkET82J6RC-O964AvqHYZYjcKTsUBm7tV1nrzeNXlTuPepORBlXnuySOkWzeKsgsxL0uAR918iKAUTyYH1XfeAw1_wo75A/s1600/6.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDE9P2R1V7e_ktUcvSvYh8yU1E9RpPXQu0F2qehg3hQfy33DkET82J6RC-O964AvqHYZYjcKTsUBm7tV1nrzeNXlTuPepORBlXnuySOkWzeKsgsxL0uAR918iKAUTyYH1XfeAw1_wo75A/s1600/6.jpg&quot; height=&quot;320&quot; width=&quot;314&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;6.4&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;消息流按以下方式通过各个组件：&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Timer&lt;/span&gt;&lt;/span&gt;组件通过规格化消息路由（&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;NMR&lt;/span&gt;&lt;/span&gt;）向&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;inputSender&lt;/span&gt;&lt;/span&gt;发送一个消息。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;inputsender&lt;/span&gt;&lt;/span&gt;把消息转换（&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;marshals&lt;/span&gt;&lt;/span&gt;）为一个&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;JMS&lt;/span&gt;&lt;/span&gt;消息，然后用&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;jmsTemplate bean&lt;/span&gt;&lt;/span&gt;发布消息。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;jmsTemplate&lt;/span&gt;&lt;/span&gt;用&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;jmsFactorybean&lt;/span&gt;&lt;/span&gt;获得一个到和&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;JMS&amp;nbsp;&lt;/span&gt;&lt;/span&gt;主题&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&quot;demo.org.servicemix.source.&quot;&lt;/span&gt;&lt;/span&gt;相关的端口的连接。这个消息被发布在&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&quot;demo.org.servicemix.source&quot;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;主题&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;jencks (the JCA&lt;/span&gt;&lt;/span&gt;资源适配器&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;在端口&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;61616&lt;/span&gt;&lt;/span&gt;上监听消息&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;5.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;inputReceiver&lt;/span&gt;&lt;/span&gt;通过&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;jencks&lt;/span&gt;&lt;/span&gt;订阅&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&quot;demo.org.servicemix.source&quot;&amp;nbsp;&lt;/span&gt;主题并接收&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;JMS&lt;/span&gt;消息&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;6.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;inputReceiver&lt;/span&gt;&lt;/span&gt;规格化&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;JMS&lt;/span&gt;&lt;/span&gt;消息并通过&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;NMR&lt;/span&gt;&lt;/span&gt;把它发送到&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;outputSender&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;7.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;outputSender&lt;/span&gt;&lt;/span&gt;把规格化的消息&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;marshal&lt;/span&gt;&lt;/span&gt;为一个&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;JMS&lt;/span&gt;&lt;/span&gt;消息，并使用&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;jmsTemplate&lt;/span&gt;&lt;/span&gt;在&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&quot;demo.org.servicemix.result&quot;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;主题上发布消息。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;8.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;jmsTemplate&lt;/span&gt;&lt;/span&gt;在&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&quot;demo.org.servicemix.result&quot;&amp;nbsp;&lt;/span&gt;主题上发布消息，使用&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;jmsFactory&lt;/span&gt;&lt;/span&gt;获得一个到结果主题的连接。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;9.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Jencks&lt;/span&gt;&lt;/span&gt;在&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;61616&lt;/span&gt;&lt;/span&gt;端口上监听消息。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;10.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;jmsTrace&lt;/span&gt;&lt;/span&gt;订阅&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&quot;demo.org.servicemix.result&quot;&amp;nbsp;&lt;/span&gt;主题，并通过&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;jencks&lt;/span&gt;接收&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;JMS&lt;/span&gt;消息。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;11.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;jmsTrace&lt;/span&gt;把&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;JMS&lt;/span&gt;消息转换成规格化消息，并通过&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;NMR&lt;/span&gt;把它发送到&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;trace&lt;/span&gt;。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.285714149475098px; line-height: 25.196428298950195px; padding: 0px;&quot;&gt;
&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;12.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;trace&lt;/span&gt;把规格化的消息转换成一个字符串，并在控制台上记录日志。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
每&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;秒在控制台上写一遍日志，还有从&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;trace&lt;/span&gt;&lt;/span&gt;组件而来的信息。注意，他日&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;ggers&amp;amp;apos&lt;/span&gt;&lt;/span&gt;，属性值为“名字”“我的示例工作”“组”，“&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;ServiceMix&lt;/span&gt;&lt;/span&gt;”用时间戳显示。&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;strong style=&quot;font-size: 14.285714149475098px;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;7.Quartz-binding(ServiceMix)&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3daL9P2BTVEjHFDUnDZbZr3V0yiDbV_-UIVR_zmKhV0UZLD0RP1qKnhOfexjjpIBL2N7RLBdSO8WcEnfTZBLaNfmJdjsZrTdpQ9Hfwn1ldNGMbE998q-2TyeR9wD-2naRSkJrnvrlQ0Y/s1600/7.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3daL9P2BTVEjHFDUnDZbZr3V0yiDbV_-UIVR_zmKhV0UZLD0RP1qKnhOfexjjpIBL2N7RLBdSO8WcEnfTZBLaNfmJdjsZrTdpQ9Hfwn1ldNGMbE998q-2TyeR9wD-2naRSkJrnvrlQ0Y/s1600/7.jpg&quot; height=&quot;205&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
This article is from :&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 22px; margin: 0cm 0cm 0pt; padding: 0px; text-indent: 2em;&quot;&gt;
&lt;span style=&quot;font-family: verdana; font-size: 14.285714149475098px;&quot;&gt;http://blog.csdn.net/juset/archive/2006/12/18/1447626.aspx&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 22px; text-indent: 28px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/9106910347447449087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/9106910347447449087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/9106910347447449087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/9106910347447449087'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2013/12/servicemix-process-examples.html' title='ServiceMix Process Examples'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRh0_inMmcpdiPu7VsBzpyVJNkWsIvo4hJrDw0hd3Jt4A60N5gu_Z09IEuw0bLcq5aCoynPM3Rcx2AVqLBE3UvZa3IsK5rUgBUjOyV2mJdoCRDAQIKwZf6KWJMzlcVkr9DhA5NKm2ygso/s72-c/1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-5766910690195118791</id><published>2013-10-10T23:38:00.003-04:00</published><updated>2013-10-10T23:44:47.627-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Tomcat"/><title type='text'>Set the context path of a web application in Tomcat 7.0</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Try to deploy a war package in Tomcat 7 with different web context path, at last it works with below steps:&lt;br /&gt;
&lt;br /&gt;
1. Create context.xml file with your new context path name. For example: &amp;nbsp;mynewpath.xml&lt;br /&gt;
&lt;br /&gt;
Don&#39;t just use default file name context.xml as your web file name, otherwise the Tomcat will deploy a new app with \context . But you want \mynewpath . It is a tricky.&lt;br /&gt;
&lt;br /&gt;
In file you need to add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;
&amp;lt;Context docBase=&quot;myapp.war&quot;&lt;br /&gt;
&amp;nbsp; reloadable=&quot;true&quot; path=&quot;/mynewpath&quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Put this mynewpath.xml in Tomcat\conf\Catalina\localhost.&lt;br /&gt;
3. Deploy your war file outside the webapp folder like below:&lt;br /&gt;
&lt;br /&gt;
C:\apache-tomcat-7.0.42\myapp.war&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That&#39;s it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/5766910690195118791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/5766910690195118791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/5766910690195118791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/5766910690195118791'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2013/10/set-context-path-of-web-application-in.html' title='Set the context path of a web application in Tomcat 7.0'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-5174507917938437466</id><published>2012-04-30T10:25:00.002-04:00</published><updated>2012-04-30T10:32:56.896-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JSF"/><title type='text'>Run JSF 2.0 on Glassfish 2.1.1</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
You can add JSF 2.0 and Unified EL (EL 2) magic to Glassfish V2.1.1 in 2 ways.&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;


1) If you want to completly replace JSF 1.x with 2.x in your glassfish V2.1.1 installation&lt;/h2&gt;
&lt;br /&gt;
a) Remove existing jsf-impl.jar in ${com.sun.aas.installRoot}/lib&lt;br /&gt;
b) Add following JSF2 and unified EL jars. i.e. jsf-api-2.1.jar, jsf-impl-2.1.jar,el-api-2.1.jar, el-impl-2.1.jar in in ${com.sun.aas.installRoot}/lib.&lt;br /&gt;
c) Add or update classpath-prefix=”${com.sun.aas.installRoot}/lib/jsf-api.jar;${com.sun.aas.installRoot}/lib/jsf-imp.jar;${com.sun.aas.installRoot}/lib/el-api.jar;${com.sun.aas.installRoot}/lib/el-impl.jar” in ${com.sun.aas.installRoot}/domains//config/domain.xml  under  as an attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;


2) If you want to keep JSF 1.x as the default implementation on your glassfish instance but want to implement JSF 2.x only on one of your applications&lt;/h2&gt;
&lt;br /&gt;
a) Add el-api-2.1.jar, el-impl-2.1.jar in ${com.sun.aas.installRoot}/lib.&lt;br /&gt;
b) Include jsf-api-2.1.jar, jsf-impl-2.1.jar in lib directory of your application war.&lt;br /&gt;
c) Add add sun-web.xml under /WEB-INF/ directory of your application war with following properties &lt;br /&gt;
mojarra2&lt;br /&gt;
d) Add or update classpath-prefix=”${com.sun.aas.installRoot}/lib/el-api.jar;${com.sun.aas.installRoot}/lib/el-impl.jar” in ${com.sun.aas.installRoot}/domains//config/domain.xml  under  as an attribute.&lt;br /&gt;
Hope this helps. Enjoy!!!&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;Note:  (This does not work in Glassfish V2.0 or V2.1)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
Original file:&lt;br /&gt;
&lt;a href=&quot;http://ocpsoft.org/java/jsf2-java/jsf2-how-to-add-the-magic-of-el-el2-to-jsf/&quot;&gt;http://ocpsoft.org/java/jsf2-java/jsf2-how-to-add-the-magic-of-el-el2-to-jsf/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;


Also there is another article show the way:&lt;/h2&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;a href=&quot;http://blog.eisele.net/2010/01/running-mojarra-202-on-glassfish-v211.html&quot;&gt;http://blog.eisele.net/2010/01/running-mojarra-202-on-glassfish-v211.html&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/5174507917938437466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/5174507917938437466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/5174507917938437466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/5174507917938437466'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2012/04/run-jsf-20-on-glassfish-211.html' title='Run JSF 2.0 on Glassfish 2.1.1'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-864770631675777866</id><published>2012-04-28T01:03:00.002-04:00</published><updated>2012-04-28T01:09:18.469-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JSF"/><title type='text'>Spring+Hibernate+JSF+Ajax4jsf+Acegi+jCaptcha 做登录模块</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
带图片验证码的用户登录是一个系统中很常见的模块，在Java 
EE中有很多不同的实现，而开源世界中又给我们提供了很多优秀的框架，从而减少了我们的编码量，下面给大家简单介绍一下用
Spring+Hibernate+JSF+Ajax4jsf+Acegi+jCaptcha 如何构建一个登录模块：
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 我使用这些框架的版本如下：&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Spring 2.0.1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Hibernate 3.2&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; JSF 1.2&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Acegi 1.0.5&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; jCaptcha 1.0-RC6&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先建表USERTEST，和ROLETEST，作为用户表和角色表&lt;br /&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;CREATE TABLE USERTEST&lt;br /&gt;(&lt;br /&gt;&amp;nbsp; USERID&amp;nbsp;&amp;nbsp;&amp;nbsp; NUMBER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br /&gt;&amp;nbsp; USERNAME&amp;nbsp; VARCHAR2(20 CHAR)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br /&gt;&amp;nbsp; PASSWORD&amp;nbsp; VARCHAR2(100 CHAR)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br /&gt;&amp;nbsp; STATUS&amp;nbsp;&amp;nbsp;&amp;nbsp; NUMBER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEFAULT 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br /&gt;&amp;nbsp; ROLEID&amp;nbsp;&amp;nbsp;&amp;nbsp; NUMBER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL&lt;br /&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;CREATE TABLE ROLETEST&lt;br /&gt;(&lt;br /&gt;&amp;nbsp; ROLEID&amp;nbsp;&amp;nbsp;&amp;nbsp; NUMBER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br /&gt;&amp;nbsp; ROLENAME&amp;nbsp; VARCHAR2(50 CHAR)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br /&gt;&amp;nbsp; ROLEDESC&amp;nbsp; VARCHAR2(50 CHAR)&lt;br /&gt;)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 同时给ROLETEST表添加一条记录：1&amp;nbsp;&amp;nbsp;&amp;nbsp; ROLE_USER&amp;nbsp;&amp;nbsp;&amp;nbsp; 普通用户&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 再给USERTEST表添加一条记录：1&amp;nbsp;&amp;nbsp;&amp;nbsp; admin&amp;nbsp;&amp;nbsp;&amp;nbsp; 123&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 对应的hbm.xml文件就相信大家都会写，如果用eclipse开发的话，可以使用HibernateSynchronizer插件，我使用的版本是3.1.9&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 接下来就要给web.xml的配置一下了：&lt;br /&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;web-app xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;&amp;nbsp;xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;&lt;br /&gt;&amp;nbsp;xmlns:web=&quot;http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;&lt;br /&gt;&amp;nbsp;xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;&lt;br /&gt;&amp;nbsp;id=&quot;WebApp_ID&quot; version=&quot;2.5&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;display-name&amp;gt;Demo&amp;lt;/display-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;welcome-file&amp;gt;index.html&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;welcome-file&amp;gt;index.htm&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;context-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;param-value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/WEB-INF/classes/applicationContext.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/context-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;context-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;param-name&amp;gt;javax.faces.CONFIG_FILES&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;param-value&amp;gt;/WEB-INF/faces-config.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/context-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;listener&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;listener-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.springframework.web.context.ContextLoaderListener&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/listener&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;listener&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;listener-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.acegisecurity.ui.session.HttpSessionEventPublisher&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/listener&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;listener&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;listener-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;com.sun.faces.config.ConfigureListener&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/listener&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;filter-name&amp;gt;OpenSessionInView&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;filter-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param-name&amp;gt;singleSession&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;filter-name&amp;gt;OpenSessionInView&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;url-pattern&amp;gt;*.jsf&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;filter-name&amp;gt;Acegi Filter Chain Proxy&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;filter-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.acegisecurity.util.FilterToBeanProxy&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param-name&amp;gt;targetClass&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param-value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.acegisecurity.util.FilterChainProxy&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;filter-name&amp;gt;Acegi Filter Chain Proxy&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;display-name&amp;gt;Ajax4jsf Filter&amp;lt;/display-name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;filter-name&amp;gt;ajax4jsf&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;filter-class&amp;gt;org.ajax4jsf.Filter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/filter&amp;gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;filter-name&amp;gt;ajax4jsf&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;dispatcher&amp;gt;INCLUDE&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-class&amp;gt;javax.faces.webapp.FacesServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;url-pattern&amp;gt;*.jsf&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/web-app&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后Spring的applicationContext.xml，在这里面你需要配置数据库连接、hibernate的各种策略、Acegi安全设置、jCaptcha设置等等：&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;&lt;br /&gt;&amp;nbsp;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;&amp;nbsp;xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;&lt;br /&gt;&amp;nbsp;xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.1.xsd&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;bean id=&quot;dataSource&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.apache.commons.dbcp.BasicDataSource&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;driverClassName&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;oracle.jdbc.driver.OracleDriver&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;url&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;jdbc:oracle:thin:@10.10.10.10:1521:demo&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;username&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;demo&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;password&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;demo&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;sessionFactory&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.springframework.orm.hibernate3.LocalSessionFactoryBean&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;dataSource&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref bean=&quot;dataSource&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;hibernateProperties&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;props&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;hibernate.dialect&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.hibernate.dialect.OracleDialect&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;hibernate.connection.pool_size&quot;&amp;gt;5&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;hibernate.show_sql&quot;&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;cache.provider_class&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.hibernate.cache.OSCacheProvider&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;cache.use_query_cache&quot;&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;cglib.use_reflection_optimizer&quot;&amp;gt;false&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/props&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;mappingDirectoryLocations&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;list&amp;gt;&amp;lt;!--&amp;nbsp;这里指定了hibernate的映射目录 --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;classpath:/com/fifthlab/demo/pojo&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;transactionManager&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.springframework.orm.hibernate3.HibernateTransactionManager&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;sessionFactory&quot; ref=&quot;sessionFactory&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;!-- Transaction template for Managers --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;bean id=&quot;txProxyTemplate&quot; abstract=&quot;true&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.springframework.transaction.interceptor.TransactionProxyFactoryBean&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;transactionManager&quot; ref=&quot;transactionManager&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;transactionAttributes&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;props&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;save*&quot;&amp;gt;PROPAGATION_REQUIRED&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;add*&quot;&amp;gt;PROPAGATION_REQUIRED&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;delete*&quot;&amp;gt;PROPAGATION_REQUIRED&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;update*&quot;&amp;gt;PROPAGATION_REQUIRED&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;relation*&quot;&amp;gt;PROPAGATION_REQUIRED&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;disconnect*&quot;&amp;gt;PROPAGATION_REQUIRED&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;assign*&quot;&amp;gt;PROPAGATION_REQUIRED&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;unassign*&quot;&amp;gt;PROPAGATION_REQUIRED&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&quot;*&quot;&amp;gt;PROPAGATION_SUPPORTS&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/props&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;lt;!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX acegi part begin XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;!-- ======================== FILTER CHAIN ======================= --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;!--&amp;nbsp; if you wish to use channel security, add &quot;channelProcessingFilter,&quot; in front&lt;br /&gt;&amp;nbsp;&amp;nbsp;of &quot;httpSessionContextIntegrationFilter&quot; in the list below --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;bean id=&quot;filterChainProxy&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.acegisecurity.util.FilterChainProxy&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;filterInvocationDefinitionSource&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PATTERN_TYPE_APACHE_ANT&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**/*.jsf=httpSessionContextIntegrationFilter,&lt;span style=&quot;color: red;&quot;&gt;captchaValidationProcessingFilter&lt;/span&gt;,authenticationProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;httpSessionContextIntegrationFilter&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.acegisecurity.context.HttpSessionContextIntegrationFilter&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;context&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;&lt;span style=&quot;color: #0033ff;&quot;&gt;&amp;lt;!--&amp;nbsp;此处修复了Acegi和jCaptcha不能兼容的一个bug，在后面的版本中应该修复了 --&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0033ff;&quot;&gt;com.fifthlab.demo.dao.authentication.FixedCaptchaSecurityContextImpl&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;authenticationManager&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.acegisecurity.providers.ProviderManager&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;providers&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref local=&quot;daoAuthenticationProvider&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;daoAuthenticationProvider&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.acegisecurity.providers.dao.DaoAuthenticationProvider&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;userDetailsService&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref local=&quot;hibernate3Authentication&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;loggerListener&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.acegisecurity.event.authentication.LoggerListener&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;authenticationProcessingFilter&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.acegisecurity.ui.webapp.AuthenticationProcessingFilter&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;authenticationManager&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref bean=&quot;authenticationManager&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;authenticationFailureUrl&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;&lt;span style=&quot;color: #0033ff;&quot;&gt;/login.jsf&lt;/span&gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;defaultTargetUrl&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;&lt;span style=&quot;color: #0033ff;&quot;&gt;/login.jsf&lt;/span&gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;filterProcessesUrl&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;/j_acegi_security_check&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;exceptionTranslationFilter&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.acegisecurity.ui.ExceptionTranslationFilter&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;authenticationEntryPoint&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref local=&quot;authenticationProcessingFilterEntryPoint&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;authenticationProcessingFilterEntryPoint&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;loginFormUrl&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;&lt;span style=&quot;color: #0033ff;&quot;&gt;/login.jsf&lt;/span&gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;forceHttps&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;filterInvocationInterceptor&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.acegisecurity.intercept.web.FilterSecurityInterceptor&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;authenticationManager&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref bean=&quot;authenticationManager&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;accessDecisionManager&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref local=&quot;httpRequestAccessDecisionManager&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;observeOncePerRequest&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;objectDefinitionSource&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PATTERN_TYPE_APACHE_ANT &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0033ff;&quot;&gt;/login.jsp&lt;/span&gt;=ROLE_ANONYMOUS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0033ff;&quot;&gt;/success.jsp&lt;/span&gt;=ROLE_USER&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #0033ff;&quot;&gt;&amp;lt;!-- 用来验证用户名密码是否相符，并赋予相应的角色 --&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;lt;bean id=&quot;hibernate3Authentication&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;&lt;span style=&quot;color: #0033ff;&quot;&gt;com.fifthlab.demo.dao.authentication.Hibernate3Authentication&lt;/span&gt;&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;sessionFactory&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref local=&quot;sessionFactory&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;anonymousProcessingFilter&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.acegisecurity.providers.anonymous.AnonymousProcessingFilter&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;key&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;foobar&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;userAttribute&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;anonymousUser,ROLE_ANONYMOUS&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;httpRequestAccessDecisionManager&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.acegisecurity.vote.AffirmativeBased&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;allowIfAllAbstainDecisions&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;decisionVoters&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref bean=&quot;roleVoter&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;bean id=&quot;roleVoter&quot; class=&quot;org.acegisecurity.vote.RoleVoter&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;lt;!-- 下面开始添加 jcaptcha&amp;nbsp; --&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;lt;bean id=&quot;captchaValidationProcessingFilter&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;org.acegisecurity.captcha.CaptchaValidationProcessingFilter&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;captchaService&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref bean=&quot;captchaService&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;captchaValidationParameter&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;j_captcha_response&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #0033ff;&quot;&gt;&amp;lt;!--&amp;nbsp;用来验证图片验证码是否输入正确 --&amp;gt;&lt;/span&gt;&amp;lt;bean id=&quot;captchaService&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;&lt;span style=&quot;color: #0033ff;&quot;&gt;com.fifthlab.demo.dao.authentication.JCaptchaServiceProxyImpl&lt;/span&gt;&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&quot;jcaptchaService&quot; ref=&quot;jcaptchaService&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;bean id=&quot;jcaptchaService&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class=&quot;com.octo.captcha.service.image.DefaultManageableImageCaptchaService&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX acegi part end XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
先解释一下上面applicationContext.xml中红色的部分是jCaptcha的一个filter，必须放在第二个位置，后面的是
acegi的filter，也就是说，要先验证图片验证码是否正确，再让acegi来验证用户名和密码。蓝色的部分是需要写的几个代码，其中有一个修复
bug的地方，如果不添加那个bean，在运行的时候就会报Cast转型的错误。下面列一下蓝色部分的代码：&lt;br /&gt;
&lt;span style=&quot;color: #3366ff;&quot;&gt;FixedCaptchaSecurityContextImpl：&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;import org.acegisecurity.captcha.CaptchaSecurityContextImpl;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;public class FixedCaptchaSecurityContextImpl extends CaptchaSecurityContextImpl {&lt;br /&gt;&amp;nbsp;public int hashCode() {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;nbsp;if (getAuthentication() == null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (int) System.currentTimeMillis();&lt;br /&gt;&amp;nbsp;&amp;nbsp;} else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return this.getAuthentication().hashCode();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #3366ff;&quot;&gt;Hibernate3Authentication：&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;
import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;

import org.acegisecurity.GrantedAuthority;&lt;br /&gt;import org.acegisecurity.GrantedAuthorityImpl;&lt;br /&gt;import org.acegisecurity.userdetails.UserDetails;&lt;br /&gt;import org.acegisecurity.userdetails.UserDetailsService;&lt;br /&gt;import org.acegisecurity.userdetails.UsernameNotFoundException;&lt;br /&gt;import org.hibernate.Criteria;&lt;br /&gt;import org.hibernate.criterion.Expression;&lt;br /&gt;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;&lt;br /&gt;

import com.fifthlab.demo.pojo.Roletest;&lt;br /&gt;import com.fifthlab.demo.pojo.Usertest;&lt;br /&gt;

public class Hibernate3Authentication extends HibernateDaoSupport implements UserDetailsService {&lt;br /&gt;

&amp;nbsp;public UserDetails loadUserByUsername(final String username)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;Criteria criteria = getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(Usertest.class);&lt;br /&gt;&amp;nbsp;&amp;nbsp;criteria.add(Expression.eq(Usertest.PROP_USERNAME, username));&lt;br /&gt;&amp;nbsp;&amp;nbsp;List users = criteria.list();&lt;br /&gt;

&amp;nbsp;&amp;nbsp;if (users.size() == 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new UsernameNotFoundException(&quot;User not found&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;

&amp;nbsp;&amp;nbsp;Usertest user = (Usertest) users.get(0);&lt;br /&gt;

&amp;nbsp;&amp;nbsp;// get User roles of this user&lt;br /&gt;&amp;nbsp;&amp;nbsp;List&amp;lt;Roletest&amp;gt; userRoles = new ArrayList&amp;lt;Roletest&amp;gt;(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;userRoles.add(user.getRoletest());&lt;br /&gt;&amp;nbsp;&amp;nbsp;GrantedAuthority[] dbAuths = new GrantedAuthority[userRoles.size()];&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (userRoles.size() == 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new UsernameNotFoundException(&quot;User has no GrantedAuthority&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;

&amp;nbsp;&amp;nbsp;// grant authority to user&lt;br /&gt;&amp;nbsp;&amp;nbsp;String roleName = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Roletest role = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; userRoles.size(); i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;role = (Roletest) userRoles.get(i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (null != role)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roleName = role.getRolename();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbAuths[i] = new GrantedAuthorityImpl(roleName);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;user.setAuthorities(dbAuths);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return user;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;

&lt;span style=&quot;color: #3366ff;&quot;&gt;JCaptchaServiceProxyImpl：&lt;/span&gt;&lt;br /&gt;

import org.acegisecurity.captcha.CaptchaServiceProxy;&lt;br /&gt;import com.octo.captcha.service.image.ImageCaptchaService;&lt;br /&gt;import com.octo.captcha.service.CaptchaServiceException;&lt;br /&gt;

public class JCaptchaServiceProxyImpl implements CaptchaServiceProxy {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ImageCaptchaService jcaptchaService;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean validateReponseForId(String id, Object response) {&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; boolean result = jcaptchaService.validateResponseForID(id, response);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //System.out.println(&quot;id:&quot;+id+&quot;\nresponse:&quot;+response+&quot;\nresult:&quot;+result);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; return result;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (CaptchaServiceException cse) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //fixes known bug in JCaptcha&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; cse.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setJcaptchaService(ImageCaptchaService jcaptchaService) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.jcaptchaService = jcaptchaService;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; } &lt;br /&gt;

&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 接下来是简单的登录页面login.jsp和登录成功后的跳转页面success.jsp：&lt;/span&gt;&lt;br /&gt;

&lt;span style=&quot;color: #0033ff;&quot;&gt;login.jsp：&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: black;&quot;&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;lt;%@ page language=&quot;Java&quot; contentType=&quot;text/html;charset=utf-8&quot;%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib uri=&quot;http://java.sun.com/jsf/html&quot; prefix=&quot;h&quot;%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib uri=&quot;http://java.sun.com/jsf/core&quot; prefix=&quot;f&quot;%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib uri=&quot;https://ajax4jsf.dev.java.net/ajax&quot; prefix=&quot;a4j&quot;%&amp;gt;&lt;br /&gt;&amp;lt;f:view&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;title&amp;gt;hello&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;META HTTP-EQUIV=&quot;PRAGMA&quot; CONTENT=&quot;NO-CACHE&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;META HTTP-EQUIV=&quot;Pragma&quot; CONTENT=&quot;no-cache&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;META HTTP-EQUIV=&quot;Expires&quot; CONTENT=&quot;Expires&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;br /&gt;

&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;h:form id=&quot;form1&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;h:panelGrid columns=&quot;1&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h:panelGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h:outputLabel value=&quot;username:&quot; for=&quot;username&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h:inputText id=&quot;username&quot; value=&quot;#{loginBean.userName}&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/h:panelGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h:panelGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h:outputLabel value=&quot;password:&quot; for=&quot;password&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h:inputSecret id=&quot;password&quot; value=&quot;#{loginBean.password}&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/h:panelGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h:panelGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h:outputLabel value=&quot;verifying code:&quot; for=&quot;verifyingCode&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h:inputText id=&quot;verifyingCode&quot; value=&quot;#{loginBean.verifyingCode}&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;&amp;lt;a4j:mediaOutput element=&quot;img&quot; cacheable=&quot;false&quot; session=&quot;false&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;createContent=&quot;#{captchaImageBean.paint}&quot; id=&quot;showPic&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mimeType=&quot;image/jpeg&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a4j:commandLink reRender=&quot;showPic&quot; requestDelay=&quot;40&quot; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h:outputText value=&quot;refresh&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/a4j:commandLink&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/h:panelGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h:panelGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h:commandButton id=&quot;commandButton1&quot; value=&quot;Submit&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;action=&quot;#{loginBean.authenticate}&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/h:panelGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/h:panelGrid&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/h:form&amp;gt;&lt;/span&gt;&lt;br /&gt;

&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/html&amp;gt;&lt;br /&gt;&amp;lt;/f:view&amp;gt;&lt;/span&gt;&lt;br /&gt;

&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 其中红色部分是应用了Ajax4jsf这个框架的两个标签，&lt;span style=&quot;color: red;&quot;&gt;&amp;lt;a4j:mediaOutput&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;是表示输出一个媒体，这里我选择的是输出图片，它会异步的产生图片，而不必和页面载入时同步取图片。而&lt;span style=&quot;color: red;&quot;&gt;&amp;lt;a4j:commandLink reRender=&quot;showPic&quot;&amp;gt;&lt;/span&gt; 则是在看不清图片的情况下通过异步的方式刷新上面那个&lt;span style=&quot;color: red;&quot;&gt;&amp;lt;a4j:mediaOutput&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;的图片。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; success.jsp的页面很简单，就是显示一个“Welcome here”的字样，因此不列出来了。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;然后我们看一下页面中用到的backing bean的代码：&lt;br /&gt;

&lt;span style=&quot;color: #3366ff;&quot;&gt;LoginBean：&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;
import javax.faces.context.FacesContext;&lt;br /&gt;import javax.servlet.http.HttpSession;&lt;br /&gt;

import org.acegisecurity.Authentication;&lt;br /&gt;import org.acegisecurity.AuthenticationException;&lt;br /&gt;import org.acegisecurity.AuthenticationManager;&lt;br /&gt;import org.acegisecurity.context.SecurityContext;&lt;br /&gt;import org.acegisecurity.context.SecurityContextHolder;&lt;br /&gt;import org.acegisecurity.providers.UsernamePasswordAuthenticationToken;&lt;br /&gt;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;&lt;br /&gt;

import com.fifthlab.demo.dao.authentication.JCaptchaServiceProxyImpl;&lt;br /&gt;

public class LoginBean extends HibernateDaoSupport {&lt;br /&gt;&amp;nbsp;private static final long serialVersionUID = 1L;&lt;br /&gt;&amp;nbsp;private String userName;&lt;br /&gt;&amp;nbsp;private String password;&lt;br /&gt;&amp;nbsp;private String verifyingCode;&lt;br /&gt;&amp;nbsp;private AuthenticationManager authenticationManager;&lt;br /&gt;&amp;nbsp;private JCaptchaServiceProxyImpl captchaService;&lt;br /&gt;

&amp;nbsp;/**&lt;br /&gt;&amp;nbsp; * @return 返回用户输入的验证码&lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;public String getVerifyingCode()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return this.verifyingCode;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp; * @param verifyingCode 设置图片验证码&lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;public void setVerifyingCode(String verifyingCode)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.verifyingCode = verifyingCode;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp; * @return 返回captchaService来验证图片验证码&lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;public JCaptchaServiceProxyImpl getCaptchaService()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return this.captchaService;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp; * @param captchaService 设置图片验证码服务&lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;public void setCaptchaService(JCaptchaServiceProxyImpl captchaService)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.captchaService = captchaService;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp; * @return 返回密码&lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;public String getPassword()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return password;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;

&amp;nbsp;/**&lt;br /&gt;&amp;nbsp; * @param password 设置密码&lt;br /&gt;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;public void setPassword(String password)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.password = password;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;

&amp;nbsp;/**&lt;br /&gt;&amp;nbsp; * @return 返回用户名&lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;public String getUserName()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return userName;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;

&amp;nbsp;/**&lt;br /&gt;&amp;nbsp; * @param userName 设置用户名&lt;br /&gt;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;public void setUserName(String userName)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.userName = userName;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;

&amp;nbsp;/**&lt;br /&gt;&amp;nbsp; * @return 返回验证管理器&lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;public AuthenticationManager getAuthenticationManager()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return authenticationManager;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;

&amp;nbsp;/**&lt;br /&gt;&amp;nbsp; * @param authenticationManager 设置验证管理器&lt;br /&gt;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;public void setAuthenticationManager(AuthenticationManager authenticationManager)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.authenticationManager = authenticationManager;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;public String authenticate()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;String sessionid = ((HttpSession)FacesContext.getCurrentInstance()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getExternalContext()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getSession(false)).getId();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean captchaResult = getCaptchaService().validateReponseForId(sessionid, getVerifyingCode());//验证图片验证码&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getUserName(), getPassword());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//验证用户名和密码&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Authentication auth = getAuthenticationManager().authenticate(authReq);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;String result = &quot;failure&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(auth.isAuthenticated() == true &amp;amp;&amp;amp; captchaResult) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{//如果图片验证码和帐户全部验证通过&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = &quot;succeed&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//把验证信息保存的上下文中&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SecurityContext secCtx = SecurityContextHolder.getContext();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;secCtx.setAuthentication(auth);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;catch(AuthenticationException e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &quot;failure&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;

&lt;span style=&quot;color: #3366ff;&quot;&gt;CaptchaImageBean:&lt;/span&gt;&lt;br /&gt;

import java.awt.image.BufferedImage;&lt;br /&gt;import java.io.ByteArrayOutputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.OutputStream;&lt;br /&gt;

import javax.faces.context.FacesContext;&lt;br /&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;import javax.servlet.http.HttpSession;&lt;br /&gt;

import com.octo.captcha.service.image.ImageCaptchaService;&lt;br /&gt;import com.sun.image.codec.jpeg.JPEGCodec;&lt;br /&gt;import com.sun.image.codec.jpeg.JPEGImageEncoder;&lt;br /&gt;

public class CaptchaImageBean {&lt;br /&gt;

&amp;nbsp;static final long serialVersionUID = 1L;&lt;br /&gt;&amp;nbsp;private ImageCaptchaService jcaptchaService;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;public void setJcaptchaService(ImageCaptchaService jcaptchaService) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.jcaptchaService = jcaptchaService;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;public void paint(OutputStream out, Object data) throws IOException&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;byte[] captchaChallengeAsJpeg = null;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getExternalContext().getRequest();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;String captchaId = ((HttpSession)FacesContext.getCurrentInstance()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getExternalContext()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getSession(false)).getId();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;BufferedImage challenge = jcaptchaService.getImageChallengeForID(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;captchaId, request.getLocale());&lt;br /&gt;

&amp;nbsp;&amp;nbsp;JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);&lt;br /&gt;&amp;nbsp;&amp;nbsp;jpegEncoder.encode(challenge);&lt;br /&gt;

&amp;nbsp;&amp;nbsp;captchaChallengeAsJpeg = jpegOutputStream.toByteArray();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;jpegOutputStream.close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;out.write(captchaChallengeAsJpeg);&lt;br /&gt;&amp;nbsp;&amp;nbsp;out.flush();&lt;br /&gt;&amp;nbsp;&amp;nbsp;out.close();&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;

&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最后当然是配置faces-config.xml了，里面配置了和Spring的整合、导航、managed bean等等：&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: black;&quot;&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE
 faces-config PUBLIC &quot;-//Sun Microsystems, Inc.//DTD JavaServer Faces 
Config 1.1//EN&quot; &quot;http://java.sun.com/dtd/web-facesconfig_1_1.dtd&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;

&lt;span style=&quot;color: #996600;&quot;&gt;&amp;lt;faces-config&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;application&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;variable-resolver&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.springframework.web.jsf.DelegatingVariableResolver&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/variable-resolver&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/application&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;managed-bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;managed-bean-name&amp;gt;loginBean&amp;lt;/managed-bean-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;managed-bean-class&amp;gt;com.fifthlab.demo.backingbean.LoginBean&amp;lt;/managed-bean-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;managed-bean-scope&amp;gt;request&amp;lt;/managed-bean-scope&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;managed-property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property-name&amp;gt;authenticationManager&amp;lt;/property-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;#{authenticationManager}&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/managed-property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;managed-property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property-name&amp;gt;captchaService&amp;lt;/property-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;#{captchaService}&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/managed-property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/managed-bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;lt;managed-bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;managed-bean-name&amp;gt;captchaImageBean&amp;lt;/managed-bean-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;managed-bean-class&amp;gt;com.fifthlab.demo.backingbean.CaptchaImageBean&amp;lt;/managed-bean-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;managed-bean-scope&amp;gt;request&amp;lt;/managed-bean-scope&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;managed-property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property-name&amp;gt;jcaptchaService&amp;lt;/property-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;#{jcaptchaService}&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/managed-property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/managed-bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;lt;navigation-rule&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;from-view-id&amp;gt;/login.jsp&amp;lt;/from-view-id&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;navigation-case&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;from-outcome&amp;gt;succeed&amp;lt;/from-outcome&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;to-view-id&amp;gt;/success.jsp&amp;lt;/to-view-id&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/navigation-case&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;navigation-case&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;from-outcome&amp;gt;failure&amp;lt;/from-outcome&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;to-view-id&amp;gt;/login.jsp&amp;lt;/to-view-id&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/navigation-case&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/navigation-rule&amp;gt;&lt;br /&gt;&amp;lt;/faces-config&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;

&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 大功告成！让我们来看一下演示吧&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilr2AoGeeZZrIAzE0hiK3vfDXFmGFr2gDYNE__PhPXrfG4nTHobT4wQuQb2zfoAb7WKdOoj_XKXvf4-_7vjiKddy5_4nFv19YD2_zssH2xxK5M9BtMl2fw3s8v15pkREosdzAotgMisqY/s1600/login.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;140&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilr2AoGeeZZrIAzE0hiK3vfDXFmGFr2gDYNE__PhPXrfG4nTHobT4wQuQb2zfoAb7WKdOoj_XKXvf4-_7vjiKddy5_4nFv19YD2_zssH2xxK5M9BtMl2fw3s8v15pkREosdzAotgMisqY/s320/login.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 填好帐户和验证码后，点击Submit，如果失败则还是该页不变，如果成功则跳转到：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIFoz5yXwtKK1IZlJOBQj_R9dyBIVNkYlawnogpB3TMb7R8xq1DGNGtBBs7Vgtx0Vh049nGf6-uCEaKe0uMcUrjjU-UCOMPXYK_B0iST7QGW-AuwlW4iiGJG9zY71lbErfSxEOvWwMIhE/s1600/welcome.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIFoz5yXwtKK1IZlJOBQj_R9dyBIVNkYlawnogpB3TMb7R8xq1DGNGtBBs7Vgtx0Vh049nGf6-uCEaKe0uMcUrjjU-UCOMPXYK_B0iST7QGW-AuwlW4iiGJG9zY71lbErfSxEOvWwMIhE/s1600/welcome.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;需要的各种lib列表如下图：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij8zRUrHnynxMW3R6uspR-DNuAoJCuEJl_R8fWhMy6re7vrREZbEqpcifw8ETXRYgJ1kNMnXf7OiWJtH4OFNfTmUgjkysG0UJ7NmUqgr2xyArP1weN7de-5K3K88iX20G5dLbLnoI-NME/s1600/lib.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij8zRUrHnynxMW3R6uspR-DNuAoJCuEJl_R8fWhMy6re7vrREZbEqpcifw8ETXRYgJ1kNMnXf7OiWJtH4OFNfTmUgjkysG0UJ7NmUqgr2xyArP1weN7de-5K3K88iX20G5dLbLnoI-NME/s320/lib.jpg&quot; width=&quot;175&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;原文：http://farmerinchina.blog.sohu.com/70466803.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/864770631675777866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/864770631675777866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/864770631675777866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/864770631675777866'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2012/04/springhibernatejsfajax4jsfacegijcaptcha.html' title='Spring+Hibernate+JSF+Ajax4jsf+Acegi+jCaptcha 做登录模块'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilr2AoGeeZZrIAzE0hiK3vfDXFmGFr2gDYNE__PhPXrfG4nTHobT4wQuQb2zfoAb7WKdOoj_XKXvf4-_7vjiKddy5_4nFv19YD2_zssH2xxK5M9BtMl2fw3s8v15pkREosdzAotgMisqY/s72-c/login.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-3027197531675736210</id><published>2012-04-27T12:43:00.000-04:00</published><updated>2012-04-27T12:44:19.092-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JSF"/><title type='text'>Deploy own version JSF 2.0 on JBoss 6</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
1. Put your own jsf jar files in the WEB-INF/lib like WEB-INF/lib/jsf2.0.6&lt;br /&gt;
2. Add below context parameters in web.xml&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;div align=&quot;LEFT&quot;&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div align=&quot;LEFT&quot;&gt;
&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;context-param&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div align=&quot;LEFT&quot;&gt;
&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;param-name&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;param-name&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div align=&quot;LEFT&quot;&gt;
&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;param-value&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;param-value&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div align=&quot;LEFT&quot;&gt;
&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;context-param&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;LEFT&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
3. Add Listener for JBoss to avoid &quot;Could not find Factory:javax.faces.context.FacesContextFactory&quot; excption if it is necessary.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;div align=&quot;LEFT&quot;&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div align=&quot;LEFT&quot;&gt;
&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;listener&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div align=&quot;LEFT&quot;&gt;
&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;listener-class&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;com.sun.faces.config.ConfigureListener&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;listener-class&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div align=&quot;LEFT&quot;&gt;
&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3f7f7f; font-size: x-small;&quot;&gt;listener&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: teal; font-size: x-small;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f5fbf; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3f5fbf; font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/3027197531675736210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/3027197531675736210' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/3027197531675736210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/3027197531675736210'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2012/04/deploy-own-version-jsf-20-on-jboss-6.html' title='Deploy own version JSF 2.0 on JBoss 6'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-6944227351759088475</id><published>2012-02-01T00:43:00.000-05:00</published><updated>2012-02-01T00:43:29.250-05:00</updated><title type='text'>自製手機APP的網站</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;1.&lt;a href=&quot;http://www.myappbuilder.com/&quot;&gt;Myappbuilder&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2.&lt;a href=&quot;http://www.appbreeder.com/&quot;&gt;Appbreeder&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
3.&lt;a href=&quot;http://www.swebapps.com/&quot;&gt;Swebapps&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
4.&lt;a href=&quot;http://www.appmakr.com/&quot;&gt;Appmakr&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
5.&lt;a href=&quot;http://www.mobileroadie.com/&quot;&gt;Mobileroadie&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
6.&lt;a href=&quot;http://www.isites.us/&quot;&gt;Isites&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
7.&lt;a href=&quot;http://www.motherapp.com/&quot;&gt;Motherapp&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
8.&lt;a href=&quot;http://www.mobbase.com/&quot;&gt;mobbase&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
9.&lt;a href=&quot;http://www.biznessapps.com/&quot;&gt;Biznessapps&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
http://ebookapp.com&lt;br /&gt;
http://gamesalad.com/&lt;br /&gt;
&lt;br /&gt;
另有幾篇重要教學：&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.businessinsider.com/how-to-build-an-iphone-app-2011-2&quot;&gt;6 Ways To Build An iPhone App Without Knowing Anything&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.popsci.com/diy/article/2009-02/how-make-iphone-app&quot;&gt;How to Make an iPhone App&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/6944227351759088475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/6944227351759088475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/6944227351759088475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/6944227351759088475'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2012/01/app.html' title='自製手機APP的網站'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-1351795863533828621</id><published>2012-01-31T01:58:00.001-05:00</published><updated>2012-01-31T01:58:44.678-05:00</updated><title type='text'>2011年最火爆的8大Web开发工具</title><content type='html'>2011年最火爆的8大Web开发工具提到，jQuery和jQuery Mobile，CSS3 PIE，Bootstrap，LESS，Chrome开发人员工具等。一下是全部内容，&lt;br /&gt;
&lt;br /&gt;
2011年最火爆的8大Web开发工具 TechFrom2011总结系列&lt;br /&gt;
&lt;br /&gt;
2011年最火爆的8大Web开发工具：&lt;br /&gt;
Web应用开发和部署工具，Bootstrap&lt;br /&gt;
&lt;br /&gt;
Twitter 于8月份推出了一个名为Bootstrap的开发工具包，将Web应用开发与部署变得更为简单快捷。Bootstrap包是一个简单的程序库，同时提供优雅的HTML和CSS规范。Bootstrap使用了一些最新的Web浏览器技术，向开发者提供时尚的排版、样式、按钮、表格、网格、导航等服务，而且占用资源很小，用gzip压缩后只有6K左右。&lt;br /&gt;
jQuery和jQuery Mobile，JavaScript代码工具&lt;br /&gt;
&lt;br /&gt;
jQuery是一款免费且开放源代码的JavaScript代码库，而jQuery Mobile是jQuery在手机和平板上的版本。&lt;br /&gt;
&lt;br /&gt;
jquery.jpg&lt;br /&gt;
&lt;br /&gt;
jQuery Mobile不仅能给主流移动平台带来jQuery核心库，还能发布一个完整统一的jQuery移动UI框架，支持全球主流的手机、平板、电子阅读器、台式电脑等平台。据微软关于jQuery的调查显示，jQuery在受访网站中的使用率已从2010年12月的27%上升到2011年12月的42%。&lt;br /&gt;
CSS代码工具，CSS3 PIE&lt;br /&gt;
&lt;br /&gt;
CSS3 PIE，全称是 Progressive Internet Explorer，可以让IE6至IE8的所有版本实现大多数的CSS3修饰特性，如圆角、阴影、渐变等等。通过这个工具CSS3 PIE，开发者可以在线修改想要的效果，并即时生成css代码。&lt;br /&gt;
开发管理工具，LESS，免费开源&lt;br /&gt;
&lt;br /&gt;
LESS是一个CSS开发管理的强大工具，拓展了CSS的变量、运算符、include、嵌套规则等语法。&lt;br /&gt;
&lt;br /&gt;
less.jpg&lt;br /&gt;
&lt;br /&gt;
LESS从Ruby的LESS library衍生而来，免费开源，实现了和CSS的无缝结合。此外，LESS可以配置成自动最小化所生成的CSS文件，不仅可以节省带宽，还可以改善最终用户的体验。&lt;br /&gt;
Chrome开发人员工具&lt;br /&gt;
&lt;br /&gt;
火狐即将死亡的预言或许被夸大其词了，但可以肯定的是Chrome正在侵蚀越来越大的市场份额，其中最主要的一个原因是Web开发人员喜欢Chrome捆绑自带的开发人员工具。&lt;br /&gt;
&lt;br /&gt;
Chrome开发人员工具主要基于WebKit网络检查器（开放源代码WebKit项目的一部分），可让Web开发人员随时随地对网页的CSS、HTML和JavaScript进行实时编辑、调试以及监控。&lt;br /&gt;
&lt;br /&gt;
Chrome开发人员工具不仅能帮助诊断、修复在网页加载、脚本执行以及页面呈现中出现的问题，还可帮助最大限度地了解网页或网络应用程序对CPU以及内存的使用情况。&lt;br /&gt;
基于浏览器的Web网络开发IDE工具，SourceKit 和 Ace&lt;br /&gt;
&lt;br /&gt;
网络开发工具中文本编辑工具最受欢迎的是 Vim，但是基于web浏览器的网络IDE开发工具是 Ace，和基于 Ace 构建的SourceKit，之前的名字是 “Bespin” 和 “Skywriter” 。&lt;br /&gt;
PhoneGap，基于html5 的开源移动开发框架&lt;br /&gt;
&lt;br /&gt;
之前在基于html5的跨平台手机应用,移动开发开源框架PhoneGap 和跨平台手机应用,移动开发开源框架PhoneGap,基于html5,已支持 facebook登陆中，介绍过移动开发 html5 开源技术框架，其母公司 Nitobi Software&gt; 已经被Adobe公司收购。&lt;br /&gt;
&lt;br /&gt;
另外，还有更多的移动和网络应用开发 10大优秀开发框架推荐，和 全功能框架平台 Strobe，基于html5的全功能应用开发平台 Strobe,由前苹果核心员工和技术大牛联合创建。&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
本文科技源TechFrom地址：: http://www.techfrom.com/20315.html</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/1351795863533828621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/1351795863533828621' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/1351795863533828621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/1351795863533828621'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2012/01/20118web.html' title='2011年最火爆的8大Web开发工具'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-8482037433294677789</id><published>2011-08-21T21:45:00.000-04:00</published><updated>2011-08-21T21:45:27.054-04:00</updated><title type='text'>Install and remove APK Files on Android Device Emulator (Windows)</title><content type='html'>Install APK&lt;br /&gt;
&lt;br /&gt;
1. Download android SDK.&lt;br /&gt;
2. Go to $SDK_ROOT/tools or $SDK_ROOT/platform-tools directory and execute the file ‘emulator.exe’. You might need to also include android virtual device (AVD) to command line execution for example,&lt;br /&gt;
&lt;br /&gt;
./emulator -avd TestDevice&lt;br /&gt;
3. Save/copy the APK file directly in the $SDK_ROOT/tools or $SDK_ROOT/platform-tools directory.&lt;br /&gt;
4. Goto Shell/Terminal/CommandPrompt, adb install fileName.apk (You will need to shell/terminal/cmd sessions live)&lt;br /&gt;
&lt;br /&gt;
or ./adb install fileName.apk&lt;br /&gt;
5.If there is ‘Path not found’ error then you need to add $SDK_ROOT/tools directory to your system PATH settings correctly.&lt;br /&gt;
&lt;br /&gt;
Remove APK&lt;br /&gt;
&lt;br /&gt;
1.Click on menu and then select settings icon &gt;&gt; Click on applications tab&gt;&gt;Go to Manage applications&lt;br /&gt;
2. Find the application which you want to remove and uninstall.&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/8482037433294677789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/8482037433294677789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/8482037433294677789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/8482037433294677789'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2011/08/install-and-remove-apk-files-on-android.html' title='Install and remove APK Files on Android Device Emulator (Windows)'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-220028211644394162</id><published>2011-08-19T17:15:00.000-04:00</published><updated>2011-08-19T17:21:00.892-04:00</updated><title type='text'>Some exceptions we will get and how to resolve when we upgrade the application from java 1.4 to 1.6</title><content type='html'>This file will be keep on updating.&lt;br /&gt;
&lt;br /&gt;
1.java.lang.IllegalAccessError: class javax.activation.SecuritySupport12 cannot access its superclass javax.activation.SecuritySupport&lt;br /&gt;
&lt;br /&gt;
This issue will happen when we are using the old activation.jar with mail.jar. solution is delete the activation.jar. Sometimes if we are using weblogic.jar, there is a subdirectory javax.activation also need to be deleted.&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/220028211644394162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/220028211644394162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/220028211644394162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/220028211644394162'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2011/08/some-exceptions-we-will-get-and-how-to.html' title='Some exceptions we will get and how to resolve when we upgrade the application from java 1.4 to 1.6'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-8660144455961063919</id><published>2011-08-11T16:02:00.000-04:00</published><updated>2011-08-11T16:02:27.704-04:00</updated><title type='text'>Run RichFace 4.0 on GlassFish 3.1 get warning This page calls for XML namespace http://richfaces.org/a4j declared with prefix a4j but no taglibrary exists for that namespace</title><content type='html'>If you get &quot;This page calls for XML namespace http://richfaces.org/a4j declared with prefix a4j but no taglibrary exists for that namespace&quot; error when running RichFace 4.0 on GlassFish 3.1 with Eclipse, it is always because you didn&#39;t deploy the RichFace jar lib to GlassFish path. Try to export below jar files with deploy package&lt;br /&gt;
&lt;br /&gt;
cssparser-0.9.5.jar,&lt;br /&gt;
guava-r08.jar,&lt;br /&gt;
richfaces-components-api-4.0.0.Final.jar,&lt;br /&gt;
richfaces-components-api-4.0.0.Final.jar,&lt;br /&gt;
richfaces-components-ui-4.0.0.Final.jar,&lt;br /&gt;
richfaces-core-api-4.0.0.Final.jar,&lt;br /&gt;
richfaces-core-impl-4.0.0.Final.jar,&lt;br /&gt;
sac-1.3.jar &lt;br /&gt;
&lt;br /&gt;
1. Goto project properties&lt;br /&gt;
2. Click Deployment Assembly&lt;br /&gt;
3. Add above jar files&lt;br /&gt;
&lt;br /&gt;
Done.</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/8660144455961063919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/8660144455961063919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/8660144455961063919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/8660144455961063919'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2011/08/run-richface-40-on-glassfish-31-get.html' title='Run RichFace 4.0 on GlassFish 3.1 get warning This page calls for XML namespace http://richfaces.org/a4j declared with prefix a4j but no taglibrary exists for that namespace'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-4892457020229118808</id><published>2011-08-09T14:05:00.001-04:00</published><updated>2011-08-09T14:44:57.564-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JSF"/><title type='text'>Upgrade web from struts 1.3 to jsf 2.0</title><content type='html'>1. Change the tile of web.xml from &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE web-app PUBLIC &quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&quot; &quot;http://java.sun.com/dtd/web-app_2_3.dtd&quot;&amp;gt;&lt;br /&gt;
&amp;lt;web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&amp;lt;web-app version=&quot;2.5&quot; xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;&lt;br /&gt;
xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;
xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Add &amp;lt;jsp-config&amp;gt; before &amp;lt;taglib&amp;gt; to match the new structure of 2.5 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;jsp-config&amp;gt; &lt;br /&gt;
&amp;lt;taglib&amp;gt;&lt;br /&gt;
&amp;lt;taglib-uri&amp;gt;/WEB-INF/struts-bean.tld&amp;lt;/taglib-uri&amp;gt;&lt;br /&gt;
&amp;lt;taglib-location&amp;gt;/WEB-INF/tld/struts/struts-bean.tld&amp;lt;/taglib-location&amp;gt;&lt;br /&gt;
&amp;lt;/taglib&amp;gt;&lt;br /&gt;
&amp;lt;taglib&amp;gt;&lt;br /&gt;
&amp;lt;taglib-uri&amp;gt;/WEB-INF/struts-html.tld&amp;lt;/taglib-uri&amp;gt;&lt;br /&gt;
&amp;lt;taglib-location&amp;gt;/WEB-INF/tld/struts/struts-html.tld&amp;lt;/taglib-location&amp;gt;&lt;br /&gt;
&amp;lt;/taglib&amp;gt;&lt;br /&gt;
&amp;lt;/jsp-config&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Add context-param&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Tell the runtime where we are in the project development&lt;br /&gt;
lifecycle.  Valid values are: &lt;br /&gt;
Development, UnitTest, SystemTest, or Production.&lt;br /&gt;
The runtime will display helpful hints to correct common mistakes&lt;br /&gt;
when the value is Development.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;param-name&amp;gt;javax.faces.PROJECT_STAGE&amp;lt;/param-name&amp;gt;&lt;br /&gt;
&amp;lt;param-value&amp;gt;Development&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Add Faces Servlet&lt;br /&gt;
&lt;br /&gt;
&amp;lt;servlet&amp;gt;&lt;br /&gt;
&amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
&amp;lt;servlet-class&amp;gt;javax.faces.webapp.FacesServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
&amp;lt;/servlet&amp;gt;&lt;br /&gt;
&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
&amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
&amp;lt;url-pattern&amp;gt;*.jsf&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
&amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
&amp;lt;url-pattern&amp;gt;/faces/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
&amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
&amp;lt;url-pattern&amp;gt;*.xhtml&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Add a blank faces-config.xml in WEB-INF&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&#39;UTF-8&#39;?&amp;gt;&lt;br /&gt;
&amp;lt;faces-config xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;&lt;br /&gt;
xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;
xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee&lt;br /&gt;
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd&quot;&lt;br /&gt;
version=&quot;2.0&quot;&amp;gt;&lt;br /&gt;
&amp;lt;/faces-config&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Add new jar lib of jstl 1.2 and jsf 2.0.x&lt;br /&gt;
&lt;br /&gt;
jstl-api-1.2.jar&lt;br /&gt;
jsf-api.jar&lt;br /&gt;
jsf-impl.jar&lt;br /&gt;
&lt;br /&gt;
Problem&lt;br /&gt;
In JSF 2.0 web application, during server initialization, it hits following warning message&lt;br /&gt;
WARNING: JSF1063: WARNING! Setting non-serializable attribute value into HttpSession (key: userBean, value class: com.jsfcompref.model.UserBean).&lt;br /&gt;
&lt;br /&gt;
UserBean&lt;br /&gt;
package com.mkyong;&lt;br /&gt;
&lt;br /&gt;
@ManagedBean(name=&quot;user&quot;)&lt;br /&gt;
@SessionScoped&lt;br /&gt;
public class UserBean{&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
The “UserBean” is not serializable, Simply make this bean implement java.io.Serializable interface.&lt;br /&gt;
&lt;br /&gt;
package com.mkyong;&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
@ManagedBean(name=&quot;user&quot;)&lt;br /&gt;
@SessionScoped&lt;br /&gt;
public class UserBean implements Serializable{&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/4892457020229118808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/4892457020229118808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/4892457020229118808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/4892457020229118808'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2011/08/upgrage-web-from-struts-13-to-jsf-20.html' title='Upgrade web from struts 1.3 to jsf 2.0'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-3534407846327970290</id><published>2011-08-09T11:55:00.000-04:00</published><updated>2012-04-27T12:45:09.027-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JSF"/><title type='text'>JSF 2 getting issue in Tomcat 7</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div&gt;
There is an JSF 2.1 bug which cause Tomcat 7 problem. You will get below error if you are using JSF 2.1 under Tocmcat 7. &lt;br /&gt;
&lt;br /&gt;
java.lang.InstantiationException: com.sun.faces.application.ServletContextSensitiveSingletonStore    at java.lang.Class.newInstance0(Class.java:340)    at java.lang.Class.newInstance(Class.java:308)    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4268)    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4771)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:138)    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:785)    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:763)    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:558)    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:674)    at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:599)    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:538)    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1390)    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:355)    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)    at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:312)    at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:292)    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:998)    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:772)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:138)    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:990)    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:275)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:138)    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:424)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:138)    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:648)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:138)    at org.apache.catalina.startup.Catalina.start(Catalina.java:576)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)    at java.lang.reflect.Method.invoke(Method.java:597)    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:415) &lt;br /&gt;
&lt;br /&gt;
To fix this you must switch back to JSF 2.0.X stable version.&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/3534407846327970290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/3534407846327970290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/3534407846327970290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/3534407846327970290'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2011/08/jsf-2-get-issue-in-tomcat-7.html' title='JSF 2 getting issue in Tomcat 7'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-7608462823098929719</id><published>2011-06-24T00:03:00.000-04:00</published><updated>2011-06-24T00:04:17.381-04:00</updated><title type='text'>C#文件操作大全</title><content type='html'>1.创建文件夹&lt;br /&gt;//using System.IO;&lt;br /&gt;Directory.CreateDirectory(%%1);&lt;br /&gt;2.创建文件&lt;br /&gt;//using System.IO;&lt;br /&gt;File.Create(%%1);&lt;br /&gt;3.删除文件&lt;br /&gt;//using System.IO;&lt;br /&gt;File.Delete(%%1);&lt;br /&gt;4.删除文件夹&lt;br /&gt;//using System.IO;&lt;br /&gt;Directory.Delete(%%1);&lt;br /&gt;5.删除一个目录下所有的文件夹&lt;br /&gt;//using System.IO;&lt;br /&gt;foreach (string dirStr in Directory.GetDirectories(%%1))&lt;br /&gt;{&lt;br /&gt; DirectoryInfo dir = new DirectoryInfo(dirStr);&lt;br /&gt; ArrayList folders=new ArrayList();&lt;br /&gt; FileSystemInfo[] fileArr = dir.GetFileSystemInfos();&lt;br /&gt; for (int i = 0; i &lt; folders.Count; i++)&lt;br /&gt; {&lt;br /&gt;  FileInfo f = folders[i] as FileInfo;&lt;br /&gt;  if (f == null)&lt;br /&gt;  {&lt;br /&gt;   DirectoryInfo d = folders[i] as DirectoryInfo;&lt;br /&gt;   d.Delete();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;6.清空文件夹&lt;br /&gt;//using System.IO;&lt;br /&gt;Directory.Delete(%%1,true);&lt;br /&gt;Directory.CreateDirectory(%%1);&lt;br /&gt;7.读取文件&lt;br /&gt;//using System.IO;&lt;br /&gt;StreamReader s = File.OpenText(%%1);&lt;br /&gt;string %%2 = null;&lt;br /&gt;while ((%%2 = s.ReadLine()) != null){&lt;br /&gt; %%3&lt;br /&gt;}&lt;br /&gt;s.Close();&lt;br /&gt;8.写入文件&lt;br /&gt;//using System.IO;&lt;br /&gt;FileInfo f = new FileInfo(%%1);&lt;br /&gt;StreamWriter w = f.CreateText();&lt;br /&gt;w.WriteLine(%%2);&lt;br /&gt;w.Close();&lt;br /&gt;9.写入随机文件&lt;br /&gt;//using System.IO;&lt;br /&gt;byte[] dataArray = new byte[100000];//new Random().NextBytes(dataArray);&lt;br /&gt;using(FileStream FileStream = new FileStream(%%1, FileMode.Create)){&lt;br /&gt;// Write the data to the file, byte by byte.&lt;br /&gt; for(int i = 0; i &lt; dataArray.Length; i++){&lt;br /&gt;  FileStream.WriteByte(dataArray[i]);&lt;br /&gt; }&lt;br /&gt;// Set the stream position to the beginning of the file.&lt;br /&gt; FileStream.Seek(0, SeekOrigin.Begin);&lt;br /&gt;// Read and verify the data.&lt;br /&gt; for(int i = 0; i &lt; FileStream.Length; i++){&lt;br /&gt;  if(dataArray[i] != FileStream.ReadByte()){&lt;br /&gt;   //写入数据错误&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;//&quot;数据流&quot;+FileStream.Name+&quot;已验证&quot;&lt;br /&gt;}&lt;br /&gt;10.读取文件属性&lt;br /&gt;//using System.IO;&lt;br /&gt;FileInfo f = new FileInfo(%%1);//f.CreationTime,f.FullName&lt;br /&gt;if((f.Attributes &amp; FileAttributes.ReadOnly) != 0){&lt;br /&gt; %%2&lt;br /&gt;}&lt;br /&gt;else{&lt;br /&gt; %%3&lt;br /&gt;}&lt;br /&gt;11.写入属性&lt;br /&gt;//using System.IO;&lt;br /&gt;FileInfo f = new FileInfo(%%1);&lt;br /&gt;//设置只读&lt;br /&gt;f.Attributes = myFile.Attributes | FileAttributes.ReadOnly;&lt;br /&gt;//设置可写&lt;br /&gt;f.Attributes = myFile.Attributes &amp; ~FileAttributes.ReadOnly;&lt;br /&gt;12.枚举一个文件夹中的所有文件夹&lt;br /&gt;//using System.IO;&lt;br /&gt;foreach (string %%2 in Directory.GetDirectories(%%1)){&lt;br /&gt; %%3&lt;br /&gt;}&lt;br /&gt;/*&lt;br /&gt;DirectoryInfo dir = new DirectoryInfo(%%1);&lt;br /&gt;FileInfo[] files = dir.GetFiles(&quot;*.*&quot;);&lt;br /&gt;foreach(FileInfo %%2 in files){&lt;br /&gt; %%3&lt;br /&gt;}&lt;br /&gt;*/&lt;br /&gt;13.复制文件夹&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;string path = (%%2.LastIndexOf(&quot;\\&quot;) == %%2.Length - 1) ? %%2 : %%2+&quot;\\&quot;;&lt;br /&gt;string parent = Path.GetDirectoryName(%%1);&lt;br /&gt;Directory.CreateDirectory(path + Path.GetFileName(%%1));&lt;br /&gt;DirectoryInfo dir = new DirectoryInfo((%%1.LastIndexOf(&quot;\\&quot;) == %%1.Length - 1) ? %%1 : %%1 + &quot;\\&quot;);&lt;br /&gt;FileSystemInfo[] fileArr = dir.GetFileSystemInfos();&lt;br /&gt;Queue&lt;FileSystemInfo&gt; Folders = new Queue&lt;FileSystemInfo&gt;(dir.GetFileSystemInfos());&lt;br /&gt;while (Folders.Count&gt;0)&lt;br /&gt;{&lt;br /&gt;                    FileSystemInfo tmp = Folders.Dequeue();&lt;br /&gt;                    FileInfo f = tmp as FileInfo;&lt;br /&gt;                    if (f == null)&lt;br /&gt;                    {&lt;br /&gt;                        DirectoryInfo d = tmp as DirectoryInfo;&lt;br /&gt;                        Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf(&quot;\\&quot;) == parent.Length - 1) ? parent : parent + &quot;\\&quot;, path));&lt;br /&gt;                        foreach (FileSystemInfo fi in d.GetFileSystemInfos())&lt;br /&gt;                        {&lt;br /&gt;                            Folders.Enqueue(fi);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    else&lt;br /&gt;                    {&lt;br /&gt;                        f.CopyTo(f.FullName.Replace(parent, path));&lt;br /&gt;                    }&lt;br /&gt;}&lt;br /&gt;14.复制目录下所有的文件夹到另一个文件夹下&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;DirectoryInfo d = new DirectoryInfo(%%1);&lt;br /&gt;foreach (DirectoryInfo dirs in d.GetDirectories())&lt;br /&gt;{&lt;br /&gt;    Queue&lt;FileSystemInfo&gt; al = new Queue&lt;FileSystemInfo&gt;(dirs.GetFileSystemInfos());&lt;br /&gt;    while (al.Count &gt; 0)&lt;br /&gt;    {&lt;br /&gt;        FileSystemInfo temp = al.Dequeue();&lt;br /&gt;        FileInfo file = temp as FileInfo;&lt;br /&gt;        if (file == null)&lt;br /&gt;        {&lt;br /&gt;            DirectoryInfo directory = temp as DirectoryInfo;&lt;br /&gt;            Directory.CreateDirectory(path + directory.Name);&lt;br /&gt;            foreach (FileSystemInfo fsi in directory.GetFileSystemInfos())&lt;br /&gt;                al.Enqueue(fsi);&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;            File.Copy(file.FullName, path + file.Name);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;15.移动文件夹&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;                string filename = Path.GetFileName(%%1);&lt;br /&gt;                string path=(%%2.LastIndexOf(&quot;\\&quot;) == %%2.Length - 1) ? %%2 : %%2 + &quot;\\&quot;;&lt;br /&gt;                if (Path.GetPathRoot(%%1) == Path.GetPathRoot(%%2))&lt;br /&gt;                    Directory.Move(%%1, path + filename);&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    string parent = Path.GetDirectoryName(%%1);&lt;br /&gt;                    Directory.CreateDirectory(path + Path.GetFileName(%%1));&lt;br /&gt;                    DirectoryInfo dir = new DirectoryInfo((%%1.LastIndexOf(&quot;\\&quot;) == %%1.Length - 1) ? %%1 : %%1 + &quot;\\&quot;);&lt;br /&gt;                    FileSystemInfo[] fileArr = dir.GetFileSystemInfos();&lt;br /&gt;                    Queue&lt;FileSystemInfo&gt; Folders = new Queue&lt;FileSystemInfo&gt;(dir.GetFileSystemInfos());&lt;br /&gt;                    while (Folders.Count &gt; 0)&lt;br /&gt;                    {&lt;br /&gt;                        FileSystemInfo tmp = Folders.Dequeue();&lt;br /&gt;                        FileInfo f = tmp as FileInfo;&lt;br /&gt;                        if (f == null)&lt;br /&gt;                        {&lt;br /&gt;                            DirectoryInfo d = tmp as DirectoryInfo;&lt;br /&gt;                            DirectoryInfo dpath = new DirectoryInfo(d.FullName.Replace((parent.LastIndexOf(&quot;\\&quot;) == parent.Length - 1) ? parent : parent + &quot;\\&quot;, path));&lt;br /&gt;                            dpath.Create();&lt;br /&gt;                            foreach (FileSystemInfo fi in d.GetFileSystemInfos())&lt;br /&gt;                            {&lt;br /&gt;                                Folders.Enqueue(fi);&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                        else&lt;br /&gt;                        {&lt;br /&gt;                            f.MoveTo(f.FullName.Replace(parent, path));&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    Directory.Delete(%%1, true);&lt;br /&gt;                }&lt;br /&gt;16.移动目录下所有的文件夹到另一个目录下&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;string filename = Path.GetFileName(%%1);&lt;br /&gt;                if (Path.GetPathRoot(%%1) == Path.GetPathRoot(%%2))&lt;br /&gt;                    foreach (string dir in Directory.GetDirectories(%%1))&lt;br /&gt;                        Directory.Move(dir, Path.Combine(%%2,filename));&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    foreach (string dir2 in Directory.GetDirectories(%%1))&lt;br /&gt;                    {&lt;br /&gt;                        string parent = Path.GetDirectoryName(dir2);&lt;br /&gt;                        Directory.CreateDirectory(Path.Combine(%%2, Path.GetFileName(dir2)));&lt;br /&gt;                        string dir = (dir2.LastIndexOf(&quot;\\&quot;) == dir2.Length - 1) ? dir2 : dir2 + &quot;\\&quot;;&lt;br /&gt;                        DirectoryInfo dirdir = new DirectoryInfo(dir);&lt;br /&gt;                        FileSystemInfo[] fileArr = dirdir.GetFileSystemInfos();&lt;br /&gt;                        Queue&lt;FileSystemInfo&gt; Folders = new Queue&lt;FileSystemInfo&gt;(dirdir.GetFileSystemInfos());&lt;br /&gt;                        while (Folders.Count &gt; 0)&lt;br /&gt;                        {&lt;br /&gt;                            FileSystemInfo tmp = Folders.Dequeue();&lt;br /&gt;                            FileInfo f = tmp as FileInfo;&lt;br /&gt;                            if (f == null)&lt;br /&gt;                            {&lt;br /&gt;                                DirectoryInfo d = tmp as DirectoryInfo;&lt;br /&gt;                                DirectoryInfo dpath = new DirectoryInfo(d.FullName.Replace((parent.LastIndexOf(&quot;\\&quot;) == parent.Length - 1) ? parent : parent + &quot;\\&quot;, %%2));&lt;br /&gt;                                dpath.Create();&lt;br /&gt;                                foreach (FileSystemInfo fi in d.GetFileSystemInfos())&lt;br /&gt;                                {&lt;br /&gt;                                    Folders.Enqueue(fi);&lt;br /&gt;                                }&lt;br /&gt;                            }&lt;br /&gt;                            else&lt;br /&gt;                            {&lt;br /&gt;                                f.MoveTo(f.FullName.Replace(parent, %%2));&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                        dirdir.Delete(true);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;17.以一个文件夹的框架在另一个目录创建文件夹和空文件&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;bool b=false;&lt;br /&gt;string path = (%%2.LastIndexOf(&quot;\\&quot;) == %%2.Length - 1) ? %%2 : %%2 + &quot;\\&quot;;&lt;br /&gt;string parent = Path.GetDirectoryName(%%1);&lt;br /&gt;Directory.CreateDirectory(path + Path.GetFileName(%%1));&lt;br /&gt;DirectoryInfo dir = new DirectoryInfo((%%1.LastIndexOf(&quot;\\&quot;) == %%1.Length - 1) ? %%1 : %%1 + &quot;\\&quot;);&lt;br /&gt;FileSystemInfo[] fileArr = dir.GetFileSystemInfos();&lt;br /&gt;Queue&lt;FileSystemInfo&gt; Folders = new Queue&lt;FileSystemInfo&gt;(dir.GetFileSystemInfos());&lt;br /&gt;while (Folders.Count &gt; 0)&lt;br /&gt;{&lt;br /&gt;    FileSystemInfo tmp = Folders.Dequeue();&lt;br /&gt;    FileInfo f = tmp as FileInfo;&lt;br /&gt;    if (f == null)&lt;br /&gt;    {&lt;br /&gt;        DirectoryInfo d = tmp as DirectoryInfo;&lt;br /&gt;        Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf(&quot;\\&quot;) == parent.Length - 1) ? parent : parent + &quot;\\&quot;, path));&lt;br /&gt;        foreach (FileSystemInfo fi in d.GetFileSystemInfos())&lt;br /&gt;        {&lt;br /&gt;            Folders.Enqueue(fi);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        if(b) File.Create(f.FullName.Replace(parent, path));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;18.复制文件&lt;br /&gt;//using System.IO;&lt;br /&gt;File.Copy(%%1,%%2);&lt;br /&gt;19.复制一个文件夹下所有的文件到另一个目录&lt;br /&gt;//using System.IO;&lt;br /&gt;foreach (string fileStr in Directory.GetFiles(%%1))&lt;br /&gt; File.Copy((%%1.LastIndexOf(&quot;\\&quot;) == %%1.Length - 1) ? %%1 +Path.GetFileName(fileStr): %%1 + &quot;\\&quot;+Path.GetFileName(fileStr),(%%2.LastIndexOf(&quot;\\&quot;) == %%2.Length - 1) ? %%2 +Path.GetFileName(fileStr): %%2 + &quot;\\&quot;+Path.GetFileName(fileStr));&lt;br /&gt;20.提取扩展名&lt;br /&gt;//using System.IO;&lt;br /&gt;string %%2=Path.GetExtension(%%1);&lt;br /&gt;21.提取文件名&lt;br /&gt;//using System.IO;&lt;br /&gt;string %%2=Path.GetFileName(%%1);&lt;br /&gt;22.提取文件路径&lt;br /&gt;//using System.IO;&lt;br /&gt;string %%2=Path.GetDirectoryName(%%1);&lt;br /&gt;23.替换扩展名&lt;br /&gt;//using System.IO;&lt;br /&gt;File.ChangeExtension(%%1,%%2);&lt;br /&gt;24.追加路径&lt;br /&gt;//using System.IO;&lt;br /&gt;string %%3=Path.Combine(%%1,%%2);&lt;br /&gt;25.移动文件&lt;br /&gt;//using System.IO;&lt;br /&gt;File.Move(%%1,%%2+&quot;\\&quot;+file.getname(%%1));&lt;br /&gt;26.移动一个文件夹下所有文件到另一个目录&lt;br /&gt;foreach (string fileStr in Directory.GetFiles(%%1))&lt;br /&gt; File.Move((%%1.LastIndexOf(&quot;\\&quot;) == %%1.Length - 1) ? %%1 +Path.GetFileName(fileStr): %%1 + &quot;\\&quot;+Path.GetFileName(fileStr),(%%2.LastIndexOf(&quot;\\&quot;) == %%2.Length - 1) ? %%2 +Path.GetFileName(fileStr): %%2 + &quot;\\&quot;+Path.GetFileName(fileStr));&lt;br /&gt;27.指定目录下搜索文件&lt;br /&gt;/*&lt;br /&gt;using System.Text;&lt;br /&gt;using System.IO;&lt;br /&gt;*/&lt;br /&gt;string fileName=%%1;&lt;br /&gt;string dirName=%%2;&lt;br /&gt; DirectoryInfo   dirc=new   DirectoryInfo(dirName);&lt;br /&gt; foreach(FileInfo   file   in   dirc.GetFiles()) {&lt;br /&gt;  if(file.Name.IndexOf(fileName)&gt;-1)&lt;br /&gt;   return file.FullName;&lt;br /&gt;  }&lt;br /&gt;  foreach(DirectoryInfo   dir   in   dirc.GetDirectories())   {  &lt;br /&gt;   return   GetFile(fileName,dir.FullName);  &lt;br /&gt;  }&lt;br /&gt;  return   &quot;找不到指定的文件&quot;;  &lt;br /&gt; }&lt;br /&gt;28.打开对话框&lt;br /&gt;OpenFileDialog penFileDialog=new OpenFileDialog();&lt;br /&gt;openFileDialog.InitialDirectory=\&quot;c:\\\\\&quot;;//注意这里写路径时要用c:\\\\而不是c:\\&lt;br /&gt;openFileDialog.Filter=\&quot;文本文件|*.*|C#文件|*.cs|所有文件|*.*\&quot;;&lt;br /&gt;openFileDialog.RestoreDirectory=true;&lt;br /&gt;openFileDialog.FilterIndex=1;&lt;br /&gt;if (openFileDialog.ShowDialog()==DialogResult.OK) {&lt;br /&gt; fName=openFileDialog.FileName;&lt;br /&gt; File fileOpen=new File(fName);&lt;br /&gt; isFileHaveName=true;&lt;br /&gt; %%1=fileOpen.ReadFile();&lt;br /&gt; %%1.AppendText(\&quot;\&quot;);&lt;br /&gt;}&lt;br /&gt;29.文件分割&lt;br /&gt;//using System.IO;&lt;br /&gt;FileStream fsr = new FileStream(%%1, FileMode.Open, FileAccess.Read);&lt;br /&gt;byte[] btArr = new byte[fsr.Length];&lt;br /&gt;fsr.Read(btArr, 0, btArr.Length);&lt;br /&gt;fsr.Close();&lt;br /&gt;string strFileName=%%1.Substring(%%1.LastIndexOf(&quot;\\&quot;)+1);&lt;br /&gt;FileStream fsw = new FileStream(%%2 + strFileName + &quot;1&quot;, FileMode.Create, FileAccess.Write);&lt;br /&gt;fsw.Write(btArr, 0, btArr.Length/2);&lt;br /&gt;fsw.Close();&lt;br /&gt;fsw = new FileStream(%%2 + strFileName + &quot;2&quot;, FileMode.Create, FileAccess.Write);&lt;br /&gt;fsw.Write(btArr, btArr.Length/2, btArr.Length-btArr.Length/2);&lt;br /&gt;fsw.Close();&lt;br /&gt;30.文件合并&lt;br /&gt;//using System.IO;&lt;br /&gt;string strFileName = %%1.Substring(%%1.LastIndexOf(&quot;\\&quot;) + 1);&lt;br /&gt;FileStream fsr1 = new FileStream(%%2 + strFileName + &quot;1&quot;, FileMode.Open, FileAccess.Read);&lt;br /&gt;FileStream fsr2 = new FileStream(%%2 + strFileName + &quot;2&quot;, FileMode.Open, FileAccess.Read);&lt;br /&gt;byte[] btArr = new byte[fsr1.Length+fsr2.Length];&lt;br /&gt;fsr1.Read(btArr, 0, Convert.ToInt32(fsr1.Length));&lt;br /&gt;fsr2.Read(btArr, Convert.ToInt32(fsr1.Length), Convert.ToInt32(fsr2.Length));&lt;br /&gt;fsr1.Close();fsr2.Close();&lt;br /&gt;FileStream fsw = new FileStream(%%2 + strFileName, FileMode.Create, FileAccess.Write);&lt;br /&gt;fsw.Write(btArr, 0, btArr.Length);&lt;br /&gt;fsw.Close();&lt;br /&gt;31.文件简单加密&lt;br /&gt;//using System.IO;&lt;br /&gt;//读文件&lt;br /&gt;FileStream fsr = new FileStream(%%1, FileMode.Open, FileAccess.Read);&lt;br /&gt;byte[] btArr = new byte[fsr.Length];&lt;br /&gt;fsr.Read(btArr, 0, btArr.Length);&lt;br /&gt;fsr.Close();&lt;br /&gt;for (int i = 0; i &lt; btArr.Length; i++){ //加密&lt;br /&gt; int ibt = btArr[i];&lt;br /&gt; ibt += 100;&lt;br /&gt; ibt %= 256;&lt;br /&gt; btArr[i] = Convert.ToByte(ibt);&lt;br /&gt;}&lt;br /&gt;//写文件&lt;br /&gt;string strFileName = Path.GetExtension(%%1);&lt;br /&gt;FileStream fsw = new FileStream(%%2+&quot;/&quot; + &quot;enc_&quot; + strFileName, FileMode.Create, FileAccess.Write);&lt;br /&gt; fsw.Write(btArr, 0, btArr.Length);&lt;br /&gt; fsw.Close();&lt;br /&gt;32.文件简单解密&lt;br /&gt;//using System.IO;&lt;br /&gt;FileStream fsr = new FileStream(%%1, FileMode.Open, FileAccess.Read);&lt;br /&gt;byte[] btArr = new byte[fsr.Length];&lt;br /&gt;fsr.Read(btArr, 0, btArr.Length);&lt;br /&gt;fsr.Close();&lt;br /&gt;for (int i = 0; i &lt; btArr.Length; i++){　//解密&lt;br /&gt; int ibt = btArr[i];&lt;br /&gt; ibt -= 100;&lt;br /&gt; ibt += 256;&lt;br /&gt; ibt %= 256;&lt;br /&gt; btArr[i] = Convert.ToByte(ibt);&lt;br /&gt;}&lt;br /&gt;//写文件&lt;br /&gt;string strFileName = Path.GetExtension(%%1);&lt;br /&gt;FileStream fsw = new FileStream(%%2 +&quot;/&quot; + strFileName, FileMode.Create, FileAccess.Write);&lt;br /&gt;fsw.Write(btArr, 0, btArr.Length);&lt;br /&gt;fsw.Close();&lt;br /&gt;33.读取ini文件属性&lt;br /&gt;//using System.Runtime.InteropServices;&lt;br /&gt;//[DllImport(&quot;kernel32&quot;)]//返回取得字符串缓冲区的长度&lt;br /&gt;//private static extern long GetPrivateProfileString(string section,string key, string def,StringBuilder retVal,int size,string filePath);&lt;br /&gt;string Section=%%1;&lt;br /&gt;string Key=%%2;&lt;br /&gt;string NoText=%%3;&lt;br /&gt;string iniFilePath=&quot;Setup.ini&quot;;&lt;br /&gt;string %%4=String.Empty;&lt;br /&gt; if(File.Exists(iniFilePath)){&lt;br /&gt;  StringBuilder temp = new StringBuilder(1024);&lt;br /&gt;  GetPrivateProfileString(Section,Key,NoText,temp,1024,iniFilePath);&lt;br /&gt;  %%4=temp.ToString();&lt;br /&gt; }&lt;br /&gt;34.合并一个目录下所有的文件&lt;br /&gt;//using System.IO;&lt;br /&gt;FileStream fsw = new FileStream(%%2, FileMode.Create, FileAccess.Write);&lt;br /&gt;foreach (string fileStr in Directory.GetFiles(%%1))&lt;br /&gt;{&lt;br /&gt;FileStream fsr1 = new FileStream(fileStr, FileMode.Open, FileAccess.Read);&lt;br /&gt;byte[] btArr = new byte[fsr1.Length];&lt;br /&gt;fsr1.Read(btArr, 0, Convert.ToInt32(fsr1.Length));&lt;br /&gt;fsr1.Close();&lt;br /&gt;fsw.Write(btArr, 0, btArr.Length);&lt;br /&gt;}&lt;br /&gt;fsw.Close();&lt;br /&gt;35.写入ini文件属性&lt;br /&gt;//using System.Runtime.InteropServices;&lt;br /&gt;//[DllImport(&quot;kernel32&quot;)]//返回0表示失败，非0为成功&lt;br /&gt;//private static extern long WritePrivateProfileString(string section,string key, string val,string filePath);&lt;br /&gt;string Section=%%1;&lt;br /&gt;string Key=%%2;&lt;br /&gt;string Value=%%3;&lt;br /&gt;string iniFilePath=&quot;Setup.ini&quot;;&lt;br /&gt;bool %%4=false;&lt;br /&gt;    if(File.Exists(iniFilePath))&lt;br /&gt;    {&lt;br /&gt;long pStation = WritePrivateProfileString(Section,Key,Value,iniFilePath);   &lt;br /&gt;if(OpStation == 0)&lt;br /&gt;{&lt;br /&gt;    %%4=false;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;    %%4=true;&lt;br /&gt;}&lt;br /&gt;    }&lt;br /&gt;36.获得当前路径&lt;br /&gt;string %%1=Environment.CurrentDirectory;&lt;br /&gt;37.读取XML数据库&lt;br /&gt;//using System.Xml;&lt;br /&gt;XmlDocument doc=new XmlDocument();&lt;br /&gt;doc.Load(%%1);&lt;br /&gt;string %%9;&lt;br /&gt;XmlElement xe=doc.GetElementById(%%7);&lt;br /&gt;XmlNodeList elemList=xe.ChildNodes;&lt;br /&gt;foreach(XmlNode elem in elemList)&lt;br /&gt;{&lt;br /&gt;if(elem.NodeType==%%8)&lt;br /&gt;{&lt;br /&gt;%%9=elem.Value;&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;38.写入XML数据库&lt;br /&gt;//using System.Xml;&lt;br /&gt;XmlDocument doc=new XmlDocument();&lt;br /&gt;doc.Load(%%1);&lt;br /&gt;XmlNode root=doc.DocumentElement;&lt;br /&gt;XmlElement book=doc.CreateElement(%%3);&lt;br /&gt;XmlElement book=doc.CreateElement(%%5);&lt;br /&gt;XmlElement port=doc.CreateElement(%%6);&lt;br /&gt;book.SetAttribute(%%4,root.ChildNodes.Count.ToString());&lt;br /&gt;author.InnerText=%%8;&lt;br /&gt;book.appendChild(author);&lt;br /&gt;book.appendChild(port);&lt;br /&gt;root.appendChild(book);&lt;br /&gt;doc.Save(%%1);&lt;br /&gt;39.ZIP压缩文件&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.IO.Compression;&lt;br /&gt;*/&lt;br /&gt;FileStream infile;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt; // Open the file as a FileStream object.&lt;br /&gt; infile = new FileStream(%%1, FileMode.Open, FileAccess.Read, FileShare.Read);&lt;br /&gt; byte[] buffer = new byte[infile.Length];&lt;br /&gt; // Read the file to ensure it is readable.&lt;br /&gt; int count = infile.Read(buffer, 0, buffer.Length);&lt;br /&gt; if (count != buffer.Length)&lt;br /&gt; {&lt;br /&gt;  infile.Close();&lt;br /&gt;//Test Failed: Unable to read data from file&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt; infile.Close();&lt;br /&gt; MemoryStream ms = new MemoryStream();&lt;br /&gt; // Use the newly created memory stream for the compressed data.&lt;br /&gt; DeflateStream compressedzipStream = new DeflateStream(ms, CompressionMode.Compress, true);&lt;br /&gt; //Compression&lt;br /&gt; compressedzipStream.Write(buffer, 0, buffer.Length);&lt;br /&gt; // Close the stream.&lt;br /&gt; compressedzipStream.Close();&lt;br /&gt; //Original size: {0}, Compressed size: {1}&quot;, buffer.Length, ms.Length);&lt;br /&gt; FileInfo f = new FileInfo(%%2);&lt;br /&gt; StreamWriter w = f.CreateText();&lt;br /&gt; w.Write(buffer,0,ms.Length);&lt;br /&gt; w.Close();&lt;br /&gt;} // end try&lt;br /&gt;catch (InvalidDataException)&lt;br /&gt;{&lt;br /&gt; //Error: The file being read contains invalid data.&lt;br /&gt;} catch (FileNotFoundException)&lt;br /&gt;{&lt;br /&gt; //Error:The file specified was not found.&lt;br /&gt;} catch (ArgumentException)&lt;br /&gt;{&lt;br /&gt; //Error: path is a zero-length string, contains only white space, or contains one or more invalid characters&lt;br /&gt;} catch (PathTooLongException)&lt;br /&gt;{&lt;br /&gt; //Error: The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based&lt;br /&gt; platforms, paths must be less than 248 characters, and file names must be less than 260 characters.&lt;br /&gt;} catch (DirectoryNotFoundException)&lt;br /&gt;{&lt;br /&gt; //Error: The specified path is invalid, such as being on an unmapped drive.&lt;br /&gt;} catch (IOException)&lt;br /&gt;{&lt;br /&gt; //Error: An I/O error occurred while opening the file.&lt;br /&gt;} catch (UnauthorizedAccessException)&lt;br /&gt;{&lt;br /&gt; //Error: path specified a file that is read-only, the path is a directory, or caller does not have the required&lt;br /&gt; permissions.&lt;br /&gt;} catch (IndexOutOfRangeException)&lt;br /&gt;{&lt;br /&gt; //Error: You must provide parameters for MyGZIP.&lt;br /&gt;}&lt;br /&gt;40.ZIP解压缩&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.IO.Compression;&lt;br /&gt;*/&lt;br /&gt;FileStream infile;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;    // Open the file as a FileStream object.&lt;br /&gt;    infile = new FileStream(%%1, FileMode.Open, FileAccess.Read, FileShare.Read);&lt;br /&gt;    byte[] buffer = new byte[infile.Length];&lt;br /&gt;    // Read the file to ensure it is readable.&lt;br /&gt;    int count = infile.Read(buffer, 0, buffer.Length);&lt;br /&gt;    if (count != buffer.Length)&lt;br /&gt;    {&lt;br /&gt;infile.Close();&lt;br /&gt;//Test Failed: Unable to read data from file&lt;br /&gt;return;&lt;br /&gt;    }&lt;br /&gt;    infile.Close();&lt;br /&gt;    MemoryStream ms = new MemoryStream();&lt;br /&gt;    // ms.Position = 0;&lt;br /&gt;    DeflateStream zipStream = new DeflateStream(ms, CompressionMode.Decompress);&lt;br /&gt;    //Decompression&lt;br /&gt;    byte[] decompressedBuffer = new byte[buffer.Length *2];&lt;br /&gt;    zipStream.Close();&lt;br /&gt;FileInfo f = new FileInfo(%%2);&lt;br /&gt;StreamWriter w = f.CreateText();&lt;br /&gt;w.Write(decompressedBuffer);&lt;br /&gt;w.Close();&lt;br /&gt;} // end try&lt;br /&gt;catch (InvalidDataException)&lt;br /&gt;{&lt;br /&gt;    //Error: The file being read contains invalid data.&lt;br /&gt;}&lt;br /&gt;catch (FileNotFoundException)&lt;br /&gt;{&lt;br /&gt;    //Error:The file specified was not found.&lt;br /&gt;}&lt;br /&gt;catch (ArgumentException)&lt;br /&gt;{&lt;br /&gt;    //Error: path is a zero-length string, contains only white space, or contains one or more invalid characters&lt;br /&gt;}&lt;br /&gt;catch (PathTooLongException)&lt;br /&gt;{&lt;br /&gt;    //Error: The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based&lt;br /&gt;platforms, paths must be less than 248 characters, and file names must be less than 260 characters.&lt;br /&gt;}&lt;br /&gt;catch (DirectoryNotFoundException)&lt;br /&gt;{&lt;br /&gt;    //Error: The specified path is invalid, such as being on an unmapped drive.&lt;br /&gt;}&lt;br /&gt;catch (IOException)&lt;br /&gt;{&lt;br /&gt;    //Error: An I/O error occurred while opening the file.&lt;br /&gt;}&lt;br /&gt;catch (UnauthorizedAccessException)&lt;br /&gt;{&lt;br /&gt;    //Error: path specified a file that is read-only, the path is a directory, or caller does not have the required&lt;br /&gt;permissions.&lt;br /&gt;}&lt;br /&gt;catch (IndexOutOfRangeException)&lt;br /&gt;{&lt;br /&gt;    //Error: You must provide parameters for MyGZIP.&lt;br /&gt;}&lt;br /&gt;41.获得应用程序完整路径&lt;br /&gt;string %%1=Application.ExecutablePath;&lt;br /&gt;42.ZIP压缩文件夹&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.IO.Compression;&lt;br /&gt;using System.Runtime.Serialization;&lt;br /&gt;using System.Runtime.Serialization.Formatters.Binary;&lt;br /&gt;*/&lt;br /&gt;        private void CreateCompressFile(Stream source, string destinationName)&lt;br /&gt;        {&lt;br /&gt;            using (Stream destination = new FileStream(destinationName, FileMode.Create, FileAccess.Write))&lt;br /&gt;            {&lt;br /&gt;                using (GZipStream utput = new GZipStream(destination, CompressionMode.Compress))&lt;br /&gt;                {&lt;br /&gt;                    byte[] bytes = new byte[4096];&lt;br /&gt;                    int n;&lt;br /&gt;                    while ((n = source.Read(bytes, 0, bytes.Length)) != 0)&lt;br /&gt;                    {&lt;br /&gt;                        output.Write(bytes, 0, n);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;ArrayList list = new ArrayList();&lt;br /&gt;foreach (string f in Directory.GetFiles(%%1))&lt;br /&gt;{&lt;br /&gt;    byte[] destBuffer = File.ReadAllBytes(f);&lt;br /&gt;    SerializeFileInfo sfi = new SerializeFileInfo(f, destBuffer);&lt;br /&gt;    list.Add(sfi);&lt;br /&gt;}&lt;br /&gt;IFormatter formatter = new BinaryFormatter();&lt;br /&gt;using (Stream s = new MemoryStream())&lt;br /&gt;{&lt;br /&gt;    formatter.Serialize(s, list);&lt;br /&gt;    s.Position = 0;&lt;br /&gt;    CreateCompressFile(s, %%2);&lt;br /&gt;}&lt;br /&gt;        [Serializable]&lt;br /&gt;        class SerializeFileInfo&lt;br /&gt;        {&lt;br /&gt;            public SerializeFileInfo(string name, byte[] buffer)&lt;br /&gt;            {&lt;br /&gt;                fileName = name;&lt;br /&gt;                fileBuffer = buffer;&lt;br /&gt;            }&lt;br /&gt;            string fileName;&lt;br /&gt;            public string FileName&lt;br /&gt;            {&lt;br /&gt;                get&lt;br /&gt;                {&lt;br /&gt;                    return fileName;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            byte[] fileBuffer;&lt;br /&gt;            public byte[] FileBuffer&lt;br /&gt;            {&lt;br /&gt;                get&lt;br /&gt;                {&lt;br /&gt;                    return fileBuffer;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;43.递归删除目录下的文件&lt;br /&gt;//using System.IO;&lt;br /&gt;DirectoryInfo DInfo=new DirectoryInfo(%%1);&lt;br /&gt;FileSystemInfo[] FSInfo=DInfo.GetFileSystemInfos();&lt;br /&gt;for(int i=0;i&lt;FSInfo.Length;i++)&lt;br /&gt;{&lt;br /&gt;FileInfo FInfo=new FileInfo(%%1+FSInfo[i].ToString());&lt;br /&gt;FInfo.Delete();&lt;br /&gt;}&lt;br /&gt;44.验证DTD&lt;br /&gt;/*&lt;br /&gt;using System.Xml;&lt;br /&gt;using System.Xml.Schema;&lt;br /&gt;*/&lt;br /&gt;XmlReaderSettings settings = new XmlReaderSettings();&lt;br /&gt;settings.ProhibitDtd = false;&lt;br /&gt;settings.ValidationType = ValidationType.DTD;&lt;br /&gt;settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);&lt;br /&gt;// Create the XmlReader object.&lt;br /&gt;XmlReader reader = XmlReader.Create(&quot;my book.xml&quot;, settings);&lt;br /&gt;// Parse the file.&lt;br /&gt;while (reader.Read());&lt;br /&gt;// Display any validation errors.&lt;br /&gt;private static void ValidationCallBack(object sender, ValidationEventArgs e)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(&quot;Validation Error: {0}&quot;, e.Message);&lt;br /&gt;}&lt;br /&gt;45.Schema 验证&lt;br /&gt;/*&lt;br /&gt;using System.Xml;&lt;br /&gt;using System.Xml.Schema;&lt;br /&gt;*/&lt;br /&gt;Boolean m_success;&lt;br /&gt;XmlValidatingReader reader = null;&lt;br /&gt;   XmlSchemaCollection myschema = new XmlSchemaCollection();&lt;br /&gt;ValidationEventHandler eventHandler = new ValidationEventHandler(ShowCompileErrors);&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;//Create the XML fragment to be parsed.&lt;br /&gt;String xmlFrag = &quot;&lt;author xmlns=&#39;urn:bookstore- schema&#39;xmlns:xsi=&#39;http://www.w3.org/2001/XMLSchema-instance&#39;&gt;&quot; +&lt;br /&gt;&quot;&lt;first-name&gt;Herman&lt;/first-name&gt;&quot; +&lt;br /&gt;&quot;&lt;last-name&gt;Melville&lt;/last-name&gt;&quot; +&lt;br /&gt;&quot;&lt;/author&gt;&quot;;&lt;br /&gt;//Create the XmlParserContext.&lt;br /&gt;XmlParserContext context = new XmlParserContext(null, null, &quot;&quot;, XmlSpace.None);&lt;br /&gt;//Implement the reader.&lt;br /&gt;reader = new XmlValidatingReader(xmlFrag, XmlNodeType.Element, context);&lt;br /&gt;//Add the schema.&lt;br /&gt;myschema.Add(&quot;urn:bookstore-schema&quot;, &quot;c:\\Books.xsd&quot;);&lt;br /&gt;//Set the schema type and add the schema to the reader.&lt;br /&gt;reader.ValidationType = ValidationType.Schema;&lt;br /&gt;reader.Schemas.Add(myschema);&lt;br /&gt;while (reader.Read())&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;Console.WriteLine(&quot;Completed validating xmlfragment&quot;);&lt;br /&gt;}&lt;br /&gt;catch (XmlException XmlExp)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(XmlExp.Message);&lt;br /&gt;}&lt;br /&gt;catch(XmlSchemaException XmlSchExp)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(XmlSchExp.Message);&lt;br /&gt;}&lt;br /&gt;catch(Exception GenExp)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(GenExp.Message);&lt;br /&gt;}&lt;br /&gt;finally&lt;br /&gt;{&lt;br /&gt;Console.Read();&lt;br /&gt;}&lt;br /&gt;public static void ShowCompileErrors(object sender, ValidationEventArgs args)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(&quot;Validation Error: {0}&quot;, args.Message);&lt;br /&gt;}&lt;br /&gt;46.Grep&lt;br /&gt;/*&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Text.RegularExpressions;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Security;&lt;br /&gt;using CommandLine.Utility;&lt;br /&gt;*/&lt;br /&gt;//Traditionally grep stands for &quot;Global Regular Expression Print&quot;.&lt;br /&gt;//Global means that an entire file is searched.&lt;br /&gt;//Regular Expression means that a regular expression string is used to establish a search pattern.&lt;br /&gt;//Print means that the command will display its findings.&lt;br /&gt;//Simply put, grep searches an entire file for the pattern you want and displays its findings.&lt;br /&gt;//&lt;br /&gt;//The use syntax is different from the traditional Unix syntax, I prefer a syntax similar to&lt;br /&gt;//csc, the C# compiler.&lt;br /&gt;//&lt;br /&gt;// grep [/h|/H] - Usage Help&lt;br /&gt;//&lt;br /&gt;// grep [/c] [/i] [/l] [/n] [/r] /E:reg_exp /F:files&lt;br /&gt;//&lt;br /&gt;// /c - print a count of matching lines for each input file;&lt;br /&gt;// /i - ignore case in pattern;&lt;br /&gt;// /l - print just files (scanning will stop on first match);&lt;br /&gt;// /n - prefix each line of output with line number;&lt;br /&gt;// /r - recursive search in subdirectories;&lt;br /&gt;//&lt;br /&gt;// /E:reg_exp - the Regular Expression used as search pattern. The Regular Expression can be delimited by&lt;br /&gt;// quotes like &quot;...&quot; and &#39;...&#39; if you want to include in it leading or trailing blanks;&lt;br /&gt;//&lt;br /&gt;// /F:files - the list of input files. The files can be separated by commas as in /F:file1,file2,file3&lt;br /&gt;//and wildcards can be used for their specification as in /F:*file?.txt;&lt;br /&gt;//&lt;br /&gt;//Example:&lt;br /&gt;//&lt;br /&gt;// grep /c /n /r /E:&quot; C Sharp &quot; /F:*.cs&lt;br /&gt;//Option Flags&lt;br /&gt;private bool m_bRecursive;&lt;br /&gt;private bool m_bIgnoreCase;&lt;br /&gt;private bool m_bJustFiles;&lt;br /&gt;private bool m_bLineNumbers;&lt;br /&gt;private bool m_bCountLines;&lt;br /&gt;private string m_strRegEx;&lt;br /&gt;private string m_strFiles;&lt;br /&gt;//ArrayList keeping the Files&lt;br /&gt;private ArrayList m_arrFiles = new ArrayList();&lt;br /&gt;//Properties&lt;br /&gt;public bool Recursive&lt;br /&gt;{&lt;br /&gt;get { return m_bRecursive; }&lt;br /&gt;set { m_bRecursive = value; }&lt;br /&gt;}&lt;br /&gt;public bool IgnoreCase&lt;br /&gt;{&lt;br /&gt;get { return m_bIgnoreCase; }&lt;br /&gt;set { m_bIgnoreCase = value; }&lt;br /&gt;}&lt;br /&gt;public bool JustFiles&lt;br /&gt;{&lt;br /&gt;get { return m_bJustFiles; }&lt;br /&gt;set { m_bJustFiles = value; }&lt;br /&gt;}&lt;br /&gt;public bool LineNumbers&lt;br /&gt;{&lt;br /&gt;get { return m_bLineNumbers; }&lt;br /&gt;set { m_bLineNumbers = value; }&lt;br /&gt;}&lt;br /&gt;public bool CountLines&lt;br /&gt;{&lt;br /&gt;get { return m_bCountLines; }&lt;br /&gt;set { m_bCountLines = value; }&lt;br /&gt;}&lt;br /&gt;public string RegEx&lt;br /&gt;{&lt;br /&gt;get { return m_strRegEx; }&lt;br /&gt;set { m_strRegEx = value; }&lt;br /&gt;}&lt;br /&gt;public string Files&lt;br /&gt;{&lt;br /&gt;get { return m_strFiles; }&lt;br /&gt;set { m_strFiles = value; }&lt;br /&gt;}&lt;br /&gt;//Build the list of Files&lt;br /&gt;private void GetFiles(String strDir, String strExt, bool bRecursive)&lt;br /&gt;{&lt;br /&gt;//search pattern can include the wild characters &#39;*&#39; and &#39;?&#39;&lt;br /&gt;string[] fileList = Directory.GetFiles(strDir, strExt);&lt;br /&gt;for(int i=0; i&lt;fileList.Length; i++)&lt;br /&gt;{&lt;br /&gt;if(File.Exists(fileList[i]))&lt;br /&gt;m_arrFiles.Add(fileList[i]);&lt;br /&gt;}&lt;br /&gt;if(bRecursive==true)&lt;br /&gt;{&lt;br /&gt;//Get recursively from subdirectories&lt;br /&gt;string[] dirList = Directory.GetDirectories(strDir);&lt;br /&gt;for(int i=0; i&lt;dirList.Length; i++)&lt;br /&gt;{&lt;br /&gt;GetFiles(dirList[i], strExt, true);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//Search Function&lt;br /&gt;public void Search()&lt;br /&gt;{&lt;br /&gt;String strDir = Environment.CurrentDirectory;&lt;br /&gt;//First empty the list&lt;br /&gt;m_arrFiles.Clear();&lt;br /&gt;//Create recursively a list with all the files complying with the criteria&lt;br /&gt;String[] astrFiles = m_strFiles.Split(new Char[] {&#39;,&#39;});&lt;br /&gt;for(int i=0; i&lt;astrFiles.Length; i++)&lt;br /&gt;{&lt;br /&gt;//Eliminate white spaces&lt;br /&gt;astrFiles[i] = astrFiles[i].Trim();&lt;br /&gt;GetFiles(strDir, astrFiles[i], m_bRecursive);&lt;br /&gt;}&lt;br /&gt;//Now all the Files are in the ArrayList, open each one&lt;br /&gt;//iteratively and look for the search string&lt;br /&gt;String strResults = &quot;Grep Results:\r\n\r\n&quot;;&lt;br /&gt;String strLine;&lt;br /&gt;int iLine, iCount;&lt;br /&gt;bool bEmpty = true;&lt;br /&gt;IEnumerator enm = m_arrFiles.GetEnumerator();&lt;br /&gt;while(enm.MoveNext())&lt;br /&gt;{&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;StreamReader sr = File.OpenText((string)enm.Current);&lt;br /&gt;iLine = 0;&lt;br /&gt;iCount = 0;&lt;br /&gt;bool bFirst = true;&lt;br /&gt;while((strLine = sr.ReadLine()) != null)&lt;br /&gt;{&lt;br /&gt;iLine++;&lt;br /&gt;//Using Regular Expressions as a real Grep&lt;br /&gt;Match mtch;&lt;br /&gt;if(m_bIgnoreCase == true)&lt;br /&gt;mtch = Regex.Match(strLine, m_strRegEx, RegexOptions.IgnoreCase);&lt;br /&gt;else&lt;br /&gt;mtch = Regex.Match(strLine, m_strRegEx);&lt;br /&gt;if(mtch.Success == true)&lt;br /&gt;{&lt;br /&gt;bEmpty = false;&lt;br /&gt;iCount++;&lt;br /&gt;if(bFirst == true)&lt;br /&gt;{&lt;br /&gt;if(m_bJustFiles == true)&lt;br /&gt;{&lt;br /&gt;strResults += (string)enm.Current + &quot;\r\n&quot;;&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;strResults += (string)enm.Current + &quot;:\r\n&quot;;&lt;br /&gt;bFirst = false;&lt;br /&gt;}&lt;br /&gt;//Add the Line to Results string&lt;br /&gt;if(m_bLineNumbers == true)&lt;br /&gt;strResults += &quot; &quot; + iLine + &quot;: &quot; + strLine + &quot;\r\n&quot;;&lt;br /&gt;else&lt;br /&gt;strResults += &quot; &quot; + strLine + &quot;\r\n&quot;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;sr.Close();&lt;br /&gt;if(bFirst == false)&lt;br /&gt;{&lt;br /&gt;if(m_bCountLines == true)&lt;br /&gt;strResults += &quot; &quot; + iCount + &quot; Lines Matched\r\n&quot;;&lt;br /&gt;strResults += &quot;\r\n&quot;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch(SecurityException)&lt;br /&gt;{&lt;br /&gt;strResults += &quot;\r\n&quot; + (string)enm.Current + &quot;: Security Exception\r\n\r\n&quot;;&lt;br /&gt;}&lt;br /&gt;catch(FileNotFoundException)&lt;br /&gt;{&lt;br /&gt;strResults += &quot;\r\n&quot; + (string)enm.Current + &quot;: File Not Found Exception\r\n&quot;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;if(bEmpty == true)&lt;br /&gt;Console.WriteLine(&quot;No matches found!&quot;);&lt;br /&gt;else&lt;br /&gt;Console.WriteLine(strResults);&lt;br /&gt;}&lt;br /&gt;//Print Help&lt;br /&gt;private static void PrintHelp()&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(&quot;Usage: grep [/h|/H]&quot;);&lt;br /&gt;Console.WriteLine(&quot;       grep [/c] [/i] [/l] [/n] [/r] /E:reg_exp /F:files&quot;);&lt;br /&gt;}&lt;br /&gt;Arguments CommandLine = new Arguments(args);&lt;br /&gt;if(CommandLine[&quot;h&quot;] != null || CommandLine[&quot;H&quot;] != null)&lt;br /&gt;{&lt;br /&gt;PrintHelp();&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;// The working object&lt;br /&gt;ConsoleGrep grep = new ConsoleGrep();&lt;br /&gt;// The arguments /e and /f are mandatory&lt;br /&gt;if(CommandLine[&quot;E&quot;] != null)&lt;br /&gt;grep.RegEx = (string)CommandLine[&quot;E&quot;];&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(&quot;Error: No Regular Expression specified!&quot;);&lt;br /&gt;Console.WriteLine();&lt;br /&gt;PrintHelp();&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;if(CommandLine[&quot;F&quot;] != null)&lt;br /&gt;grep.Files = (string)CommandLine[&quot;F&quot;];&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(&quot;Error: No Search Files specified!&quot;);&lt;br /&gt;Console.WriteLine();&lt;br /&gt;PrintHelp();&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;grep.Recursive = (CommandLine[&quot;r&quot;] != null);&lt;br /&gt;grep.IgnoreCase = (CommandLine[&quot;i&quot;] != null);&lt;br /&gt;grep.JustFiles = (CommandLine[&quot;l&quot;] != null);&lt;br /&gt;if(grep.JustFiles == true)&lt;br /&gt;grep.LineNumbers = false;&lt;br /&gt;else&lt;br /&gt;grep.LineNumbers = (CommandLine[&quot;n&quot;] != null);&lt;br /&gt;if(grep.JustFiles == true)&lt;br /&gt;grep.CountLines = false;&lt;br /&gt;else&lt;br /&gt;grep.CountLines = (CommandLine[&quot;c&quot;] != null);&lt;br /&gt;// Do the search&lt;br /&gt;grep.Search();&lt;br /&gt;47.直接创建多级目录&lt;br /&gt;//using System.IO;&lt;br /&gt;DirectoryInfo di=new DirectoryInfo(%%1);&lt;br /&gt;di.CreateSubdirectory(%%2);&lt;br /&gt;48.批量重命名&lt;br /&gt;//using System.IO;&lt;br /&gt;string strOldFileName; string strNewFileName; string strOldPart =this.textBox1.Text.Trim();//重命名文件前的文件名等待替换字符串&lt;br /&gt;string strNewPart = this.textBox2.Text.Trim();//重命名文件后的文件名替换字符串&lt;br /&gt;string strNewFilePath;&lt;br /&gt;string strFileFolder;    //原始图片目录&lt;br /&gt;int TotalFiles = 0; DateTime StartTime = DateTime.Now; //获取开始时间  &lt;br /&gt;FolderBrowserDialog f1 = new FolderBrowserDialog(); //打开选择目录对话框&lt;br /&gt;if (f1.ShowDialog() == DialogResult.OK) {&lt;br /&gt; strFileFolder = f1.SelectedPath;&lt;br /&gt; DirectoryInfo di = new DirectoryInfo(strFileFolder);&lt;br /&gt; FileInfo[] filelist = di.GetFiles(&quot;*.*&quot;);&lt;br /&gt; int i = 0;&lt;br /&gt; foreach (FileInfo fi in filelist) {&lt;br /&gt;  strOldFileName = fi.Name;&lt;br /&gt;  strNewFileName = fi.Name.Replace(strOldPart, strNewPart);&lt;br /&gt;  strNewFilePath = @strFileFolder + &quot;\\&quot; + strNewFileName;&lt;br /&gt;  filelist[i].MoveTo(@strNewFilePath); TotalFiles += 1;&lt;br /&gt;  this.listBox1.Items.Add(&quot;文件名：&quot; + strOldFileName + &quot;已重命名为&quot; + strNewFileName);&lt;br /&gt;  i += 1;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;DateTime EndTime = DateTime.Now;//获取结束时间&lt;br /&gt;TimeSpan ts = EndTime - StartTime; this.listBox1.Items.Add(&quot;总耗时：&quot; + ts.Hours.ToString() + &quot;时&quot; +ts.Minutes.ToString() + &quot;分&quot; + ts.Seconds.ToString() + &quot;秒&quot;);&lt;br /&gt;49.文本查找替换&lt;br /&gt;/*&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Text.RegularExpressions;&lt;br /&gt;using System.IO;&lt;br /&gt;*/&lt;br /&gt;            if (args.Length == 3)&lt;br /&gt;            {&lt;br /&gt;ReplaceFiles(args[0],args[1],args[2],null);&lt;br /&gt;            }&lt;br /&gt;            if (args.Length == 4)&lt;br /&gt;            {&lt;br /&gt;if (args[3].Contains(&quot;v&quot;))&lt;br /&gt;{&lt;br /&gt;    ReplaceVariable(args[0], args[1], args[2], args[3]);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;    ReplaceFiles(args[0], args[1], args[2], args[3]);&lt;br /&gt;}&lt;br /&gt;            }&lt;br /&gt;        /**//// &lt;summary&gt;&lt;br /&gt;        /// 替换环境变量中某个变量的文本值。可以是系统变量，用户变量，临时变量。替换时会覆盖原始值。小心使用&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name=&quot;variable&quot;&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;param name=&quot;search&quot;&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;param name=&quot;replace&quot;&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;param name=&quot;options&quot;&gt;&lt;/param&gt;&lt;br /&gt;        public static void ReplaceVariable(string variable, string search, string replace, string options)&lt;br /&gt;        {&lt;br /&gt;string variable=%%1;&lt;br /&gt; string search=%%2;&lt;br /&gt; string replace=%%3;&lt;br /&gt;            string text=Environment.GetEnvironmentVariable(variable);&lt;br /&gt;            System.Windows.Forms.MessageBox.Show(text);&lt;br /&gt;            text=ReplaceText(text, search, replace, options);&lt;br /&gt;            Environment.SetEnvironmentVariable(variable, text);&lt;br /&gt;            text = Environment.GetEnvironmentVariable(variable);&lt;br /&gt;            System.Windows.Forms.MessageBox.Show(text);&lt;br /&gt;        }&lt;br /&gt; &lt;br /&gt;        /**//// &lt;summary&gt;&lt;br /&gt;        /// 批量替换文件文本&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name=&quot;args&quot;&gt;&lt;/param&gt;&lt;br /&gt;        public static void ReplaceFiles(string path,string search, string replace, string options)&lt;br /&gt;        {&lt;br /&gt;string path=%%1;&lt;br /&gt;string search=%%2;&lt;br /&gt;string replace=%%3;&lt;br /&gt;            string[] fs;&lt;br /&gt;            if(File.Exists(path)){&lt;br /&gt;ReplaceFile(path, search, replace, options);&lt;br /&gt;return;&lt;br /&gt;            }&lt;br /&gt;            if (Directory.Exists(path))&lt;br /&gt;            {&lt;br /&gt;fs = Directory.GetFiles(path);&lt;br /&gt;foreach (string f in fs)&lt;br /&gt;{&lt;br /&gt;    ReplaceFile(f, search, replace, options);&lt;br /&gt;}&lt;br /&gt;return;&lt;br /&gt;            }&lt;br /&gt;            int i=path.LastIndexOf(&quot;\&quot;);&lt;br /&gt;            if(i&lt;0)i=path.LastIndexOf(&quot;/&quot;);&lt;br /&gt;            string d, searchfile;&lt;br /&gt;            if (i &gt; -1)&lt;br /&gt;            {&lt;br /&gt;d = path.Substring(0, i + 1);&lt;br /&gt;searchfile = path.Substring(d.Length);&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;d = System.Environment.CurrentDirectory;&lt;br /&gt;searchfile = path;&lt;br /&gt;            }&lt;br /&gt;            searchfile = searchfile.Replace(&quot;.&quot;, @&quot;.&quot;);&lt;br /&gt;            searchfile = searchfile.Replace(&quot;?&quot;, @&quot;[^.]?&quot;);&lt;br /&gt;            searchfile = searchfile.Replace(&quot;*&quot;, @&quot;[^.]*&quot;);&lt;br /&gt;            //System.Windows.Forms.MessageBox.Show(d);  System.Windows.Forms.MessageBox.Show(searchfile);&lt;br /&gt;            if (!Directory.Exists(d)) return;&lt;br /&gt;            fs = Directory.GetFiles(d);&lt;br /&gt;            foreach (string f in fs)&lt;br /&gt;            {&lt;br /&gt;if(System.Text.RegularExpressions.Regex.IsMatch(f,searchfile))&lt;br /&gt;    ReplaceFile(f, search, replace, options);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;       &lt;br /&gt;        /**//// &lt;summary&gt;&lt;br /&gt;        /// 替换单个文本文件中的文本&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name=&quot;filename&quot;&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;param name=&quot;search&quot;&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;param name=&quot;replace&quot;&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;param name=&quot;options&quot;&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;        public static bool ReplaceFile(string filename, string search, string replace,string options)&lt;br /&gt;        {&lt;br /&gt;string path=%%1;&lt;br /&gt;string search=%%2;&lt;br /&gt;string replace=%%3;&lt;br /&gt;            FileStream fs = File.OpenRead(filename);&lt;br /&gt;            //判断文件是文本文件还二进制文件。该方法似乎不科学&lt;br /&gt;            byte b;&lt;br /&gt;            for (long i = 0; i &lt; fs.Length; i++)&lt;br /&gt;            {&lt;br /&gt;b = (byte)fs.ReadByte();&lt;br /&gt;if (b == 0)&lt;br /&gt;{&lt;br /&gt;    System.Windows.Forms.MessageBox.Show(&quot;非文本文件&quot;);&lt;br /&gt;    return false;//有此字节则表示改文件不是文本文件。就不用替换了&lt;br /&gt;}&lt;br /&gt;            }&lt;br /&gt;            //判断文本文件编码规则。&lt;br /&gt;            byte[] bytes = new byte[2];&lt;br /&gt;            Encoding coding=Encoding.Default;&lt;br /&gt;            if (fs.Read(bytes, 0, 2) &gt; 2)&lt;br /&gt;            {&lt;br /&gt;if (bytes == new byte[2] { 0xFF, 0xFE }) coding = Encoding.Unicode;&lt;br /&gt;if (bytes == new byte[2] { 0xFE, 0xFF }) coding = Encoding.BigEndianUnicode;&lt;br /&gt;if (bytes == new byte[2] { 0xEF, 0xBB }) coding = Encoding.UTF8;&lt;br /&gt;            }&lt;br /&gt;            fs.Close();&lt;br /&gt;            //替换数据&lt;br /&gt;            string text=File.ReadAllText(filename, coding);&lt;br /&gt;            text=ReplaceText(text,search, replace, options);&lt;br /&gt;            File.WriteAllText(filename, text, coding);&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;        /**//// &lt;summary&gt;&lt;br /&gt;        /// 替换文本&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name=&quot;text&quot;&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;param name=&quot;search&quot;&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;param name=&quot;replace&quot;&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;param name=&quot;options&quot;&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;        public static string ReplaceText(string text, string search, string replace, string options)&lt;br /&gt;        {&lt;br /&gt;            RegexOptions ps = RegexOptions.None;&lt;br /&gt;            if (options == null)  //纯文本替换&lt;br /&gt;            {&lt;br /&gt;search = search.Replace(&quot;.&quot;, @&quot;.&quot;);&lt;br /&gt;search = search.Replace(&quot;?&quot;, @&quot;?&quot;);&lt;br /&gt;search = search.Replace(&quot;*&quot;, @&quot;*&quot;);&lt;br /&gt;search = search.Replace(&quot;(&quot;, @&quot;(&quot;);&lt;br /&gt;search = search.Replace(&quot;)&quot;, @&quot;)&quot;);&lt;br /&gt;search = search.Replace(&quot;[&quot;, @&quot;[&quot;);&lt;br /&gt;search = search.Replace(&quot;[&quot;, @&quot;[&quot;);&lt;br /&gt;search = search.Replace(&quot;[&quot;, @&quot;[&quot;);&lt;br /&gt;search = search.Replace(&quot;{&quot;, @&quot;{&quot;);&lt;br /&gt;search = search.Replace(&quot;}&quot;, @&quot;}&quot;);&lt;br /&gt;ops |= RegexOptions.IgnoreCase;&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;if(options.Contains(&quot;I&quot;))ops |= RegexOptions.IgnoreCase;&lt;br /&gt;            }&lt;br /&gt;            text = Regex.Replace(text, search, replace, ops);&lt;br /&gt;            return text;&lt;br /&gt;        }&lt;br /&gt;50.文件关联&lt;br /&gt;//using Microsoft.Win32;&lt;br /&gt;string keyName;&lt;br /&gt;string keyValue;&lt;br /&gt;keyName = %%1; //&quot;WPCFile&quot;&lt;br /&gt;keyValue = %%2; //&quot;资源包文件&quot;&lt;br /&gt;RegistryKey isExCommand = null;&lt;br /&gt;bool isCreateRegistry = true;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;    /// 检查 文件关联是否创建&lt;br /&gt;    isExCommand = Registry.ClassesRoot.OpenSubKey(keyName);&lt;br /&gt;    if (isExCommand == null)&lt;br /&gt;    {&lt;br /&gt;        isCreateRegistry = true;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        if (isExCommand.GetValue(&quot;Create&quot;).ToString() == Application.ExecutablePath.ToString())&lt;br /&gt;        {&lt;br /&gt;            isCreateRegistry = false;&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            Registry.ClassesRoot.DeleteSubKeyTree(keyName);&lt;br /&gt;            isCreateRegistry = true;            &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;catch (Exception)&lt;br /&gt;{&lt;br /&gt;    isCreateRegistry = true;&lt;br /&gt;}&lt;br /&gt;if (isCreateRegistry)&lt;br /&gt;{&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        RegistryKey key, keyico;&lt;br /&gt;        key = Registry.ClassesRoot.CreateSubKey(keyName);&lt;br /&gt;        key.SetValue(&quot;Create&quot;, Application.ExecutablePath.ToString());&lt;br /&gt;        keyico = key.CreateSubKey(&quot;DefaultIcon&quot;);&lt;br /&gt;        keyico.SetValue(&quot;&quot;, Application.ExecutablePath + &quot;,0&quot;);&lt;br /&gt;        key.SetValue(&quot;&quot;, keyValue);&lt;br /&gt;        key = key.CreateSubKey(&quot;Shell&quot;);&lt;br /&gt;        key = key.CreateSubKey(&quot;Open&quot;);&lt;br /&gt;        key = key.CreateSubKey(&quot;Command&quot;);&lt;br /&gt;        key.SetValue(&quot;&quot;, &quot;\&quot;&quot; + Application.ExecutablePath.ToString() + &quot;\&quot; \&quot;%1\&quot;&quot;);&lt;br /&gt;        keyName = %%3; //&quot;.wpc&quot;&lt;br /&gt;        keyValue = %%1;&lt;br /&gt;        key = Registry.ClassesRoot.CreateSubKey(keyName);&lt;br /&gt;        key.SetValue(&quot;&quot;, keyValue);&lt;br /&gt;    }&lt;br /&gt;    catch (Exception)&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;51.操作Excel文件&lt;br /&gt;//using Excel;&lt;br /&gt;private static string Connstring ;//连接字符串&lt;br /&gt;Workbook myBook = null;&lt;br /&gt;Worksheet mySheet=null;&lt;br /&gt;Excel.ApplicationClass ExlApp = new ApplicationClass();&lt;br /&gt;ExlApp.Visible =true;&lt;br /&gt;object Missiong = System.Reflection.Missing.Value;&lt;br /&gt;string reqpath = this.Request.PhysicalPath;&lt;br /&gt;int pos = reqpath.LastIndexOf(&quot;\\&quot;);&lt;br /&gt;reqpath = reqpath.Substring(0,pos);&lt;br /&gt;ExlApp.Workbooks.Open(%%1,oMissiong, oMissiong, oMissiong,oMissiong, oMissiong, oMissiong,&lt;br /&gt;  oMissiong,oMissiong,oMissiong, oMissiong, oMissiong, oMissiong);//, oMissiong);//, oMissiong); // reqpath + &quot;\\scxx.xls&quot;&lt;br /&gt;myBook = ExlApp.Workbooks[1];&lt;br /&gt;mySheet = (Worksheet)myBook.Worksheets[1];&lt;br /&gt;Excel.Range rg; &lt;br /&gt;string mySelectQuery = %%2; //&quot;SELECT dh, qy,zb FROM SCXXB&quot;&lt;br /&gt;using(SqlConnection myConnection = new SqlConnection(Connstring)){&lt;br /&gt;SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection);&lt;br /&gt;myConnection.Open();&lt;br /&gt;SqlDataReader myReader;&lt;br /&gt;myReader = myCommand.ExecuteReader();&lt;br /&gt;// Always call Read before accessing data.&lt;br /&gt;int recount=0;&lt;br /&gt;while (myReader.Read())&lt;br /&gt;{&lt;br /&gt; recount=recount+1;&lt;br /&gt;}&lt;br /&gt;myReader.Close();&lt;br /&gt;myConnection.Close();&lt;br /&gt;int gho=3;&lt;br /&gt;for(int i = 1; i &lt; recount ; i ++)&lt;br /&gt;{&lt;br /&gt;rg = mySheet.get_Range(&quot;A&quot; +  gho.ToString(), &quot;C&quot; + ( gho ).ToString());&lt;br /&gt; rg.Copy(oMissiong);&lt;br /&gt;  rg.Insert(XlInsertShiftDirection.xlShiftDown);&lt;br /&gt; }&lt;br /&gt; //从数据表中取数据&lt;br /&gt; mySelectQuery = %%2; //&quot;SELECT dh, qy,zb FROM SCXXB ORDER BY qy,zb&quot;;&lt;br /&gt; myConnection = new SqlConnection(Connstring);&lt;br /&gt; myCommand = new SqlCommand(mySelectQuery,myConnection);&lt;br /&gt; myConnection.Open();&lt;br /&gt; myReader = myCommand.ExecuteReader();&lt;br /&gt; int Curhs =  gho ;&lt;br /&gt; while (myReader.Read())&lt;br /&gt; {&lt;br /&gt;  mySheet.Cells[Curhs,1] =myReader[&quot;qy&quot;].ToString() ;&lt;br /&gt;  mySheet.Cells[Curhs,2] =myReader[&quot;zb&quot;].ToString() ;&lt;br /&gt;  mySheet.Cells[Curhs,3] =myReader[&quot;dh&quot;].ToString() ;&lt;br /&gt;  Curhs ++; &lt;br /&gt; }&lt;br /&gt; myReader.Close();&lt;br /&gt; //合并最后一页&lt;br /&gt; MergeCell(ref mySheet,3 , recount ,&quot;A&quot;); //调用函数实现A列合并&lt;br /&gt; MergeCell(ref mySheet,3 , recount ,&quot;B&quot;); //调用函数实现A列合并&lt;br /&gt; myBook.SaveAs(%%1, oMissiong,oMissiong, oMissiong,oMissiong,oMissiong,Excel.XlSaveAsAccessMode.xlNoChange,oMissiong,oMissiong,oMissiong,oMissiong);&lt;br /&gt; if(myBook != null)&lt;br /&gt; myBook.Close(true, %%1, true);&lt;br /&gt; if(mySheet != null)&lt;br /&gt;  System.Runtime.InteropServices.Marshal.ReleaseComObject (mySheet);&lt;br /&gt; mySheet = null;&lt;br /&gt; if(myBook != null)&lt;br /&gt; System.Runtime.InteropServices.Marshal.ReleaseComObject (myBook);&lt;br /&gt; myBook = null;&lt;br /&gt; if(ExlApp != null)&lt;br /&gt; {&lt;br /&gt;  ExlApp.Quit();&lt;br /&gt;  System.Runtime.InteropServices.Marshal.ReleaseComObject ((object)ExlApp);&lt;br /&gt;  ExlApp = null;  &lt;br /&gt; }&lt;br /&gt; GC.Collect();&lt;br /&gt; /// 合并单元格&lt;br /&gt; private void MergeCell(ref Worksheet mySheet, int startLine,int RecCount, string Col)&lt;br /&gt; {&lt;br /&gt;  string qy1 = mySheet.get_Range(Col + startLine.ToString(), Col + startLine.ToString()).Text.ToString();&lt;br /&gt;  Excel.Range rg1,rg ;&lt;br /&gt;  int ms1, me1;&lt;br /&gt;  string strtemp = &quot;&quot;;&lt;br /&gt;  int ntemp = 0;&lt;br /&gt;  me1 = startLine;&lt;br /&gt;  for (int i=1; i&lt;=RecCount; i++)&lt;br /&gt;  {&lt;br /&gt;   ntemp = startLine + i;&lt;br /&gt;   rg = mySheet.get_Range(Col+ ntemp.ToString(), Col+ ntemp.ToString());&lt;br /&gt;   strtemp = rg.Text.ToString().Trim();&lt;br /&gt;   if (qy1.Trim() != strtemp.Trim())&lt;br /&gt;   {&lt;br /&gt;    ms1 = me1;&lt;br /&gt;    me1 = i + startLine - 1;&lt;br /&gt;    //合并&lt;br /&gt;    if (me1-ms1&gt;0)&lt;br /&gt;    {&lt;br /&gt;     rg1 = mySheet.get_Range(Col + ms1.ToString(), Col + me1.ToString());&lt;br /&gt;     rg1.ClearContents();&lt;br /&gt;     rg1.MergeCells = true;&lt;br /&gt;     if(Col == &quot;A&quot;)&lt;br /&gt;      mySheet.Cells[ms1,1] = qy1;&lt;br /&gt;     else if (Col == &quot;B&quot;)&lt;br /&gt;      mySheet.Cells[ms1,2] = qy1;&lt;br /&gt;    } &lt;br /&gt;    me1 += 1; &lt;br /&gt;    strtemp = mySheet.get_Range(Col + me1.ToString(), Col + me1.ToString()).Text.ToString();&lt;br /&gt;    if(strtemp.Trim() != &quot;&quot;)&lt;br /&gt;     qy1 = strtemp;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;52.设置JDK环境变量&lt;br /&gt;/*&lt;br /&gt;JAVA_HOME=C:\j2sdk1.4.2_04&lt;br /&gt;CLASSPATH=.;C:\j2sdk1.4.2_04\lib\tools.jar;C:\j2sdk1.4.2_04\lib\dt.jar;C:\j2sdk1.4.2_04&lt;br /&gt;path=C:\j2sdk1.4.2_04\bin;&lt;br /&gt;*/&lt;br /&gt;//using Microsoft.Win32;&lt;br /&gt;int isFileNum=0;&lt;br /&gt;int i=0;&lt;br /&gt;Environment.CurrentDirectory&lt;br /&gt;string srcFileName,srcFilePath,dstFile,srcFile;&lt;br /&gt;string src=Environment.CurrentDirectory+&quot;\\*.zip&quot;;&lt;br /&gt;string useless,useful,mysqlDriver;&lt;br /&gt;CFileFind tempFind;&lt;br /&gt;BOOL isFound=(BOOL)tempFind.FindFile(src);&lt;br /&gt;RegistryKey rkLocalM = Registry.CurrentUser; //Registry.ClassesRoot, Registry.LocalMachine, Registry.Users, Registry.CurrentConfig&lt;br /&gt;const string strSubKey = &quot;Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU&quot;;&lt;br /&gt;RegistryKey rkSub = rkLocalM.CreateSubKey( strSubKey );&lt;br /&gt;rkSub.SetValue(&quot;a&quot;,&quot;winword -q\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;MRUList&quot;,&quot;azyxwvutsrqponmlkjihgfedcb&quot;);&lt;br /&gt;rkSub.SetValue(&quot;b&quot;,&quot;cmd /k\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;c&quot;,&quot;iexplore -k\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;d&quot;,&quot;iexpress\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;e&quot;,&quot;mmc\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;f&quot;,&quot;msconfig\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;g&quot;,&quot;regedit\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;h&quot;,&quot;regedt32\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;i&quot;,&quot;Regsvr32 /u wmpshell.dll\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;j&quot;,&quot;sfc /scannow\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;k&quot;,&quot;shutdown -s -f -t 600\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;l&quot;,&quot;shutdown -a\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;m&quot;,&quot;C:\\TurboC\\BIN\\TC.EXE\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;n&quot;,&quot;services.msc\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;o&quot;,&quot;gpedit.msc\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;p&quot;,&quot;fsmgmt.msc\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;q&quot;,&quot;diskmgmt.msc\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;r&quot;,&quot;dfrg.msc\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;s&quot;,&quot;devmgmt.msc\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;t&quot;,&quot;compmgmt.msc\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;u&quot;,&quot;ciadv.msc\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;v&quot;,&quot;C:\\MATLAB701\\bin\\win32\\MATLAB.exe -nosplash -nojvm\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;w&quot;,&quot;C:\\MATLAB701\\bin\\win32\\MATLAB.exe -nosplash\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;x&quot;,&quot;C:\\Program Files\\Kingsoft\\PowerWord 2005\\XDICT.EXE\&quot; -nosplash\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;y&quot;,&quot;powerpnt -splash\\1&quot;);&lt;br /&gt;rkSub.SetValue(&quot;z&quot;,&quot;excel -e\\1&quot;);&lt;br /&gt;RegistryKey rkSub = rkLocalM.OpenSubKey(&quot;Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit\\Favorites&quot;);&lt;br /&gt;rkSub.SetValue(&quot;DIY_IEToolbar&quot;,&quot;我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\InternetExplorer\\Extensions&quot;);&lt;br /&gt;rkSub.SetValue(&quot;文件夹右键菜单&quot;,&quot;我的电脑\\HKEY_CLASSES_ROOT\\Folder&quot;);&lt;br /&gt;rkSub.SetValue(&quot;指向“收藏夹”&quot;,&quot;我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit\\Favorites&quot;);&lt;br /&gt;rkSub.SetValue(&quot;默认安装目录（SourcePath）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion&quot;);&lt;br /&gt;rkSub.SetValue(&quot;设定字体替换&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\FontSubstitutes&quot;);&lt;br /&gt;rkSub.SetValue(&quot;设置光驱自动运行功能（AutoRun）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Cdrom&quot;);&lt;br /&gt;rkSub.SetValue(&quot;改变鼠标设置&quot;,&quot;我的电脑\\HKEY_CURRENT_USER\\ControlPanel\\Mouse&quot;);&lt;br /&gt;rkSub.SetValue(&quot;加快菜单的显示速度（MenuShowDelay&lt;400）&quot;,&quot;我的电脑\\HKEY_CURRENT_USER\\ControlPanel\\desktop&quot;);&lt;br /&gt;rkSub.SetValue(&quot;修改系统的注册单位（RegisteredOrganization）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion&quot;);&lt;br /&gt;rkSub.SetValue(&quot;查看启动&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run&quot;);&lt;br /&gt;rkSub.SetValue(&quot;查看单次启动1&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce&quot;);&lt;br /&gt;rkSub.SetValue(&quot;查看单次启动2&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnceEx&quot;);&lt;br /&gt;rkSub.SetValue(&quot;任意定位墙纸位置（WallpaperOriginX/Y）&quot;,&quot;我的电脑\\HKEY_CURRENT_USER\\ControlPanel\\desktop&quot;);&lt;br /&gt;rkSub.SetValue(&quot;设置启动信息提示（LegalNoticeCaption/Text）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\Winlogon&quot;);&lt;br /&gt;rkSub.SetValue(&quot;更改登陆时的背景图案（Wallpaper）&quot;,&quot;我的电脑\\HKEY_USERS\\.DEFAULT\\ControlPanel\\Desktop&quot;);&lt;br /&gt;rkSub.SetValue(&quot;限制远程修改本机注册表（\\winreg\\AllowedPaths\\Machine）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SecurePipeServers&quot;);&lt;br /&gt;rkSub.SetValue(&quot;修改环境变量&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SessionManager\\Environment&quot;);&lt;br /&gt;rkSub.SetValue(&quot;设置网络服务器（severname&quot;,&quot;\\\\ROBERT）&quot;);&lt;br /&gt;rkSub.SetValue(&quot;为一块网卡指定多个IP地址（\\网卡名\\Parameters\\Tcpip\\IPAddress和SubnetMask）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services&quot;);&lt;br /&gt;rkSub.SetValue(&quot;去除可移动设备出错信息（\\设备名\\ErrorControl）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services&quot;);&lt;br /&gt;rkSub.SetValue(&quot;限制使用显示属性&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system&quot;);&lt;br /&gt;rkSub.SetValue(&quot;不允许拥护在控制面板中改变显示模式（NoDispAppearancePage）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system&quot;);&lt;br /&gt;rkSub.SetValue(&quot;隐藏控制面板中的“显示器”设置（NoDispCPL）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system&quot;);&lt;br /&gt;rkSub.SetValue(&quot;不允许用户改变主面背景和墙纸（NoDispBackgroundPage）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system&quot;);&lt;br /&gt;rkSub.SetValue(&quot;“显示器”属性中将不会出现“屏幕保护程序”标签页（NoDispScrSavPage）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system&quot;);&lt;br /&gt;rkSub.SetValue(&quot;“显示器”属性中将不会出现“设置”标签页（NoDispSettingPage）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system&quot;);&lt;br /&gt;rkSub.SetValue(&quot;阻止用户运行任务管理器（DisableTaskManager）&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system&quot;);&lt;br /&gt;rkSub.SetValue(&quot;“启动”菜单记录信息&quot;,&quot;我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU&quot;);&lt;br /&gt;rkSub.SetValue(&quot;Office2003用户指定文件夹&quot;,&quot;我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\11.0\\Common\\OpenFind\\Places\\UserDefinedPlaces&quot;);&lt;br /&gt;rkSub.SetValue(&quot;OfficeXP用户指定文件夹&quot;,&quot;我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\10.0\\Common\\OpenFind\\Places\\UserDefinedPlaces&quot;);&lt;br /&gt;rkSub.SetValue(&quot;查看VB6临时文件&quot;,&quot;我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\VisualBasic\\6.0\\RecentFiles&quot;);&lt;br /&gt;rkSub.SetValue(&quot;设置默认HTML编辑器&quot;,&quot;我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\InternetExplorer\\Default HTML Editor&quot;);&lt;br /&gt;rkSub.SetValue(&quot;更改重要URL&quot;,&quot;我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\InternetExplorer\\Main&quot;);&lt;br /&gt;rkSub.SetValue(&quot;控制面板注册位置&quot;,&quot;我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ControlPanel\\Extended Properties\\{305CA226-D286-468e-B848-2B2E8E697B74} 2&quot;);&lt;br /&gt;rkLocalM = Registry.ClassesRoot; //Registry.ClassesRoot, Registry.LocalMachine, Registry.Users, Registry.CurrentConfig&lt;br /&gt;rkSub = rkLocalM.OpenSubKey(&quot;Directory\\shell\\cmd&quot;);&lt;br /&gt;rkSub.SetValue(&quot;&quot;,&quot;在这里打开命令行窗口&quot;);&lt;br /&gt;rkSub = rkLocalM.OpenSubKey(&quot;Directory\\shell\\cmd\\command&quot;);&lt;br /&gt;rkSub.SetValue(&quot;&quot;,&quot;cmd.exe /k \&quot;cd %L\&quot;&quot;);&lt;br /&gt;rkLocalM = Registry.LocalMachine; //Registry.ClassesRoot, Registry.LocalMachine, Registry.Users, Registry.CurrentConfig&lt;br /&gt;rkSub = rkLocalM.OpenSubKey( &quot;SOFTWARE\\Classes\\AllFilesystemObjects\\shellex\\ContextMenuHandlers&quot;);&lt;br /&gt;rkLocalM.CreateSubKey(&quot;Copy To&quot;);&lt;br /&gt;rkLocalM.CreateSubKey(&quot;Move To&quot;);&lt;br /&gt;rkLocalM.CreateSubKey(&quot;Send To&quot;);&lt;br /&gt;rkSub = rkLocalM.OpenSubKey(&quot;SOFTWARE\\Classes\\AllFilesystemObjects\\shellex\\ContextMenuHandlers\\Copy To&quot;);&lt;br /&gt;rkSub.SetValue(&quot;&quot;,&quot;{C2FBB630-2971-11D1-A18C-00C04FD75D13}&quot;);&lt;br /&gt;rkSub = rkLocalM.OpenSubKey( &quot;SOFTWARE\\Classes\\AllFilesystemObjects\\shellex\\ContextMenuHandlers&quot;);&lt;br /&gt;rkSub.SetValue(&quot;&quot;,&quot;{C2FBB631-2971-11D1-A18C-00C04FD75D13}&quot;);&lt;br /&gt;rkSub = rkLocalM.OpenSubKey( &quot;SOFTWARE\\Classes\\AllFilesystemObjects\\shellex\\ContextMenuHandlers&quot;);&lt;br /&gt;rkSub.SetValue(&quot;&quot;,&quot;{7BA4C740-9E81-11CF-99D3-00AA004AE837}&quot;);&lt;br /&gt;rkSub = rkLocalM.OpenSubKey( &quot;SOFTWARE\\Classes\\AllFilesystemObjects\\shellex\\ContextMenuHandlers&quot;);&lt;br /&gt;rkLocalM = Registry.LocalMachine;&lt;br /&gt;rkSub = rkLocalM.OpenSubKey(&quot;SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL&quot;);&lt;br /&gt;rkSub.SetValue( &quot;RegPath&quot;,&quot;Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced&quot;);&lt;br /&gt;rkSub.SetValue( &quot;ValueName&quot;,&quot;Hidden&quot;);&lt;br /&gt;rkSub = rkLocalM.OpenSubKey(&quot;SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}&quot;);&lt;br /&gt;rkSub.SetValue(&quot;&quot;,&quot;Folder Options&quot;);&lt;br /&gt;rkLocalM = Registry.ClassesRoot;&lt;br /&gt;rkSub = rkLocalM.OpenSubKey(&quot;CLSID\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}&quot;))&lt;br /&gt;rkSub.SetValue(CLSID.WriteString(&quot;&quot;,&quot;文件夹选项&quot;);&lt;br /&gt;rkSub = rkLocalM.OpenSubKey(&quot;CLSID\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}\\Shell\\RunAs\\Command&quot;))&lt;br /&gt;rkSub.SetValue(&quot;Extended&quot;,&quot;&quot;);&lt;br /&gt;/*&lt;br /&gt;  if(REGWriteDword(HKEY_LOCAL_MACHINE,&quot;SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL&quot;,&quot;CheckedValue&quot;,1)!=ERROR_SUCCESS)&lt;br /&gt;  {&lt;br /&gt;   //AfxMessageBox(&quot;写入失败&quot;);&lt;br /&gt;  }&lt;br /&gt;  if(REGWriteDword(HKEY_CLASSES_ROOT,&quot;CLSID\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}\\ShellFolder&quot;,&quot;Attributes&quot;,0)!=ERROR_SUCCESS)&lt;br /&gt;  {&lt;br /&gt;   //AfxMessageBox(&quot;写入失败&quot;);&lt;br /&gt;  }&lt;br /&gt;  if(REGWriteDword(HKEY_CLASSES_ROOT,&quot;CLSID\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}&quot;,&quot;{305CA226-D286-468e-B848-2B2E8E697B74} 2&quot;,1)!=ERROR_SUCCESS)&lt;br /&gt;  {&lt;br /&gt;   //AfxMessageBox(&quot;写入失败&quot;);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  BYTE InfoTip[] = {0x40,0x00,0x25,0x00,0x53,0x00,0x79,0x00,0x73,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x52,0x00,0x6f,0x00,0x6f,0x00,0x74,0x00,0x25,0x00,0x5c,0x00,0x73,0x00,0x79,0x00,0x73,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x33,0x00,0x32,0x00,0x5c,0x00,0x53,0x00,0x48,0x00,0x45,0x00,0x4c,0x00,0x4c,0x00,0x33,0x00,0x32,0x00,0x2e,0x00,0x64,0x00,0x6c,0x00,0x6c,0x00,0x2c,0x00,0x2d,0x00,0x32,0x00,0x32,0x00,0x39,0x00,0x32,0x00,0x34,0x00,0x00,0x00 };&lt;br /&gt;  REGWriteBinary(HKEY_LOCAL_MACHINE,InfoTip,&quot;SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}&quot;,&quot;InfoTip&quot;);&lt;br /&gt;  &lt;br /&gt;  BYTE LocalizedString[] = {0x40,0x00,0x25,0x00,0x53,0x00,0x79,0x00,0x73,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x52,0x00,0x6f,0x00,0x6f,0x00,0x74,0x00,0x25,0x00,0x5c,0x00,0x73,0x00,0x79,0x00,0x73,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x33,0x00,0x32,0x00,0x5c,0x00,0x53,0x00,0x48,0x00,0x45,0x00,0x4c,0x00,0x4c,0x00,0x33,0x00,0x32,0x00,0x2e,0x00,0x64,0x00,0x6c,0x00,0x6c,0x00,0x2c,0x00,0x2d,0x00,0x32,0x00,0x32,0x00,0x39,0x00,0x38,0x00,0x35,0x00,0x00,0x00 };&lt;br /&gt;  REGWriteBinary(HKEY_LOCAL_MACHINE,LocalizedString,&quot;SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}&quot;,&quot;LocalizedString&quot;);&lt;br /&gt;  &lt;br /&gt;  BYTE btBuf[]= {0x25,0x00,0x53,0x00,0x79,0x00,0x73,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x52,0x00,0x6f,0x00,0x6f,0x00,0x74,0x00,0x25,0x00,0x5c,0x00,0x73,0x00,0x79,0x00,0x73,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x33,0x00,0x32,0x00,0x5c,0x00,0x53,0x00,0x48,0x00,0x45,0x00,0x4c,0x00,0x4c,0x00,0x33,0x00,0x32,0x00,0x2e,0x00,0x64,0x00,0x6c,0x00,0x6c,0x00,0x2c,0x00,0x2d,0x00,0x32,0x00,0x31,0x00,0x30,0x00,0x00,0x00 };&lt;br /&gt;  REGWriteBinary(HKEY_LOCAL_MACHINE,btBuf,&quot;SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}\\DefaultIcon&quot;,&quot;&quot;);&lt;br /&gt;  &lt;br /&gt;  BYTE Command1[]= {0x72,0x00,0x75,0x00,0x6e,0x00,0x64,0x00,0x6c,0x00,0x6c,0x00,0x33,0x00,0x32,0x00,0x2e,0x00,0x65,0x00,0x78,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x68,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x33,0x00,0x32,0x00,0x2e,0x00,0x64,0x00,0x6c,0x00,0x6c,0x00,0x2c,0x00,0x4f,0x00,0x70,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x5f,0x00,0x52,0x00,0x75,0x00,0x6e,0x00,0x44,0x00,0x4c,0x00,0x4c,0x00,0x20,0x00,0x30,0x00,0x00,0x00 };&lt;br /&gt;  REGWriteBinary(HKEY_LOCAL_MACHINE,Command1,&quot;SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}\\Shell\\Open\\Command&quot;,&quot;&quot;);&lt;br /&gt;  &lt;br /&gt;  BYTE Command2[]= {0x72,0x00,0x75,0x00,0x6e,0x00,0x64,0x00,0x6c,0x00,0x6c,0x00,0x33,0x00,0x32,0x00,0x2e,0x00,0x65,0x00,0x78,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x68,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x33,0x00,0x32,0x00,0x2e,0x00,0x64,0x00,0x6c,0x00,0x6c,0x00,0x2c,0x00,0x4f,0x00,0x70,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x5f,0x00,0x52,0x00,0x75,0x00,0x6e,0x00,0x44,0x00,0x4c,0x00,0x4c,0x00,0x20,0x00,0x30,0x00,0x00,0x00 };&lt;br /&gt;  REGWriteBinary(HKEY_LOCAL_MACHINE,Command2,&quot;SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}\\Shell\\RunAs\\Command&quot;,&quot;&quot;);&lt;br /&gt;  &lt;br /&gt;  BYTE NoDriveTypeAutoRun[]= {0x91,0x00,0x00,0x00 };&lt;br /&gt;  REGWriteBinary(HKEY_CURRENT_USER,NoDriveTypeAutoRun,&quot;Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer&quot;,&quot;NoDriveTypeAutoRun&quot;);&lt;br /&gt;  &lt;br /&gt;  BYTE NoDriveAutoRun[]= {0xff,0xff,0xff,0x03 };&lt;br /&gt;  REGWriteBinary(HKEY_CURRENT_USER,NoDriveAutoRun,&quot;Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer&quot;,&quot;NoDriveAutoRun&quot;);&lt;br /&gt;  &lt;br /&gt;  TCHAR   szSystemInfo[2000];  &lt;br /&gt;  ExpandEnvironmentStrings(&quot;%PATH%&quot;,szSystemInfo, 2000);  &lt;br /&gt;  useful.Format(&quot;%s&quot;,szSystemInfo);&lt;br /&gt;  while(isFound &amp;&amp; i&lt;isFileNum)&lt;br /&gt;  {&lt;br /&gt;   isFound=(BOOL)tempFind.FindNextFile();&lt;br /&gt;   if(tempFind.IsDirectory())&lt;br /&gt;   {&lt;br /&gt;    srcFileName=tempFind.GetFileTitle();&lt;br /&gt;    srcFilePath=tempFind.GetFilePath();&lt;br /&gt;    if(srcFileName.Find(&quot;jboss&quot;)==0)&lt;br /&gt;    {&lt;br /&gt;     char crEnVar[MAX_PATH];&lt;br /&gt;     ::GetEnvironmentVariable (&quot;USERPROFILE&quot;,crEnVar,MAX_PATH);  &lt;br /&gt;     string destPath=string(crEnVar);&lt;br /&gt;     destPath+=&quot;\\SendTo\\&quot;;&lt;br /&gt;     // lasting(&quot;C:\\Sun\\Java\\eclipse\\eclipse.exe&quot;,destPath);&lt;br /&gt;     string destPath2=destPath+&quot;一键JBoss调试.lnk&quot;;&lt;br /&gt;     useless.Format(&quot;%s\\%s&quot;,szDir,&quot;jboss.exe&quot;);&lt;br /&gt;     srcFile=useless.GetBuffer(0);&lt;br /&gt;     dstFile=srcFilePath+&quot;\\jboss.exe&quot;;&lt;br /&gt;     CopyFile(srcFile,dstFile,false);&lt;br /&gt;     lasting(dstFile.GetBuffer(0),destPath2);&lt;br /&gt;     useless.Format(&quot;%s\\%s&quot;,szDir,&quot;DLL1.dll&quot;);&lt;br /&gt;     srcFile=useless.GetBuffer(0);&lt;br /&gt;     dstFile=srcFilePath+&quot;\\DLL1.dll&quot;;&lt;br /&gt;     CopyFile(srcFile,dstFile,false);&lt;br /&gt;     useless.Format(&quot;%s\\%s&quot;,szDir,mysqlDriver.GetBuffer(0));&lt;br /&gt;     srcFile=useless.GetBuffer(0);&lt;br /&gt;     dstFile=srcFilePath+&quot;\\server\\default\\lib\\mysql.jar&quot;;&lt;br /&gt;     CopyFile(srcFile,dstFile,false);&lt;br /&gt;     useless.Format(&quot;%s\\%s&quot;,szDir,&quot;DeployDoc.exe&quot;);&lt;br /&gt;     srcFile=useless.GetBuffer(0);&lt;br /&gt;     dstFile=srcFilePath+&quot;\\DeployDoc.exe&quot;;&lt;br /&gt;     CopyFile(srcFile,dstFile,false);&lt;br /&gt;     CRegEdit RegJavaHome;string StrPath;&lt;br /&gt;     RegJavaHome.m_RootKey=HKEY_LOCAL_MACHINE;&lt;br /&gt;     RegJavaHome.OpenKey(&quot;SOFTWARE\\JavaSoft\\Java Development Kit\\1.6&quot;);&lt;br /&gt;     RegJavaHome.ReadString(&quot;JavaHome&quot;,StrPath);&lt;br /&gt;     &lt;br /&gt;     CRegEdit SysJavaHome;string StrJavaHome;&lt;br /&gt;     SysJavaHome.m_RootKey=HKEY_LOCAL_MACHINE;&lt;br /&gt;     SysJavaHome.OpenKey(&quot;SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment&quot;);&lt;br /&gt;     SysJavaHome.WriteString(&quot;JAVA_HOME&quot;,(LPCTSTR)StrPath);&lt;br /&gt;     SysJavaHome.WriteString(&quot;CLASSPATH&quot;,&quot;.;%JAVA_HOME%\\lib&quot;);&lt;br /&gt;     &lt;br /&gt;     CRegEdit RegHomePath;&lt;br /&gt;     RegHomePath.m_RootKey=HKEY_CURRENT_USER;&lt;br /&gt;     RegHomePath.OpenKey(&quot;Environment&quot;);&lt;br /&gt;     StrJavaHome.Format(&quot;%s\\bin;%sJAVA_HOME%s\\bin;%s&quot;,srcFilePath.GetBuffer(0),&quot;%&quot;,&quot;%&quot;,szSystemInfo);&lt;br /&gt;     RegHomePath.WriteString(&quot;HOME_PATH&quot;,(LPCTSTR)StrPath);&lt;br /&gt;     &lt;br /&gt;     useful=StrJavaHome;&lt;br /&gt;     SysJavaHome.WriteString(&quot;Path&quot;,(LPCTSTR)StrJavaHome);&lt;br /&gt;     &lt;br /&gt;     RegHomePath.WriteString(&quot;JBOSS_HOME&quot;,(LPCTSTR)srcFilePath);&lt;br /&gt;     // string temp=destPath+&quot;JBoss编译调试.cmd&quot;;&lt;br /&gt;     string temp2;&lt;br /&gt;     temp2.Format(&quot;%s\\%s&quot;,szDir,&quot;JBoss编译调试.cmd&quot;);&lt;br /&gt;     lasting(temp2.GetBuffer(0),destPath2);&lt;br /&gt;     destPath2=destPath+&quot;VC文件清理.lnk&quot;;&lt;br /&gt;     useless.Format(&quot;%s\\FileCleaner.exe&quot;,szDir);&lt;br /&gt;     lasting(useless.GetBuffer(0),destPath2);&lt;br /&gt;     destPath2=destPath+&quot;注册并压缩.lnk&quot;;&lt;br /&gt;     useless.Format(&quot;%s\\rarfavlst.vbs&quot;,szDir);&lt;br /&gt;     lasting(useless.GetBuffer(0),destPath2);&lt;br /&gt;     destPath2=destPath+&quot;打包转移.lnk&quot;;&lt;br /&gt;     useless.Format(&quot;%s\\rarApp.vbs&quot;,szDir);&lt;br /&gt;     lasting(useless.GetBuffer(0),destPath2);&lt;br /&gt;     /*&lt;br /&gt;     TCHAR szPath[MAX_PATH];&lt;br /&gt;     //CSIDL_SENDTO($9)&lt;br /&gt;     //  表示当前用户的“发送到”文件夹，例如：C:\Documents and Settings\username\SendTo&lt;br /&gt;     if(SUCCEEDED(SHGetFolderPath(NULL,&lt;br /&gt;     CSIDL_SENDTO|CSIDL_FLAG_CREATE,&lt;br /&gt;     NULL,&lt;br /&gt;     0,&lt;br /&gt;     szPath)))&lt;br /&gt;     {&lt;br /&gt;     //printf(szPath);&lt;br /&gt;     }&lt;br /&gt;     string targetPath(szPath);&lt;br /&gt;     lasting(targetPath,);&lt;br /&gt;     &lt;br /&gt;     */&lt;br /&gt;    }&lt;br /&gt;    else if(srcFileName.Find(&quot;resin&quot;)==0)&lt;br /&gt;    {&lt;br /&gt;     useless.Format(&quot;%s\\%s&quot;,szDir,&quot;resin.exe&quot;);&lt;br /&gt;     srcFile=useless.GetBuffer(0);&lt;br /&gt;     dstFile=srcFilePath+&quot;\\resin2.exe&quot;;&lt;br /&gt;     CopyFile(srcFile,dstFile,false);&lt;br /&gt;     useless.Format(&quot;%s\\%s&quot;,szDir,&quot;DLL1.dll&quot;);&lt;br /&gt;     srcFile=useless.GetBuffer(0);&lt;br /&gt;     dstFile=srcFilePath+&quot;\\DLL1.dll&quot;;&lt;br /&gt;     CopyFile(srcFile,dstFile,false);&lt;br /&gt;     useless.Format(&quot;%s\\%s&quot;,szDir,&quot;DeployDoc.exe&quot;);&lt;br /&gt;     srcFile=useless.GetBuffer(0);&lt;br /&gt;     dstFile=srcFilePath+&quot;\\DeployDoc.exe&quot;;&lt;br /&gt;     CopyFile(srcFile,dstFile,false);&lt;br /&gt;     string StrPath;&lt;br /&gt;     &lt;br /&gt;     CRegEdit SysJavaHome;string StrJavaHome;&lt;br /&gt;     SysJavaHome.m_RootKey=HKEY_LOCAL_MACHINE;&lt;br /&gt;     SysJavaHome.OpenKey(&quot;SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment&quot;);&lt;br /&gt;     &lt;br /&gt;     CRegEdit RegHomePath;&lt;br /&gt;     RegHomePath.m_RootKey=HKEY_CURRENT_USER;&lt;br /&gt;     RegHomePath.OpenKey(&quot;Environment&quot;);&lt;br /&gt;     RegHomePath.WriteString(&quot;RESIN_HOME&quot;,(LPCTSTR)srcFilePath); //D:\resin-3.2.0&lt;br /&gt;     &lt;br /&gt;     useless.Format(&quot;%s\\bin;%s&quot;,srcFilePath.GetBuffer(0),useful.GetBuffer(0));&lt;br /&gt;     useful=useless;&lt;br /&gt;     SysJavaHome.WriteString(&quot;Path&quot;,(LPCTSTR)useful);&lt;br /&gt;     Sleep(5000);&lt;br /&gt;    }&lt;br /&gt;    else if(srcFileName.Find(&quot;ant&quot;)&gt;0)&lt;br /&gt;    {&lt;br /&gt;     string StrPath;&lt;br /&gt;     &lt;br /&gt;     CRegEdit SysJavaHome;string StrJavaHome;&lt;br /&gt;     SysJavaHome.m_RootKey=HKEY_LOCAL_MACHINE;&lt;br /&gt;     SysJavaHome.OpenKey(&quot;SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment&quot;);&lt;br /&gt;     &lt;br /&gt;     &lt;br /&gt;     CRegEdit RegHomePath;&lt;br /&gt;     RegHomePath.m_RootKey=HKEY_CURRENT_USER;&lt;br /&gt;     RegHomePath.OpenKey(&quot;Environment&quot;);&lt;br /&gt;     RegHomePath.WriteString(&quot;ANT_HOME&quot;,(LPCTSTR)srcFilePath); //D:\apache-ant-1.7.1\ PATH=%ANT_HOME%/bin&lt;br /&gt;     &lt;br /&gt;     useless.Format(&quot;%s\\bin;%s&quot;,srcFilePath.GetBuffer(0),useful.GetBuffer(0));&lt;br /&gt;     useful=useless;&lt;br /&gt;     SysJavaHome.WriteString(&quot;Path&quot;,(LPCTSTR)useful);&lt;br /&gt;     Sleep(5000);&lt;br /&gt;    }&lt;br /&gt;    else if(srcFileName.Find(&quot;eclipse&quot;)==0 || srcFileName.Find(&quot;NetBeans&quot;)==0)&lt;br /&gt;    {&lt;br /&gt;     //char * xmFile=&quot;&quot;;&lt;br /&gt;     //SaveFileToStr(&quot;deploy.xml&quot;,xmFile);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;   continue;&lt;br /&gt; }&lt;br /&gt;*/&lt;br /&gt;53.选择文件夹对话框&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Windows.Forms.Design;;//加载System.Design.dll的.Net API&lt;br /&gt;*/&lt;br /&gt;       public class FolderDialog : FolderNameEditor&lt;br /&gt;        {&lt;br /&gt;            FolderNameEditor.FolderBrowser fDialog = new&lt;br /&gt;            System.Windows.Forms.Design.FolderNameEditor.FolderBrowser();&lt;br /&gt;            public FolderDialog()&lt;br /&gt;            {&lt;br /&gt;            }&lt;br /&gt;            public DialogResult DisplayDialog()&lt;br /&gt;            {&lt;br /&gt;return DisplayDialog(&quot;请选择一个文件夹&quot;);&lt;br /&gt;            }&lt;br /&gt;            public DialogResult DisplayDialog(string description)&lt;br /&gt;            {&lt;br /&gt;fDialog.Description = description;&lt;br /&gt;return fDialog.ShowDialog();&lt;br /&gt;            }&lt;br /&gt;            public string Path&lt;br /&gt;            {&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;    return fDialog.DirectoryPath;&lt;br /&gt;}&lt;br /&gt;            }&lt;br /&gt;            ~FolderDialog()&lt;br /&gt;            {&lt;br /&gt;fDialog.Dispose();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;            FolderDialog aa = new FolderDialog();&lt;br /&gt;            aa.DisplayDialog();&lt;br /&gt;            if(aa.ShowDialog()==DialogResult.OK)&lt;br /&gt;            {&lt;br /&gt;                %%1 = aa.SelectedPath;&lt;br /&gt;            }&lt;br /&gt;54.删除空文件夹&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Text.RegularExpressions;&lt;br /&gt;*/&lt;br /&gt;bool   IsValidFileChars(string   strIn)  &lt;br /&gt;  {  &lt;br /&gt;          Regex   regEx   =   new   Regex(&quot;[\\*\\\\/:?&lt;&gt;|\&quot;]&quot;);&lt;br /&gt;          return   !regEx.IsMatch(&quot;aj\\pg&quot;);  &lt;br /&gt;  }  &lt;br /&gt;                    try&lt;br /&gt;                    {&lt;br /&gt;                string path = %%1;&lt;br /&gt;if(!IsValidFileChars(path))&lt;br /&gt;throw new Exception(&quot;非法目录名！&quot;);&lt;br /&gt;if(!Directory.Exists(path))&lt;br /&gt;throw new Exception(&quot;本地目录路径不存在！&quot;);&lt;br /&gt;                DirectoryInfo dir = new DirectoryInfo(path);&lt;br /&gt;                FileSystemInfo[] fileArr = dir.GetFileSystemInfos();&lt;br /&gt;                Queue&lt;String&gt; Folders = new Queue&lt;String&gt;(Directory.GetDirectories(aa.Path));&lt;br /&gt;                while (Folders.Count &gt; 0)&lt;br /&gt;                {&lt;br /&gt;                    path = Folders.Dequeue();&lt;br /&gt;                    string[] dirs = Directory.GetDirectories(path);&lt;br /&gt;                        Directory.Delete(path);&lt;br /&gt;                    }&lt;br /&gt;                        foreach (string direct in dirs)&lt;br /&gt;                        {&lt;br /&gt;                            Folders.Enqueue(direct);&lt;br /&gt;                        }&lt;br /&gt;                    catch (Exception ep)&lt;br /&gt;                    {&lt;br /&gt;MessageBox.show(ep.ToString());&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;55.发送数据到剪贴板&lt;br /&gt;//using System.Windows.Forms;&lt;br /&gt;Clipboard.SetText(%%1);&lt;br /&gt;56.从剪贴板中取数据&lt;br /&gt;//using System.Windows.Forms;&lt;br /&gt; IDataObject iData = Clipboard.GetDataObject();&lt;br /&gt; string %%1;&lt;br /&gt;   // 将数据与指定的格式进行匹配，返回bool&lt;br /&gt;   if (iData.GetDataPresent(DataFormats.Text))&lt;br /&gt;   {&lt;br /&gt;    // GetData检索数据并指定一个格式&lt;br /&gt;    %%1 = (string)iData.GetData(DataFormats.Text);&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    MessageBox.Show(&quot;目前剪贴板中数据不可转换为文本&quot;,&quot;错误&quot;);&lt;br /&gt;   }&lt;br /&gt;57.获取文件路径的父路径&lt;br /&gt;//using System.IO;&lt;br /&gt;string %%2=Directory.GetParent(%%1);&lt;br /&gt;58.创建快捷方式&lt;br /&gt;//首先添加以下引用：COM下Windows Script. Host Object Model，然后可以通过以下方法创建快捷方式。&lt;br /&gt;/*&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;using IWshRuntimeLibrary;&lt;br /&gt;*/&lt;br /&gt;string app = %%1;&quot;http://localhost/TrainManage/Default.aspx&quot;&lt;br /&gt;string location1 = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Favorites) + &quot;\\培训教学教务管理系统.url&quot;;&lt;br /&gt;string location2 = System.Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory) + &quot;\\培训教学教务管理系统.url&quot;;&lt;br /&gt;string location3 = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Programs) + &quot;\\培训教学教务管理系统.url&quot;;&lt;br /&gt;try {&lt;br /&gt;  // Create a Windows Script. Host Shell class&lt;br /&gt;  IWshShell_Class shell = new IWshShell_ClassClass();&lt;br /&gt;  // Define the shortcut file&lt;br /&gt;  IWshURLShortcut shortcut = shell.CreateShortcut(location1) as IWshURLShortcut;&lt;br /&gt;  shortcut.TargetPath = app;&lt;br /&gt;  // Save it&lt;br /&gt;  shortcut.Save();&lt;br /&gt;  shortcut = shell.CreateShortcut(location2) as IWshURLShortcut;shortcut.TargetPath = app;&lt;br /&gt;                   // Save it&lt;br /&gt;                   shortcut.Save();&lt;br /&gt;                   shortcut = shell.CreateShortcut(location3) as IWshURLShortcut;&lt;br /&gt;                   shortcut.TargetPath = app;&lt;br /&gt;                   // Save it&lt;br /&gt;                   shortcut.Save();&lt;br /&gt;              }&lt;br /&gt;              catch(COMException ex)&lt;br /&gt;              {&lt;br /&gt; Console.WriteLine(ex.Message);&lt;br /&gt;}&lt;br /&gt;59.弹出快捷菜单&lt;br /&gt;//在工具箱中找到ContextMenuStrip控件，并拖放至Form1窗体&lt;br /&gt;//设计菜单内容&lt;br /&gt;//将contextMenuStrip1与窗体关联。方法是先选定Form1，为其ContextMenuStrip属性设置属性值为contextMenuStrip1&lt;br /&gt;60.文件夹复制到整合操作&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;            FolderDialog aa = new FolderDialog();&lt;br /&gt;            aa.DisplayDialog();&lt;br /&gt;            if (aa.Path != &quot;&quot;)&lt;br /&gt;            {&lt;br /&gt;                string path = (aa.Path.LastIndexOf(&quot;\\&quot;) == aa.Path.Length - 1) ? aa.Path : aa.Path+&quot;\\&quot;;&lt;br /&gt;                string parent = Path.GetDirectoryName(%%1);&lt;br /&gt;                Directory.CreateDirectory(path + Path.GetFileName(%%1));&lt;br /&gt;                %%1 = (%%1.LastIndexOf(&quot;\\&quot;) == %%1.Length - 1) ? %%1 : %%1 + &quot;\\&quot;;&lt;br /&gt;                DirectoryInfo dir = new DirectoryInfo(%%1);&lt;br /&gt;                FileSystemInfo[] fileArr = dir.GetFileSystemInfos();&lt;br /&gt;                Queue&lt;FileSystemInfo&gt; Folders = new Queue&lt;FileSystemInfo&gt;(dir.GetFileSystemInfos());&lt;br /&gt;                while (Folders.Count&gt;0)&lt;br /&gt;                {&lt;br /&gt;                    FileSystemInfo tmp = Folders.Dequeue();&lt;br /&gt;                    FileInfo f = tmp as FileInfo;&lt;br /&gt;                    if (f == null)&lt;br /&gt;                    {&lt;br /&gt;                        DirectoryInfo d = tmp as DirectoryInfo;&lt;br /&gt;                        Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf(&quot;\\&quot;) == parent.Length - 1) ? parent : parent + &quot;\\&quot;, path));&lt;br /&gt;                        foreach (FileSystemInfo fi in d.GetFileSystemInfos())&lt;br /&gt;                        {&lt;br /&gt;                            Folders.Enqueue(fi);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    else&lt;br /&gt;                    {&lt;br /&gt;                        f.CopyTo(f.FullName.Replace(parent, path));&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;61.文件夹移动到整合操作&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;            FolderDialog aa = new FolderDialog();&lt;br /&gt;            aa.DisplayDialog();&lt;br /&gt;            if (aa.Path != &quot;&quot;)&lt;br /&gt;            {&lt;br /&gt;                string filename = Path.GetFileName(%%1);&lt;br /&gt;                string path=(aa.Path.LastIndexOf(&quot;\\&quot;) == aa.Path.Length - 1) ? aa.Path : aa.Path + &quot;\\&quot;;&lt;br /&gt;                if (Path.GetPathRoot(%%1) == Path.GetPathRoot(aa.Path))&lt;br /&gt;                    Directory.Move(%%1, path + filename);&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    string parent = Path.GetDirectoryName(%%1);&lt;br /&gt;                    Directory.CreateDirectory(path + Path.GetFileName(%%1));&lt;br /&gt;                    %%1 = (%%1.LastIndexOf(&quot;\\&quot;) == %%1.Length - 1) ? %%1 : %%1 + &quot;\\&quot;;&lt;br /&gt;                    DirectoryInfo dir = new DirectoryInfo(%%1);&lt;br /&gt;                    FileSystemInfo[] fileArr = dir.GetFileSystemInfos();&lt;br /&gt;                    Queue&lt;FileSystemInfo&gt; Folders = new Queue&lt;FileSystemInfo&gt;(dir.GetFileSystemInfos());&lt;br /&gt;                    while (Folders.Count &gt; 0)&lt;br /&gt;                    {&lt;br /&gt;                        FileSystemInfo tmp = Folders.Dequeue();&lt;br /&gt;                        FileInfo f = tmp as FileInfo;&lt;br /&gt;                        if (f == null)&lt;br /&gt;                        {&lt;br /&gt;                            DirectoryInfo d = tmp as DirectoryInfo;&lt;br /&gt;                            DirectoryInfo dpath = new DirectoryInfo(d.FullName.Replace((parent.LastIndexOf(&quot;\\&quot;) == parent.Length - 1) ? parent : parent + &quot;\\&quot;, path));&lt;br /&gt;                            dpath.Create();&lt;br /&gt;                            foreach (FileSystemInfo fi in d.GetFileSystemInfos())&lt;br /&gt;                            {&lt;br /&gt;                                Folders.Enqueue(fi);&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                        else&lt;br /&gt;                        {&lt;br /&gt;                            f.MoveTo(f.FullName.Replace(parent, path));&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    Directory.Delete(%%1, true);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;62.目录下所有文件夹复制到整合操作&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;            FolderDialog aa = new FolderDialog();&lt;br /&gt;            aa.DisplayDialog();&lt;br /&gt;            if (aa.Path != &quot;&quot;)&lt;br /&gt;            {&lt;br /&gt;                string direc = %%1;//获取选中的节点的完整路径&lt;br /&gt;                foreach (string dirStr in Directory.GetDirectories(direc))&lt;br /&gt;                {&lt;br /&gt;                    DirectoryInfo dir = new DirectoryInfo(dirStr);&lt;br /&gt;                    ArrayList folders = new ArrayList();&lt;br /&gt;                    FileSystemInfo[] fileArr = dir.GetFileSystemInfos();&lt;br /&gt;                    folders.AddRange(fileArr);&lt;br /&gt;                    for (int i = 0; i &lt; folders.Count; i++)&lt;br /&gt;                    {&lt;br /&gt;                        FileInfo f = folders[i] as FileInfo;&lt;br /&gt;                        if (f == null)&lt;br /&gt;                        {&lt;br /&gt;                            DirectoryInfo d = folders[i] as DirectoryInfo;&lt;br /&gt;                            Directory.CreateDirectory(aa.Path + d.Name);&lt;br /&gt;                            folders.AddRange(d.GetFileSystemInfos());&lt;br /&gt;                        }&lt;br /&gt;                        else&lt;br /&gt;                            File.Copy(f.FullName, aa.Path + f.Name);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;63.目录下所有文件夹移动到整合操作&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;            FolderDialog aa = new FolderDialog();&lt;br /&gt;            aa.DisplayDialog();&lt;br /&gt;            if (aa.Path != &quot;&quot;)&lt;br /&gt;            {&lt;br /&gt;                TreeNode CurSelNode = this.DirectorytreeView.SelectedNode;//获取选中的节点&lt;br /&gt;                string direc = this.GetNodeFullPath(CurSelNode);//获取选中的节点的完整路径&lt;br /&gt;                if (Path.GetPathRoot(direc) == Path.GetPathRoot(aa.Path))&lt;br /&gt;                    foreach (string dir in Directory.GetDirectories(direc))&lt;br /&gt;                        Directory.Move(dir, aa.Path);&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    foreach (string dir2 in Directory.GetDirectories(direc))&lt;br /&gt;                    {&lt;br /&gt;                        string parent = Path.GetDirectoryName(dir2);&lt;br /&gt;                        Directory.CreateDirectory(Path.Combine(aa.Path, Path.GetFileName(dir2)));&lt;br /&gt;                        string dir = (dir2.LastIndexOf(&quot;\\&quot;) == dir2.Length - 1) ? dir2 : dir2 + &quot;\\&quot;;&lt;br /&gt;                        DirectoryInfo dirdir = new DirectoryInfo(dir);&lt;br /&gt;                        FileSystemInfo[] fileArr = dirdir.GetFileSystemInfos();&lt;br /&gt;                        Queue&lt;FileSystemInfo&gt; Folders = new Queue&lt;FileSystemInfo&gt;(dirdir.GetFileSystemInfos());&lt;br /&gt;                        while (Folders.Count &gt; 0)&lt;br /&gt;                        {&lt;br /&gt;                            FileSystemInfo tmp = Folders.Dequeue();&lt;br /&gt;                            FileInfo f = tmp as FileInfo;&lt;br /&gt;                            if (f == null)&lt;br /&gt;                            {&lt;br /&gt;                                DirectoryInfo d = tmp as DirectoryInfo;&lt;br /&gt;                                DirectoryInfo dpath = new DirectoryInfo(d.FullName.Replace((parent.LastIndexOf(&quot;\\&quot;) == parent.Length - 1) ? parent : parent + &quot;\\&quot;, aa.Path));&lt;br /&gt;                                dpath.Create();&lt;br /&gt;                                foreach (FileSystemInfo fi in d.GetFileSystemInfos())&lt;br /&gt;                                {&lt;br /&gt;                                    Folders.Enqueue(fi);&lt;br /&gt;                                }&lt;br /&gt;                            }&lt;br /&gt;                            else&lt;br /&gt;                            {&lt;br /&gt;                                f.MoveTo(f.FullName.Replace(parent, aa.Path));&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                        dirdir.Delete(true);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;64.目录下所有文件复制到整合操作&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;            FolderDialog aa = new FolderDialog();&lt;br /&gt;            aa.DisplayDialog();&lt;br /&gt;            if (aa.Path != &quot;&quot;)&lt;br /&gt;            {&lt;br /&gt;                string direc = %%1;//获取选中的节点的完整路径&lt;br /&gt;                foreach (string fileStr in Directory.GetFiles(direc))&lt;br /&gt;                    File.Copy((direc.LastIndexOf(&quot;\\&quot;) == direc.Length - 1) ? direc + Path.GetFileName(fileStr) : direc + &quot;\\&quot; + Path.GetFileName(fileStr), (aa.Path.LastIndexOf(&quot;\\&quot;) == aa.Path.Length - 1) ? aa.Path + Path.GetFileName(fileStr) : aa.Path + &quot;\\&quot; + Path.GetFileName(fileStr));&lt;br /&gt;            }&lt;br /&gt;65.目录下所有文件移动到整合操作&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;            FolderDialog aa = new FolderDialog();&lt;br /&gt;            aa.DisplayDialog();&lt;br /&gt;            if (aa.Path != &quot;&quot;)&lt;br /&gt;            {&lt;br /&gt;                string direc = %%1;//获取选中的节点的完整路径&lt;br /&gt;                foreach (string fileStr in Directory.GetFiles(direc))&lt;br /&gt;                    File.Move((direc.LastIndexOf(&quot;\\&quot;) == direc.Length - 1) ? direc + Path.GetFileName(fileStr) : direc + &quot;\\&quot; + Path.GetFileName(fileStr), (aa.Path.LastIndexOf(&quot;\\&quot;) == aa.Path.Length - 1) ? aa.Path + Path.GetFileName(fileStr) : aa.Path + &quot;\\&quot; + Path.GetFileName(fileStr));&lt;br /&gt;                DirectoryInfolistView.Clear();&lt;br /&gt;            }&lt;br /&gt;66.对目标压缩文件解压缩到指定文件夹&lt;br /&gt;/*&lt;br /&gt;using System.Runtime.Serialization;&lt;br /&gt;using System.Runtime.Serialization.Formatters.Binary;&lt;br /&gt;using System.Collections;&lt;br /&gt;System.Design.dll&lt;br /&gt;using System.IO.Compression;&lt;br /&gt;*/&lt;br /&gt;        private void DeSerializeFiles(Stream s, string dirPath)&lt;br /&gt;        {&lt;br /&gt;            BinaryFormatter b = new BinaryFormatter();&lt;br /&gt;            ArrayList list = (ArrayList)b.Deserialize(s);&lt;br /&gt;            foreach (SerializeFileInfo f in list)&lt;br /&gt;            {&lt;br /&gt;                string newName = dirPath + Path.GetFileName(f.FileName);&lt;br /&gt;                using (FileStream fs = new FileStream(newName, FileMode.Create, FileAccess.Write))&lt;br /&gt;                {&lt;br /&gt;                    fs.Write(f.FileBuffer, 0, f.FileBuffer.Length);&lt;br /&gt;                    fs.Close();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        public void DeCompress(string fileName, string dirPath)&lt;br /&gt;        {&lt;br /&gt;            using (Stream source = File.OpenRead(fileName))&lt;br /&gt;            {&lt;br /&gt;                using (Stream destination = new MemoryStream())&lt;br /&gt;                {&lt;br /&gt;                    using (GZipStream input = new GZipStream(source, CompressionMode.Decompress, true))&lt;br /&gt;                    {&lt;br /&gt;                        byte[] bytes = new byte[4096];&lt;br /&gt;                        int n;&lt;br /&gt;                        while ((n = input.Read(bytes, 0, bytes.Length)) != 0)&lt;br /&gt;                        {&lt;br /&gt;destination.Write(bytes, 0, n);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    destination.Flush();&lt;br /&gt;                    destination.Position = 0;&lt;br /&gt;                    DeSerializeFiles(destination, dirPath);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;67.创建目录副本整合操作&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;            FolderDialog aa = new FolderDialog();&lt;br /&gt;            aa.DisplayDialog();&lt;br /&gt;            bool b = MessageBox.Show(&quot;是否也创建空文件？&quot;, &quot;构建文件夹框架&quot;, MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK ? true : false;&lt;br /&gt;            if (aa.Path != &quot;&quot;)&lt;br /&gt;            {&lt;br /&gt;                string path = (aa.Path.LastIndexOf(&quot;\\&quot;) == aa.Path.Length - 1) ? aa.Path : aa.Path + &quot;\\&quot;;&lt;br /&gt;                string parent = Path.GetDirectoryName(%%1);&lt;br /&gt;                Directory.CreateDirectory(path + Path.GetFileName(%%1));&lt;br /&gt;                %%1 = (%%1.LastIndexOf(&quot;\\&quot;) == %%1.Length - 1) ? %%1 : %%1 + &quot;\\&quot;;&lt;br /&gt;                DirectoryInfo dir = new DirectoryInfo(%%1);&lt;br /&gt;                FileSystemInfo[] fileArr = dir.GetFileSystemInfos();&lt;br /&gt;                Queue&lt;FileSystemInfo&gt; Folders = new Queue&lt;FileSystemInfo&gt;(dir.GetFileSystemInfos());&lt;br /&gt;                while (Folders.Count &gt; 0)&lt;br /&gt;                {&lt;br /&gt;                    FileSystemInfo tmp = Folders.Dequeue();&lt;br /&gt;                    FileInfo f = tmp as FileInfo;&lt;br /&gt;                    if (f == null)&lt;br /&gt;                    {&lt;br /&gt;                        DirectoryInfo d = tmp as DirectoryInfo;&lt;br /&gt;                        Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf(&quot;\\&quot;) == parent.Length - 1) ? parent : parent + &quot;\\&quot;, path));&lt;br /&gt;                        foreach (FileSystemInfo fi in d.GetFileSystemInfos())&lt;br /&gt;                        {&lt;br /&gt;                            Folders.Enqueue(fi);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    else&lt;br /&gt;                    {&lt;br /&gt;                        if(b) File.Create(f.FullName.Replace(parent, path));&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;68.打开网页&lt;br /&gt;System.Diagnostics.Process.Start(&quot;IEXPLORE.EXE&quot;, &quot;http://ant.sourceforge.net/&quot;);&lt;br /&gt;69.删除空文件夹整合操作&lt;br /&gt;//using System.IO;&lt;br /&gt;           FolderDialog aa = new FolderDialog();&lt;br /&gt;            aa.DisplayDialog();&lt;br /&gt;            if (aa.Path != &quot;&quot;)&lt;br /&gt;            {&lt;br /&gt;                string path = aa.Path;&lt;br /&gt;                DirectoryInfo dir = new DirectoryInfo(aa.Path);&lt;br /&gt;                FileSystemInfo[] fileArr = dir.GetFileSystemInfos();&lt;br /&gt;                Queue&lt;String&gt; Folders = new Queue&lt;String&gt;(Directory.GetDirectories(aa.Path));&lt;br /&gt;                while (Folders.Count &gt; 0)&lt;br /&gt;                {&lt;br /&gt;                    path = Folders.Dequeue();&lt;br /&gt;                    string[] dirs = Directory.GetDirectories(path);&lt;br /&gt;                    try&lt;br /&gt;                    {&lt;br /&gt;                        Directory.Delete(path);&lt;br /&gt;                    }&lt;br /&gt;                    catch (Exception)&lt;br /&gt;                    {&lt;br /&gt;                        foreach (string direct in dirs)&lt;br /&gt;                        {&lt;br /&gt;                            Folders.Enqueue(direct);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;70.获取磁盘所有分区后再把光驱盘符去除(用&quot;\0&quot;代替)，把结果放在数组allfenqu[] 中，数组中每个元素代表一个分区盘符，不包括 :\\ 这样的路径，allfenqu[]数组开始时存放的是所有盘符。&lt;br /&gt;当我用这样的代码测试结果是正确的，光驱盘符会被去掉：&lt;br /&gt;//using System.IO;&lt;br /&gt;stringroot; //root代表盘符路径&lt;br /&gt;for(i=0;i&lt;20;i++) //0-20代表最大的盘符数&lt;br /&gt;{&lt;br /&gt;root.Format(&quot;%c:\\&quot;,allfenqu[i]);&lt;br /&gt;if(GetDriveType(root)==5)&lt;br /&gt;allfenqu[i]=&#39;\0&#39;;&lt;br /&gt;}&lt;br /&gt;但我用这样的代码时结果却无法去掉光驱盘符，allfenqu[]中还是会包含光驱盘符：&lt;br /&gt;stringroot;&lt;br /&gt;for(i=0;i&lt;20;i++)&lt;br /&gt;{&lt;br /&gt;root=allfenqu[i]+&quot;:\\&quot;;&lt;br /&gt;if(GetDriveType(root)==5)&lt;br /&gt;allfenqu[i]=&#39;\0&#39;;&lt;br /&gt;}&lt;br /&gt;71.激活一个程序或程序关联的文件&lt;br /&gt;//using System.Diagnostics;&lt;br /&gt;Process LandFileDivisison;&lt;br /&gt;                    LandFileDivisison = new System.Diagnostics.Process();&lt;br /&gt;                    LandFileDivisison.StartInfo.FileName = %%1;&lt;br /&gt;                    LandFileDivisison.Start();&lt;br /&gt;72.HTTP下载&lt;br /&gt;/*&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Threading;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Net;&lt;br /&gt;*/&lt;br /&gt;        private WebClient client = new WebClient();&lt;br /&gt;            Thread th = new Thread(new ThreadStart(StartDownload));&lt;br /&gt;            th.Start();&lt;br /&gt;        private void StartDownload()&lt;br /&gt;        {&lt;br /&gt;            //Start.Enabled = false;&lt;br /&gt;            string URL = %%1;&lt;br /&gt;            int n = URL.LastIndexOf(&quot;/&quot;);&lt;br /&gt;            string URLAddress = URL.Substring(0, n);&lt;br /&gt;            string fileName = URL.Substring(n + 1, URL.Length - n - 1);&lt;br /&gt;            string Dir = %%2;&lt;br /&gt;            string Path = Dir.ToString() + &quot;\\&quot; + fileName;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                WebRequest myre = WebRequest.Create(URLAddress);&lt;br /&gt;            }&lt;br /&gt;            catch (WebException exp)&lt;br /&gt;            {&lt;br /&gt;                MessageBox.Show(exp.Message, &quot;Error&quot;);&lt;br /&gt;            }&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                //statusBar.Text = &quot;开始下载文件...&quot;;&lt;br /&gt;                client.DownloadFile(URLAddress, fileName);&lt;br /&gt;                Stream str = client.OpenRead(URLAddress);&lt;br /&gt;                StreamReader reader = new StreamReader(str);&lt;br /&gt;                byte[] mbyte = new byte[100000];&lt;br /&gt;                int allmybyte = (int)mbyte.Length;&lt;br /&gt;                int startmbyte = 0;&lt;br /&gt;                //statusBar.Text = &quot;正在接收数据...&quot;;&lt;br /&gt;                while (allmybyte &gt; 0)&lt;br /&gt;                {&lt;br /&gt;                    int m = str.Read(mbyte, startmbyte, allmybyte);&lt;br /&gt;                    if (m == 0)&lt;br /&gt;                        break;&lt;br /&gt;                    startmbyte += m;&lt;br /&gt;                    allmybyte -= m;&lt;br /&gt;                }&lt;br /&gt;                FileStream fstr = new FileStream(Path, FileMode.OpenOrCreate, FileAccess.Write);&lt;br /&gt;                fstr.Write(mbyte, 0, startmbyte);&lt;br /&gt;                str.Close();&lt;br /&gt;                fstr.Close();&lt;br /&gt;                //statusBar.Text = &quot;下载完毕！&quot;;&lt;br /&gt;                MessageBox.Show(&quot;下载完毕&quot;);&lt;br /&gt;            }&lt;br /&gt;            catch (WebException exp)&lt;br /&gt;            {&lt;br /&gt;                MessageBox.Show(exp.Message, &quot;Error&quot;);&lt;br /&gt;                //statusBar.Text = &quot;&quot;;&lt;br /&gt;            }&lt;br /&gt;            Start.Enabled = true;&lt;br /&gt;        }&lt;br /&gt;73.FTP下载&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Text.RegularExpressions;&lt;br /&gt;*/&lt;br /&gt;bool   IsValidFileChars(string   strIn)  &lt;br /&gt;  {  &lt;br /&gt;          Regex   regEx   =   new   Regex(&quot;[\\*\\\\/:?&lt;&gt;|\&quot;]&quot;);&lt;br /&gt;          return   !regEx.IsMatch(&quot;aj\\pg&quot;);  &lt;br /&gt;  }  &lt;br /&gt;public bool DownloadFile(string RemoteFileName, string LocalPath)&lt;br /&gt;{&lt;br /&gt;return DownloadFile(RemoteFileName, LocalPath, RemoteFileName);&lt;br /&gt;}&lt;br /&gt;/**//// &lt;summary&gt;&lt;br /&gt;/// 从FTP服务器下载文件，指定本地路径和本地文件名&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;RemoteFileName&quot;&gt;远程文件名&lt;/param&gt;&lt;br /&gt;/// &lt;param name=&quot;LocalPath&quot;&gt;本地路径&lt;/param&gt;&lt;br /&gt;/// &lt;param name=&quot;LocalFilePath&quot;&gt;保存文件的本地路径,后面带有&quot;\&quot;&lt;/param&gt;&lt;br /&gt;/// &lt;param name=&quot;LocalFileName&quot;&gt;保存本地的文件名&lt;/param&gt;&lt;br /&gt;public bool DownloadFile(string RemoteFileName, string LocalPath, string LocalFileName)&lt;br /&gt;{&lt;br /&gt;byte[] bt = null;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;if (!IsValidFileChars(RemoteFileName) || !IsValidFileChars(LocalFileName) || !IsValidPathChars(LocalPath))&lt;br /&gt;{&lt;br /&gt;throw new Exception(&quot;非法文件名或目录名!&quot;);&lt;br /&gt;}&lt;br /&gt;if (!Directory.Exists(LocalPath))&lt;br /&gt;{&lt;br /&gt;throw new Exception(&quot;本地文件路径不存在!&quot;);&lt;br /&gt;}&lt;br /&gt;string LocalFullPath = Path.Combine(LocalPath, LocalFileName);&lt;br /&gt;if (File.Exists(LocalFullPath))&lt;br /&gt;{&lt;br /&gt;throw new Exception(&quot;当前路径下已经存在同名文件！&quot;);&lt;br /&gt;}&lt;br /&gt;bt = DownloadFile(RemoteFileName);&lt;br /&gt;if (bt != null)&lt;br /&gt;{&lt;br /&gt;FileStream stream = new FileStream(LocalFullPath, FileMode.Create);&lt;br /&gt;stream.Write(bt, 0, bt.Length);&lt;br /&gt;stream.Flush();&lt;br /&gt;stream.Close();&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch (Exception ep)&lt;br /&gt;{&lt;br /&gt;ErrorMsg = ep.ToString();&lt;br /&gt;throw ep;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;/**//// &lt;summary&gt;&lt;br /&gt;/// 从FTP服务器下载文件，返回文件二进制数据&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;RemoteFileName&quot;&gt;远程文件名&lt;/param&gt;&lt;br /&gt;public byte[] DownloadFile(string RemoteFileName)&lt;br /&gt;{&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;if (!IsValidFileChars(RemoteFileName))&lt;br /&gt;{&lt;br /&gt;throw new Exception(&quot;非法文件名或目录名!&quot;);&lt;br /&gt;}&lt;br /&gt;Response = Open(new Uri(this.Uri.ToString() + RemoteFileName), WebRequestMethods.Ftp.DownloadFile);&lt;br /&gt;Stream Reader = Response.GetResponseStream();&lt;br /&gt;MemoryStream mem = new MemoryStream(1024 * 500);&lt;br /&gt;byte[] buffer = new byte[1024];&lt;br /&gt;int bytesRead = 0;&lt;br /&gt;int TotalByteRead = 0;&lt;br /&gt;while (true)&lt;br /&gt;{&lt;br /&gt;bytesRead = Reader.Read(buffer, 0, buffer.Length);&lt;br /&gt;TotalByteRead += bytesRead;&lt;br /&gt;if (bytesRead == 0)&lt;br /&gt;break;&lt;br /&gt;mem.Write(buffer, 0, bytesRead);&lt;br /&gt;}&lt;br /&gt;if (mem.Length &gt; 0)&lt;br /&gt;{&lt;br /&gt;return mem.ToArray();&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch (Exception ep)&lt;br /&gt;{&lt;br /&gt;ErrorMsg = ep.ToString();&lt;br /&gt;throw ep;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;74.写图像到剪切板 setClipboardImage&lt;br /&gt;//using System.IO;&lt;br /&gt;Bitmap   bm   =new   Bitmap(filename);  &lt;br /&gt;Clipboard.SetDataObject(bm,true);&lt;br /&gt;75.从剪贴板复制图像到窗体&lt;br /&gt;            if (Clipboard.ContainsImage())&lt;br /&gt;            {&lt;br /&gt;               this.pictureBox1.Image =  Clipboard.GetImage();&lt;br /&gt;            }&lt;br /&gt;剪贴板中的数据类型  &lt;br /&gt;//using System.IO;&lt;br /&gt;d.GetDataPresent(DataFormats.Bitmap)//(.Text       .Html)  &lt;br /&gt;  Bitmap   b   =   (Bitmap)d.GetData(DataFormat   Bitmap)  &lt;br /&gt;  粘贴  &lt;br /&gt;  IDataObject   data   =   Clipboard.GetDataObjects;  &lt;br /&gt;  if(Data.GetDataPresent(DataFormats.Bipmap))  &lt;br /&gt;  {  &lt;br /&gt;  b.Save(@&quot;C:\mymap.bmp&quot;);  &lt;br /&gt;  }&lt;br /&gt;76.删除文件夹下的所有文件且不删除文件夹下的文件夹&lt;br /&gt;//using System.IO;&lt;br /&gt;77.XML遍历结点属性值&lt;br /&gt;//using System.IO;&lt;br /&gt;78.拷贝文件名复制文件&lt;br /&gt;//添加引用System.Windows.Forms&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Windows.Forms;&lt;br /&gt;namespace ConsoleApplication1&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            IDataObject iData = Clipboard.GetDataObject();&lt;br /&gt;            string str;&lt;br /&gt;            // 将数据与指定的格式进行匹配，返回bool&lt;br /&gt;            if (iData.GetDataPresent(DataFormats.Text))&lt;br /&gt;            {&lt;br /&gt;                // GetData检索数据并指定一个格式&lt;br /&gt;                str = (string)iData.GetData(DataFormats.Text);&lt;br /&gt;                File.Copy(str, @&quot;C:\&quot; + Path.GetFileName(str));&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                MessageBox.Show(&quot;目前剪贴板中数据不可转换为文本&quot;, &quot;错误&quot;);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;79.开源程序库Xercesc-C++代码工程中内联&lt;br /&gt;using System;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text.RegularExpressions;&lt;br /&gt;using System.Text;&lt;br /&gt;public class InlineXercesc&lt;br /&gt;{&lt;br /&gt;    private const String filter = &quot;.cpp&quot;;&lt;br /&gt;    private ArrayList all = new ArrayList();&lt;br /&gt;    private Queue&lt;String&gt; fal2 = new Queue&lt;String&gt;();&lt;br /&gt;    private static String CurDir = Environment.CurrentDirectory;&lt;br /&gt;    public InlineXercesc(String lib)&lt;br /&gt;    {&lt;br /&gt;        string SourceLib = &quot;D:\\Desktop\\大项目\\xerces-c-3.0.1\\src&quot;;&lt;br /&gt;        string pattern = &quot;include.*?&quot; + lib + &quot;.*?&gt;&quot;; // 第一个参数为需要匹配的字符串&lt;br /&gt;        Match matcher = null;&lt;br /&gt;        Queue&lt;string&gt; fal = new Queue&lt;string&gt;();&lt;br /&gt;        DirectoryInfo delfile = new DirectoryInfo(CurDir);&lt;br /&gt;        foreach (DirectoryInfo files2 in delfile.GetDirectories())&lt;br /&gt;        {&lt;br /&gt;            String enumDir = CurDir + &quot;\\&quot; + files2.Name + &quot;\\&quot;;&lt;br /&gt;            FileSystemInfo[] fileArr = files2.GetFileSystemInfos();&lt;br /&gt;            Queue&lt;FileSystemInfo&gt; folderList = new Queue&lt;FileSystemInfo&gt;(fileArr);&lt;br /&gt;            while (folderList.Count &gt; 0)&lt;br /&gt;            {&lt;br /&gt;                FileSystemInfo tmp = folderList.Dequeue();&lt;br /&gt;                FileInfo f = tmp as FileInfo;&lt;br /&gt;                if (f == null)&lt;br /&gt;                {&lt;br /&gt;                    DirectoryInfo d = tmp as DirectoryInfo;&lt;br /&gt;                    foreach (FileSystemInfo fi in d.GetFileSystemInfos())&lt;br /&gt;                    {&lt;br /&gt;                        folderList.Enqueue(fi);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    StreamReader br = null;&lt;br /&gt;                    try&lt;br /&gt;                    {&lt;br /&gt;                        br = new StreamReader(file);&lt;br /&gt;                        // 打开文件&lt;br /&gt;                    }&lt;br /&gt;                    catch (IOException e)&lt;br /&gt;                    {&lt;br /&gt;                        // 没有打开文件，则产生异常&lt;br /&gt;                        System.Console.Error.WriteLine(&quot;Cannot read &#39;&quot; + f.FullName + &quot;&#39;: &quot; + e.Message);&lt;br /&gt;                        continue;&lt;br /&gt;                    }&lt;br /&gt;                    String line;&lt;br /&gt;                    StringBuilder sb = new StringBuilder(2048);&lt;br /&gt;                    while ((line = br.ReadLine()) != null)&lt;br /&gt;                    {&lt;br /&gt;                        // 读入一行，直到文件结束&lt;br /&gt;                        matcher = Regex.Match(line, pattern); // 匹配字符串&lt;br /&gt;                        if (matcher.Success == true)&lt;br /&gt;                        {&lt;br /&gt;                            // 如果有匹配的字符串，则输出&lt;br /&gt;                            sb.Append(line.Replace(line.Substring(line.IndexOf(&quot;&lt;&quot;), (line.LastIndexOf(&quot;/&quot;) + 1) - (line.IndexOf(&quot;&lt;&quot;))), &quot;\&quot;&quot;).Replace(&#39;&gt;&#39;, &#39;\&quot;&#39;));&lt;br /&gt;                            line = line.Substring(line.IndexOf(&quot;&lt;&quot;) + 1, (line.LastIndexOf(&quot;&gt;&quot;)) - (line.IndexOf(&quot;&lt;&quot;) + 1)).Replace(&#39;/&#39;, &#39;\\&#39;);&lt;br /&gt;                            fal.Enqueue(SourceLib + &quot;\\&quot; + line);&lt;br /&gt;                        }&lt;br /&gt;                        else&lt;br /&gt;                        {&lt;br /&gt;                            sb.Append(line);&lt;br /&gt;                        }&lt;br /&gt;                        sb.Append(&quot;\r\n&quot;);&lt;br /&gt;                    }&lt;br /&gt;                    br.Close(); // 关闭文件&lt;br /&gt;                    StreamWriter w = new StreamWriter(f.FullName);&lt;br /&gt;                    w.WriteLine(sb.ToString());&lt;br /&gt;                    w.Close();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            while (fal.Count &gt; 0)&lt;br /&gt;            {&lt;br /&gt;                String file = fal.Dequeue(); // 第2个参数开始，均为文件名。&lt;br /&gt;                String targetPath = enumDir + file.Substring(file.LastIndexOf(&quot;\\&quot;) + 1);&lt;br /&gt;                if (targetPath.IndexOf(&#39;&lt;&#39;) == -1 &amp;&amp; !!File.Exists(targetPath))&lt;br /&gt;                {&lt;br /&gt;                    File.CreateText(targetPath);&lt;br /&gt;                    StreamReader br = null;&lt;br /&gt;                    String line;&lt;br /&gt;                    try&lt;br /&gt;                    {&lt;br /&gt;                        br = new StreamReader(new StreamReader(file).BaseStream, System.Text.Encoding.UTF7);&lt;br /&gt;                        // 打开文件&lt;br /&gt;                    }&lt;br /&gt;                    catch (IOException e)&lt;br /&gt;                    {&lt;br /&gt;                        // 没有打开文件，则产生异常&lt;br /&gt;                        //UPGRADE_TODO: 在 .NET 中，method &#39;java.lang.Throwable.getMessage&#39; 的等效项可能返回不同的值。. &#39;ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword=&quot;jlca1043&quot;&#39;&lt;br /&gt;                        System.Console.Error.WriteLine(&quot;Cannot read &#39;&quot; + file + &quot;&#39;: &quot; + e.Message);&lt;br /&gt;                        continue;&lt;br /&gt;                    }&lt;br /&gt;                    StreamWriter fw = new StreamWriter(targetPath);&lt;br /&gt;                    while ((line = br.ReadLine()) != null)&lt;br /&gt;                    {&lt;br /&gt;                        // 读入一行，直到文件结束&lt;br /&gt;                        matcher = Regex.Match(line, pattern); // 匹配字符串&lt;br /&gt;                        if (matcher.Success == true)&lt;br /&gt;                        {&lt;br /&gt;                            // 如果有匹配的字符串，则输出&lt;br /&gt;                            fal.Enqueue(SourceLib + &quot;\\&quot; + line.Substring(line.IndexOf(&quot;&lt;&quot;) + 1, (line.LastIndexOf(&quot;&gt;&quot;)) - (line.IndexOf(&quot;&lt;&quot;) + 1)).Replace(&#39;/&#39;, &#39;\\&#39;));&lt;br /&gt;                            line = line.Replace(line.Substring(line.IndexOf(&quot;&lt;&quot;), (line.LastIndexOf(&quot;/&quot;) + 1) - (line.IndexOf(&quot;&lt;&quot;))), &quot;\&quot;&quot;);&lt;br /&gt;                            line = line.Replace(&quot;&gt;&quot;, &quot;\&quot;&quot;);&lt;br /&gt;                        }&lt;br /&gt;                        fw.Write(line + &quot;\r\n&quot;);&lt;br /&gt;                    }&lt;br /&gt;                    fw.Flush();&lt;br /&gt;                    fw.Close();&lt;br /&gt;                    br.Close(); // 关闭文件&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            Queue&lt;string&gt; folderListArr = new Queue&lt;string&gt;();&lt;br /&gt;            folderListArr.Enqueue(CurDir);&lt;br /&gt;            while (folderListArr.Count &gt; 0)&lt;br /&gt;            {&lt;br /&gt;                DirectoryInfo file = new DirectoryInfo(folderListArr.Dequeue());&lt;br /&gt;                FileSystemInfo[] files = file.GetFileSystemInfos();&lt;br /&gt;                for (int i = 0; i &lt; files.Length; i++)&lt;br /&gt;                {&lt;br /&gt;                    DirectoryInfo ddd = files[i] as DirectoryInfo;&lt;br /&gt;                    if (ddd != null)&lt;br /&gt;                    {&lt;br /&gt;                        folderListArr.Enqueue(files[i].FullName);&lt;br /&gt;                    }&lt;br /&gt;                    else&lt;br /&gt;                    {&lt;br /&gt;                        if (files[i].Extension == &quot;.hpp&quot;)&lt;br /&gt;                        {&lt;br /&gt;                            all.Add(files[i].FullName.Replace(&quot;.hpp&quot;, &quot;.cpp&quot;));&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            int count = 1;&lt;br /&gt;            while (count &gt; 0)&lt;br /&gt;            {&lt;br /&gt;                doSearch(SourceLib);&lt;br /&gt;                all.Clear();&lt;br /&gt;                while (fal2.Count &gt; 0)&lt;br /&gt;                {&lt;br /&gt;                    String file1 = fal2.Dequeue(); // 第2个参数开始，均为文件名。&lt;br /&gt;                    String targetPath = enumDir + file1.Substring(file1.LastIndexOf(&quot;\\&quot;) + 1);&lt;br /&gt;                    if (targetPath.IndexOf(&#39;&lt;&#39;) == -1 &amp;&amp; !File.Exists(targetPath))&lt;br /&gt;                    {&lt;br /&gt;File.CreateText(targetPath);&lt;br /&gt;                        StreamReader br = null;&lt;br /&gt;                        String line;&lt;br /&gt;                        try&lt;br /&gt;                        {&lt;br /&gt;                            br = new StreamReader(file1);&lt;br /&gt;                            // 打开文件&lt;br /&gt;                        }&lt;br /&gt;                        catch (IOException e)&lt;br /&gt;                        {&lt;br /&gt;                            System.Console.Error.WriteLine(&quot;Cannot read &#39;&quot; + file1 + &quot;&#39;: &quot; + e.Message);&lt;br /&gt;                            continue;&lt;br /&gt;                        }&lt;br /&gt;                        StreamWriter fw;&lt;br /&gt;                        try&lt;br /&gt;                        {&lt;br /&gt;                            fw = new StreamWriter(targetPath);&lt;br /&gt;                            while ((line = br.ReadLine()) != null)&lt;br /&gt;                            {&lt;br /&gt;                                // 读入一行，直到文件结束&lt;br /&gt;                                matcher = Regex.Match(line, pattern); // 匹配字符串&lt;br /&gt;                                if (matcher.Success == true)&lt;br /&gt;                                {&lt;br /&gt;                                    // 如果有匹配的字符串，则输出&lt;br /&gt;                                    fal2.Enqueue(SourceLib + &quot;\\&quot; + line.Substring(line.IndexOf(&#39;&lt;&#39;) + 1, (line.LastIndexOf(&#39;&gt;&#39;)) - (line.IndexOf(&#39;&lt;&#39;) + 1)).Replace(&#39;/&#39;, &#39;\\&#39;));&lt;br /&gt;                                    all.Add(fal2.Peek().Replace(&quot;.hpp&quot;, &quot;.cpp&quot;));&lt;br /&gt;                                    line = line.Replace(line.Substring(line.IndexOf(&#39;&lt;&#39;), (line.LastIndexOf(&#39;/&#39;) + 1) - (line.IndexOf(&#39;&lt;&#39;))), &quot;\&quot;&quot;);&lt;br /&gt;                                    line = line.Replace(&#39;&gt;&#39;, &#39;\&quot;&#39;);&lt;br /&gt;                                }&lt;br /&gt;                                fw.Write(line + &quot;\r\n&quot;);&lt;br /&gt;                            }&lt;br /&gt;                            fw.Flush();&lt;br /&gt;                            fw.Close();&lt;br /&gt;                            br.Close(); // 关闭文件&lt;br /&gt;                        }&lt;br /&gt;                        catch (IOException e)&lt;br /&gt;                        {&lt;br /&gt;                            Console.Error.WriteLine(e.StackTrace);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                count = all.Count;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    private void doSearch(string path)&lt;br /&gt;    {&lt;br /&gt;        DirectoryInfo filepath = new DirectoryInfo(path);&lt;br /&gt;        if (filepath.Exists)&lt;br /&gt;        {&lt;br /&gt;            FileSystemInfo[] fileArray = filepath.GetFileSystemInfos();&lt;br /&gt;            foreach (FileSystemInfo f in fileArray)&lt;br /&gt;            {&lt;br /&gt;                DirectoryInfo dd = f as DirectoryInfo;&lt;br /&gt;                if (dd != null)&lt;br /&gt;                {&lt;br /&gt;                    doSearch(f.FullName);&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    FileInfo ff = f as FileInfo;&lt;br /&gt;                    if (f.Name.IndexOf(filter) &gt; -1)&lt;br /&gt;                    {&lt;br /&gt;                        foreach (string file in all)&lt;br /&gt;                        {&lt;br /&gt;                            if (file.IndexOf(&#39;&lt;&#39;) == -1 &amp;&amp; Path.GetFileName(file) == f.Name)&lt;br /&gt;                            {&lt;br /&gt;                                fal2.Enqueue(f.FullName);&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    static void Main(String[] args)&lt;br /&gt;    {&lt;br /&gt;        new InlineXercesc(&quot;xercesc&quot;);&lt;br /&gt;        FileInfo f = new FileInfo(CurDir + &quot;\\DetailCpp.cmd&quot;);&lt;br /&gt;        StreamWriter w = f.CreateText();&lt;br /&gt;        w.WriteLine(&quot;copy StdAfx.cpp+*.c+*.cpp &quot; + CurDir&lt;br /&gt;                                        + &quot;\\StdAfx.cpp&amp;&amp; del *.c &amp;&amp; del *.cpp&quot;);&lt;br /&gt;        w.Close();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;80.提取包含头文件列表&lt;br /&gt;//InlineExt.cs&lt;br /&gt;using System;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text.RegularExpressions;&lt;br /&gt;using System.Text;&lt;br /&gt;public class InlineExt&lt;br /&gt;{&lt;br /&gt; private System.String CurDir = Environment.CurrentDirectory;&lt;br /&gt; public InlineExt()&lt;br /&gt; {&lt;br /&gt;        string pattern = &quot;include.*?\&quot;.*?.hpp\&quot;&quot;; // 第一个参数为需要匹配的字符串&lt;br /&gt;        Match matcher = null;&lt;br /&gt;  FileInfo delfile = new System.IO.FileInfo(CurDir);&lt;br /&gt;  FileInfo[] files2 = SupportClass.FileSupport.GetFiles(delfile);&lt;br /&gt;  for (int l = 0; l &lt; files2.Length; l++)&lt;br /&gt;  {&lt;br /&gt;   if (Directory.Exists(files2[l].FullName))&lt;br /&gt;   {&lt;br /&gt;                Queue&lt;String&gt; ts = new Queue&lt;String&gt;();&lt;br /&gt;    FileInfo file = new FileInfo(Path.Combine(files2[l].FullName , &quot;StdAfx.cpp&quot;));&lt;br /&gt;    StreamReader br = null;&lt;br /&gt;    StreamWriter fw = null;&lt;br /&gt;    String line;&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;     br = new StreamReader(new StreamReader(file.FullName, System.Text.Encoding.Default).BaseStream, new System.IO.StreamReader(file.FullName, System.Text.Encoding.Default).CurrentEncoding); // 打开文件&lt;br /&gt;     while ((line = br.ReadLine()) != null)&lt;br /&gt;     {&lt;br /&gt;                        matcher = Regex.Match(line, pattern); // 匹配字符串&lt;br /&gt;                        if (matcher.Success == true)&lt;br /&gt;      {&lt;br /&gt;       // 如果有匹配的字符串，则输出&lt;br /&gt;       ts.Enqueue(line.Substring(line.IndexOf(&#39;\&quot;&#39;) + 1, (line.LastIndexOf(&#39;\&quot;&#39;)) - (line.IndexOf(&#39;\&quot;&#39;) + 1)));&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;     FileInfo file2 = new FileInfo(Path.Combine(files2[l].FullName , &quot;ReadMe.txt&quot;));&lt;br /&gt;     if (File.Exists(file2.FullName))&lt;br /&gt;     {&lt;br /&gt;                        fw = new StreamWriter(file2.FullName, false, System.Text.Encoding.GetEncoding(&quot;GB2312&quot;)); //System.Text.Encoding.Default&lt;br /&gt;                        foreach(string it in ts)&lt;br /&gt;      {&lt;br /&gt;       fw.Write(&quot;#include \&quot;&quot; + it + &quot;\&quot;\r\n&quot;);&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;    catch (IOException e)&lt;br /&gt;    {&lt;br /&gt;     // 没有打开文件，则产生异常&lt;br /&gt;     Console.Error.WriteLine(&quot;Cannot read &#39;&quot; + file + &quot;&#39;: &quot; + e.Message);&lt;br /&gt;     continue;&lt;br /&gt;    }&lt;br /&gt;    finally&lt;br /&gt;    {&lt;br /&gt;     try&lt;br /&gt;     {&lt;br /&gt;      if (br != null)&lt;br /&gt;       br.Close();&lt;br /&gt;      if (fw != null)&lt;br /&gt;       fw.Close();&lt;br /&gt;     }&lt;br /&gt;     catch (IOException e)&lt;br /&gt;     {&lt;br /&gt;      Console.WriteLine(e.StackTrace);&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; public static void  Main(System.String[] args)&lt;br /&gt; {&lt;br /&gt;  new InlineExt();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;//SupportClass.cs&lt;br /&gt;using System;&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Contains conversion support elements such as classes, interfaces and static methods.&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;public class SupportClass&lt;br /&gt;{&lt;br /&gt; /// &lt;summary&gt;&lt;br /&gt; /// Writes the exception stack trace to the received stream&lt;br /&gt; /// &lt;/summary&gt;&lt;br /&gt; /// &lt;param name=&quot;throwable&quot;&gt;Exception to obtain information from&lt;/param&gt;&lt;br /&gt; /// &lt;param name=&quot;stream&quot;&gt;Output sream used to write to&lt;/param&gt;&lt;br /&gt; public static void WriteStackTrace(System.Exception throwable, System.IO.TextWriter stream)&lt;br /&gt; {&lt;br /&gt;  stream.Write(throwable.StackTrace);&lt;br /&gt;  stream.Flush();&lt;br /&gt; }&lt;br /&gt; /*******************************/&lt;br /&gt; /// &lt;summary&gt;&lt;br /&gt; /// Represents the methods to support some operations over files.&lt;br /&gt; /// &lt;/summary&gt;&lt;br /&gt; public class FileSupport&lt;br /&gt; {&lt;br /&gt;  /// &lt;summary&gt;&lt;br /&gt;  /// Creates a new empty file with the specified pathname.&lt;br /&gt;  /// &lt;/summary&gt;&lt;br /&gt;  /// &lt;param name=&quot;path&quot;&gt;The abstract pathname of the file&lt;/param&gt;&lt;br /&gt;  /// &lt;returns&gt;True if the file does not exist and was succesfully created&lt;/returns&gt;&lt;br /&gt;  public static bool CreateNewFile(System.IO.FileInfo path)&lt;br /&gt;  {&lt;br /&gt;   if (path.Exists)&lt;br /&gt;   {&lt;br /&gt;    return false;&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;                System.IO.FileStream createdFile = path.Create();&lt;br /&gt;                createdFile.Close();&lt;br /&gt;    return true;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  /// &lt;summary&gt;&lt;br /&gt;  /// Compares the specified object with the specified path&lt;br /&gt;  /// &lt;/summary&gt;&lt;br /&gt;  /// &lt;param name=&quot;path&quot;&gt;An abstract pathname to compare with&lt;/param&gt;&lt;br /&gt;  /// &lt;param name=&quot;file&quot;&gt;An object to compare with the given pathname&lt;/param&gt;&lt;br /&gt;  /// &lt;returns&gt;A value indicating a lexicographically comparison of the parameters&lt;/returns&gt;&lt;br /&gt;  public static int CompareTo(System.IO.FileInfo path, System.Object file)&lt;br /&gt;  {&lt;br /&gt;   if( file is System.IO.FileInfo )&lt;br /&gt;   {&lt;br /&gt;    System.IO.FileInfo fileInfo = (System.IO.FileInfo)file;&lt;br /&gt;    return path.FullName.CompareTo( fileInfo.FullName );&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    throw new System.InvalidCastException();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  /// &lt;summary&gt;&lt;br /&gt;  /// Returns an array of abstract pathnames representing the files and directories of the specified path.&lt;br /&gt;  /// &lt;/summary&gt;&lt;br /&gt;  /// &lt;param name=&quot;path&quot;&gt;The abstract pathname to list it childs.&lt;/param&gt;&lt;br /&gt;  /// &lt;returns&gt;An array of abstract pathnames childs of the path specified or null if the path is not a directory&lt;/returns&gt;&lt;br /&gt;  public static System.IO.FileInfo[] GetFiles(System.IO.FileInfo path)&lt;br /&gt;  {&lt;br /&gt;   if ( (path.Attributes &amp; System.IO.FileAttributes.Directory) &gt; 0 )&lt;br /&gt;   {                &lt;br /&gt;    String[] fullpathnames = System.IO.Directory.GetFileSystemEntries(path.FullName);&lt;br /&gt;    System.IO.FileInfo[] result = new System.IO.FileInfo[fullpathnames.Length];&lt;br /&gt;    for(int i = 0; i &lt; result.Length ; i++)&lt;br /&gt;     result[i] = new System.IO.FileInfo(fullpathnames[i]);&lt;br /&gt;    return result;&lt;br /&gt;   }&lt;br /&gt;   else return null;&lt;br /&gt;  }&lt;br /&gt;  /// &lt;summary&gt;&lt;br /&gt;  /// Creates an instance of System.Uri class with the pech specified&lt;br /&gt;  /// &lt;/summary&gt;&lt;br /&gt;  /// &lt;param name=&quot;path&quot;&gt;The abstract path name to create the Uri&lt;/param&gt;&lt;br /&gt;  /// &lt;returns&gt;A System.Uri instance constructed with the specified path&lt;/returns&gt;&lt;br /&gt;  public static System.Uri ToUri(System.IO.FileInfo path)&lt;br /&gt;  {&lt;br /&gt;   System.UriBuilder uri = new System.UriBuilder();&lt;br /&gt;   uri.Path = path.FullName;&lt;br /&gt;   uri.Host = String.Empty;&lt;br /&gt;   uri.Scheme = System.Uri.UriSchemeFile;&lt;br /&gt;   return uri.Uri;&lt;br /&gt;  }&lt;br /&gt;  /// &lt;summary&gt;&lt;br /&gt;  /// Returns true if the file specified by the pathname is a hidden file.&lt;br /&gt;  /// &lt;/summary&gt;&lt;br /&gt;  /// &lt;param name=&quot;file&quot;&gt;The abstract pathname of the file to test&lt;/param&gt;&lt;br /&gt;  /// &lt;returns&gt;True if the file is hidden, false otherwise&lt;/returns&gt;&lt;br /&gt;  public static bool IsHidden(System.IO.FileInfo file)&lt;br /&gt;  {&lt;br /&gt;   return ((file.Attributes &amp; System.IO.FileAttributes.Hidden) &gt; 0);&lt;br /&gt;  }&lt;br /&gt;  /// &lt;summary&gt;&lt;br /&gt;  /// Sets the read-only property of the file to true.&lt;br /&gt;  /// &lt;/summary&gt;&lt;br /&gt;  /// &lt;param name=&quot;file&quot;&gt;The abstract path name of the file to modify&lt;/param&gt;&lt;br /&gt;  public static bool SetReadOnly(System.IO.FileInfo file)&lt;br /&gt;  {&lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;    file.Attributes = file.Attributes | System.IO.FileAttributes.ReadOnly;&lt;br /&gt;    return true;&lt;br /&gt;   }&lt;br /&gt;   catch (System.Exception exception)&lt;br /&gt;   {&lt;br /&gt;    String exceptionMessage = exception.Message;&lt;br /&gt;    return false;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  /// &lt;summary&gt;&lt;br /&gt;  /// Sets the last modified time of the specified file with the specified value.&lt;br /&gt;  /// &lt;/summary&gt;&lt;br /&gt;  /// &lt;param name=&quot;file&quot;&gt;The file to change it last-modified time&lt;/param&gt;&lt;br /&gt;  /// &lt;param name=&quot;date&quot;&gt;Total number of miliseconds since January 1, 1970 (new last-modified time)&lt;/param&gt;&lt;br /&gt;  /// &lt;returns&gt;True if the operation succeeded, false otherwise&lt;/returns&gt;&lt;br /&gt;  public static bool SetLastModified(System.IO.FileInfo file, long date)&lt;br /&gt;  {&lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;    long valueConstant = (new System.DateTime(1969, 12, 31, 18, 0, 0)).Ticks;&lt;br /&gt;    file.LastWriteTime = new System.DateTime( (date * 10000L) + valueConstant );&lt;br /&gt;    return true;&lt;br /&gt;   }&lt;br /&gt;   catch (System.Exception exception)&lt;br /&gt;   {&lt;br /&gt;    String exceptionMessage = exception.Message;&lt;br /&gt;    return false;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;81.剪贴扳转换成打印字符&lt;br /&gt;//using System.Windows.Forms;&lt;br /&gt;            IDataObject iData = Clipboard.GetDataObject();&lt;br /&gt;            string str;&lt;br /&gt;            // 将数据与指定的格式进行匹配，返回bool&lt;br /&gt;            if (iData.GetDataPresent(DataFormats.Text))&lt;br /&gt;            {&lt;br /&gt;                // GetData检索数据并指定一个格式&lt;br /&gt;                str = (string)iData.GetData(DataFormats.Text);&lt;br /&gt;                string[] arr = str.Split(&quot;\r\n&quot;.ToCharArray());&lt;br /&gt;                StringBuilder sb = new StringBuilder(1024);&lt;br /&gt;                sb.Append(&quot;System.out.println(\&quot;@echooff\&quot;);\r\n&quot;);&lt;br /&gt;                foreach (string s in arr)&lt;br /&gt;                {&lt;br /&gt;                    if (s.Trim()!=&quot;&quot;)&lt;br /&gt;                    {&lt;br /&gt;                        sb.Append(&quot;System.out.println(\&quot;ECHO &quot; + s.Replace(&quot;^&quot;, &quot;^^&quot;).Replace(&quot;&amp;&quot;, &quot;^&amp;&quot;).Replace(&quot;:&quot;, &quot;^:&quot;).Replace(&quot;&gt;&quot;, &quot;^&gt;&quot;).Replace(&quot;&lt;&quot;, &quot;^&lt;&quot;).Replace(&quot;|&quot;, &quot;^|&quot;).Replace(&quot;\&quot;&quot;, &quot;^\&quot;&quot;).Replace(@&quot;\&quot;, @&quot;\\&quot;).Replace(&quot;\&quot;&quot;, &quot;\\\&quot;&quot;) + &quot;\&quot;);&quot;);&lt;br /&gt;                        sb.Append(&quot;\r\n&quot;);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                Clipboard.SetText(sb.ToString());&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                MessageBox.Show(&quot;目前剪贴板中数据不可转换为文本&quot;, &quot;错误&quot;);&lt;br /&gt;            }&lt;br /&gt;82.把JButton或JTree组件写到一个流中&lt;br /&gt;83.注册全局热键&lt;br /&gt;注册全局热键要用到Windows的API方法RegisterHotKey和UnregisterHotKey。&lt;br /&gt;一、声明注册热键方法 [DllImport(&quot;user32.dll&quot;)]&lt;br /&gt;private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);&lt;br /&gt;[DllImport(&quot;user32.dll&quot;)]&lt;br /&gt;private static extern int UnregisterHotKey(IntPtr hwnd, int id);&lt;br /&gt;int Space = 32; //热键ID&lt;br /&gt;private const int WM_HOTKEY = 0x312; //窗口消息-热键&lt;br /&gt;private const int WM_CREATE = 0x1; //窗口消息-创建&lt;br /&gt;private const int WM_DESTROY = 0x2; //窗口消息-销毁&lt;br /&gt;private const int MOD_ALT = 0x1; //ALT&lt;br /&gt;private const int MOD_CONTROL = 0x2; //CTRL&lt;br /&gt;private const int MOD_SHIFT = 0x4; //SHIFT&lt;br /&gt;private const int VK_SPACE = 0x20; //SPACE&lt;br /&gt;二、注册热键方法 /// &lt;summary&gt;&lt;br /&gt;/// 注册热键&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;hwnd&quot;&gt;窗口句柄&lt;/param&gt;&lt;br /&gt;/// &lt;param name=&quot;hotKey_id&quot;&gt;热键ID&lt;/param&gt;&lt;br /&gt;/// &lt;param name=&quot;fsModifiers&quot;&gt;组合键&lt;/param&gt;&lt;br /&gt;/// &lt;param name=&quot;vk&quot;&gt;热键&lt;/param&gt;&lt;br /&gt;private void RegKey(IntPtr hwnd, int hotKey_id, int fsModifiers, int vk)&lt;br /&gt;{&lt;br /&gt;bool result;&lt;br /&gt;if (RegisterHotKey(hwnd,hotKey_id,fsModifiers,vk) == 0)&lt;br /&gt;{&lt;br /&gt;result = false;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;result = true;&lt;br /&gt;}&lt;br /&gt;if (!result)&lt;br /&gt;{&lt;br /&gt;MessageBox.Show(&quot;注册热键失败！&quot;);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 注销热键&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;hwnd&quot;&gt;窗口句柄&lt;/param&gt;&lt;br /&gt;/// &lt;param name=&quot;hotKey_id&quot;&gt;热键ID&lt;/param&gt;&lt;br /&gt;private void UnRegKey(IntPtr hwnd, int hotKey_id)&lt;br /&gt;{&lt;br /&gt;UnregisterHotKey(hwnd,hotKey_id);&lt;br /&gt;}&lt;br /&gt;三、重写WndProc方法，实现注册 protected override void WndProc(ref Message m)&lt;br /&gt;{&lt;br /&gt;base.WndProc(ref m);&lt;br /&gt;switch(m.Msg)&lt;br /&gt;{&lt;br /&gt;case WM_HOTKEY: //窗口消息-热键&lt;br /&gt;switch(m.WParam.ToInt32())&lt;br /&gt;{&lt;br /&gt;case 32: //热键ID&lt;br /&gt;MessageBox.Show(&quot;Hot Key : Ctrl + Alt + Shift + Space&quot;);&lt;br /&gt;break;&lt;br /&gt;   default:&lt;br /&gt;   break;&lt;br /&gt;}&lt;br /&gt;break;&lt;br /&gt;case WM_CREATE: //窗口消息-创建&lt;br /&gt;RegKey(Handle,Space,MOD_ALT | MOD_CONTROL | MOD_SHIFT,VK_SPACE); //注册热键&lt;br /&gt;break;&lt;br /&gt;case WM_DESTROY: //窗口消息-销毁&lt;br /&gt;UnRegKey(Handle,Space); //销毁热键&lt;br /&gt;break;&lt;br /&gt;default:&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;附：虚拟键值表&lt;br /&gt;{ Virtual Keys, Standard Set }&lt;br /&gt;{$EXTERNALSYM VK_LBUTTON}&lt;br /&gt;VK_LBUTTON = 1;&lt;br /&gt;{$EXTERNALSYM VK_RBUTTON}&lt;br /&gt;VK_RBUTTON = 2;&lt;br /&gt;{$EXTERNALSYM VK_CANCEL}&lt;br /&gt;VK_CANCEL = 3;&lt;br /&gt;{$EXTERNALSYM VK_MBUTTON}&lt;br /&gt;VK_MBUTTON = 4; { NOT contiguous with L &amp; RBUTTON }&lt;br /&gt;{$EXTERNALSYM VK_BACK}&lt;br /&gt;VK_BACK = 8;&lt;br /&gt;{$EXTERNALSYM VK_TAB}&lt;br /&gt;VK_TAB = 9;&lt;br /&gt;{$EXTERNALSYM VK_CLEAR}&lt;br /&gt;VK_CLEAR = 12;&lt;br /&gt;{$EXTERNALSYM VK_RETURN}&lt;br /&gt;VK_RETURN = 13;&lt;br /&gt;{$EXTERNALSYM VK_SHIFT}&lt;br /&gt;VK_SHIFT = $10;&lt;br /&gt;{$EXTERNALSYM VK_CONTROL}&lt;br /&gt;VK_CONTROL = 17;&lt;br /&gt;{$EXTERNALSYM VK_MENU}&lt;br /&gt;VK_MENU = 18;&lt;br /&gt;{$EXTERNALSYM VK_PAUSE}&lt;br /&gt;VK_PAUSE = 19;&lt;br /&gt;{$EXTERNALSYM VK_CAPITAL}&lt;br /&gt;VK_CAPITAL = 20;&lt;br /&gt;{$EXTERNALSYM VK_KANA }&lt;br /&gt;VK_KANA = 21;&lt;br /&gt;{$EXTERNALSYM VK_HANGUL }&lt;br /&gt;VK_HANGUL = 21;&lt;br /&gt;{$EXTERNALSYM VK_JUNJA }&lt;br /&gt;VK_JUNJA = 23;&lt;br /&gt;{$EXTERNALSYM VK_FINAL }&lt;br /&gt;VK_FINAL = 24;&lt;br /&gt;{$EXTERNALSYM VK_HANJA }&lt;br /&gt;VK_HANJA = 25;&lt;br /&gt;{$EXTERNALSYM VK_KANJI }&lt;br /&gt;VK_KANJI = 25;&lt;br /&gt;{$EXTERNALSYM VK_CONVERT }&lt;br /&gt;VK_CONVERT = 28;&lt;br /&gt;{$EXTERNALSYM VK_NONCONVERT }&lt;br /&gt;VK_NONCONVERT = 29;&lt;br /&gt;{$EXTERNALSYM VK_ACCEPT }&lt;br /&gt;VK_ACCEPT = 30;&lt;br /&gt;{$EXTERNALSYM VK_MODECHANGE }&lt;br /&gt;VK_MODECHANGE = 31;&lt;br /&gt;{$EXTERNALSYM VK_ESCAPE}&lt;br /&gt;VK_ESCAPE = 27;&lt;br /&gt;{$EXTERNALSYM VK_SPACE}&lt;br /&gt;VK_SPACE = $20;&lt;br /&gt;{$EXTERNALSYM VK_PRIOR}&lt;br /&gt;VK_PRIOR = 33;&lt;br /&gt;{$EXTERNALSYM VK_NEXT}&lt;br /&gt;VK_NEXT = 34;&lt;br /&gt;{$EXTERNALSYM VK_END}&lt;br /&gt;VK_END = 35;&lt;br /&gt;{$EXTERNALSYM VK_HOME}&lt;br /&gt;VK_HOME = 36;&lt;br /&gt;{$EXTERNALSYM VK_LEFT}&lt;br /&gt;VK_LEFT = 37;&lt;br /&gt;{$EXTERNALSYM VK_UP}&lt;br /&gt;VK_UP = 38;&lt;br /&gt;{$EXTERNALSYM VK_RIGHT}&lt;br /&gt;VK_RIGHT = 39;&lt;br /&gt;{$EXTERNALSYM VK_DOWN}&lt;br /&gt;VK_DOWN = 40;&lt;br /&gt;{$EXTERNALSYM VK_SELECT}&lt;br /&gt;VK_SELECT = 41;&lt;br /&gt;{$EXTERNALSYM VK_PRINT}&lt;br /&gt;VK_PRINT = 42;&lt;br /&gt;{$EXTERNALSYM VK_EXECUTE}&lt;br /&gt;VK_EXECUTE = 43;&lt;br /&gt;{$EXTERNALSYM VK_SNAPSHOT}&lt;br /&gt;VK_SNAPSHOT = 44;&lt;br /&gt;{$EXTERNALSYM VK_INSERT}&lt;br /&gt;VK_INSERT = 45;&lt;br /&gt;{$EXTERNALSYM VK_DELETE}&lt;br /&gt;VK_DELETE = 46;&lt;br /&gt;{$EXTERNALSYM VK_HELP}&lt;br /&gt;VK_HELP = 47;&lt;br /&gt;{ VK_0 thru VK_9 are the same as ASCII &#39;0&#39; thru &#39;9&#39; ($30 - $39) }&lt;br /&gt;{ VK_A thru VK_Z are the same as ASCII &#39;A&#39; thru &#39;Z&#39; ($41 - $5A) }&lt;br /&gt;{$EXTERNALSYM VK_LWIN}&lt;br /&gt;VK_LWIN = 91;&lt;br /&gt;{$EXTERNALSYM VK_RWIN}&lt;br /&gt;VK_RWIN = 92;&lt;br /&gt;{$EXTERNALSYM VK_APPS}&lt;br /&gt;VK_APPS = 93;&lt;br /&gt;{$EXTERNALSYM VK_NUMPAD0}&lt;br /&gt;VK_NUMPAD0 = 96;&lt;br /&gt;{$EXTERNALSYM VK_NUMPAD1}&lt;br /&gt;VK_NUMPAD1 = 97;&lt;br /&gt;{$EXTERNALSYM VK_NUMPAD2}&lt;br /&gt;VK_NUMPAD2 = 98;&lt;br /&gt;{$EXTERNALSYM VK_NUMPAD3}&lt;br /&gt;VK_NUMPAD3 = 99;&lt;br /&gt;{$EXTERNALSYM VK_NUMPAD4}&lt;br /&gt;VK_NUMPAD4 = 100;&lt;br /&gt;{$EXTERNALSYM VK_NUMPAD5}&lt;br /&gt;VK_NUMPAD5 = 101;&lt;br /&gt;{$EXTERNALSYM VK_NUMPAD6}&lt;br /&gt;VK_NUMPAD6 = 102;&lt;br /&gt;{$EXTERNALSYM VK_NUMPAD7}&lt;br /&gt;VK_NUMPAD7 = 103;&lt;br /&gt;{$EXTERNALSYM VK_NUMPAD8}&lt;br /&gt;VK_NUMPAD8 = 104;&lt;br /&gt;{$EXTERNALSYM VK_NUMPAD9}&lt;br /&gt;VK_NUMPAD9 = 105;&lt;br /&gt;{$EXTERNALSYM VK_MULTIPLY}&lt;br /&gt;VK_MULTIPLY = 106;&lt;br /&gt;{$EXTERNALSYM VK_ADD}&lt;br /&gt;VK_ADD = 107;&lt;br /&gt;{$EXTERNALSYM VK_SEPARATOR}&lt;br /&gt;VK_SEPARATOR = 108;&lt;br /&gt;{$EXTERNALSYM VK_SUBTRACT}&lt;br /&gt;VK_SUBTRACT = 109;&lt;br /&gt;{$EXTERNALSYM VK_DECIMAL}&lt;br /&gt;VK_DECIMAL = 110;&lt;br /&gt;{$EXTERNALSYM VK_DIVIDE}&lt;br /&gt;VK_DIVIDE = 111;&lt;br /&gt;{$EXTERNALSYM VK_F1}&lt;br /&gt;VK_F1 = 112;&lt;br /&gt;{$EXTERNALSYM VK_F2}&lt;br /&gt;VK_F2 = 113;&lt;br /&gt;{$EXTERNALSYM VK_F3}&lt;br /&gt;VK_F3 = 114;&lt;br /&gt;{$EXTERNALSYM VK_F4}&lt;br /&gt;VK_F4 = 115;&lt;br /&gt;{$EXTERNALSYM VK_F5}&lt;br /&gt;VK_F5 = 116;&lt;br /&gt;{$EXTERNALSYM VK_F6}&lt;br /&gt;VK_F6 = 117;&lt;br /&gt;{$EXTERNALSYM VK_F7}&lt;br /&gt;VK_F7 = 118;&lt;br /&gt;{$EXTERNALSYM VK_F8}&lt;br /&gt;VK_F8 = 119;&lt;br /&gt;{$EXTERNALSYM VK_F9}&lt;br /&gt;VK_F9 = 120;&lt;br /&gt;{$EXTERNALSYM VK_F10}&lt;br /&gt;VK_F10 = 121;&lt;br /&gt;{$EXTERNALSYM VK_F11}&lt;br /&gt;VK_F11 = 122;&lt;br /&gt;{$EXTERNALSYM VK_F12}&lt;br /&gt;VK_F12 = 123;&lt;br /&gt;{$EXTERNALSYM VK_F13}&lt;br /&gt;VK_F13 = 124;&lt;br /&gt;{$EXTERNALSYM VK_F14}&lt;br /&gt;VK_F14 = 125;&lt;br /&gt;{$EXTERNALSYM VK_F15}&lt;br /&gt;VK_F15 = 126;&lt;br /&gt;{$EXTERNALSYM VK_F16}&lt;br /&gt;VK_F16 = 127;&lt;br /&gt;{$EXTERNALSYM VK_F17}&lt;br /&gt;VK_F17 = 128;&lt;br /&gt;{$EXTERNALSYM VK_F18}&lt;br /&gt;VK_F18 = 129;&lt;br /&gt;{$EXTERNALSYM VK_F19}&lt;br /&gt;VK_F19 = 130;&lt;br /&gt;{$EXTERNALSYM VK_F20}&lt;br /&gt;VK_F20 = 131;&lt;br /&gt;{$EXTERNALSYM VK_F21}&lt;br /&gt;VK_F21 = 132;&lt;br /&gt;{$EXTERNALSYM VK_F22}&lt;br /&gt;VK_F22 = 133;&lt;br /&gt;{$EXTERNALSYM VK_F23}&lt;br /&gt;VK_F23 = 134;&lt;br /&gt;{$EXTERNALSYM VK_F24}&lt;br /&gt;VK_F24 = 135;&lt;br /&gt;{$EXTERNALSYM VK_NUMLOCK}&lt;br /&gt;VK_NUMLOCK = 144;&lt;br /&gt;{$EXTERNALSYM VK_SCROLL}&lt;br /&gt;VK_SCROLL = 145;&lt;br /&gt;{ VK_L &amp; VK_R - left and right Alt, Ctrl and Shift virtual keys.&lt;br /&gt;Used only as parameters to GetAsyncKeyState() and GetKeyState().&lt;br /&gt;No other API or message will distinguish left and right keys in this way. }&lt;br /&gt;{$EXTERNALSYM VK_LSHIFT}&lt;br /&gt;VK_LSHIFT = 160;&lt;br /&gt;84.菜单勾选/取消完成后关闭计算机&lt;br /&gt;/*&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;        [StructLayout(LayoutKind.Sequential, Pack = 1)]&lt;br /&gt;        internal struct TokPriv1Luid&lt;br /&gt;        {&lt;br /&gt;            public int Count;&lt;br /&gt;            public long Luid;&lt;br /&gt;            public int Attr;&lt;br /&gt;        }&lt;br /&gt;        [DllImport(&quot;kernel32.dll&quot;, ExactSpelling = true)]&lt;br /&gt;        internal static extern IntPtr GetCurrentProcess();&lt;br /&gt; &lt;br /&gt;        [DllImport(&quot;advapi32.dll&quot;, ExactSpelling = true, SetLastError = true)]&lt;br /&gt;        internal static extern bool OpenProcessToken(IntPtr h, int acc, ref   IntPtr phtok);&lt;br /&gt; &lt;br /&gt;        [DllImport(&quot;advapi32.dll&quot;, SetLastError = true)]&lt;br /&gt;        internal static extern bool LookupPrivilegeValue(string host, string name, ref   long pluid);&lt;br /&gt; &lt;br /&gt;        [DllImport(&quot;advapi32.dll&quot;, ExactSpelling = true, SetLastError = true)]&lt;br /&gt;        internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);&lt;br /&gt; &lt;br /&gt;        [DllImport(&quot;user32.dll&quot;, ExactSpelling = true, SetLastError = true)]&lt;br /&gt;        internal static extern bool ExitWindowsEx(int flg, int rea);&lt;br /&gt; &lt;br /&gt;        internal const int SE_PRIVILEGE_ENABLED = 0x00000002;&lt;br /&gt;        internal const int TOKEN_QUERY = 0x00000008;&lt;br /&gt;        internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;&lt;br /&gt;        internal const string SE_SHUTDOWN_NAME = &quot;SeShutdownPrivilege&quot;;&lt;br /&gt;        internal const int EWX_SHUTDOWN = 0x00000001;&lt;br /&gt;        internal const int EWX_POWEROFF = 0x00000008;&lt;br /&gt;        internal const int EWX_FORCE = 0x00000004;&lt;br /&gt;        internal const int EWX_FORCEIFHUNG = 0x00000010;&lt;br /&gt;*/&lt;br /&gt;int flg=EWX_FORCE | EWX_POWEROFF;&lt;br /&gt;            bool ok;&lt;br /&gt;            TokPriv1Luid tp;&lt;br /&gt;            IntPtr hproc = GetCurrentProcess();&lt;br /&gt;            IntPtr htok = IntPtr.Zero;&lt;br /&gt;            k = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref   htok);&lt;br /&gt;            tp.Count = 1;&lt;br /&gt;            tp.Luid = 0;&lt;br /&gt;            tp.Attr = SE_PRIVILEGE_ENABLED;&lt;br /&gt;            k = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref   tp.Luid);&lt;br /&gt;            k = AdjustTokenPrivileges(htok, false, ref   tp, 0, IntPtr.Zero, IntPtr.Zero);&lt;br /&gt;            k = ExitWindowsEx(flg, 0);&lt;br /&gt;85.菜单勾选/取消完成后重新启动计算机&lt;br /&gt;/*&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;        [StructLayout(LayoutKind.Sequential, Pack = 1)]&lt;br /&gt;        internal struct TokPriv1Luid&lt;br /&gt;        {&lt;br /&gt;            public int Count;&lt;br /&gt;            public long Luid;&lt;br /&gt;            public int Attr;&lt;br /&gt;        }&lt;br /&gt;        [DllImport(&quot;kernel32.dll&quot;, ExactSpelling = true)]&lt;br /&gt;        internal static extern IntPtr GetCurrentProcess();&lt;br /&gt; &lt;br /&gt;        [DllImport(&quot;advapi32.dll&quot;, ExactSpelling = true, SetLastError = true)]&lt;br /&gt;        internal static extern bool OpenProcessToken(IntPtr h, int acc, ref   IntPtr phtok);&lt;br /&gt; &lt;br /&gt;        [DllImport(&quot;advapi32.dll&quot;, SetLastError = true)]&lt;br /&gt;        internal static extern bool LookupPrivilegeValue(string host, string name, ref   long pluid);&lt;br /&gt; &lt;br /&gt;        [DllImport(&quot;advapi32.dll&quot;, ExactSpelling = true, SetLastError = true)]&lt;br /&gt;        internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);&lt;br /&gt; &lt;br /&gt;        [DllImport(&quot;user32.dll&quot;, ExactSpelling = true, SetLastError = true)]&lt;br /&gt;        internal static extern bool ExitWindowsEx(int flg, int rea);&lt;br /&gt; &lt;br /&gt;        internal const int SE_PRIVILEGE_ENABLED = 0x00000002;&lt;br /&gt;        internal const int TOKEN_QUERY = 0x00000008;&lt;br /&gt;        internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;&lt;br /&gt;        internal const string SE_SHUTDOWN_NAME = &quot;SeShutdownPrivilege&quot;;&lt;br /&gt;        internal const int EWX_SHUTDOWN = 0x00000001;&lt;br /&gt;        internal const int EWX_REBOOT = 0x00000002;&lt;br /&gt;        internal const int EWX_FORCE = 0x00000004;&lt;br /&gt;        internal const int EWX_FORCEIFHUNG = 0x00000010;&lt;br /&gt;*/&lt;br /&gt;int flg=EWX_FORCE | EWX_REBOOT;&lt;br /&gt;            bool ok;&lt;br /&gt;            TokPriv1Luid tp;&lt;br /&gt;            IntPtr hproc = GetCurrentProcess();&lt;br /&gt;            IntPtr htok = IntPtr.Zero;&lt;br /&gt;            k = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref   htok);&lt;br /&gt;            tp.Count = 1;&lt;br /&gt;            tp.Luid = 0;&lt;br /&gt;            tp.Attr = SE_PRIVILEGE_ENABLED;&lt;br /&gt;            k = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref   tp.Luid);&lt;br /&gt;            k = AdjustTokenPrivileges(htok, false, ref   tp, 0, IntPtr.Zero, IntPtr.Zero);&lt;br /&gt;            k = ExitWindowsEx(flg, 0);&lt;br /&gt;86.菜单勾选/取消完成后注销计算机&lt;br /&gt;/*&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;        [StructLayout(LayoutKind.Sequential, Pack = 1)]&lt;br /&gt;        internal struct TokPriv1Luid&lt;br /&gt;        {&lt;br /&gt;            public int Count;&lt;br /&gt;            public long Luid;&lt;br /&gt;            public int Attr;&lt;br /&gt;        }&lt;br /&gt;        [DllImport(&quot;kernel32.dll&quot;, ExactSpelling = true)]&lt;br /&gt;        internal static extern IntPtr GetCurrentProcess();&lt;br /&gt; &lt;br /&gt;        [DllImport(&quot;advapi32.dll&quot;, ExactSpelling = true, SetLastError = true)]&lt;br /&gt;        internal static extern bool OpenProcessToken(IntPtr h, int acc, ref   IntPtr phtok);&lt;br /&gt; &lt;br /&gt;        [DllImport(&quot;advapi32.dll&quot;, SetLastError = true)]&lt;br /&gt;        internal static extern bool LookupPrivilegeValue(string host, string name, ref   long pluid);&lt;br /&gt; &lt;br /&gt;        [DllImport(&quot;advapi32.dll&quot;, ExactSpelling = true, SetLastError = true)]&lt;br /&gt;        internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);&lt;br /&gt; &lt;br /&gt;        [DllImport(&quot;user32.dll&quot;, ExactSpelling = true, SetLastError = true)]&lt;br /&gt;        internal static extern bool ExitWindowsEx(int flg, int rea);&lt;br /&gt; &lt;br /&gt;        internal const int SE_PRIVILEGE_ENABLED = 0x00000002;&lt;br /&gt;        internal const int TOKEN_QUERY = 0x00000008;&lt;br /&gt;        internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;&lt;br /&gt;        internal const string SE_SHUTDOWN_NAME = &quot;SeShutdownPrivilege&quot;;&lt;br /&gt;        internal const int EWX_SHUTDOWN = 0x00000001;&lt;br /&gt;        internal const int EWX_LOGOFF = 0x00000000;&lt;br /&gt;        internal const int EWX_FORCE = 0x00000004;&lt;br /&gt;        internal const int EWX_FORCEIFHUNG = 0x00000010;&lt;br /&gt;*/&lt;br /&gt;int flg=EWX_FORCE | EWX_LOGOFF;&lt;br /&gt;            bool ok;&lt;br /&gt;            TokPriv1Luid tp;&lt;br /&gt;            IntPtr hproc = GetCurrentProcess();&lt;br /&gt;            IntPtr htok = IntPtr.Zero;&lt;br /&gt;            k = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref   htok);&lt;br /&gt;            tp.Count = 1;&lt;br /&gt;            tp.Luid = 0;&lt;br /&gt;            tp.Attr = SE_PRIVILEGE_ENABLED;&lt;br /&gt;            k = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref   tp.Luid);&lt;br /&gt;            k = AdjustTokenPrivileges(htok, false, ref   tp, 0, IntPtr.Zero, IntPtr.Zero);&lt;br /&gt;            k = ExitWindowsEx(flg, 0);&lt;br /&gt;87.菜单勾选/取消开机自启动程序&lt;br /&gt; public void RunWhenStart(bool Started)&lt;br /&gt;        {&lt;br /&gt;string name=%%1;&lt;br /&gt;string path=Application.ExecutablePath;&lt;br /&gt;            RegistryKey HKLM = Registry.LocalMachine;&lt;br /&gt;            RegistryKey Run = HKLM.CreateSubKey(@&quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Run\&quot;);&lt;br /&gt;            if (Started == true)&lt;br /&gt;            {&lt;br /&gt;               try&lt;br /&gt;                {&lt;br /&gt;                    Run.SetValue(name, path);&lt;br /&gt;                    HKLM.Close();&lt;br /&gt;                }&lt;br /&gt;                catch (Exception)&lt;br /&gt;                {&lt;br /&gt;                    MessageBox.Show(&quot;注册表修改错误(开机自启未实现)&quot;);&lt;br /&gt;              }&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                try&lt;br /&gt;                {&lt;br /&gt;                    if (Run.GetValue(name) != null)&lt;br /&gt;                   {&lt;br /&gt;                        Run.DeleteValue(name);&lt;br /&gt;                      HKLM.Close();&lt;br /&gt;                   }&lt;br /&gt;                    else&lt;br /&gt;                        return;&lt;br /&gt;                }&lt;br /&gt;               catch (Exception e)&lt;br /&gt;               {&lt;br /&gt;                   //ExceptionTransact.WriteErrLog(base.GetType().Name, e.Message);&lt;br /&gt;MessageBox(e.Message);&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;        }&lt;br /&gt;88.菜单勾选/取消自动登录系统&lt;br /&gt;89.模拟键盘输入字符串&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Drawing;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Windows.Forms;&lt;br /&gt;using KenZhang.Free.VirtualInput;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;namespace VirtualInputDemo&lt;br /&gt;{&lt;br /&gt;    public partial class Form1 : Form&lt;br /&gt;    {&lt;br /&gt;        public const int INPUT_KEYBOARD = 1;&lt;br /&gt;        public const int KEYEVENTF_KEYUP = 0x0002;&lt;br /&gt;        [DllImport(&quot;user32.dll&quot;)]&lt;br /&gt;        public static extern UInt32 SendInput(UInt32 nInputs, ref INPUT pInputs, int cbSize);&lt;br /&gt;        [StructLayout(LayoutKind.Explicit)]&lt;br /&gt;        public struct INPUT&lt;br /&gt;        {&lt;br /&gt;            [FieldOffset(0)]&lt;br /&gt;            public Int32 type;&lt;br /&gt;            [FieldOffset(4)]&lt;br /&gt;            public KEYBDINPUT ki;&lt;br /&gt;            [FieldOffset(4)]&lt;br /&gt;            public MOUSEINPUT mi;&lt;br /&gt;            [FieldOffset(4)]&lt;br /&gt;            public HARDWAREINPUT hi;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;        public struct MOUSEINPUT&lt;br /&gt;        {&lt;br /&gt;            public Int32 dx;&lt;br /&gt;            public Int32 dy;&lt;br /&gt;            public Int32 mouseData;&lt;br /&gt;            public Int32 dwFlags;&lt;br /&gt;            public Int32 time;&lt;br /&gt;            public IntPtr dwExtraInfo;&lt;br /&gt;        }&lt;br /&gt;        [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;        public struct KEYBDINPUT&lt;br /&gt;        {&lt;br /&gt;            public Int16 wVk;&lt;br /&gt;            public Int16 wScan;&lt;br /&gt;            public Int32 dwFlags;&lt;br /&gt;            public Int32 time;&lt;br /&gt;            public IntPtr dwExtraInfo;&lt;br /&gt;        }&lt;br /&gt;        [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;        public struct HARDWAREINPUT&lt;br /&gt;        {&lt;br /&gt;            public Int32 uMsg;&lt;br /&gt;            public Int16 wParamL;&lt;br /&gt;            public Int16 wParamH;&lt;br /&gt;        }&lt;br /&gt;        public Form1()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;        }&lt;br /&gt;        private void button1_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            textBox1.Focus();&lt;br /&gt;            INPUT inDown = new INPUT();&lt;br /&gt;            inDown.type = INPUT_KEYBOARD;&lt;br /&gt;            inDown.ki.wVk = (int)Keys.A;&lt;br /&gt;            //INPUT inUp = new INPUT();&lt;br /&gt;            //inUp.type = INPUT_KEYBOARD;&lt;br /&gt;            //inUp.ki.wVk = (int)Keys.A;&lt;br /&gt;            //inUp.ki.dwFlags = KEYEVENTF_KEYUP;&lt;br /&gt;            SendInput(1, ref  inDown, Marshal.SizeOf(inDown));&lt;br /&gt;            //SendInput(1, ref  inUp, Marshal.SizeOf(inUp));&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;90.提取PDF文件中的文本&lt;br /&gt;xpdf&lt;br /&gt;   public partial class Form1 : Form&lt;br /&gt;    {&lt;br /&gt;        public OpenFileDialog fdlg = new OpenFileDialog();//打开文件对话框&lt;br /&gt;        public string filename;&lt;br /&gt;        public Form1()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;        }&lt;br /&gt;        private void button1_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            ofdlg.Filter = &quot;pdf文件(*.pdf)|*.pdf&quot;;//选择pdf文件&lt;br /&gt;            if (ofdlg.ShowDialog() == DialogResult.OK)&lt;br /&gt;            {&lt;br /&gt;                filename = string.Format(&quot;{0}&quot;, ofdlg.FileName);&lt;br /&gt;            }           &lt;br /&gt;        }&lt;br /&gt;　　　　　　//传送打开文件对话框中得到的filename来做为外部程序的参数来做转化&lt;br /&gt;        private void button2_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            Process p = new Process();&lt;br /&gt;            string path = &quot;pdftotext.exe&quot;; //进程启用外部程序&lt;br /&gt;            　　　　　　　　　　　　　　　　//这个exe我放在debug文件夹下面       &lt;br /&gt;            p.StartInfo.FileName = path;&lt;br /&gt;            p.StartInfo.Arguments = string.Format( filename + &quot; -&quot;);//很怪异的一行&lt;br /&gt;           　　　　　　　　　　　　　　　　　　　　　　　//参数“－”表示可以得到输出流&lt;br /&gt;            p.StartInfo.UseShellExecute = false;&lt;br /&gt;            p.StartInfo.RedirectStandardInput = true;&lt;br /&gt;            p.StartInfo.RedirectStandardOutput = true;&lt;br /&gt;            p.StartInfo.RedirectStandardError = true;&lt;br /&gt;            p.StartInfo.CreateNoWindow = true;&lt;br /&gt;           &lt;br /&gt;            p.Start();&lt;br /&gt;            string s = p.StandardOutput.ReadToEnd();//得到pdf文档中的文本内容&lt;br /&gt;            textBox1.Text = s;&lt;br /&gt;            p.Close();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;上面的程序运行后，如果是在Debug文件夹下的pdf文件就可以得到输出，可是如果在打开文件对话框中打开我桌面上的一个pdf如：@&quot;d:\我的文档\test.pdf&quot;，输出就会是空，但是如果把上面那怪异的一行改为：&lt;br /&gt;C# code&lt;br /&gt;p.StartInfo.Arguments = string.Format( @&quot;d:\我的文档\test.pdf&quot; + &quot; -&quot;);&lt;br /&gt;&lt;br /&gt;程序就又会得到输出。&lt;br /&gt;呵呵，谢谢楼上的兄台，下载的xpdf中xpdftotext.exe用到的配置文件xpdfrc需要手动配置，我如果把那些字体啊，什么的映射成绝对路径下的文件，就不会出现上面的问题，但是我把配置文件中的路径改成了相对路径，于是就出现了上面的问题了，看兄台能够很轻易的就运行成功，一定是做过很多代码的，这里还得劳烦兄台再给看一下，帮下忙，能遇到一个大神不容易，大神可不能吝啬啊，先谢过了哈&lt;br /&gt;91.操作内存映射文件&lt;br /&gt;/*&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;[DllImport(&quot;kernel32.dll&quot;)]&lt;br /&gt;public static extern IntPtr CreateFileMapping(IntPtr hFile,&lt;br /&gt;    IntPtr lpFileMappingAttributes, uint flProtect,&lt;br /&gt;    uint dwMaximumSizeHigh,&lt;br /&gt;    uint dwMaximumSizeLow, string lpName);&lt;br /&gt;[DllImport(&quot;kernel32.dll&quot;)]&lt;br /&gt;public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, uint&lt;br /&gt;    dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow,&lt;br /&gt;    IntPtr dwNumberOfBytesToMap);&lt;br /&gt;[DllImport(&quot;kernel32.dll&quot;)]&lt;br /&gt;public static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);&lt;br /&gt;[DllImport(&quot;kernel32.dll&quot;)]&lt;br /&gt;public static extern bool CloseHandle(IntPtr hObject);&lt;br /&gt;[DllImport(&quot;kernel32.dll&quot;)]&lt;br /&gt;public static extern IntPtr CreateFile(string lpFileName,&lt;br /&gt;    int dwDesiredAccess, FileShare dwShareMode, IntPtr securityAttrs,&lt;br /&gt;    FileMode dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);&lt;br /&gt;[DllImport(&quot;kernel32.dll&quot;)]&lt;br /&gt;public static extern uint GetFileSize(IntPtr hFile, IntPtr lpFileSizeHigh);&lt;br /&gt;public const int GENERIC_READ = -2147483648; //0x80000000&lt;br /&gt;public const int GENERIC_WRITE = 0x40000000;&lt;br /&gt;public const int GENERIC_EXECUTE = 0x20000000;&lt;br /&gt;public const int GENERIC_ALL = 0x10000000;&lt;br /&gt;public const int FILE_ATTRIBUTE_NORMAL = 0x80;&lt;br /&gt;public const int FILE_FLAG_SEQUENTIAL_SCAN = 0x8000000;&lt;br /&gt;public const int INVALID_HANDLE_VALUE = -1;&lt;br /&gt;public const int PAGE_NOACCESS = 1;&lt;br /&gt;public const int PAGE_READONLY = 2;&lt;br /&gt;public const int PAGE_READWRITE = 4;&lt;br /&gt;public const int FILE_MAP_COPY = 1;&lt;br /&gt;public const int FILE_MAP_WRITE = 2;&lt;br /&gt;public const int FILE_MAP_READ = 4;&lt;br /&gt;*/&lt;br /&gt;    IntPtr vFileHandle = CreateFile(@&quot;c:\temp\temp.txt&quot;,&lt;br /&gt;        GENERIC_READ | GENERIC_WRITE, FileShare.Read | FileShare.Write,&lt;br /&gt;        IntPtr.Zero,  FileMode.Open,&lt;br /&gt;        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero);&lt;br /&gt;    if (INVALID_HANDLE_VALUE != (int)vFileHandle)&lt;br /&gt;    {&lt;br /&gt;        IntPtr vMappingHandle = CreateFileMapping(&lt;br /&gt;            vFileHandle, IntPtr.Zero, PAGE_READWRITE, 0, 0, &quot;~MappingTemp&quot;);&lt;br /&gt;        if (vMappingHandle != IntPtr.Zero)&lt;br /&gt;        {&lt;br /&gt;            IntPtr vHead = MapViewOfFile(vMappingHandle,&lt;br /&gt;                FILE_MAP_COPY | FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, IntPtr.Zero);&lt;br /&gt;            if (vHead != IntPtr.Zero)&lt;br /&gt;            {&lt;br /&gt;                uint vSize = GetFileSize(vFileHandle, IntPtr.Zero);&lt;br /&gt;                for (int i = 0; i &lt;= vSize / 2; i++)&lt;br /&gt;                {&lt;br /&gt;                    byte vTemp = Marshal.ReadByte((IntPtr)((int)vHead + i));&lt;br /&gt;                    Marshal.WriteByte((IntPtr)((int)vHead + i),&lt;br /&gt;                        Marshal.ReadByte((IntPtr)((int)vHead + vSize - i - 1)));&lt;br /&gt;                    Marshal.WriteByte((IntPtr)((int)vHead + vSize - i - 1), vTemp);&lt;br /&gt;                }&lt;br /&gt;                UnmapViewOfFile(vHead);&lt;br /&gt;            }&lt;br /&gt;            CloseHandle(vMappingHandle);&lt;br /&gt;        }&lt;br /&gt;        CloseHandle(vFileHandle);&lt;br /&gt;    }&lt;br /&gt;92.重定向windows控制台程序的输出信息&lt;br /&gt;      delegate void dReadLine(string strLine);&lt;br /&gt;        private void excuteCommand(string strFile, string args, dReadLine onReadLine)&lt;br /&gt;        {&lt;br /&gt;             System.Diagnostics.Process p = new System.Diagnostics.Process();&lt;br /&gt;             p.StartInfo = new System.Diagnostics.ProcessStartInfo();&lt;br /&gt;             p.StartInfo.FileName = strFile;&lt;br /&gt;             p.StartInfo.Arguments = args;&lt;br /&gt;             p.StartInfo.WindowStyle. = System.Diagnostics.ProcessWindowStyle.Hidden;&lt;br /&gt;             p.StartInfo.RedirectStandardOutput = true;&lt;br /&gt;             p.StartInfo.UseShellExecute = false;&lt;br /&gt;             p.StartInfo.CreateNoWindow = true;&lt;br /&gt;             p.Start();&lt;br /&gt;             System.IO.StreamReader reader = p.StandardOutput;//截取输出流&lt;br /&gt;            string line = reader.ReadLine();//每次读取一行&lt;br /&gt;            while (!reader.EndOfStream)&lt;br /&gt;            {&lt;br /&gt;                 onReadLine(line);&lt;br /&gt;                 line = reader.ReadLine();&lt;br /&gt;             }&lt;br /&gt;             p.WaitForExit();&lt;br /&gt;         }&lt;br /&gt;        private void PrintMessage(string strLine)&lt;br /&gt;        {&lt;br /&gt;            this.textBox1.Text += strLine + &quot; &quot;;&lt;br /&gt;         }&lt;br /&gt;             excuteCommand(&quot;ipconfig&quot;, &quot;&quot;, new dReadLine(PrintMessage));&lt;br /&gt;93.接受邮件&lt;br /&gt;94.发送邮件&lt;br /&gt;using System;&lt;br /&gt;using System.Net.Sockets;&lt;br /&gt;using System.Net;&lt;br /&gt;using System.Security.Cryptography;&lt;br /&gt;using System.IO;&lt;br /&gt;// 类名：Pop3&lt;br /&gt;// 功能：接收电子邮件&lt;br /&gt;namespace ZTSX.Email&lt;br /&gt;{&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Pop3 的摘要说明。&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;public class Pop3&lt;br /&gt;{&lt;br /&gt;private string mstrHost     = null; //主机名称或IP地址&lt;br /&gt;private int mintPort     = 110; //主机的端口号（默认为110）&lt;br /&gt;private TcpClient mtcpClient   = null; //客户端&lt;br /&gt;private NetworkStream mnetStream = null; //网络基础数据流&lt;br /&gt;private StreamReader m_stmReader = null; //读取字节流&lt;br /&gt;private string mstrStatMessage   = null; //执行STAT命令后得到的消息（从中得到邮件数）&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 构造函数&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;remarks&gt;一个邮件接收对象&lt;/remarks&gt;&lt;br /&gt;public Pop3()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 构造函数&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;host&quot;&gt;主机名称或IP地址&lt;/param&gt;&lt;br /&gt;public Pop3(string host)&lt;br /&gt;{&lt;br /&gt;   mstrHost = host;&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 构造函数&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;host&quot;&gt;主机名称或IP地址&lt;/param&gt;&lt;br /&gt;/// &lt;param name=&quot;port&quot;&gt;主机的端口号&lt;/param&gt;&lt;br /&gt;/// &lt;remarks&gt;一个邮件接收对象&lt;/remarks&gt;&lt;br /&gt;public Pop3(string host,int port)&lt;br /&gt;{&lt;br /&gt;   mstrHost = host;&lt;br /&gt;   mintPort = port;&lt;br /&gt;}&lt;br /&gt;#region 属性&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 主机名称或IP地址&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;remarks&gt;主机名称或IP地址&lt;/remarks&gt;&lt;br /&gt;public string HostName&lt;br /&gt;{&lt;br /&gt;   get{return mstrHost;}&lt;br /&gt;   set{mstrHost = value;}&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 主机的端口号&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;remarks&gt;主机的端口号&lt;/remarks&gt;&lt;br /&gt;public int Port&lt;br /&gt;{&lt;br /&gt;   get{return mintPort;}&lt;br /&gt;   set{mintPort = value;}&lt;br /&gt;}&lt;br /&gt;#endregion&lt;br /&gt;#region 私有方法&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 向网络访问的基础数据流中写数据（发送命令码）&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;netStream&quot;&gt;可以用于网络访问的基础数据流&lt;/param&gt;&lt;br /&gt;/// &lt;param name=&quot;command&quot;&gt;命令行&lt;/param&gt;&lt;br /&gt;/// &lt;remarks&gt;向网络访问的基础数据流中写数据（发送命令码）&lt;/remarks&gt;&lt;br /&gt;private void WriteToNetStream(ref NetworkStream netStream,String command)&lt;br /&gt;{&lt;br /&gt;   string strToSend = command + &quot;\r\n&quot;;&lt;br /&gt;   byte[] arrayToSend = System.Text.Encoding.ASCII.GetBytes(strToSend.ToCharArray());&lt;br /&gt;      netStream.Write(arrayToSend,0,arrayToSend.Length);&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 检查命令行结果是否正确&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;message&quot;&gt;命令行的执行结果&lt;/param&gt;&lt;br /&gt;/// &lt;param name=&quot;check&quot;&gt;正确标志&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;&lt;br /&gt;/// 类型：布尔&lt;br /&gt;/// 内容：true表示没有错误，false为有错误&lt;br /&gt;/// &lt;/returns&gt;&lt;br /&gt;/// &lt;remarks&gt;检查命令行结果是否有错误&lt;/remarks&gt;&lt;br /&gt;private bool CheckCorrect(string message,string check)&lt;br /&gt;{&lt;br /&gt;   if(message.IndexOf(check) == -1)&lt;br /&gt;    return false;&lt;br /&gt;   else&lt;br /&gt;    return true;&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 邮箱中的未读邮件数&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;message&quot;&gt;执行完LIST命令后的结果&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;&lt;br /&gt;/// 类型：整型&lt;br /&gt;/// 内容：邮箱中的未读邮件数&lt;br /&gt;/// &lt;/returns&gt;&lt;br /&gt;/// &lt;remarks&gt;邮箱中的未读邮件数&lt;/remarks&gt;&lt;br /&gt;private int GetMailNumber(string message)&lt;br /&gt;{&lt;br /&gt;   string[] strMessage = message.Split(&#39; &#39;);&lt;br /&gt;   return Int32.Parse(strMessage[1]);&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 得到经过解码后的邮件的内容&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;encodingContent&quot;&gt;解码前的邮件的内容&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;&lt;br /&gt;/// 类型：字符串&lt;br /&gt;/// 内容：解码后的邮件的内容&lt;br /&gt;/// &lt;/returns&gt;&lt;br /&gt;/// &lt;remarks&gt;得到解码后的邮件的内容&lt;/remarks&gt;&lt;br /&gt;private string GetDecodeMailContent(string encodingContent)&lt;br /&gt;{&lt;br /&gt;   string strContent = encodingContent.Trim();&lt;br /&gt;   string strEncode = null;&lt;br /&gt;   int iStart = strContent.IndexOf(&quot;Base64&quot;);&lt;br /&gt;   if(iStart == -1)&lt;br /&gt;    throw new Pop3Exception(&quot;邮件内容不是Base64编码，请检查&quot;);&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    strEncode = strContent.Substring(iStart + 6,strContent.Length - iStart - 6);&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;     return SX.Encode.TransformToString(strEncode);&lt;br /&gt;    }&lt;br /&gt;    catch(SX.EncodeException exc)&lt;br /&gt;    {&lt;br /&gt;     throw new Pop3Exception(exc.Message);&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;#endregion&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 与主机建立连接&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;returns&gt;&lt;br /&gt;/// 类型：布尔&lt;br /&gt;/// 内容：连接结果（true为连接成功，false为连接失败）&lt;br /&gt;/// &lt;/returns&gt;&lt;br /&gt;/// &lt;remarks&gt;与主机建立连接&lt;/remarks&gt;&lt;br /&gt;public bool Connect()&lt;br /&gt;{&lt;br /&gt;   if(mstrHost == null)&lt;br /&gt;    throw new Exception(&quot;请提供SMTP主机名称或IP地址！&quot;);&lt;br /&gt;   if(mintPort == 0)&lt;br /&gt;    throw new Exception(&quot;请提供SMTP主机的端口号&quot;);&lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;    mtcpClient = new TcpClient(mstrHost,mintPort);&lt;br /&gt;    mnetStream = mtcpClient.GetStream();&lt;br /&gt;    m_stmReader = new StreamReader(mtcpClient.GetStream());&lt;br /&gt;    string strMessage = m_stmReader.ReadLine();&lt;br /&gt;    if(CheckCorrect(strMessage,&quot;+OK&quot;) == true)&lt;br /&gt;     return true;&lt;br /&gt;    else&lt;br /&gt;     return false;&lt;br /&gt;   }&lt;br /&gt;   catch(SocketException exc)&lt;br /&gt;   {&lt;br /&gt;    throw new Pop3Exception(exc.ToString());&lt;br /&gt;   }&lt;br /&gt;   catch(NullReferenceException exc)&lt;br /&gt;   {&lt;br /&gt;    throw new Pop3Exception(exc.ToString());&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;#region Pop3命令&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 执行Pop3命令，并检查执行的结果&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;command&quot;&gt;Pop3命令行&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;&lt;br /&gt;/// 类型：字符串&lt;br /&gt;/// 内容：Pop3命令的执行结果&lt;br /&gt;/// &lt;/returns&gt;&lt;br /&gt;private string ExecuteCommand(string command)&lt;br /&gt;{&lt;br /&gt;   string strMessage = null; //执行Pop3命令后返回的消息&lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;    //发送命令&lt;br /&gt;    WriteToNetStream(ref mnetStream,command);&lt;br /&gt;    //读取多行&lt;br /&gt;    if(command.Substring(0,4).Equals(&quot;LIST&quot;) || command.Substring(0,4).Equals(&quot;RETR&quot;) || command.Substring(0,4).Equals(&quot;UIDL&quot;)) //记录STAT后的消息（其中包含邮件数）&lt;br /&gt;    {&lt;br /&gt;     strMessage = ReadMultiLine();&lt;br /&gt;     if(command.Equals(&quot;LIST&quot;)) //记录LIST后的消息（其中包含邮件数）&lt;br /&gt;      mstrStatMessage = strMessage;&lt;br /&gt;    }&lt;br /&gt;     //读取单行&lt;br /&gt;    else&lt;br /&gt;     strMessage = m_stmReader.ReadLine();&lt;br /&gt;    //判断执行结果是否正确&lt;br /&gt;    if(CheckCorrect(strMessage,&quot;+OK&quot;))&lt;br /&gt;     return strMessage;&lt;br /&gt;    else&lt;br /&gt;     return &quot;Error&quot;;&lt;br /&gt;   }&lt;br /&gt;   catch(IOException exc)&lt;br /&gt;   {&lt;br /&gt;    throw new Pop3Exception(exc.ToString());&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 在Pop3命令中，LIST、RETR和UIDL命令的结果要返回多行，以点号（.）结尾，&lt;br /&gt;/// 所以如果想得到正确的结果，必须读取多行&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;returns&gt;&lt;br /&gt;/// 类型：字符串&lt;br /&gt;/// 内容：执行Pop3命令后的结果&lt;br /&gt;/// &lt;/returns&gt;&lt;br /&gt;private string ReadMultiLine()&lt;br /&gt;{&lt;br /&gt;   string strMessage = m_stmReader.ReadLine();&lt;br /&gt;   string strTemp = null;&lt;br /&gt;   while(strMessage != &quot;.&quot;)&lt;br /&gt;   {&lt;br /&gt;    strTemp = strTemp + strMessage;&lt;br /&gt;    strMessage = m_stmReader.ReadLine();&lt;br /&gt;   }&lt;br /&gt;   return strTemp;&lt;br /&gt;}&lt;br /&gt;//USER命令&lt;br /&gt;private string USER(string user)&lt;br /&gt;{&lt;br /&gt;   return ExecuteCommand(&quot;USER &quot; + user) + &quot;\r\n&quot;;&lt;br /&gt;}&lt;br /&gt;//PASS命令&lt;br /&gt;private string PASS(string password)&lt;br /&gt;{&lt;br /&gt;   return ExecuteCommand(&quot;PASS &quot; + password) + &quot;\r\n&quot;;&lt;br /&gt;}&lt;br /&gt;//LIST命令&lt;br /&gt;private string LIST()&lt;br /&gt;{&lt;br /&gt;   return ExecuteCommand(&quot;LIST&quot;) + &quot;\r\n&quot;;&lt;br /&gt;}&lt;br /&gt;//UIDL命令&lt;br /&gt;private string UIDL()&lt;br /&gt;{&lt;br /&gt;   return ExecuteCommand(&quot;UIDL&quot;) + &quot;\r\n&quot;;&lt;br /&gt;}&lt;br /&gt;//NOOP命令&lt;br /&gt;private string NOOP()&lt;br /&gt;{&lt;br /&gt;   return ExecuteCommand(&quot;NOOP&quot;) + &quot;\r\n&quot;;&lt;br /&gt;}&lt;br /&gt;//STAT命令&lt;br /&gt;private string STAT()&lt;br /&gt;{&lt;br /&gt;   return ExecuteCommand(&quot;STAT&quot;) + &quot;\r\n&quot;;&lt;br /&gt;}&lt;br /&gt;//RETR命令&lt;br /&gt;private string RETR(int number)&lt;br /&gt;{&lt;br /&gt;   return ExecuteCommand(&quot;RETR &quot; + number.ToString()) + &quot;\r\n&quot;;&lt;br /&gt;}&lt;br /&gt;//DELE命令&lt;br /&gt;private string DELE(int number)&lt;br /&gt;{&lt;br /&gt;   return ExecuteCommand(&quot;DELE &quot; + number.ToString()) + &quot;\r\n&quot;;&lt;br /&gt;}&lt;br /&gt;//QUIT命令&lt;br /&gt;private void Quit()&lt;br /&gt;{&lt;br /&gt;   WriteToNetStream(ref mnetStream,&quot;QUIT&quot;);&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 收取邮件&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;user&quot;&gt;用户名&lt;/param&gt;&lt;br /&gt;/// &lt;param name=&quot;password&quot;&gt;口令&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;&lt;br /&gt;/// 类型：字符串数组&lt;br /&gt;/// 内容：解码前的邮件内容&lt;br /&gt;/// &lt;/returns&gt;&lt;br /&gt;private string[] ReceiveMail(string user,string password)&lt;br /&gt;{&lt;br /&gt;   int iMailNumber = 0; //邮件数&lt;br /&gt;   if(USER(user).Equals(&quot;Error&quot;))&lt;br /&gt;    throw new Pop3Exception(&quot;用户名不正确！&quot;);&lt;br /&gt;   if(PASS(password).Equals(&quot;Error&quot;))&lt;br /&gt;    throw new Pop3Exception(&quot;用户口令不正确！&quot;);&lt;br /&gt;   if(STAT().Equals(&quot;Error&quot;))&lt;br /&gt;    throw new Pop3Exception(&quot;准备接收邮件时发生错误！&quot;);&lt;br /&gt;   if(LIST().Equals(&quot;Error&quot;))&lt;br /&gt;    throw new Pop3Exception(&quot;得到邮件列表时发生错误！&quot;);&lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;    iMailNumber = GetMailNumber(mstrStatMessage);&lt;br /&gt;    //没有新邮件&lt;br /&gt;    if(iMailNumber == 0)&lt;br /&gt;     return null;&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;     string[] strMailContent = new string[iMailNumber];&lt;br /&gt;     for(int i = 1 ; i &lt;= iMailNumber ; i++)&lt;br /&gt;     {&lt;br /&gt;      //读取邮件内容&lt;br /&gt;      strMailContent[i - 1] = GetDecodeMailContent(RETR(i));&lt;br /&gt;     }&lt;br /&gt;     return strMailContent;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   catch(Pop3Exception exc)&lt;br /&gt;   {&lt;br /&gt;    throw new Pop3Exception(exc.ToString());&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;#endregion&lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 收取邮件    &lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;user&quot;&gt;用户名&lt;/param&gt;&lt;br /&gt;/// &lt;param name=&quot;password&quot;&gt;口令&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;&lt;br /&gt;/// 类型：字符串数组&lt;br /&gt;/// 内容：解码前的邮件内容&lt;br /&gt;/// &lt;/returns&gt;&lt;br /&gt;///&lt;remarks&gt;收取邮箱中的未读邮件&lt;/remarks&gt;&lt;br /&gt;public string[] Receive(string user,string password)&lt;br /&gt;{&lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;    return ReceiveMail(user,password);&lt;br /&gt;   }&lt;br /&gt;   catch(Pop3Exception exc)&lt;br /&gt;   {&lt;br /&gt;    throw new Pop3Exception(exc.ToString());&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 断开所有与服务器的会话&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;remarks&gt;断开所有与服务器的会话&lt;/remarks&gt;&lt;br /&gt;public void DisConnect()&lt;br /&gt;{&lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;    Quit();&lt;br /&gt;    if(m_stmReader != null)&lt;br /&gt;     m_stmReader.Close();&lt;br /&gt;    if(mnetStream != null)&lt;br /&gt;     mnetStream.Close();&lt;br /&gt;    if(mtcpClient != null)&lt;br /&gt;     mtcpClient.Close();&lt;br /&gt;   }&lt;br /&gt;   catch(SocketException exc)&lt;br /&gt;   {&lt;br /&gt;    throw new Pop3Exception(exc.ToString());&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 删除邮件&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name=&quot;number&quot;&gt;邮件号&lt;/param&gt;&lt;br /&gt;public void DeleteMail(int number)&lt;br /&gt;{&lt;br /&gt;   //删除邮件&lt;br /&gt;   int iMailNumber = number + 1;&lt;br /&gt;   if(DELE(iMailNumber).Equals(&quot;Error&quot;))&lt;br /&gt;    throw new Pop3Exception(&quot;删除第&quot; + iMailNumber.ToString() + &quot;时出现错误！&quot;);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;95.报表相关&lt;br /&gt;/*&lt;br /&gt;using CrystalDecisions.CrystalReports.Engine;&lt;br /&gt;using CrystalDecisions.Shared;&lt;br /&gt;*/&lt;br /&gt;2、水晶报表的两种格式&lt;br /&gt;   1）pull模式,不利用DataSet,直接从数据库中取出数据&lt;br /&gt;   2) push模式,使用DataSet,利用它进行数据的加载和处理等&lt;br /&gt;3. 水晶报表使用的库&lt;br /&gt;   1)水晶报表的引擎(CREnging.dll),作用:合并数据,装换格式&lt;br /&gt;   2)水晶报表设计器(CRDesigner.dll),作用：设计标题，插入数据等&lt;br /&gt;   3）水晶报表查看控件（CRWebFormViewer.DLL）&lt;br /&gt;   4)需要引入的命名空间&lt;br /&gt;     using CrystalDecisions.CrystalReports.Engine;&lt;br /&gt;     using CrystalDecisions.Shared;&lt;br /&gt;4、Pull模式下使用水晶报表&lt;br /&gt;   1）创建rpt文件&lt;br /&gt;   2）拖放CrystalReportViewer&lt;br /&gt;   3）绑定&lt;br /&gt;5、读取水晶报表文件&lt;br /&gt;   private void ReadCRV(cryatalReportViewer crv)&lt;br /&gt;   {&lt;br /&gt;     openFileDialog dlg=new OpenFileDialog();&lt;br /&gt;     dlg.Title=&quot;打开水晶报表文件&quot;;&lt;br /&gt;     dlg.Filter=&quot;水晶报表文件(*.rpt)|*.rpt|所有文件|*.*&quot;;&lt;br /&gt;     if(dlg.showDialog()==DialogResult.OK)&lt;br /&gt;     {&lt;br /&gt;       crv.ReportSource=dlg.FileName;&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt;6. B/S下读取报表的文件&lt;br /&gt;    private void ReadCRV(cryatalReportViewer crv,File file)&lt;br /&gt;    {&lt;br /&gt;      string strName=file.PostedFile.FileName;&lt;br /&gt;      if(strName.Trim()!=&quot;&quot;)&lt;br /&gt;      {&lt;br /&gt;        crv.ReportSource=strName&lt;br /&gt;        Session[&quot;fileName&quot;]=strName;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    在B/S中要防止数据源的丢失&lt;br /&gt;    priavte void Page_Load(object sender,System.EventArgs e)&lt;br /&gt;    {&lt;br /&gt;      if(Session[&quot;fileName&quot;]!=null)&lt;br /&gt;      {&lt;br /&gt;        crv.ReportSource=Session[&quot;fileName&quot;].ToString();&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;7. 假如直接从数据库中读取数据，采用PULL模式可能出现错误（登录的用户名和密码不对）&lt;br /&gt;   private void ReadCRV(CrystalReportViewer crv,CrystalReport cr)&lt;br /&gt;   {&lt;br /&gt;      ReportDocument reportDoc=new ReportDocument();&lt;br /&gt;      reportDoc.Load(Server.MapPath(cr));//要加载的rpt文件的名字&lt;br /&gt;      //解决登录的问题&lt;br /&gt;      TableLogOnInfo logonInfo = new TableLogOnInfo();&lt;br /&gt;      foreach(Table tb in ReportDoc.Database.Tables)&lt;br /&gt;      {&lt;br /&gt;        logonInfo=tb.LogOnInfo;&lt;br /&gt;        logonInfo.ConnectionInfo.ServerName=&quot;(loacl)&quot;;&lt;br /&gt;        logonInfo.ConnectionInfo.DatabaseName=&quot;Pubs&quot;;&lt;br /&gt;        logonInfo.ConnectionInfo.UserId=&quot;sa&quot;;&lt;br /&gt;        logonInfo.ConnectionInfo.Password=&quot;&quot;;&lt;br /&gt;        tb.ApplyLogOnInfo(logonInfo);&lt;br /&gt;      }&lt;br /&gt;      crv.ReportSource=reportDoc;&lt;br /&gt;   }&lt;br /&gt;8. 采用Push模式，直接在数据源读取&lt;br /&gt;   private void BindReport(CrystalReportViewer crv)&lt;br /&gt;   {&lt;br /&gt;     string strProvider=&quot;Server=(local);DataBase=pubs;uid=sa;pwd=&quot;;&lt;br /&gt;     CrystalReport cr=new CrystalReport();&lt;br /&gt;     DataSet ds=new DataSet();&lt;br /&gt;     SqlConnection conn=new SqlConnection(strProvider);&lt;br /&gt;     conn.open();&lt;br /&gt;     string strSql=&quot;select * from jobs&quot;;&lt;br /&gt;     SqlDataAdapter dap=new SqlDataAdapter(strSql,conn);&lt;br /&gt;     adp.Fill(ds,&quot;jobs&quot;);&lt;br /&gt;     cr.SetDataSource(ds);&lt;br /&gt;     crv.ReportSource=cr;&lt;br /&gt;   }&lt;br /&gt;9. 导出水晶报表的文件&lt;br /&gt;   private void ExportCrv(CrystalReport cr)&lt;br /&gt;   {&lt;br /&gt;      DiskFileDestionOptions dOpt=new DiskFileDestionOptions();&lt;br /&gt;      cr.ExportOptions.ExportDestinationType=ExportDestinationType.DiskFile();&lt;br /&gt;      cr.ExportOptions.ExportFormatType= ExportFormatType.PortableDocFormat;&lt;br /&gt;      dOpt.DiskFileName=&quot;C:\output.pdf&quot;;&lt;br /&gt;      cr.ExportOptions.DestinationOptions=dOpt;&lt;br /&gt;      cr.Export();&lt;br /&gt;     &lt;br /&gt;   }&lt;br /&gt;   private void ExportCrv(CrystalReport cr,string strType,string strPath)&lt;br /&gt;   {&lt;br /&gt;      DiskFileDestionOptions dOpt=new DiskFileDestionOptions();&lt;br /&gt;      cr.ExportOptions.ExportDestinationType=ExportDestinationType.DiskFile();&lt;br /&gt;      switch(strType)&lt;br /&gt;      {&lt;br /&gt;         case &quot;RTF&quot;:&lt;br /&gt;           cr.ExportOptions.ExportFormatType=ExportFormatType.RichText;&lt;br /&gt;           dOpt.DiskFileName=strPath;&lt;br /&gt;           break;&lt;br /&gt;         case &quot;PDF&quot;:&lt;br /&gt;           cr.ExportOptions.ExportFormatType=ExportFormatType.PortableDocFormat;&lt;br /&gt;           dOpt.DiskFileName=strPath;&lt;br /&gt;           break;&lt;br /&gt;         case &quot;DOC&quot;:&lt;br /&gt;           cr.ExportOptions.ExportFormatType=ExportFormatType.WordForWindows;&lt;br /&gt;           dOpt.DiskFileName=strPath;&lt;br /&gt;           break;&lt;br /&gt;         case &quot;XLS&quot;:&lt;br /&gt;           cr.ExportOptions.ExportFormatType=ExportFormatType.Excel;&lt;br /&gt;           dOpt.DiskFileName=strPath;&lt;br /&gt;           break;&lt;br /&gt;         default;&lt;br /&gt;         break;&lt;br /&gt;          &lt;br /&gt;      }&lt;br /&gt;      cr.ExportOptions.DestinationOptions=dOpt;&lt;br /&gt;      cr.Export();&lt;br /&gt;   }&lt;br /&gt;10 B/S下水晶报表的打印&lt;br /&gt;   priavte void PrintCRV(CrystalReport cr)&lt;br /&gt;   {&lt;br /&gt;     stringstrPrinterName=@&quot;printName&quot;;&lt;br /&gt;     PageMargins margins=cr.PrintOptions.PageMargins;&lt;br /&gt;     margins.bottomMargin = 250;&lt;br /&gt;     margins.leftMargin = 350;&lt;br /&gt;     margins.rightMargin = 350;&lt;br /&gt;     margins.topMargin = 450;&lt;br /&gt;     cr.PrintOptions.ApplyPageMargins(margins);&lt;br /&gt;     cr.PrintOptions.printerName=strPrinterName;&lt;br /&gt;     cr.PrintToPrinter(1,false,0,0)//参数设置为0，表示打印所用页&lt;br /&gt;   }&lt;br /&gt;96.全屏幕截取&lt;br /&gt;/*&lt;br /&gt;using System.Drawing.Drawing2D;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Drawing.Imaging;&lt;br /&gt;using System.Threading;&lt;br /&gt;*/&lt;br /&gt;[DllImport(&quot;gdi32.dll&quot;)]&lt;br /&gt;private static extern int BitBlt(IntPtr hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,IntPtr hdcSrc,int nXSrc,int nYSrc,UInt32 dwRop);&lt;br /&gt;            //this.Hide();//如果你不想截取的图象中有此应用程序&lt;br /&gt;            //Thread.Sleep(1000);&lt;br /&gt;            Rectangle rect = new Rectangle();&lt;br /&gt;            rect = Screen.GetWorkingArea(this);//获得当前屏幕的大小  &lt;br /&gt;            Graphics g = this.CreateGraphics();&lt;br /&gt;//创建一个以当前屏幕为模板的图象  &lt;br /&gt;            Image myimage = new Bitmap(rect.Width, rect.Height, g);&lt;br /&gt;//第二种得到全屏坐标的方法&lt;br /&gt;         // Image myimage = new Bitmap(Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height,g);&lt;br /&gt;//创建以屏幕大小为标准的位图 &lt;br /&gt;            Graphics gg = Graphics.FromImage(myimage);&lt;br /&gt;            IntPtr dc = g.GetHdc();//得到屏幕的DC &lt;br /&gt;            IntPtr dcdc = gg.GetHdc();//得到Bitmap的DC    &lt;br /&gt;         BitBlt(dcdc, 0, 0, rect.Width, rect.Height, dc, 0, 0, 13369376);&lt;br /&gt;//调用此API函数，实现屏幕捕获  &lt;br /&gt;            g.ReleaseHdc(dc);//释放掉屏幕的DC  &lt;br /&gt;            gg.ReleaseHdc(dcdc);//释放掉Bitmap的DC    &lt;br /&gt;            myimage.Save(Application.StartupPath + @&quot;\bob.jpg&quot;,    ImageFormat.Jpeg);//以JPG文件格式来保存  &lt;br /&gt;            this.Show();&lt;br /&gt;97.区域截幕&lt;br /&gt;/*&lt;br /&gt;using System.Drawing.Drawing2D;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Drawing.Imaging;&lt;br /&gt;using System.Threading;&lt;br /&gt; [DllImport(&quot;gdi32.dll&quot;)]&lt;br /&gt;public static extern IntPtr CreateDC(&lt;br /&gt; string lpszDriver,        // driver name&lt;br /&gt; string lpszDevice,        // device name&lt;br /&gt; string lpszOutput,        // not used; should be NULL&lt;br /&gt; Int64 lpInitData  // optional printer data&lt;br /&gt; );&lt;br /&gt; &lt;br /&gt;[DllImport(&quot;gdi32.dll&quot;)]&lt;br /&gt;public static extern IntPtr CreateCompatibleDC(&lt;br /&gt; IntPtr hdc // handle to DC&lt;br /&gt; );&lt;br /&gt; &lt;br /&gt;[DllImport(&quot;gdi32.dll&quot;)]&lt;br /&gt;public static extern int GetDeviceCaps(&lt;br /&gt; IntPtr hdc,     // handle to DC&lt;br /&gt; GetDeviceCapsIndex nIndex   // index of capability&lt;br /&gt;);&lt;br /&gt;[DllImport(&quot;gdi32.dll&quot;)]&lt;br /&gt;public static extern IntPtr CreateCompatibleBitmap(&lt;br /&gt; IntPtr hdc,        // handle to DC&lt;br /&gt; int nWidth,     // width of bitmap, in pixels&lt;br /&gt; int nHeight     // height of bitmap, in pixels&lt;br /&gt; );&lt;br /&gt;[DllImport(&quot;gdi32.dll&quot;)]&lt;br /&gt;public static extern IntPtr SelectObject(&lt;br /&gt; IntPtr hdc,          // handle to DC&lt;br /&gt; IntPtr hgdiobj   // handle to object&lt;br /&gt; );&lt;br /&gt;[DllImport(&quot;gdi32.dll&quot;)]&lt;br /&gt;public static extern int BitBlt(&lt;br /&gt; IntPtr hdcDest, // handle to destination DC&lt;br /&gt; int nXDest,  // x-coord of destination upper-left corner&lt;br /&gt; int nYDest,  // y-coord of destination upper-left corner&lt;br /&gt; int nWidth,  // width of destination rectangle&lt;br /&gt; int nHeight, // height of destination rectangle&lt;br /&gt; IntPtr hdcSrc,  // handle to source DC&lt;br /&gt; int nXSrc,   // x-coordinate of source upper-left corner&lt;br /&gt; int nYSrc,   // y-coordinate of source upper-left corner&lt;br /&gt; UInt32 dwRop  // raster operation code&lt;br /&gt; );&lt;br /&gt;[DllImport(&quot;gdi32.dll&quot;)]&lt;br /&gt;public static extern int DeleteDC(&lt;br /&gt; IntPtr hdc          // handle to DC&lt;br /&gt; );&lt;br /&gt;*/&lt;br /&gt;public static Bitmap GetPartScreen(Point P1,Point P2,bool Full)&lt;br /&gt;{&lt;br /&gt;    IntPtr hscrdc,hmemdc;&lt;br /&gt;    IntPtr hbitmap,holdbitmap;&lt;br /&gt;    int nx,ny,nx2,ny2;&lt;br /&gt;    nx=ny=nx2=ny2=0;&lt;br /&gt;    int nwidth, nheight;&lt;br /&gt;    int xscrn, yscrn;&lt;br /&gt;    hscrdc = CreateDC(&quot;DISPLAY&quot;, null, null, 0);//创建DC句柄&lt;br /&gt;    hmemdc = CreateCompatibleDC(hscrdc);//创建一个内存DC&lt;br /&gt;    xscrn = GetDeviceCaps(hscrdc, GetDeviceCapsIndex.HORZRES);//获取屏幕宽度&lt;br /&gt;    yscrn = GetDeviceCaps(hscrdc, GetDeviceCapsIndex.VERTRES);//获取屏幕高度&lt;br /&gt;    if(Full)//如果是截取整个屏幕&lt;br /&gt;    {&lt;br /&gt;        nx = 0;&lt;br /&gt;        ny = 0;&lt;br /&gt;        nx2 = xscrn;&lt;br /&gt;        ny2 = yscrn;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        nx = P1.X;&lt;br /&gt;        ny = P1.Y;&lt;br /&gt;        nx2 =P2.X;&lt;br /&gt;        ny2 =P2.Y;&lt;br /&gt;        //检查数值合法性&lt;br /&gt;        if(nx&lt;0)nx = 0;&lt;br /&gt;        if(ny&lt;0)ny = 0;&lt;br /&gt;        if(nx2&gt;xscrn)nx2 = xscrn;&lt;br /&gt;        if(ny2&gt;yscrn)ny2 = yscrn;&lt;br /&gt;    }&lt;br /&gt;    nwidth = nx2 - nx;//截取范围的宽度&lt;br /&gt;    nheight = ny2 - ny;//截取范围的高度&lt;br /&gt;    hbitmap = CreateCompatibleBitmap(hscrdc, nwidth, nheight);//从内存DC复制到hbitmap句柄&lt;br /&gt;    holdbitmap = SelectObject(hmemdc, hbitmap);&lt;br /&gt;    BitBlt(hmemdc, 0, 0, nwidth, nheight,hscrdc, nx, ny,(UInt32)0xcc0020);&lt;br /&gt;    hbitmap = SelectObject(hmemdc, holdbitmap);&lt;br /&gt;    DeleteDC(hscrdc);//删除用过的对象&lt;br /&gt;    DeleteDC(hmemdc);//删除用过的对象&lt;br /&gt;    return Bitmap.FromHbitmap(hbitmap);//用Bitmap.FromHbitmap从hbitmap返回Bitmap&lt;br /&gt;}&lt;br /&gt;98.计算文件MD5值&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Security.Cryptography;&lt;br /&gt;*/&lt;br /&gt;string path = %%1;&lt;br /&gt;FileStream fs = new FileStream(path,FileMode.Open,FileAccess.Read);&lt;br /&gt;MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();&lt;br /&gt;byte [] md5byte = md5.ComputeHash(fs);&lt;br /&gt;int i,j;&lt;br /&gt;StringBuilder sb = new StringBuilder(16);&lt;br /&gt;foreach (byte b in md5byte)&lt;br /&gt;{&lt;br /&gt;　   i = Convert.ToInt32(b);&lt;br /&gt;　　 j = i &gt;&gt; 4;&lt;br /&gt;　　 sb.Append(Convert.ToString(j,16));&lt;br /&gt;　　 j = ((i &lt;&lt; 4) &amp; 0x00ff) &gt;&gt; 4;&lt;br /&gt;　　 sb.Append(Convert.ToString(j,16));&lt;br /&gt;}&lt;br /&gt;string %%2=sb.ToString();&lt;br /&gt;99.计算获取文件夹中文件的MD5值&lt;br /&gt;/*&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Security.Cryptography;&lt;br /&gt;using System.Collections;&lt;br /&gt;*/&lt;br /&gt;bool b=false;&lt;br /&gt;string path = (%%2.LastIndexOf(&quot;\\&quot;) == %%2.Length - 1) ? %%2 : %%2 + &quot;\\&quot;;&lt;br /&gt;string parent = Path.GetDirectoryName(%%1);&lt;br /&gt;Directory.CreateDirectory(path + Path.GetFileName(%%1));&lt;br /&gt;DirectoryInfo dir = new DirectoryInfo((%%1.LastIndexOf(&quot;\\&quot;) == %%1.Length - 1) ? %%1 : %%1 + &quot;\\&quot;);&lt;br /&gt;FileSystemInfo[] fileArr = dir.GetFileSystemInfos();&lt;br /&gt;Queue&lt;FileSystemInfo&gt; Folders = new Queue&lt;FileSystemInfo&gt;(dir.GetFileSystemInfos());&lt;br /&gt;while (Folders.Count &gt; 0)&lt;br /&gt;{&lt;br /&gt;    FileSystemInfo tmp = Folders.Dequeue();&lt;br /&gt;    FileInfo f = tmp as FileInfo;&lt;br /&gt;    if (b &amp;&amp; f == null)&lt;br /&gt;    {&lt;br /&gt;        DirectoryInfo d = tmp as DirectoryInfo;&lt;br /&gt;        Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf(&quot;\\&quot;) == parent.Length - 1) ? parent : parent + &quot;\\&quot;, path));&lt;br /&gt;        foreach (FileSystemInfo fi in d.GetFileSystemInfos())&lt;br /&gt;        {&lt;br /&gt;            Folders.Enqueue(fi);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        FileStream fs = new FileStream(f,FileMode.Open,FileAccess.Read);&lt;br /&gt;        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();&lt;br /&gt;        byte [] md5byte = md5.ComputeHash(fs);&lt;br /&gt;        int i,j;&lt;br /&gt;        StringBuilder sb = new StringBuilder(16);&lt;br /&gt;        foreach (byte b in md5byte)&lt;br /&gt;        {&lt;br /&gt;        　   i = Convert.ToInt32(b);&lt;br /&gt;        　　 j = i &gt;&gt; 4;&lt;br /&gt;        　　 sb.Append(Convert.ToString(j,16));&lt;br /&gt;        　　 j = ((i &lt;&lt; 4) &amp; 0x00ff) &gt;&gt; 4;&lt;br /&gt;        　　 sb.Append(Convert.ToString(j,16));&lt;br /&gt;        }&lt;br /&gt;        string %%3=sb.ToString();&lt;br /&gt;    }&lt;br /&gt;}</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/7608462823098929719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/7608462823098929719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/7608462823098929719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/7608462823098929719'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2011/06/c.html' title='C#文件操作大全'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-4415433560139225054</id><published>2011-01-09T14:50:00.000-05:00</published><updated>2011-01-09T14:55:50.465-05:00</updated><title type='text'></title><content type='html'>1、IIS下301设置&lt;br /&gt;&lt;br /&gt;Internet信息服务管理器 -&amp;gt; 虚拟目录 -&amp;gt; 重定向到URL，输入需要转向的目标URL，并选择“资源的永久重定向”。&lt;br /&gt;&lt;br /&gt;2、ASP下的301转向代码&lt;br /&gt;&lt;br /&gt;    &amp;lt;%@ Language=VBScript %&amp;gt;&lt;br /&gt;    &amp;lt;%&lt;br /&gt;    Response.Status=”301 Moved Permanently”&lt;br /&gt;    Response.AddHeader “Location”, “http://www.lesishu.cn/articles/301/”&lt;br /&gt;    %&amp;gt;&lt;br /&gt;&lt;br /&gt;3、ASP.Net下的301转向代码&lt;br /&gt;&lt;br /&gt;    &amp;lt;script runat=”server”&amp;gt;&lt;br /&gt;    private void Page_Load(object sender, System.EventArgs e)&lt;br /&gt;    {&lt;br /&gt;    Response.Status = “301 Moved Permanently”;&lt;br /&gt;    Response.AddHeader(”Location”,”http://www.lesishu.cn/articles/301/“);&lt;br /&gt;    }&lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;4、PHP下的301转向代码&lt;br /&gt;&lt;br /&gt;    header(”HTTP/1.1 301 Moved Permanently”);&lt;br /&gt;    header(”Location: http://www.lesishu.cn/articles/301/”);&lt;br /&gt;    exit();&lt;br /&gt;&lt;br /&gt;5、CGI Perl下的301转向代码&lt;br /&gt;&lt;br /&gt;    $q = new CGI;&lt;br /&gt;    print $q-&amp;gt;redirect(”http://www.new-url.com/”);&lt;br /&gt;&lt;br /&gt;6、JSP下的301转向代码&lt;br /&gt;&lt;br /&gt;    &amp;lt;%&lt;br /&gt;    response.setStatus(301);&lt;br /&gt;    response.setHeader( “Location”, “http://www.lesishu.cn/” );&lt;br /&gt;    response.setHeader( “Connection”, “close” );&lt;br /&gt;    %&amp;gt;&lt;br /&gt;&lt;br /&gt;7、Apache下301转向代码&lt;br /&gt;&lt;br /&gt;新建.htaccess文件，输入下列内容（需要开启mod_rewrite）：&lt;br /&gt;&lt;br /&gt;1）将不带WWW的域名转向到带WWW的域名下&lt;br /&gt;&lt;br /&gt;    Options +FollowSymLinks&lt;br /&gt;    RewriteEngine on&lt;br /&gt;    RewriteCond %{HTTP_HOST} ^lesishu.cn [NC]&lt;br /&gt;    RewriteRule ^(.*)$ http://www.lesishu.cn/$1 [L,R=301]&lt;br /&gt;&lt;br /&gt;2）重定向到新域名&lt;br /&gt;&lt;br /&gt;    Options +FollowSymLinks&lt;br /&gt;    RewriteEngine on&lt;br /&gt;    RewriteRule ^(.*)$ http://www.lesishu.cn/$1 [L,R=301]&lt;br /&gt;&lt;br /&gt;3）使用正则进行301转向，实现伪静态&lt;br /&gt;&lt;br /&gt;    Options +FollowSymLinks&lt;br /&gt;    RewriteEngine on&lt;br /&gt;    RewriteRule ^news-(.+)\.html$ news.php?id=$1&lt;br /&gt;&lt;br /&gt;将news.php?id=123这样的地址转向到news-123.html&lt;br /&gt;&lt;br /&gt;8、Apache下vhosts.conf中配置301转向&lt;br /&gt;&lt;br /&gt;为实现URL规范化，SEO通常将不带WWW的域名转向到带WWW域名，vhosts.conf中配置为：&lt;br /&gt;&lt;br /&gt;    &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;    ServerName www.lesishu.cn&lt;br /&gt;    DocumentRoot /home/lesishu&lt;br /&gt;    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;    ServerName lesishu.cn&lt;br /&gt;    RedirectMatch permanent ^/(.*) http://www.lesishu.cn/$1&lt;br /&gt;    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;br /&gt;Apache下除了以上2种方法，还有其他配置方法和可选参数，建议阅读Apache文档。&lt;br /&gt;&lt;br /&gt;301转向情况检测&lt;br /&gt;&lt;br /&gt;   1. http://www.seoconsultants.com/tools/headers.asp&lt;br /&gt;   2. http://www.internetofficer.com/seo-tool/redirect-check/</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/4415433560139225054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/4415433560139225054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/4415433560139225054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/4415433560139225054'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2011/01/1iis301-internet-urlurl-2asp301.html' title=''/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-7239917006763598060</id><published>2010-11-18T21:55:00.000-05:00</published><updated>2010-11-18T22:12:27.100-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><title type='text'>JS获取浏览器窗口大小</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIQHAFZyGgNSSnckyoAIrMc1WyrY3l0u4tM4QKB-Uc7D-2pHKw4WLVHus5sU2Q9yKJrtCWg7bVqe0_Aa9NvUtDIXRXzHOF2PMnvvTaqmg__stYZdSBCQMFworwONQZRING4Bgh587SMtw/s1600/pic.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 408px; height: 402px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIQHAFZyGgNSSnckyoAIrMc1WyrY3l0u4tM4QKB-Uc7D-2pHKw4WLVHus5sU2Q9yKJrtCWg7bVqe0_Aa9NvUtDIXRXzHOF2PMnvvTaqmg__stYZdSBCQMFworwONQZRING4Bgh587SMtw/s320/pic.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5541089975080703682&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class=&quot;postText&quot;&gt;&lt;br /&gt;&lt;p&gt;网页可见区域宽：document.body.clientWidth&lt;br /&gt;网页可见区域高：document.body.clientHeight&lt;br /&gt;网页可见区域宽：document.body.offsetWidth (包括边线的宽)&lt;br /&gt;网页可见区域高：document.body.offsetHeight (包括边线的宽)&lt;br /&gt;网页正文全文宽：document.body.scrollWidth&lt;br /&gt;网页正文全文高：document.body.scrollHeight&lt;br /&gt;网页被卷去的高：document.body.scrollTop&lt;br /&gt;网页被卷去的左：document.body.scrollLeft&lt;br /&gt;网页正文部分上：window.screenTop&lt;br /&gt;网页正文部分左：window.screenLeft&lt;br /&gt;屏幕分辨率的高：window.screen.height&lt;br /&gt;屏幕分辨率的宽：window.screen.width&lt;br /&gt;屏幕可用工作区高度：window.screen.availHeight&lt;br /&gt;屏幕可用工作区宽度：window.screen.availWidth&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth&lt;br /&gt;scrollHeight: 获取对象的滚动高度。&lt;br /&gt;scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离&lt;br /&gt;scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离&lt;br /&gt;scrollWidth:获取对象的滚动宽度&lt;br /&gt;offsetHeight:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度&lt;br /&gt;offsetLeft:获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置&lt;br /&gt;offsetTop:获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置&lt;br /&gt;event.clientX 相对文档的水平座标&lt;br /&gt;event.clientY 相对文档的垂直座标&lt;br /&gt;event.offsetX 相对容器的水平坐标&lt;br /&gt;event.offsetY 相对容器的垂直坐标&lt;br /&gt;document.documentElement.scrollTop 垂直方向滚动的值&lt;br /&gt;event.clientX+document.documentElement.scrollTop 相对文档的水平座标+垂直方向滚动的量&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;IE，FireFox 差异如下：&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;IE6.0、FF1.06+：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;clientWidth = width + padding&lt;/p&gt;&lt;br /&gt;&lt;p&gt;clientHeight = height + padding&lt;/p&gt;&lt;br /&gt;&lt;p&gt;offsetWidth = width + padding + border&lt;/p&gt;&lt;br /&gt;&lt;p&gt;offsetHeight = height + padding + border&lt;/p&gt;&lt;br /&gt;&lt;p&gt;IE5.0/5.5：&lt;br /&gt;clientWidth = width - border&lt;/p&gt;&lt;br /&gt;&lt;p&gt;clientHeight = height - border&lt;/p&gt;&lt;br /&gt;&lt;p&gt;offsetWidth = width&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;offsetHeight = height&lt;/p&gt;&lt;br /&gt;&lt;p&gt;(需要提一下：CSS中的margin属性，与clientWidth、offsetWidth、clientHeight、offsetHeight均无关)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;网页可见区域宽： document.body.clientWidth&lt;br /&gt;网页可见区域高： document.body.clientHeight&lt;br /&gt;网页可见区域宽： document.body.offsetWidth (包括边线的宽)&lt;br /&gt;网页可见区域高： document.body.offsetHeight (包括边线的高)&lt;br /&gt;网页正文全文宽： document.body.scrollWidth&lt;br /&gt;网页正文全文高： document.body.scrollHeight&lt;br /&gt;网页被卷去的高： document.body.scrollTop&lt;br /&gt;网页被卷去的左： document.body.scrollLeft&lt;br /&gt;网页正文部分上： window.screenTop&lt;br /&gt;网页正文部分左： window.screenLeft&lt;br /&gt;屏幕分辨率的高： window.screen.height&lt;br /&gt;屏幕分辨率的宽： window.screen.width&lt;br /&gt;屏幕可用工作区高度： window.screen.availHeight&lt;br /&gt;屏幕可用工作区宽度： window.screen.availWidth&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;－－－－－－－－－－－－－－－－－－－&lt;/p&gt;&lt;br /&gt;&lt;p&gt;技术要点&lt;br /&gt;本节代码主要使用了Document对象关于窗口的一些属性，这些属性的主要功能和用法如下。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;要得到窗口的尺寸，对于不同的浏览器，需要使用不同的属性和方法：若要检测窗口的真实尺寸，在Netscape下需要使用Window的属性；在IE下需要深入Document内部对body进行检测；在DOM环境下，若要得到窗口的尺寸，需要注意根元素的尺寸，而不是元素。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Window对象的innerWidth属性包含当前窗口的内部宽度。Window对象的innerHeight属性包含当前窗口的内部高度。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Document对象的body属性对应HTML文档的标签。Document对象的documentElement属性则表示HTML文档的根节点。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;document.body.clientHeight表示HTML文档所在窗口的当前高度。document.body. clientWidth表示HTML文档所在窗口的当前宽度。&lt;/p&gt;&lt;br /&gt;&lt;div class=&quot;wp_codebox&quot; style=&quot;padding-bottom: 15px;&quot;&gt;&lt;table width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr id=&quot;p11991&quot;&gt;&lt;td class=&quot;line_numbers&quot; width=&quot;1%&quot;&gt;&lt;pre&gt;1&lt;br /&gt;       2&lt;br /&gt;       3&lt;br /&gt;       4&lt;br /&gt;       5&lt;br /&gt;       6&lt;br /&gt;       7&lt;br /&gt;       8&lt;br /&gt;       9&lt;br /&gt;       10&lt;br /&gt;       11&lt;br /&gt;       12&lt;br /&gt;       13&lt;br /&gt;       14&lt;br /&gt;       15&lt;br /&gt;       16&lt;br /&gt;       17&lt;br /&gt;       18&lt;br /&gt;       19&lt;br /&gt;       20&lt;br /&gt;       21&lt;br /&gt;       22&lt;br /&gt;       23&lt;br /&gt;       24&lt;br /&gt;       25&lt;br /&gt;       26&lt;br /&gt;       27&lt;br /&gt;       28&lt;br /&gt;       29&lt;br /&gt;       30&lt;br /&gt;       31&lt;br /&gt;       32&lt;br /&gt;       33&lt;br /&gt;       34&lt;br /&gt;       35&lt;br /&gt;       36&lt;br /&gt;       37&lt;br /&gt;       38&lt;br /&gt;       39&lt;br /&gt;       40&lt;br /&gt;       41&lt;br /&gt;       42&lt;br /&gt;       43&lt;br /&gt;       44&lt;br /&gt;       45&lt;br /&gt;       46&lt;br /&gt;       47&lt;br /&gt;       48&lt;br /&gt;       &lt;/pre&gt;&lt;br /&gt;       &lt;/td&gt;&lt;br /&gt;       &lt;td class=&quot;code&quot; id=&quot;p1199code1&quot;&gt;&lt;br /&gt;&lt;br /&gt;       &lt;pre class=&quot;html&quot; style=&quot;font-family: monospace;&quot;&gt;&amp;lt; !DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;&lt;br /&gt;       &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&amp;gt;&lt;br /&gt;       &amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&amp;gt;&lt;br /&gt;       &amp;lt;head&amp;gt;&lt;br /&gt;       &amp;lt;title&amp;gt;请调整浏览器窗口&amp;lt;/title&amp;gt;&lt;br /&gt;       &amp;lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=gb2312&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;/meta&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;       &amp;lt;body&amp;gt;&lt;br /&gt;       &amp;lt;h2 align=&quot;center&quot;&amp;gt;请调整浏览器窗口大小&amp;lt;/h2&amp;gt;&amp;lt;hr /&amp;gt;&lt;br /&gt;       &amp;lt;form action=&quot;#&quot; method=&quot;get&quot; name=&quot;form1&quot; id=&quot;form1&quot;&amp;gt;&lt;br /&gt;       &amp;lt;!--显示浏览器窗口的实际尺寸--&amp;gt;&lt;br /&gt;&lt;br /&gt;       浏览器窗口 的 实际高度: &amp;lt;input type=&quot;text&quot; name=&quot;availHeight&quot; size=&quot;4&quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;       浏览器窗口 的 实际宽度: &amp;lt;input type=&quot;text&quot; name=&quot;availWidth&quot; size=&quot;4&quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;       &amp;lt;/form&amp;gt;&lt;br /&gt;       &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;&lt;br /&gt;       &amp;lt;!--&lt;br /&gt;       var winWidth = 0;&lt;br /&gt;       var winHeight = 0;&lt;br /&gt;       function findDimensions() //函数：获取尺寸&lt;br /&gt;       {&lt;br /&gt;       //获取窗口宽度&lt;br /&gt;       if (window.innerWidth)&lt;br /&gt;       winWidth = window.innerWidth;&lt;br /&gt;       else if ((document.body) &amp;amp;&amp;amp; (document.body.clientWidth))&lt;br /&gt;       winWidth = document.body.clientWidth;&lt;br /&gt;       //获取窗口高度&lt;br /&gt;       if (window.innerHeight)&lt;br /&gt;       winHeight = window.innerHeight;&lt;br /&gt;       else if ((document.body) &amp;amp;&amp;amp; (document.body.clientHeight))&lt;br /&gt;       winHeight = document.body.clientHeight;&lt;br /&gt;       //通过深入Document内部对body进行检测，获取窗口大小&lt;br /&gt;       if (document.documentElement  &amp;amp;&amp;amp; document.documentElement.clientHeight &amp;amp;&amp;amp; document.documentElement.clientWidth)&lt;br /&gt;       {&lt;br /&gt;       winHeight = document.documentElement.clientHeight;&lt;br /&gt;       winWidth = document.documentElement.clientWidth;&lt;br /&gt;       }&lt;br /&gt;       //结果输出至两个文本框&lt;br /&gt;       document.form1.availHeight.value= winHeight;&lt;br /&gt;       document.form1.availWidth.value= winWidth;&lt;br /&gt;       }&lt;br /&gt;       findDimensions();&lt;br /&gt;       //调用函数，获取数值&lt;br /&gt;       window.onresize=findDimensions;&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;       //--&amp;gt;&lt;br /&gt;       &amp;lt;/script&amp;gt;&lt;br /&gt;       &amp;lt;/body&amp;gt;&lt;br /&gt;       &amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;       &lt;/td&gt;&lt;br /&gt;   &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;br /&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;源程序解读&lt;/p&gt;&lt;br /&gt;&lt;p&gt;（1）程序首先建立一个表单，包含两个文本框，用于显示窗口当前的宽度和高度，并且，其数值会随窗口大小的改变而变化。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;（2）在随后的JavaScript代码中，首先定义了两个变量winWidth和winHeight，用于保存窗口的高度值和宽度值。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;（3）然后，在函数findDimensions ( )中，使用window.innerHeight和window.innerWidth得到窗口的高度和宽度，并将二者保存在前述两个变量中。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;（4）再通过深入Document内部对body进行检测，获取窗口大小，并存储在前述两个变量中。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;（5）在函数的最后，通过按名称访问表单元素，结果输出至两个文本框。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;（6）在JavaScript代码的最后，通过调用findDimensions ( )函数，完成整个操作。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/7239917006763598060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/7239917006763598060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/7239917006763598060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/7239917006763598060'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2010/11/document.html' title='JS获取浏览器窗口大小'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIQHAFZyGgNSSnckyoAIrMc1WyrY3l0u4tM4QKB-Uc7D-2pHKw4WLVHus5sU2Q9yKJrtCWg7bVqe0_Aa9NvUtDIXRXzHOF2PMnvvTaqmg__stYZdSBCQMFworwONQZRING4Bgh587SMtw/s72-c/pic.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-5523658879358249513</id><published>2010-09-19T18:58:00.000-04:00</published><updated>2010-09-19T19:03:12.520-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="HTML and CSS"/><title type='text'>Create CSS Rounded Corners by css or images</title><content type='html'>There are several good resources teach how to create rounded corners by css and images.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;1. Google Rounded Corners Generator&lt;/h3&gt;&lt;br /&gt;http://groups-beta.google.com/groups/roundedcorners? &lt;strong&gt;c&lt;/strong&gt;=999999&amp;amp;&lt;strong&gt;bc&lt;/strong&gt;=white&amp;amp;&lt;strong&gt;w&lt;/strong&gt;=4&amp;amp;&lt;strong&gt;h&lt;/strong&gt;=4&amp;amp;&lt;strong&gt;a&lt;/strong&gt;=tr&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;2. Spiffy Corners&lt;/h3&gt;http://www.spiffycorners.com/sc.php?sc=spiffy&amp;amp;bg=ffffff&amp;amp;fg=0a67e6&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;3. Cornershop&lt;/h3&gt;http://wigflip.com/cornershop/&lt;br /&gt;&lt;br /&gt;They can generate css source code and images based on your demand. Really useful.</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/5523658879358249513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/5523658879358249513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/5523658879358249513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/5523658879358249513'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2010/09/create-css-rounded-corners-by-css-or.html' title='Create CSS Rounded Corners by css or images'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-9179577727638985222</id><published>2010-08-25T16:07:00.000-04:00</published><updated>2010-08-25T16:13:24.437-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dotNet"/><title type='text'>关于C#小数位数</title><content type='html'>1.简单的例子&lt;br /&gt;&lt;br /&gt;System.Globalization.NumberFormatInfo provider = new System.Globalization.NumberFormatInfo();&lt;br /&gt;&lt;br /&gt;provider.NumberDecimalDigits =intDecLength; //要設定的小數位數&lt;br /&gt;&lt;br /&gt;double strCashAmt=Convert.ToDouble(this.txtCashAmt.Text); //先把控件內的值轉成double&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;this.txtCashAmt.Text = strCashAmt.ToString(&quot;N&quot;,provider); //再利用ToString函數格式化小數位數&lt;br /&gt;&lt;br /&gt;2.C#保留小数位N位,四舍五入 .&lt;br /&gt;&lt;br /&gt;decimal d= decimal.Round(decimal.Parse(&quot;0.55555&quot;),2);&lt;br /&gt;&lt;br /&gt;3.C#保留小数位N位四舍五入&lt;br /&gt;&lt;br /&gt;Math.Round(0.55555,2)&lt;br /&gt;&lt;br /&gt;4,C#保留小数位N位四舍五入&lt;br /&gt;&lt;br /&gt;double dbdata = 0.55555;&lt;br /&gt;&lt;br /&gt;string str1 = dbdata.ToString(&quot;f2&quot;);//fN 保留N位，四舍五入&lt;br /&gt;&lt;br /&gt;5.C#保留小数位N位四舍五入&lt;br /&gt;&lt;br /&gt;string result = String.Format(&quot;{0:N2}&quot;, 0.55555);//2位&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;string result = String.Format(&quot;{0:N3}&quot;, 0.55555);//3位&lt;br /&gt;&lt;br /&gt;6. C#保留小数位N位四舍五入&lt;br /&gt;&lt;br /&gt;double s=0.55555;&lt;br /&gt;&lt;br /&gt;result=s.ToString(&quot;#0.00&quot;);//点后面几个0就保留几位&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C#保留小数位数，及百分号的解决方法:&lt;br /&gt;&lt;br /&gt;1、用NumberFormatInfo类来解决:&lt;br /&gt;&lt;br /&gt;System.Globalization.NumberFormatInfo provider = new System.Globalization.NumberFormatInfo();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;provider.PercentDecimalDigits = 2;//小数点保留几位数.&lt;br /&gt;&lt;br /&gt;provider.PercentPositivePattern = 2;//百分号出现在何处.&lt;br /&gt;&lt;br /&gt;double result = (double)1 / 3;//一定要用double类型.&lt;br /&gt;&lt;br /&gt;Response.Write(result.ToString(&quot;P&quot;, provider));&lt;br /&gt;&lt;br /&gt;2、用toString方法.:&lt;br /&gt;&lt;br /&gt;public string getRate(double hcount, double task)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;string rValue;&lt;br /&gt;&lt;br /&gt;string temp = &quot;&quot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if (task == 0)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;task = 1;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;double db = (hcount / task) * 100;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if (hcount &gt;= task)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;rValue = &quot;100%&quot;;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;rValue = db.ToString(&quot;#0.#0&quot;) + &quot;%&quot;;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return rValue;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;string str1 = String.Format(&quot;{0:N1}&quot;,56789); //result: 56,789.0&lt;br /&gt;&lt;br /&gt;string str2 = String.Format(&quot;{0:N2}&quot;,56789); //result: 56,789.00&lt;br /&gt;&lt;br /&gt;string str3 = String.Format(&quot;{0:N3}&quot;,56789); //result: 56,789.000&lt;br /&gt;&lt;br /&gt;string str8 = String.Format(&quot;{0:F1}&quot;,56789); //result: 56789.0&lt;br /&gt;&lt;br /&gt;string str9 = String.Format(&quot;{0:F2}&quot;,56789); //result: 56789.00&lt;br /&gt;&lt;br /&gt;string str11 =(56789 / 100.0).ToString(&quot;#.##&quot;); //result: 567.89&lt;br /&gt;&lt;br /&gt;string str12 =(56789 / 100).ToString(&quot;#.##&quot;); //result: 567</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/9179577727638985222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/9179577727638985222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/9179577727638985222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/9179577727638985222'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2010/08/c.html' title='关于C#小数位数'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-6337159287434774965</id><published>2010-08-16T23:45:00.000-04:00</published><updated>2010-08-17T00:01:55.753-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="solr"/><title type='text'>Install solr in windows tomcat</title><content type='html'>1. download solr like apache-solr-1.4.1&lt;br /&gt;2. download tomcat 5.5  or above&lt;br /&gt;3. Install tomcat&lt;br /&gt;4. Extract apache-solr-1.4.1 package  to anywhere&lt;br /&gt;5. Copy apache-solr-1.4.1\dist\apache-solr-1.4.1.war to Tomcat webapps folder, for instance: Tomcat 5.5\webapps&lt;br /&gt;6. Start tomcat and get: Tomcat 5.5\webapps\apache-solr-1.4.1 directory&lt;br /&gt;7. Stop tomcat, open Tomcat 5.5\webapps\solr\WEB-INF\web.xml and copy below&lt;br /&gt;&lt;br /&gt;&amp;lt;env-entry&amp;gt;&lt;br /&gt;&amp;lt;env-entry-name&amp;gt;solr/home&amp;lt;/env-entry-name&amp;gt;&lt;br /&gt;&amp;lt;env-entry-value&amp;gt;C:\solr&amp;lt;/env-entry-value&amp;gt;&lt;br /&gt;&amp;lt;env-entry-type&amp;gt;java.lang.String&amp;lt;/env-entry-type&amp;gt;&lt;br /&gt;&amp;lt;/env-entry&amp;gt;&lt;br /&gt;&lt;br /&gt;to replace the old.&lt;br /&gt;8. Zip apache-solr-1.4.1  and rename to solr.zip&lt;br /&gt;9. Delete Tomcat 5.5\webapps\apache-solr-1.4.1 directory&lt;br /&gt;10. Copy apache-solr-1.4.1\example\solr folder to c:&lt;br /&gt;11. restart tomcat&lt;br /&gt;&lt;br /&gt;That&#39;s it.</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/6337159287434774965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/6337159287434774965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/6337159287434774965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/6337159287434774965'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2010/08/install-solr-in-windows-tomcat.html' title='Install solr in windows tomcat'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-8121767453743108222</id><published>2010-08-02T21:52:00.000-04:00</published><updated>2010-08-17T00:02:19.149-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="sqlserver"/><title type='text'>SQL Server Express Connection String</title><content type='html'>1. Working with SQL Client:&lt;br /&gt;1.1 NameSpace: System.Data.SqlClient;&lt;br /&gt;1.2 Objects: DataSet dataSet;&lt;br /&gt;                  SqlConnection conn;&lt;br /&gt;                  SqlDataAdapter dbAdapter;&lt;br /&gt;1.3 Connection Strings:&lt;br /&gt;&lt;br /&gt;     1.3.1 Using Windows Authentication Mode of Connectivity:&lt;br /&gt;                      string conString = &quot;Server=.\\SQLEXPRESS;&quot; +&lt;br /&gt;                                    &quot;DataBase=yourDatabase;&quot; +&lt;br /&gt;                                    &quot;Integrated Security=SSPI;&quot;;    &lt;br /&gt;       &lt;br /&gt;    1.3.2 Using SQL Server Authentication Mode of Connectivity:&lt;br /&gt;            string conString = &quot;Server=.\\SQLEXPRESS;&quot; +&lt;br /&gt;                                    &quot;DataBase=yourDatabase;&quot; +&lt;br /&gt;                                    &quot;Uid=yourUserId;Pwd=yourPassword;&quot;;&lt;br /&gt;                                 &lt;br /&gt; 2. Working with OLEDB:&lt;br /&gt;2.1 NameSpace: System.Data.OleDb;&lt;br /&gt;2.2 Objects: DataSet dataSet;&lt;br /&gt;                  OleDbConnection conn;&lt;br /&gt;                  OleDbDataAdapter dbAdapter;&lt;br /&gt;2.3 Connection Strings:&lt;br /&gt;&lt;br /&gt;     2.3.1 Using Windows Authentication Mode of Connectivity:&lt;br /&gt;                  string conString = &quot;Provider=SQLOLEDB;&quot; +&lt;br /&gt;                                   &quot;Data Source=.\\SQLEXPRESS;&quot; +&lt;br /&gt;                                  &quot;Initial Catalog=yourDataBase;&quot; +&lt;br /&gt;                                  &quot;Integrated Security=SSPI;&quot;;&lt;br /&gt;      &lt;br /&gt;    2.3.2 Using SQL Server Authentication Mode of Connectivity:&lt;br /&gt;              string conString = &quot;Provider=SQLOLEDB;&quot; +&lt;br /&gt;                                   &quot;Data Source=.\\SQLEXPRESS;&quot; +&lt;br /&gt;                                  &quot;Initial Catalog=yourDataBase;&quot; +&lt;br /&gt;                                  &quot;Uid = yourUserId; Pwd = yourPassword;&quot;;</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/8121767453743108222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/8121767453743108222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/8121767453743108222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/8121767453743108222'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2010/08/sql-server-express-connection-string.html' title='SQL Server Express Connection String'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-2672609091852177898</id><published>2010-08-02T15:03:00.000-04:00</published><updated>2010-08-17T00:02:40.954-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="XML"/><title type='text'>xml operation</title><content type='html'>&amp;lt;p&amp;gt;用的是一种很笨的方法，但可以帮助初学者了解访问XML节点的过程。&lt;br /&gt;&lt;br /&gt;  已知有一个XML文件（bookstore.xml）如下：&lt;br /&gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&amp;lt;table rules=&quot;none&quot; align=&quot;center&quot; bgcolor=&quot;#ddedfb&quot; border=&quot;1&quot; bordercolor=&quot;#55aaff&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;500&quot;&amp;gt;     &amp;lt;tbody&amp;gt;         &amp;lt;tr&amp;gt;             &amp;lt;td width=&quot;10&quot;&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;             &amp;lt;td&amp;gt;             &amp;lt;p&amp;gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&amp;gt;&lt;br /&gt;&amp;lt;bookstore&amp;gt;&lt;br /&gt;  &amp;lt;book genre=&quot;fantasy&quot; isbn=&quot;2-3631-4&quot;&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Oberon&#39;s Legacy&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;author&amp;gt;Corets, Eva&amp;lt;/author&amp;gt;&lt;br /&gt;    &amp;lt;price&amp;gt;5.95&amp;lt;/price&amp;gt;&lt;br /&gt;  &amp;lt;/book&amp;gt;&lt;br /&gt;&amp;lt;/bookstore&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;             &amp;lt;/td&amp;gt;         &amp;lt;/tr&amp;gt;     &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt;  &amp;lt;p&amp;gt;&lt;br /&gt;&lt;br /&gt;  1、往&amp;lt;bookstore&amp;gt;节点中插入一个&amp;lt;book&amp;gt;节点：&lt;br /&gt;&lt;br /&gt;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt; &amp;lt;/p&amp;gt;&amp;lt;table rules=&quot;none&quot; align=&quot;center&quot; bgcolor=&quot;#ddedfb&quot; border=&quot;1&quot; bordercolor=&quot;#55aaff&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;500&quot;&amp;gt;     &amp;lt;tbody&amp;gt;         &amp;lt;tr&amp;gt;             &amp;lt;td width=&quot;10&quot;&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;             &amp;lt;td&amp;gt;             &amp;lt;p&amp;gt;   XmlDocument xmlDoc=new XmlDocument();&lt;br /&gt;   xmlDoc.Load(&quot;bookstore.xml&quot;);&lt;br /&gt;   XmlNode root=xmlDoc.SelectSingleNode(&quot;bookstore&quot;);//查找&amp;lt;bookstore&amp;gt;&lt;br /&gt;   XmlElement xe1=xmlDoc.CreateElement(&quot;book&quot;);//创建一个&amp;lt;book&amp;gt;节点&lt;br /&gt;   xe1.SetAttribute(&quot;genre&quot;,&quot;李赞红&quot;);//设置该节点genre属性&lt;br /&gt;   xe1.SetAttribute(&quot;ISBN&quot;,&quot;2-3631-4&quot;);//设置该节点ISBN属性&lt;br /&gt;&lt;br /&gt;   XmlElement xesub1=xmlDoc.CreateElement(&quot;title&quot;);&lt;br /&gt;   xesub1.InnerText=&quot;CS从入门到精通&quot;;//设置文本节点&lt;br /&gt;   xe1.AppendChild(xesub1);//添加到&amp;lt;book&amp;gt;节点中&lt;br /&gt;   XmlElement xesub2=xmlDoc.CreateElement(&quot;author&quot;);&lt;br /&gt;   xesub2.InnerText=&quot;候捷&quot;;&lt;br /&gt;   xe1.AppendChild(xesub2);&lt;br /&gt;   XmlElement xesub3=xmlDoc.CreateElement(&quot;price&quot;);&lt;br /&gt;   xesub3.InnerText=&quot;58.3&quot;;&lt;br /&gt;   xe1.AppendChild(xesub3);&lt;br /&gt;&lt;br /&gt;   root.AppendChild(xe1);//添加到&amp;lt;bookstore&amp;gt;节点中&lt;br /&gt;   xmlDoc.Save(&quot;bookstore.xml&quot;);&lt;br /&gt;&amp;lt;/p&amp;gt;             &amp;lt;/td&amp;gt;         &amp;lt;/tr&amp;gt;     &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt;  &amp;lt;p&amp;gt;&lt;br /&gt;  //================&lt;br /&gt;  结果为：&lt;br /&gt;&lt;br /&gt;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt; &amp;lt;/p&amp;gt;&amp;lt;table rules=&quot;none&quot; align=&quot;center&quot; bgcolor=&quot;#ddedfb&quot; border=&quot;1&quot; bordercolor=&quot;#55aaff&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;500&quot;&amp;gt;     &amp;lt;tbody&amp;gt;         &amp;lt;tr&amp;gt;             &amp;lt;td width=&quot;10&quot;&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;             &amp;lt;td&amp;gt;             &amp;lt;p&amp;gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&amp;gt;&lt;br /&gt;&amp;lt;bookstore&amp;gt;&lt;br /&gt;  &amp;lt;book genre=&quot;fantasy&quot; isbn=&quot;2-3631-4&quot;&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Oberon&#39;s Legacy&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;author&amp;gt;Corets, Eva&amp;lt;/author&amp;gt;&lt;br /&gt;    &amp;lt;price&amp;gt;5.95&amp;lt;/price&amp;gt;&lt;br /&gt;  &amp;lt;/book&amp;gt;&lt;br /&gt;  &amp;lt;book genre=&quot;李赞红&quot; isbn=&quot;2-3631-4&quot;&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;CS从入门到精通&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;author&amp;gt;候捷&amp;lt;/author&amp;gt;&lt;br /&gt;    &amp;lt;price&amp;gt;58.3&amp;lt;/price&amp;gt;&lt;br /&gt;  &amp;lt;/book&amp;gt;&lt;br /&gt;&amp;lt;/bookstore&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;             &amp;lt;/td&amp;gt;         &amp;lt;/tr&amp;gt;     &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt;  &amp;lt;p&amp;gt;&lt;br /&gt;2、修改节点：将genre属性值为“李赞红“的节点的genre值改为“update李赞红”，将该节点的子节点&amp;lt;author&amp;gt;的文本修改为“亚胜”。&lt;br /&gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&amp;lt;table rules=&quot;none&quot; align=&quot;center&quot; bgcolor=&quot;#ddedfb&quot; border=&quot;1&quot; bordercolor=&quot;#55aaff&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;500&quot;&amp;gt;     &amp;lt;tbody&amp;gt;         &amp;lt;tr&amp;gt;             &amp;lt;td width=&quot;10&quot;&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;             &amp;lt;td&amp;gt;             &amp;lt;p&amp;gt;    XmlNodeList nodeList=xmlDoc.SelectSingleNode(&quot;bookstore&quot;).ChildNodes;//获取bookstore节点的所有子节点&lt;br /&gt;   foreach(XmlNode xn in nodeList)//遍历所有子节点&lt;br /&gt;   {&lt;br /&gt;    XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型&lt;br /&gt;    if(xe.GetAttribute(&quot;genre&quot;)==&quot;李赞红&quot;)//如果genre属性值为“李赞红”&lt;br /&gt;    {&lt;br /&gt;     xe.SetAttribute(&quot;genre&quot;,&quot;update李赞红&quot;);//则修改该属性为“update李赞红”&lt;br /&gt;&lt;br /&gt;     XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点&lt;br /&gt;     foreach(XmlNode xn1 in nls)//遍历&lt;br /&gt;     {&lt;br /&gt;      XmlElement xe2=(XmlElement)xn1;//转换类型&lt;br /&gt;      if(xe2.Name==&quot;author&quot;)//如果找到&lt;br /&gt;      {&lt;br /&gt;       xe2.InnerText=&quot;亚胜&quot;;//则修改&lt;br /&gt;       break;//找到退出来就可以了&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;     break;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   xmlDoc.Save(&quot;bookstore.xml&quot;);//保存。&lt;br /&gt;&amp;lt;/p&amp;gt;             &amp;lt;/td&amp;gt;         &amp;lt;/tr&amp;gt;     &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;  //=================&lt;br /&gt;&lt;br /&gt;  最后结果为：&lt;br /&gt;&lt;br /&gt;&amp;lt;table rules=&quot;none&quot; align=&quot;center&quot; bgcolor=&quot;#ddedfb&quot; border=&quot;1&quot; bordercolor=&quot;#55aaff&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;500&quot;&amp;gt;     &amp;lt;tbody&amp;gt;         &amp;lt;tr&amp;gt;             &amp;lt;td width=&quot;10&quot;&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;             &amp;lt;td&amp;gt;             &amp;lt;p&amp;gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&amp;gt;&lt;br /&gt;&amp;lt;bookstore&amp;gt;&lt;br /&gt;  &amp;lt;book genre=&quot;fantasy&quot; isbn=&quot;2-3631-4&quot;&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Oberon&#39;s Legacy&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;author&amp;gt;Corets, Eva&amp;lt;/author&amp;gt;&lt;br /&gt;    &amp;lt;price&amp;gt;5.95&amp;lt;/price&amp;gt;&lt;br /&gt;  &amp;lt;/book&amp;gt;&lt;br /&gt;  &amp;lt;book genre=&quot;update李赞红&quot; isbn=&quot;2-3631-4&quot;&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;CS从入门到精通&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;author&amp;gt;亚胜&amp;lt;/author&amp;gt;&lt;br /&gt;    &amp;lt;price&amp;gt;58.3&amp;lt;/price&amp;gt;&lt;br /&gt;  &amp;lt;/book&amp;gt;&lt;br /&gt;&amp;lt;/bookstore&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;             &amp;lt;/td&amp;gt;         &amp;lt;/tr&amp;gt;     &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;  3、删除 &amp;lt;book genre=&quot;fantasy&quot; isbn=&quot;2-3631-4&quot;&amp;gt;节点的genre属性，删除 &amp;lt;book genre=&quot;update李赞红&quot; isbn=&quot;2-3631-4&quot;&amp;gt;节点。&lt;br /&gt;&lt;br /&gt;&amp;lt;table rules=&quot;none&quot; align=&quot;center&quot; bgcolor=&quot;#ddedfb&quot; border=&quot;1&quot; bordercolor=&quot;#55aaff&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;500&quot;&amp;gt;     &amp;lt;tbody&amp;gt;         &amp;lt;tr&amp;gt;             &amp;lt;td width=&quot;10&quot;&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;             &amp;lt;td&amp;gt;             &amp;lt;p&amp;gt;XmlNodeList xnl=xmlDoc.SelectSingleNode(&quot;bookstore&quot;).ChildNodes;&lt;br /&gt;&lt;br /&gt;   foreach(XmlNode xn in xnl)&lt;br /&gt;   {&lt;br /&gt;    XmlElement xe=(XmlElement)xn;&amp;lt;/p&amp;gt;             &amp;lt;/td&amp;gt;         &amp;lt;/tr&amp;gt;     &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt;&lt;br /&gt;   if(xe.GetAttribute(&quot;genre&quot;)==&quot;fantasy&quot;)&lt;br /&gt;    {&lt;br /&gt;     xe.RemoveAttribute(&quot;genre&quot;);//删除genre属性&lt;br /&gt;    }&lt;br /&gt;    else if(xe.GetAttribute(&quot;genre&quot;)==&quot;update李赞红&quot;)&lt;br /&gt;    {&lt;br /&gt;     xe.RemoveAll();//删除该节点的全部内容&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   xmlDoc.Save(&quot;bookstore.xml&quot;);&lt;br /&gt;&lt;br /&gt;  //====================&lt;br /&gt; &lt;br /&gt;  最后结果为：&lt;br /&gt;&lt;br /&gt;&amp;lt;table rules=&quot;none&quot; align=&quot;center&quot; bgcolor=&quot;#ddedfb&quot; border=&quot;1&quot; bordercolor=&quot;#55aaff&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;500&quot;&amp;gt;     &amp;lt;tbody&amp;gt;         &amp;lt;tr&amp;gt;             &amp;lt;td width=&quot;10&quot;&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;             &amp;lt;td&amp;gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&amp;gt;&lt;br /&gt;&amp;lt;bookstore&amp;gt;&lt;br /&gt;  &amp;lt;book isbn=&quot;2-3631-4&quot;&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Oberon&#39;s Legacy&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;author&amp;gt;Corets, Eva&amp;lt;/author&amp;gt;&lt;br /&gt;    &amp;lt;price&amp;gt;5.95&amp;lt;/price&amp;gt;&lt;br /&gt;  &amp;lt;/book&amp;gt;&lt;br /&gt;  &amp;lt;book&amp;gt;&lt;br /&gt;  &amp;lt;/book&amp;gt;&lt;br /&gt;&amp;lt;/bookstore&amp;gt;&amp;lt;/td&amp;gt;         &amp;lt;/tr&amp;gt;     &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;  4、显示所有数据。&lt;br /&gt;&lt;br /&gt;&amp;lt;table rules=&quot;none&quot; align=&quot;center&quot; bgcolor=&quot;#ddedfb&quot; border=&quot;1&quot; bordercolor=&quot;#55aaff&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;500&quot;&amp;gt;     &amp;lt;tbody&amp;gt;         &amp;lt;tr&amp;gt;             &amp;lt;td width=&quot;10&quot;&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;             &amp;lt;td&amp;gt;             &amp;lt;p&amp;gt; XmlNode xn=xmlDoc.SelectSingleNode(&quot;bookstore&quot;);&lt;br /&gt;&lt;br /&gt;   XmlNodeList xnl=xn.ChildNodes;&lt;br /&gt;  &lt;br /&gt;   foreach(XmlNode xnf in xnl)&lt;br /&gt;   {&lt;br /&gt;    XmlElement xe=(XmlElement)xnf;&lt;br /&gt;    Console.WriteLine(xe.GetAttribute(&quot;genre&quot;));//显示属性值&lt;br /&gt;    Console.WriteLine(xe.GetAttribute(&quot;ISBN&quot;));&lt;br /&gt;&lt;br /&gt;    XmlNodeList xnf1=xe.ChildNodes;&lt;br /&gt;    foreach(XmlNode xn2 in xnf1)&lt;br /&gt;    {&lt;br /&gt;     Console.WriteLine(xn2.InnerText);//显示子节点点文本&lt;br /&gt;    }&lt;br /&gt;   } &amp;lt;/p&amp;gt;             &amp;lt;/td&amp;gt;         &amp;lt;/tr&amp;gt;     &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt;  &amp;lt;p&amp;gt; &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&lt;br /&gt;转载自:http://blog.csdn.net/s98/archive/2004/10/17/140307.aspx&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   XmlDocument xmlDoc=new XmlDocument();&lt;br /&gt;   xmlDoc.Load(&quot;c:/aaa.xml&quot;);&lt;br /&gt;   XmlNode xn=xmlDoc.SelectSingleNode(&quot;todate&quot;);&lt;br /&gt;   XmlNodeList xnl=xn.ChildNodes;&lt;br /&gt;   foreach(XmlNode xnf in xnl)&lt;br /&gt;   {&lt;br /&gt;    XmlElement xe=(XmlElement)xnf;&lt;br /&gt;&lt;br /&gt;    XmlNodeList xnf1=xe.ChildNodes;&lt;br /&gt;   &lt;br /&gt;    Response.Write(xnf1[0].InnerText);//显示子节点点文本&lt;br /&gt;   } &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;   XmlDocument xmlDoc=new XmlDocument();&lt;br /&gt;   xmlDoc.Load(&quot;c:/aaa.xml&quot;);&lt;br /&gt;   XmlNode xn=xmlDoc.SelectSingleNode(&quot;todate&quot;);&lt;br /&gt;   XmlNodeList xnl=xn.ChildNodes;&lt;br /&gt;   foreach(XmlNode xnf in xnl)&lt;br /&gt;   {&lt;br /&gt;    XmlElement xe=(XmlElement)xnf;&lt;br /&gt;&lt;br /&gt;    XmlNodeList xnf1=xe.ChildNodes;&lt;br /&gt;   &lt;br /&gt;    xnf1[0].InnerText=&quot;10&quot;;&lt;br /&gt;    xmlDoc.Save(&quot;c:/aaa.xml&quot;);&amp;lt;/p&amp;gt;</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/2672609091852177898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/2672609091852177898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/2672609091852177898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/2672609091852177898'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2010/08/xml-operation.html' title='xml operation'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-5291003057362984811</id><published>2010-06-10T17:07:00.000-04:00</published><updated>2010-09-19T19:03:51.736-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Regular Expression"/><title type='text'>一些常用的正则表达式</title><content type='html'>正则表达式用于字符串处理，表单验证等场合，实用高效，但用到时总是不太把握，以致往往要上网查一番。我将一些常用的表达式收藏在这里，作备忘之用。本贴随时会更新。&lt;br /&gt;&lt;br /&gt;匹配中文字符的正则表达式： [\u4e00-\u9fa5]&lt;br /&gt;&lt;br /&gt;匹配双字节字符(包括汉字在内)：[^\x00-\xff]&lt;br /&gt;&lt;br /&gt;应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）&lt;br /&gt;&lt;br /&gt;String.prototype.len=function(){return this.replace([^\x00-\xff]/g,”aa”).length;}&lt;br /&gt;&lt;br /&gt;匹配空行的正则表达式：\n[\s ]*\r&lt;br /&gt;&lt;br /&gt;匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;&lt;(.*) \/&gt;/&lt;br /&gt;&lt;br /&gt;匹配首尾空格的正则表达式：(^\s*)(\s*$)&lt;br /&gt;&lt;br /&gt;应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下：&lt;br /&gt;&lt;br /&gt;String.prototype.trim = function()&lt;br /&gt;{&lt;br /&gt;return this.replace(/(^\s*)(\s*$)/g, “”);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;利用正则表达式分解和转换IP地址：&lt;br /&gt;&lt;br /&gt;下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序：&lt;br /&gt;&lt;br /&gt;function IP2V(ip)&lt;br /&gt;{&lt;br /&gt;re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式&lt;br /&gt;if(re.test(ip))&lt;br /&gt;{&lt;br /&gt;return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;throw new Error(“Not a valid IP address!”)&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下：&lt;br /&gt;&lt;br /&gt;var ip=”10.100.20.168″&lt;br /&gt;ip=ip.split(“.”)&lt;br /&gt;alert(“IP值是：”+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))&lt;br /&gt;&lt;br /&gt;匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*&lt;br /&gt;&lt;br /&gt;匹配网址URL的正则表达式：http://([\w-]+\.)+[\w-]+(/[\w- ./?%&amp;amp;=]*)?&lt;br /&gt;&lt;br /&gt;利用正则表达式去除字串中重复的字符的算法程序：[注：此程序不正确，原因见本贴回复]&lt;br /&gt;&lt;br /&gt;var s=”abacabefgeeii”&lt;br /&gt;var s1=s.replace(/(.).*\1/g,”$1″)&lt;br /&gt;var re=new RegExp(“[&quot;+s1+&quot;]“,”g”)&lt;br /&gt;var s2=s.replace(re,”&quot;)&lt;br /&gt;alert(s1+s2) //结果为：abcefgi&lt;br /&gt;&lt;br /&gt;我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法，最终没有找到，这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符，再以重复的字符建立第二个表达式，取到不重复的字符，两者串连。这个方法对于字符顺序有要求的字符串可能不适用。&lt;br /&gt;&lt;br /&gt;得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1&lt;br /&gt;&lt;br /&gt;s=”http://www.9499.net/page1.htm”&lt;br /&gt;s=s.replace(/(.*\/){0,}([^\.]+).*/ig,”$2″)&lt;br /&gt;alert(s)&lt;br /&gt;&lt;br /&gt;利用正则表达式限制网页表单里的文本框输入内容：&lt;br /&gt;&lt;br /&gt;用正则表达式限制只能输入中文：onkeyup=”value=value.replace(/[^\u4E00-\u9FA5]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\u4E00-\u9FA5]/g,”))”&lt;br /&gt;&lt;br /&gt;用正则表达式限制只能输入全角字符： onkeyup=”value=value.replace(/[^\uFF00-\uFFFF]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\uFF00-\uFFFF]/g,”))”&lt;br /&gt;&lt;br /&gt;用正则表达式限制只能输入数字：onkeyup=”value=value.replace(/[^\d]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d]/g,”))”&lt;br /&gt;&lt;br /&gt;用正则表达式限制只能输入数字和英文：onkeyup=”value=value.replace(/[\W]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d]/g,”))”&lt;br /&gt;&lt;br /&gt;正则表达式，相关链接&lt;br /&gt;http://blog.csdn.net/laily/category/19548.aspx&lt;br /&gt;http://blog.csdn.net/laily/archive/2004/06/30/30525.aspx 微软的正则表达式教程（五）：选择/编组和后向引用&lt;br /&gt;&lt;br /&gt;http://blog.csdn.net/laily/archive/2004/06/30/30522.aspx 微软的正则表达式教程（四）：限定符和定位符&lt;br /&gt;&lt;br /&gt;http://blog.csdn.net/laily/archive/2004/06/30/30517.aspx 微软的正则表达式教程（三）：字符匹配&lt;br /&gt;&lt;br /&gt;http://blog.csdn.net/laily/archive/2004/06/30/30514.aspx 微软的正则表达式教程（二）：正则表达式语法和优先权顺序&lt;br /&gt;&lt;br /&gt;http://blog.csdn.net/laily/archive/2004/06/30/30511.aspx 微软的正则表达式教程（一）：正则表达式简介&lt;br /&gt;&lt;br /&gt;http://blog.csdn.net/laily/archive/2004/06/30/30360.aspx 小程序大作为：高级查找/替换、正则表达式练习器、Javascript脚本程序调试器&lt;br /&gt;&lt;br /&gt;http://blog.csdn.net/laily/archive/2004/06/24/25872.aspx 经典正则表达式&lt;br /&gt;&lt;br /&gt;正则表达式，正规表达式，正则表达式匹配，正则表达式语法，模式匹配，正规表达式匹配 javascript正则表达式 ASP正则表达式 ASP.NET正则表达式 C#正则表达式 JSP正则表达式 PHP正则表达式 VB.NET正则表达式 VBSCript正则表达式编程 delphi正则表达式 jscript&lt;br /&gt;&lt;br /&gt;补充：&lt;br /&gt;^\d+$　　//匹配非负整数（正整数 + 0）&lt;br /&gt;^[0-9]*[1-9][0-9]*$　　//匹配正整数&lt;br /&gt;^((-\d+)(0+))$　　//匹配非正整数（负整数 + 0）&lt;br /&gt;^-[0-9]*[1-9][0-9]*$　　//匹配负整数&lt;br /&gt;^-?\d+$　　　　//匹配整数&lt;br /&gt;^\d+(\.\d+)?$　　//匹配非负浮点数（正浮点数 + 0）&lt;br /&gt;^(([0-9]+\.[0-9]*[1-9][0-9]*)([0-9]*[1-9][0-9]*\.[0-9]+)([0-9]*[1-9][0-9]*))$　　//匹配正浮点数&lt;br /&gt;^((-\d+(\.\d+)?)(0+(\.0+)?))$　　//匹配非正浮点数（负浮点数 + 0）&lt;br /&gt;^(-(([0-9]+\.[0-9]*[1-9][0-9]*)([0-9]*[1-9][0-9]*\.[0-9]+)([0-9]*[1-9][0-9]*)))$　　//匹配负浮点数&lt;br /&gt;^(-?\d+)(\.\d+)?$　　//匹配浮点数&lt;br /&gt;^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串&lt;br /&gt;^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串&lt;br /&gt;^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串&lt;br /&gt;^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串&lt;br /&gt;^\w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串&lt;br /&gt;^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$　　　　//匹配email地址&lt;br /&gt;^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$　　//匹配url&lt;br /&gt;利用正则表达式去除字串中重复的字符的算法程序：&lt;br /&gt;&lt;br /&gt;var s=”abacabefgeeii”&lt;br /&gt;var s1=s.replace(/(.).*\1/g,”$1″)&lt;br /&gt;var re=new RegExp(“[&quot;+s1+&quot;]“,”g”)&lt;br /&gt;var s2=s.replace(re,”&quot;)&lt;br /&gt;alert(s1+s2) //结果为：abcefgi&lt;br /&gt;===============================&lt;br /&gt;如果var s = “abacabefggeeii”&lt;br /&gt;结果就不对了，结果为：abeicfgg&lt;br /&gt;正则表达式的能力有限&lt;br /&gt;1.确认有效电子邮件格式&lt;br /&gt;下面的代码示例使用静态 Regex.IsMatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址，则 IsValidEmail 方法返回 true，否则返回 false，但不采取其他任何操作。您可以使用 IsValidEmail，在应用程序将地址存储在数据库中或显示在 ASP.NET 页中之前，筛选出包含无效字符的电子邮件地址。&lt;br /&gt;&lt;br /&gt;[Visual Basic]&lt;br /&gt;Function IsValidEmail(strIn As String) As Boolean&lt;br /&gt;‘ Return true if strIn is in valid e-mail format.&lt;br /&gt;Return Regex.IsMatch(strIn, (“^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)(([\w-]+\.)+))([a-zA-Z]{2,4}[0-9]{1,3})(\]?)$”)&lt;br /&gt;End Function&lt;br /&gt;[C#]&lt;br /&gt;bool IsValidEmail(string strIn)&lt;br /&gt;{&lt;br /&gt;// Return true if strIn is in valid e-mail format.&lt;br /&gt;return Regex.IsMatch(strIn, @”^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)(([\w-]+\.)+))([a-zA-Z]{2,4}[0-9]{1,3})(\]?)$”);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;2.清理输入字符串&lt;br /&gt;下面的代码示例使用静态 Regex.Replace 方法从字符串中抽出无效字符。您可以使用这里定义的 CleanInput 方法，清除掉在接受用户输入的窗体的文本字段中输入的可能有害的字符。CleanInput 在清除掉除 @、-（连字符）和 .（句点）以外的所有非字母数字字符后返回一个字符串。&lt;br /&gt;&lt;br /&gt;[Visual Basic]&lt;br /&gt;Function CleanInput(strIn As String) As String&lt;br /&gt;‘ Replace invalid characters with empty strings.&lt;br /&gt;Return Regex.Replace(strIn, “[^\w\.@-]“, “”)&lt;br /&gt;End Function&lt;br /&gt;[C#]&lt;br /&gt;String CleanInput(string strIn)&lt;br /&gt;{&lt;br /&gt;// Replace invalid characters with empty strings.&lt;br /&gt;return Regex.Replace(strIn, @”[^\w\.@-]“, “”);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;3.更改日期格式&lt;br /&gt;以下代码示例使用 Regex.Replace 方法来用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。&lt;br /&gt;&lt;br /&gt;[Visual Basic]&lt;br /&gt;Function MDYToDMY(input As String) As String&lt;br /&gt;Return Regex.Replace(input, _&lt;br /&gt;“\b(?&lt;month&gt;\d{1,2})/(?&lt;day&gt;\d{1,2})/(?&lt;year&gt;\d{2,4})\b”, _&lt;br /&gt;“${day}-${month}-${year}”)&lt;br /&gt;End Function&lt;br /&gt;[C#]&lt;br /&gt;String MDYToDMY(String input)&lt;br /&gt;{&lt;br /&gt;return Regex.Replace(input,&lt;br /&gt;“\\b(?&lt;month&gt;\\d{1,2})/(?&lt;day&gt;\\d{1,2})/(?&lt;year&gt;\\d{2,4})\\b”,&lt;br /&gt;“${day}-${month}-${year}”);&lt;br /&gt;}&lt;br /&gt;Regex 替换模式&lt;br /&gt;本示例说明如何在 Regex.Replace 的替换模式中使用命名的反向引用。其中，替换表达式 ${day} 插入由 (?&lt;day&gt;…) 组捕获的子字符串。&lt;br /&gt;&lt;br /&gt;有几种静态函数使您可以在使用正则表达式操作时无需创建显式正则表达式对象，而 Regex.Replace 函数正是其中之一。如果您不想保留编译的正则表达式，这将给您带来方便&lt;br /&gt;&lt;br /&gt;4.提取 URL 信息&lt;br /&gt;以下代码示例使用 Match.Result 来从 URL 提取协议和端口号。例如，“http://www.contoso.com:8080/letters/readme.html”将返回“http:8080”。&lt;br /&gt;&lt;br /&gt;[Visual Basic]&lt;br /&gt;Function Extension(url As String) As String&lt;br /&gt;Dim r As New Regex(“^(?&lt;proto&gt;\w+)://[^/]+?(?&lt;port&gt;:\d+)?/”, _&lt;br /&gt;RegexOptions.Compiled)&lt;br /&gt;Return r.Match(url).Result(“${proto}${port}”)&lt;br /&gt;End Function&lt;br /&gt;[C#]&lt;br /&gt;String Extension(String url)&lt;br /&gt;{&lt;br /&gt;Regex r = new Regex(@”^(?&lt;proto&gt;\w+)://[^/]+?(?&lt;port&gt;:\d+)?/”,&lt;br /&gt;RegexOptions.Compiled);&lt;br /&gt;return r.Match(url).Result(“${proto}${port}”);&lt;br /&gt;}</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/5291003057362984811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/5291003057362984811' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/5291003057362984811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/5291003057362984811'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2010/06/kiyo-1206-u4e00-u9fa5-x00-xff-2ascii1.html' title='一些常用的正则表达式'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-8182058771876461944</id><published>2010-01-20T18:32:00.000-05:00</published><updated>2010-09-19T19:04:13.860-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Axis"/><title type='text'>disable Axis2 soapAction</title><content type='html'>Sometimes we want to disable soapAction of Axis2 to communicate .Net WCF webservice.&lt;br /&gt;&lt;br /&gt;Add below in NetworkNode2Stub.java&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        //adding SOAP soap_headers&lt;br /&gt;         _serviceClient.addHeadersToEnvelope(env);&lt;br /&gt;        // set the message context with that soap envelope&lt;br /&gt;        _messageContext.setEnvelope(env);&lt;br /&gt;&lt;br /&gt;        // add the message contxt to the operation client&lt;br /&gt;        _operationClient.addMessageContext(_messageContext);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;        // Disable SOAP_ACTION to fix .Net endpoint without soapAction&lt;br /&gt;        _operationClient.getOptions().setProperty(&lt;br /&gt;          &lt;br /&gt;          org.apache.axis2.Constants.Configuration.DISABLE_SOAP_ACTION,&lt;br /&gt;          org.apache.axis2.Constants.VALUE_TRUE);&lt;/strong&gt;&lt;br /&gt;        //execute the operation client&lt;br /&gt;        _operationClient.execute(true);</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/8182058771876461944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/8182058771876461944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/8182058771876461944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/8182058771876461944'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2010/01/disable-axis2-soapaction.html' title='disable Axis2 soapAction'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-2961247422866207541</id><published>2010-01-08T18:50:00.000-05:00</published><updated>2010-09-19T19:04:37.451-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JNDI"/><title type='text'>Tomcat 5.X setup jndi</title><content type='html'>1. Copy jdbc driver to Tomcat 5.X\common\lib&lt;br /&gt;2. Romove all commons-dbcp-x.x.x,commons-pool-x.x and jdbc driver  from application/WEB-INF/lib&lt;br /&gt;&lt;br /&gt;3. Add Context and jndi parameters in server.xml file as below:&lt;br /&gt;&lt;br /&gt;Tomcat 5.0.xx:&lt;br /&gt;(the entity way) was the only way that worked.&lt;br /&gt;&lt;br /&gt;[server.xml]:&lt;br /&gt;  &amp;lt;Service...&amp;gt;&lt;br /&gt;    &amp;lt;Engine...&amp;gt;&lt;br /&gt;      &amp;lt;Host...&amp;gt;&lt;br /&gt;            ...&lt;br /&gt;          &amp;lt;Context crossContext=&quot;true&quot; docBase=&quot;/opt/tomcat5/webapps/oracleTest&quot; path=&quot;/oracleTest&quot; reloadable=&quot;true&quot;&amp;gt;&lt;br /&gt;     &amp;lt;Resource name=&quot;jdbc/myoracle&quot; auth=&quot;Container&quot;&lt;br /&gt;        type=&quot;javax.sql.DataSource&quot;/&amp;gt; &lt;br /&gt;     &amp;lt;ResourceParams name=&quot;jdbc/myoracle&quot;&amp;gt;&lt;br /&gt;       &amp;lt;parameter&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;factory&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;org.apache.commons.dbcp.BasicDataSourceFactory&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;/parameter&amp;gt;&lt;br /&gt;       &amp;lt;parameter&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;driverClassName&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;oracle.jdbc.OracleDriver&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;/parameter&amp;gt;&lt;br /&gt;       &amp;lt;parameter&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;url&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;jdbc:oracle:thin:@15.1.1.40:1521:dbastra&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;/parameter&amp;gt;&lt;br /&gt;       &amp;lt;parameter&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;username&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;uuuuuu&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;/parameter&amp;gt;&lt;br /&gt;       &amp;lt;parameter&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;xxxxxxxx&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;/parameter&amp;gt;&lt;br /&gt;       &amp;lt;parameter&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;maxActive&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;/parameter&amp;gt;&lt;br /&gt;       &amp;lt;parameter&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;maxIdle&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;/parameter&amp;gt;&lt;br /&gt;       &amp;lt;parameter&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;maxWait&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;-1&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;/parameter&amp;gt;&lt;br /&gt;     &amp;lt;/ResourceParams&amp;gt;&lt;br /&gt;  &amp;lt;Resource name=&quot;jdbc/myoracle5&quot; auth=&quot;Container&quot;&lt;br /&gt;   type=&quot;javax.sql.DataSource&quot; /&amp;gt;&lt;br /&gt;        &amp;lt;/Context&amp;gt;&lt;br /&gt;      &amp;lt;/Host&amp;gt;&lt;br /&gt;    &amp;lt;/Engine&amp;gt;&lt;br /&gt;  &amp;lt;/Service&amp;gt;&lt;br /&gt;&lt;br /&gt;Tomcat 5.5.xx:&lt;br /&gt;(the attributes way) was the only way that worked.&lt;br /&gt;&lt;br /&gt;[server.xml]:&lt;br /&gt;  &amp;lt;Service...&amp;gt;&lt;br /&gt;    &amp;lt;Engine...&amp;gt;&lt;br /&gt;      &amp;lt;Host...&amp;gt;&lt;br /&gt;            ...&lt;br /&gt; &amp;lt;Context path=&quot;/oracleTest&quot; reloadable=&quot;true&quot;&lt;br /&gt;    docBase=&quot;/opt/tomcat5/webapps/oracleTest&quot;&amp;gt;&lt;br /&gt; &lt;br /&gt;   &amp;lt;Logger className=&quot;org.apache.catalina.logger.SystemOutLogger&quot;&lt;br /&gt;               verbosity=&quot;4&quot; timestamp=&quot;true&quot; /&amp;gt;&lt;br /&gt;   &lt;br /&gt;          &amp;lt;Resource name=&quot;jdbc/myoracle5&quot; auth=&quot;Container&quot;&lt;br /&gt;               type=&quot;javax.sql.DataSource&quot; driverClassName=&quot;oracle.jdbc.OracleDriver&quot;&lt;br /&gt;               url=&quot;jdbc:oracle:thin:@15.1.1.40:1521:dbastra&quot; username=&quot;aradmin&quot;&lt;br /&gt;               password=&quot;ar#admin#&quot; maxActive=&quot;20&quot; maxIdle=&quot;10&quot; maxWait=&quot;-1&quot; /&amp;gt;&lt;br /&gt; &lt;br /&gt;        &amp;lt;/Context&amp;gt;&lt;br /&gt;      &amp;lt;/Host&amp;gt;&lt;br /&gt;    &amp;lt;/Engine&amp;gt;&lt;br /&gt;  &amp;lt;/Service&amp;gt;&lt;br /&gt;&lt;br /&gt;for BOTH versions:&lt;br /&gt;&lt;br /&gt;Here there are some points we should take a look:&lt;br /&gt;&lt;br /&gt;&amp;lt;Context&amp;gt; in [server.xml] !! &lt;br /&gt;&quot;Please note that for tomcat 5, unlike tomcat 4.x, it is NOT recommended to place &amp;lt;Context&amp;gt; elements directly in the server.xml file. Instead, put them in the META-INF/context.xml directory of your WAR file or the conf directory as described above.&quot;&lt;br /&gt;http://tomcat.apache.org/tomcat-5.5-doc/config/context.html&lt;br /&gt;&lt;br /&gt;And if we cut the &amp;lt;Context&amp;gt;..&amp;lt;/Context&amp;gt; body we described above from the server.xml and paste it into [META-INF/context.xml] or into [conf/Catalina/localhost/oracleTest.xml], it works...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39;?&amp;gt;&lt;br /&gt;&amp;lt;Context crossContext=&quot;true&quot; docBase=&quot;/forge/oracleTest&quot; path=&quot;/oracleTest&quot; reloadable=&quot;true&quot;&amp;gt;&lt;br /&gt;            &amp;lt;Logger className=&quot;org.apache.catalina.logger.FileLogger&quot;&lt;br /&gt;                  prefix=&quot;localhost_DBTest_log.&quot; suffix=&quot;.txt&quot; timestamp=&quot;true&quot; /&amp;gt;&lt;br /&gt; &lt;br /&gt;     &amp;lt;Resource ... (the one that applies to your version)&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/Context&amp;gt;&lt;br /&gt;&lt;br /&gt;GlobalNamingResources:&lt;br /&gt;&quot;GlobalNamingResources element defines the global JNDI resources for the Server. These resources are listed in the server&#39;s global JNDI resource context. This context is distinct from the per-web-application JNDI contexts described in the JNDI Resources HOW-TO. The resources defined in this element are not visible in the per-web-application contexts unless you explicitly link them with &amp;lt;ResourceLink&amp;gt; elements.&quot;&lt;br /&gt;http://tomcat.apache.org/tomcat-5.5-doc/config/globalresources.html&lt;br /&gt;http://tomcat.apache.org/tomcat-5.5-doc/config/context.html#Resource%20Links&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Article From http://forums.sun.com/thread.jspa?threadID=567630&amp;start=15</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/2961247422866207541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/2961247422866207541' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/2961247422866207541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/2961247422866207541'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2010/01/tomcat-5x-setup-jndi.html' title='Tomcat 5.X setup jndi'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6989973461873230399.post-1465075423896245928</id><published>2010-01-05T18:45:00.000-05:00</published><updated>2010-09-19T19:04:53.694-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="XML"/><title type='text'>Parse Large xml using dom4j</title><content type='html'>dom4j提供了基于事件的模型来操作xml文档。利用该模型开发人员可以一部分、一部分的处理XML文档，而不需要将整个XML文档都加载到内存中。例如：假想你要处理一个非常大的XML文档，它可能是由数据库的某张数据表而来的。如下所示：&lt;br /&gt;&amp;lt;ROWSET&amp;gt;&lt;br /&gt;&amp;lt;ROW ID=&quot;1&quot;&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/ROW&amp;gt;&lt;br /&gt;&amp;lt;ROW ID=&quot;2&quot;&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/ROW&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;ROW ID=&quot;N&quot;&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/ROW&amp;gt;&lt;br /&gt;&amp;lt;/ROWSET&amp;gt;&lt;br /&gt;我们可以在某一时间只处理一个ROW节点，而不必立刻将文档的所有内容加载到内存中。dom4j提供一个基于事件的模型来实现它。我们可以注册一个事件处理器来处理一个或多个路径表达式。事件处理器会在注册路径的开始和结束时被调用执行。当注册路径的开始标签找到时执行事件处理器的 onStart()方法，当注册路径的结束标签被找到时执行事件处理器的onEnd()方法。&lt;br /&gt;&amp;shy;&lt;br /&gt;onStart()和onEnd()方法传递一个ElementPath实例参数，这个实例既为根据注册路径遍历xml文档时的当前节点（Element）。如果想对遍历的当前节点进行操作，可以在onEnd()方法中对当前节点调用detach()方法保存改。&lt;br /&gt;下面是示例代码：&lt;br /&gt;&lt;br /&gt;SAXReader reader = new SAXReader();&lt;br /&gt;reader.addHandler( &quot;/ROWSET/ROW&quot;,&lt;br /&gt;new ElementHandler() {&lt;br /&gt;public void onStart(ElementPath path) {&lt;br /&gt;// do nothing here...&lt;br /&gt;}&lt;br /&gt;public void onEnd(ElementPath path) {&lt;br /&gt;// process a ROW element&lt;br /&gt;Element row = path.getCurrent();&lt;br /&gt;Element rowSet = row.getParent();&lt;br /&gt;Document document = row.getDocument();&lt;br /&gt;...&lt;br /&gt;// prune the tree&lt;br /&gt;row.detach();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;Document document = reader.read(url);&lt;br /&gt;上面的办法解决了读的问题可是写的问题还没有解决。我命由我不由天（吹牛皮），畅游dom4j的doc文档找到如下几个方法&lt;br /&gt;startDocument()&lt;br /&gt;writeOpen();&lt;br /&gt;writeClose();&lt;br /&gt;endDocument()&lt;br /&gt;动手一试，问题搞定，看来牛皮没白吹。下面是示例代码：&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* 数据写入xml文件&lt;br /&gt;* @param filePath 目标xml文件的存放路径&lt;br /&gt;* @return&lt;br /&gt;*/&lt;br /&gt;public boolean writeXML(String filePath){&lt;br /&gt;XMLWriter out;&lt;br /&gt;try {&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* 创建XMLWriter对象，设置XML编码，解决中文问题。&lt;br /&gt;*/&lt;br /&gt;OutputFormat outputFormat = OutputFormat.createPrettyPrint();&lt;br /&gt;outputFormat.setEncoding(&quot;GBK&quot;);&lt;br /&gt;out = new XMLWriter(new FileWriter(filePath),outputFormat);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;out.startDocument();&lt;br /&gt;Element rootElement = DocumentHelper.createElement(&quot;mans&quot;);&lt;br /&gt;out.writeOpen(rootElement);&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* 向mans节点写入子节点&lt;br /&gt;*/&lt;br /&gt;for(int i=0 ; i&amp;lt;1000000 ; i++){&lt;br /&gt;Element man = createManElement(new Long(i), &quot;shuhang&quot;+i);//用于创建节点的方法&lt;br /&gt;out.write(man);&lt;br /&gt;System.out.println(&quot; the loop index is : &quot; + i);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;out.writeClose(rootElement);&lt;br /&gt;out.endDocument();&lt;br /&gt;&lt;br /&gt;out.close();&lt;br /&gt;return true;&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;return false;&lt;br /&gt;} catch (SAXException e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;shy;&lt;br /&gt;新问题出现。对于读取数据的方法，在onEnd()方法中只是进行对Element的简单操作而已，若要对Element进行复杂的处理怎么办，如将Element节点的数据写入数据库，无法在onEnd()方法中加入过多的代码，因为无法通过编译。仔细想了一下dom4j的注册事件处理器应该用的是模板方法，通过钩子将用户的操作加入到模板中去。何不自己写一个事件处理器来完成我们自己的定制操作，代码如下：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class ManElementHandler implements ElementHandler {&lt;br /&gt;public String mdbName;&lt;br /&gt;&amp;shy;&lt;br /&gt;public ManElementHandler(){&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&amp;shy;&lt;br /&gt;public ManElementHandler(String mdbName){&lt;br /&gt;this.mdbName = mdbName;&lt;br /&gt;}&lt;br /&gt;&amp;shy;&lt;br /&gt;public boolean saveMan(Element element, String mdbName){&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;&amp;shy;&lt;br /&gt;public void onEnd(ElementPath arg0) {&lt;br /&gt;Element row = arg0.getCurrent();&lt;br /&gt;Element rowSet = row.getParent();&lt;br /&gt;Document document = row.getDocument();&lt;br /&gt;Element root = document.getRootElement();&lt;br /&gt;Iterator it = root.elementIterator();&lt;br /&gt;while(it.hasNext()){&lt;br /&gt;Element element = (Element)it.next();&lt;br /&gt;System.out.println(&quot; id : &quot; + element.elementText(&quot;id&quot;) + &quot; name : &quot; + element.elementText(&quot;name&quot;));&lt;br /&gt;saveMan(element, this.mdbName);&lt;br /&gt;}&lt;br /&gt;row.detach();&lt;br /&gt;}&lt;br /&gt;public void onStart(ElementPath path) {&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;下面给出完整的实例代码。该实例首先创建一个xml文档，然后读取xml文档中的数据并将数据写入Access数据库中。测试时使用的文件大小为125M未发生内存溢出。&lt;br /&gt;&lt;br /&gt;//*****************************************************************************************************************&lt;br /&gt;package com;&lt;br /&gt;import java.sql.Connection;&lt;br /&gt;import java.sql.DriverManager;&lt;br /&gt;/**&lt;br /&gt;* 获取Access数据库的连接&lt;br /&gt;* @author 佛山无影脚&lt;br /&gt;* @version 1.0&lt;br /&gt;* Jul 7, 2008 4:35:49 PM&lt;br /&gt;*/&lt;br /&gt;public class AccessMDBUtil {&lt;br /&gt;public static Connection connectMdb(String mdbName) {&lt;br /&gt;if(mdbName == null  mdbName.equals(&quot;&quot;)){&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;try {&lt;br /&gt;Class.forName(&quot;sun.jdbc.odbc.JdbcOdbcDriver&quot;);&lt;br /&gt;String dburl =&quot;jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=&quot;+mdbName;&lt;br /&gt;Connection conn=DriverManager.getConnection(dburl);&lt;br /&gt;return conn;&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//*******************************************************************************************************************&lt;br /&gt;//*******************************************************************************************************************&lt;br /&gt;package com;&lt;br /&gt;import java.sql.Connection;&lt;br /&gt;import java.sql.ResultSet;&lt;br /&gt;import java.sql.SQLException;&lt;br /&gt;import java.sql.Statement;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;import org.dom4j.Document;&lt;br /&gt;import org.dom4j.Element;&lt;br /&gt;import org.dom4j.ElementHandler;&lt;br /&gt;import org.dom4j.ElementPath;&lt;br /&gt;/**&lt;br /&gt;* 定制的事件处理器&lt;br /&gt;* @author 佛山无影脚&lt;br /&gt;* @version 1.0&lt;br /&gt;* Jul 7, 2008 4:35:49 PM&lt;br /&gt;*/&lt;br /&gt;public class ManElementHandler implements ElementHandler {&lt;br /&gt;public String mdbName;//数据库名称 含路径&lt;br /&gt;&amp;shy;&lt;br /&gt;public ManElementHandler(){&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&amp;shy;&lt;br /&gt;public ManElementHandler(String mdbName){&lt;br /&gt;this.mdbName = mdbName;&lt;br /&gt;}&lt;br /&gt;&amp;shy;&lt;br /&gt;/**&lt;br /&gt;*将Element节点数据保存到数据库&lt;br /&gt;*@param element 遍历XML文档时的当前节点&lt;br /&gt;*@param mdbName 数据库名称 含路径&lt;br /&gt;*@return&lt;br /&gt;*/&lt;br /&gt;public boolean saveMan(Element element, String mdbName){&lt;br /&gt;System.out.println(&quot; the method saveMan in ManElementHandler is execute!&quot;);&lt;br /&gt;Statement stmt = null;&lt;br /&gt;ResultSet rs = null;&lt;br /&gt;Connection conn = null;&lt;br /&gt;try {&lt;br /&gt;conn= AccessMDBUtil.connectMdb(mdbName);&lt;br /&gt;stmt=conn.createStatement();&lt;br /&gt;String sql = &quot;insert into mans(id,name) values(&quot; + element.elementText(&quot;id&quot;) + &quot;,&#39;&quot; + element.elementText(&quot;name&quot;) + &quot;&#39;)&quot;;&lt;br /&gt;stmt.executeUpdate(sql);&lt;br /&gt;&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;return false;&lt;br /&gt;} finally {&lt;br /&gt;if(rs != null) {&lt;br /&gt;try {&lt;br /&gt;rs.close();&lt;br /&gt;} catch (SQLException e) {&lt;br /&gt;// TODO Auto-generated catch block&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;if(stmt != null) {&lt;br /&gt;try {&lt;br /&gt;stmt.close();&lt;br /&gt;} catch (SQLException e) {&lt;br /&gt;// TODO Auto-generated catch block&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;if(conn != null) {&lt;br /&gt;try {&lt;br /&gt;conn.close();&lt;br /&gt;} catch (SQLException e) {&lt;br /&gt;// TODO Auto-generated catch block&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;&amp;shy;&lt;br /&gt;public void onEnd(ElementPath arg0) {&lt;br /&gt;Element row = arg0.getCurrent();&lt;br /&gt;Element rowSet = row.getParent();&lt;br /&gt;Document document = row.getDocument();&lt;br /&gt;Element root = document.getRootElement();&lt;br /&gt;Iterator it = root.elementIterator();&lt;br /&gt;while(it.hasNext()){&lt;br /&gt;Element element = (Element)it.next();&lt;br /&gt;System.out.println(&quot; id : &quot; + element.elementText(&quot;id&quot;) + &quot; name : &quot; + element.elementText(&quot;name&quot;));&lt;br /&gt;saveMan(element, this.mdbName);&lt;br /&gt;}&lt;br /&gt;row.detach();&lt;br /&gt;}&lt;br /&gt;public void onStart(ElementPath path) {&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//*************************************************************************************************************************&lt;br /&gt;//*************************************************************************************************************************&lt;br /&gt;package com;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileWriter;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import org.dom4j.Document;&lt;br /&gt;import org.dom4j.DocumentException;&lt;br /&gt;import org.dom4j.DocumentHelper;&lt;br /&gt;import org.dom4j.Element;&lt;br /&gt;import org.dom4j.io.OutputFormat;&lt;br /&gt;import org.dom4j.io.SAXReader;&lt;br /&gt;import org.dom4j.io.XMLWriter;&lt;br /&gt;import org.xml.sax.SAXException;&lt;br /&gt;import org.xml.sax.XMLReader;&lt;br /&gt;/**&lt;br /&gt;* 测试&lt;br /&gt;* @author 佛山无影脚&lt;br /&gt;* @version 1.0&lt;br /&gt;* Jul 7, 2008 4:35:49 PM&lt;br /&gt;*/&lt;br /&gt;public class ManTest {&lt;br /&gt;/**&lt;br /&gt;* 创建man节点&lt;br /&gt;* &amp;lt;man&amp;gt;&amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&amp;lt;name&amp;gt;佛山无影脚&amp;lt;/name&amp;gt;&amp;lt;/man&amp;gt;&lt;br /&gt;* @param id&lt;br /&gt;* @param name&lt;br /&gt;* @return&lt;br /&gt;*/&lt;br /&gt;public Element createManElement(Long id,String name){&lt;br /&gt;Element manElement = DocumentHelper.createElement(&quot;man&quot;);&lt;br /&gt;manElement.addElement(&quot;id&quot;).addText(id.toString());&lt;br /&gt;manElement.addElement(&quot;name&quot;).addText(name);&lt;br /&gt;return manElement;&lt;br /&gt;}&lt;br /&gt;&amp;shy;&lt;br /&gt;/**&lt;br /&gt;* 数据写入xml文件&lt;br /&gt;* @param filePath 目标xml文件的存放路径&lt;br /&gt;* @return&lt;br /&gt;*/&lt;br /&gt;public boolean writeXML(String filePath){&lt;br /&gt;XMLWriter out;&lt;br /&gt;try {&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* 创建XMLWriter对象，设置XML编码，解决中文问题。&lt;br /&gt;*/&lt;br /&gt;OutputFormat outputFormat = OutputFormat.createPrettyPrint();&lt;br /&gt;outputFormat.setEncoding(&quot;GBK&quot;);&lt;br /&gt;out = new XMLWriter(new FileWriter(filePath),outputFormat);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;out.startDocument();&lt;br /&gt;Element rootElement = DocumentHelper.createElement(&quot;mans&quot;);&lt;br /&gt;out.writeOpen(rootElement);&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* 向mans节点写入子节点&lt;br /&gt;*/&lt;br /&gt;for(int i=0 ; i&amp;lt;1000000 ; i++){&lt;br /&gt;Element man = this.createManElement(new Long(i), &quot;shuhang&quot;+i);&lt;br /&gt;out.write(man);&lt;br /&gt;System.out.println(&quot; the loop index is : &quot; + i);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;out.writeClose(rootElement);&lt;br /&gt;out.endDocument();&lt;br /&gt;&lt;br /&gt;out.close();&lt;br /&gt;return true;&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;return false;&lt;br /&gt;} catch (SAXException e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&amp;shy;&lt;br /&gt;/**&lt;br /&gt;* 从xml文件中读取数据，并将数据写入Access数据&lt;br /&gt;* @param filePath xml文件的存放路径&lt;br /&gt;* @return&lt;br /&gt;*/&lt;br /&gt;public boolean readXML(String filePath){&lt;br /&gt;&lt;br /&gt;ManElementHandler manElementHandler = new ManElementHandler(&quot;F:\\dom4j\\xmlTest.mdb&quot;);&lt;br /&gt;SAXReader reader = new SAXReader();&lt;br /&gt;reader.addHandler( &quot;/mans/man&quot;, manElementHandler);&lt;br /&gt;Document document = null;&lt;br /&gt;try {&lt;br /&gt;File file = new File(filePath);&lt;br /&gt;document = reader.read(file);&lt;br /&gt;} catch (DocumentException e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;&amp;shy;&lt;br /&gt;&amp;shy;&lt;br /&gt;public static void main(String[] args){&lt;br /&gt;XMLReader reader = null;&lt;br /&gt;long startTime = System.currentTimeMillis();&lt;br /&gt;ManTest mantest = new ManTest();&lt;br /&gt;&lt;br /&gt;mantest.writeXML(&quot;f:\\dom4j\\mans.xml&quot;);&lt;br /&gt;mantest.readXML(&quot;f:\\dom4j\\mans.xml&quot;);&lt;br /&gt;&lt;br /&gt;long endTime = System.currentTimeMillis();&lt;br /&gt;System.out.println(&quot; is end! the millis is : &quot; + (endTime - startTime));&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//*************************************************************************************************************************&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/shuhang1106/archive/2008/07/09/2627581.aspx</content><link rel='replies' type='application/atom+xml' href='http://coderesource.blogspot.com/feeds/1465075423896245928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6989973461873230399/1465075423896245928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/1465075423896245928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6989973461873230399/posts/default/1465075423896245928'/><link rel='alternate' type='text/html' href='http://coderesource.blogspot.com/2010/01/dom4jxmlxmlxmlxml-id1.html' title='Parse Large xml using dom4j'/><author><name>Charlie</name><uri>http://www.blogger.com/profile/11741413220126341442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>