﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-如何学好java-随笔分类-java 常用框架</title><link>http://www.blogjava.net/wshsdlau/category/51797.html</link><description>如何学好java，其实很简单，只要用心体会，慢慢积累！</description><language>zh-cn</language><lastBuildDate>Thu, 29 Nov 2012 01:49:44 GMT</lastBuildDate><pubDate>Thu, 29 Nov 2012 01:49:44 GMT</pubDate><ttl>60</ttl><item><title>struts2学习</title><link>http://www.blogjava.net/wshsdlau/archive/2011/11/28/379145.html</link><dc:creator>哈希</dc:creator><author>哈希</author><pubDate>Mon, 28 Nov 2011 07:09:00 GMT</pubDate><guid>http://www.blogjava.net/wshsdlau/archive/2011/11/28/379145.html</guid><wfw:comment>http://www.blogjava.net/wshsdlau/comments/379145.html</wfw:comment><comments>http://www.blogjava.net/wshsdlau/archive/2011/11/28/379145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wshsdlau/comments/commentRss/379145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wshsdlau/services/trackbacks/379145.html</trackback:ping><description><![CDATA[<a href="http://code.google.com/p/j2eewiki/wiki/Struts2Hello">http://code.google.com/p/j2eewiki/wiki/Struts2Hello</a> <img src ="http://www.blogjava.net/wshsdlau/aggbug/379145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wshsdlau/" target="_blank">哈希</a> 2011-11-28 15:09 <a href="http://www.blogjava.net/wshsdlau/archive/2011/11/28/379145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mldn's ssh</title><link>http://www.blogjava.net/wshsdlau/archive/2011/06/11/379152.html</link><dc:creator>哈希</dc:creator><author>哈希</author><pubDate>Sat, 11 Jun 2011 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/wshsdlau/archive/2011/06/11/379152.html</guid><wfw:comment>http://www.blogjava.net/wshsdlau/comments/379152.html</wfw:comment><comments>http://www.blogjava.net/wshsdlau/archive/2011/06/11/379152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wshsdlau/comments/commentRss/379152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wshsdlau/services/trackbacks/379152.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: web.xmlCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;&lt;web-app&nbsp;xmlns="http://java.sun.c...&nbsp;&nbsp;<a href='http://www.blogjava.net/wshsdlau/archive/2011/06/11/379152.html'>阅读全文</a><img src ="http://www.blogjava.net/wshsdlau/aggbug/379152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wshsdlau/" target="_blank">哈希</a> 2011-06-11 15:35 <a href="http://www.blogjava.net/wshsdlau/archive/2011/06/11/379152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MVC三层模型(struts+spring+hibernate)总结</title><link>http://www.blogjava.net/wshsdlau/archive/2011/05/20/379155.html</link><dc:creator>哈希</dc:creator><author>哈希</author><pubDate>Fri, 20 May 2011 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/wshsdlau/archive/2011/05/20/379155.html</guid><wfw:comment>http://www.blogjava.net/wshsdlau/comments/379155.html</wfw:comment><comments>http://www.blogjava.net/wshsdlau/archive/2011/05/20/379155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wshsdlau/comments/commentRss/379155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wshsdlau/services/trackbacks/379155.html</trackback:ping><description><![CDATA[<div class="bct fc05 fc11 nbw-blog ztag js-fs2">
<p style="text-indent: 2em"><span style="color: red">简单的说：</span></p>
<p style="text-indent: 2em"><span style="color: red">struts 控制用的</span></p>
<p style="text-indent: 2em"><span style="color: red">hibernate 操作数据库的</span></p>
<p style="text-indent: 2em"><span style="color: red">spring 用解耦的</span></p>
<p style="text-indent: 2em"><span style="color: red">详细的说：</span></p>
<p style="text-indent: 2em"><span style="color: red">STRUTS 在 SSH 框架中起控制的作用 , 其核心是 Controller, 即 ActionServlet, 而 ActionServlet 的核心就是 Struts-confi g.xml. 主要控制逻辑关系的处理 .</span></p>
<p style="text-indent: 2em"><span style="color: red">hibernate 是数据持久化层 , 是一种新的对象、关系的映射工具 , 提供了从 Java 类到数据表的映射，也提供了数据查询和恢复等机制 , 大大减少数据访问的复杂度。把对数据库的直接操作 , 转换为对持久对象的操作 .</span></p>
<p style="text-indent: 2em"><span style="color: red">SPRING 是一个轻量级的控制反转 (IoC) 和面向切面 (AOP) 的容器框架 , 面向接口的编程 , 由容器控制程序之间的（依赖）关系，而非传统实现中，由程序代码直接操控。这也就是所谓 &#8220; 控制反转 &#8221; 的概念所在：（依赖）控制权由应用代码中转到了外部容器，控制权的转移，是所谓反转。依赖注入，即组件之间的依赖关系由容器在运行期决定，形象的来说，即由容器动态的将某种依赖关系注入到组件之中</span></p>
<p style="text-indent: 2em"><span style="color: red">起到的主要作用是解耦</span></p>
<p style="text-indent: 2em"><span style="color: red">Struts 、 spring 、 Hibernate 在各层的作用</span></p>
<p style="text-indent: 2em"><span style="color: red">1 ） struts 负责 web 层 .</span></p>
<p style="text-indent: 2em"><span style="color: red">ActionFormBean 接收网页中表单提交的数据，然后通过 Act</span><wbr><span style="color: red">ion 进行处理，再 Forward 到对应的网页。</span></p>
<p style="text-indent: 2em"><span style="color: red">在 struts-config.xml 中定义 &lt;act</span><wbr><span style="color: red">ion-mapping&gt;, ActionServlet 会加载。</span></p>
<p style="text-indent: 2em"><span style="color: red">2 ） spring 负责业务层管理，即 Service （或 Manager).</span></p>
<p style="text-indent: 2em"><span style="color: red">1 ． service 为 act</span><wbr><span style="color: red">ion 提供统计的调用接口，封装持久层的 DAO.</span></p>
<p style="text-indent: 2em"><span style="color: red">2 ．可以写一些自己的业务方法。</span></p>
<p style="text-indent: 2em"><span style="color: red">3 ．统一的 javabean 管理方法</span></p>
<p style="text-indent: 2em"><span style="color: red">4 ．声明式事务管理（<a href="http://www.cnblogs.com/rushoooooo/archive/2011/08/28/2155960.html">http://www.cnblogs.com/rushoooooo/archive/2011/08/28/2155960.html</a>）</span></p>
<p style="text-indent: 2em"><span style="color: red">5. 集成 Hiberante</span></p>
<p style="text-indent: 2em"><span style="color: red">3 ） Hiberante ，负责持久化层，完成数据库的 crud 操作</span></p>
<p style="text-indent: 2em"><span style="color: red">hibernate 为持久层，提供 OR/Mapping 。</span></p>
<p style="text-indent: 2em"><span style="color: red">它有一组 .hbm.xml 文件和 POJO, 是跟数据库中的表相对应的。然后定义 DAO ，这些是跟数据库打交道的类，它们会使用 PO 。</span></p>
<p style="text-indent: 2em"><span style="color: red">在 struts+spring+hibernate 的系统中，</span></p>
<p style="text-indent: 2em"><span style="color: red">对象的调用流程是： jsp-&gt; Act</span><wbr><span style="color: red">ion － &gt; Service -&gt;DAO -&gt;Hibernate 。</span></p>
<p style="text-indent: 2em"><span style="color: red">数据的流向是 ActionFormBean 接受用户的数据， Act</span><wbr><span style="color: red">ion 将数据从 ActionFromBean 中取出，封装成 VO 或 PO,</span></p>
<p style="text-indent: 2em"><span style="color: red">再调用业务层的 Bean 类，完成各种业务处理后再 forward 。而业务层 Bean 收到这个 PO 对象之后，会调用 DAO 接口方法，进行持久化操作。</span></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><span style="color: red">spring:Aop管理事务控制,IoC管理各个组件的耦合,DaoTemplate作为常规持久层的快速开发模板! </span></p>
<p style="text-indent: 2em"><span style="color: red">struts:控制层Act</span><wbr><span style="color: red">ion,页面标签和Model数据,调用业务层 </span></p>
<p style="text-indent: 2em"><span style="color: red">Hibernate:负责数据库和对象的映射,负责DAO层(Da</span><wbr><span style="color: red">ta Access Object:数据访问) </span></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><span style="color: red">spring整合hibernate和struts，只要在配好了applicationContext.xml,在struts的act</span><wbr><span style="color: red">ion中直接调用就可以了。hibernate访问数据库的操作都在spring中实现了，spring的调用又在stuts的act</span><wbr><span style="color: red">ion中实现了。这个ssh框架就连到了一起&#8230;&#8230; </span></p>
<p style="text-indent: 2em">&nbsp; </p>
<p style="text-indent: 2em">&nbsp; </p>
<p style="text-indent: 2em"><span style="color: red">1 SSH在开发中的位置</span></p>
<p style="text-indent: 2em"><span style="color: red">现在J2EE的开源框架多的数不清楚，目前（已经、正在）比较流行的常用框架大概有struts,spring,hibernate,jsf,webwork，而 struts+spring+hibernate(SSH)这种轻量级架构被誉为&#8220;黄金组合&#8221;。spring和hibernate更是被许多人认为是未来五年内不会被淘汰的技术，犹如当年的struts，今天的开发中依然被广泛采用。</span></p>
<p style="text-indent: 2em"><span style="color: red">2 为什么使用SSH　　</span></p>
<p style="text-indent: 2em"><span style="color: red">其实，就算用Java建造一个不是很烦琐的web应用，也不是件轻松的事情。 在构架的一开始就有很多事情要考虑。从高处看，摆在开发者面前有很多问题：要考虑是怎样建立用户接口？在哪里处理业务逻辑？ 怎样持久化的数据。 而这三层构架中，每一层都有他们要仔细考虑的。 各个层该使用什么技术？怎样的设计能松散耦合还能灵活改变？ 怎样替换某个层而不影响整体构架？应用程序如何做各种级别的业务处理（比如事务处理）？</span></p>
<p style="text-indent: 2em"><span style="color: red">&nbsp;&nbsp;&nbsp; 构架一个Web应用需要弄明白好多问题。 幸运的是，已经有不少开发者已经遇到过这类问题，并且建立了处理这类问题的框架。 一个好框架具备以下几点：减轻开发者处理复杂的问题的负担（"不重复发明轮子"）；内部有良好的扩展； 并且有一个支持它的强大的用户团体。 好的构架一般有针对性的处理某一类问题，并且能将它做好（Do On</span><wbr><span style="color: red">e Thing well）。 然而，你的程序中有几个层可能需要使用特定的框架，已经完成的UI(用户接口) 并不代表你也可以把你的业务逻辑和持久逻辑偶合到你的UI部分。 举个例子，你不该在一个Controller(控制器)里面写JDBC代码作为你的业务逻辑， 这不是控制器应该提供的。 一个UI 控制器应该委派给其它给在UI范围之外的轻量级组件。 好的框架应该能指导代码如何分布。 更重要的是，框架能把开发者从编码中解放出来，使他们能专心于应用程序的逻辑（这对客户来说很重要）。&nbsp;</span></p>
<p style="text-indent: 2em"><span style="color: red">他们里面有很我优秀的设计理念及模式应用。比如， struts属于MVC框架，关键是要了解MVC的概念及大致原理，掌握就很容易了；而hibernate属于orm系统，属于持久层的解决方案，同样需要对ORM的概念及原理有一个总体的了解，必要时可以去查查EJB1及EJB2里面用于持久层的Entity Bean的使用。而spring属于应用程序框架，其核心是IOC容器以及AOP，把这两个核心概念(也可称为大模式)了解以后，再加上一定的内力修为，其它就都不难了。Spring中还集成了很多适用东西(不过这些东西80%的在某一个项目中可能一直用不上)，比如对JDBC的封装、自己的MVC、对动态语言的简洁访问等，这些你根据自己的项目情况来选择学习，用到的时候再看看他的文档，一个项目下来应该就能把握。 </span></p>
<p style="text-indent: 2em"><span style="color: red">3 对于SSH的理解</span></p>
<p style="text-indent: 2em"><span style="color: red">在SSH框架中，struts用来解决MVC中显示、请求控制部分，spring主要负责访问数据库DAO类的事务控制以及它被人称誉的IOC思想在业务类中的恰当运用，hibernate主要是充当数据访问层组件。由于spring对hibernate的良好支持，在DAO类主要由spring来完成，hibernate更多关注的应是O/R影射文件上的配置，如级联关系，延迟加载等如何设置才能使效率更高。见图1 （框架组合示意图）</span></p>
<p style="text-indent: 2em"><span style="color: red">4 收获和问题 </span></p>
<p style="text-indent: 2em"><span style="color: red">4.1 actionform,PO,VO三对象的运用</span></p>
<p style="text-indent: 2em"><span style="color: red">讨论最多的是actionform,PO,VO三对象的运用，本人倾向的观点是：在SSH框架中，PO和VO可以不必区分，即业务层和持久层都可以使用hibernate产生的PO对象，我暂时把对象分成actionform和po两种来分析，act</span><wbr><span style="color: red">ion 应该是actionform和po的分界点，po不能穿透业务层，突破act</span><wbr><span style="color: red">ion到达页面显示层，同样actionform也不能突破act</span><wbr><span style="color: red">ion传到后台业务、持久层。（原因：po是持久对象，到达页面后就脱离了session成为无状态（暂理解为脱管态）的对象，而hibernate的持久对象是有状态（包含数据库主键）的，无状态的对象传到后台在调用hibernate的保存方法时会出错，一定要把无状态的对象先转化成持久态对象才能保存）在act</span><wbr><span style="color: red">ion中应该对两对象进行转化，转化的方法目前我还没发现有什么非常好的方法（欢迎高手不惜赐教），最普通的就是用get（），set（）方法，也可以使用struts提供的属性复制方法BeanUtils类，但这个好象只支持单个类的转化，对于集合对象不行，需要我们自己扩展。</span></p>
<p style="text-indent: 2em"><span style="color: red">4.2 spring事务管理</span></p>
<p style="text-indent: 2em"><span style="color: red">在配置spring的事务管理中，最好把事务控制配置在业务类上，而不要配置在DAO类（需要保证多个原子事务操作同时失败回滚时这是一种解决办法）；</span></p>
<p style="text-indent: 2em"><span style="color: red">4.3 act</span><wbr><span style="color: red">ion如何获取业务类</span></p>
<p style="text-indent: 2em"><span style="color: red">act</span><wbr><span style="color: red">ion中如何获取业务类：写一个父类act</span><wbr><span style="color: red">ion，在父类中通过spring的webapplicationcontent获得业务类的实例。struts中的具体act</span><wbr><span style="color: red">ion继承该父类，通过调用父类的getService（）直接获得业务类的实例。</span></p>
<p style="text-indent: 2em"><span style="color: red">4.4 理解AOP思想</span></p>
<p style="text-indent: 2em"><span style="color: red">深入理解AOP思想，我暂时感觉到的就是尽量面向接口编程，不管是域对象还是业务类或者是DAO类都设计出接口，在各方法中我们尽量传入对象的接口，这对我们重用这些方法，扩展是很有好处的。</span></p>
<p style="text-indent: 2em"><span style="color: red">4.5 分页处理 level</span></p>
<p style="text-indent: 2em"><span style="color: red">5 系统包划分</span></p></div><img src ="http://www.blogjava.net/wshsdlau/aggbug/379155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wshsdlau/" target="_blank">哈希</a> 2011-05-20 17:00 <a href="http://www.blogjava.net/wshsdlau/archive/2011/05/20/379155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse快速上手Hibernate之入门实例</title><link>http://www.blogjava.net/wshsdlau/archive/2011/05/20/379156.html</link><dc:creator>哈希</dc:creator><author>哈希</author><pubDate>Fri, 20 May 2011 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/wshsdlau/archive/2011/05/20/379156.html</guid><wfw:comment>http://www.blogjava.net/wshsdlau/comments/379156.html</wfw:comment><comments>http://www.blogjava.net/wshsdlau/archive/2011/05/20/379156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wshsdlau/comments/commentRss/379156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wshsdlau/services/trackbacks/379156.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Eclipse快速上手Hibernate--1. 入门实例 &lt; language="javascript" type="text/javascript"&gt;document.title="Eclipse快速上手Hibernate--1. 入门实例 - "+document.title &nbsp;&nbsp;&nbsp; 这篇文章主要谈谈Hibernate的入门开发，例子很简单，就是...&nbsp;&nbsp;<a href='http://www.blogjava.net/wshsdlau/archive/2011/05/20/379156.html'>阅读全文</a><img src ="http://www.blogjava.net/wshsdlau/aggbug/379156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wshsdlau/" target="_blank">哈希</a> 2011-05-20 15:30 <a href="http://www.blogjava.net/wshsdlau/archive/2011/05/20/379156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>springMVC</title><link>http://www.blogjava.net/wshsdlau/archive/2011/05/17/379157.html</link><dc:creator>哈希</dc:creator><author>哈希</author><pubDate>Tue, 17 May 2011 14:23:00 GMT</pubDate><guid>http://www.blogjava.net/wshsdlau/archive/2011/05/17/379157.html</guid><wfw:comment>http://www.blogjava.net/wshsdlau/comments/379157.html</wfw:comment><comments>http://www.blogjava.net/wshsdlau/archive/2011/05/17/379157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wshsdlau/comments/commentRss/379157.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wshsdlau/services/trackbacks/379157.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这篇文章将教你快速地上手使用 Spring 框架. 如果你手上有一本《Spring in Action》, 那么你最好从第三部分"Spring 在 Web 层的应用--建立 Web 层"开始看, 否则那将是一场恶梦! 			 			 			首先, 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用程序接收到  http://localhost:8080/...&nbsp;&nbsp;<a href='http://www.blogjava.net/wshsdlau/archive/2011/05/17/379157.html'>阅读全文</a><img src ="http://www.blogjava.net/wshsdlau/aggbug/379157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wshsdlau/" target="_blank">哈希</a> 2011-05-17 22:23 <a href="http://www.blogjava.net/wshsdlau/archive/2011/05/17/379157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate缓存分类</title><link>http://www.blogjava.net/wshsdlau/archive/2011/05/10/379159.html</link><dc:creator>哈希</dc:creator><author>哈希</author><pubDate>Tue, 10 May 2011 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/wshsdlau/archive/2011/05/10/379159.html</guid><wfw:comment>http://www.blogjava.net/wshsdlau/comments/379159.html</wfw:comment><comments>http://www.blogjava.net/wshsdlau/archive/2011/05/10/379159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wshsdlau/comments/commentRss/379159.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wshsdlau/services/trackbacks/379159.html</trackback:ping><description><![CDATA[ <span style="color: red">缓存是位于应用程序与物理数据源之间，用于临时存放复制数据的内存区域，目的是为了减少应用程序对物理数据源访问的次数，从而提高应用程序的运行性能.
<br />
&nbsp; Hibernate在查询数据时，首先到缓存中去查找，如果找到就直接使用，找不到的时候就会从物理数据源中检索，所以，把频繁使用的数据加载到缓存区后，就可以大大减少应用程序对物理数据源的访问，使得程序的运行性能明显的提升.</span>
<br />
&nbsp;
<br />
<span style="color: red"> Hibernate缓存分类：</span>
<br />
<br />
Session缓存，一级缓存.
<br />
<br />
SessionFactory的缓存分为内置缓存和外置缓存.内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据
及预定义SQL语句等),对于应用程序来说,它是只读的.外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质
外,还可以选用硬盘等外部存储设备.
<br />
<br />
<span style="color: red"> Hibernate的缓存范围</span>
<br />
<br />
Hibernate的一级缓存和二级缓存都位于均位于持久层,且均用于存放数据库数据的副本,最大的区别就是缓存的范围各不一样.
<br />
<br />
缓存的范围分为3类:
<br />
<br />
1.事务范围
<br />
&nbsp;&nbsp; 事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束.事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围.
<br />
2.应用范围
<br />
&nbsp;&nbsp; 应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束.应用范围的缓存可以使用内存或硬盘作为存储介质,二级缓存就属于应用范围.
<br />
3.集群范围
<br />
&nbsp;&nbsp; 在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致,缓存中的数据通常采用对象的松散数据形式.
<br />
<br />
<span style="color: red">&nbsp; Hibernate的缓存管理</span>
<br />
<br />
<span style="color: blue"> 一级缓存的管理:</span>
<br />
<br />
&nbsp; <span style="color: red">evit(Object obj)</span>&nbsp; 将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象.
<br />
&nbsp; <span style="color: red">clear()</span>&nbsp; 将一级缓存中的所有持久化对象清除,释放其占用的内存资源
<br />
&nbsp; <span style="color: red">contains(Object obj) </span> 判断指定的对象是否存在于一级缓存中.
<br />
&nbsp; <span style="color: red"> flush() </span> 刷新一级缓存区的内容,使之与数据库数据保持同步.
<br />
<br />
&nbsp; <span style="color: blue">二级缓存的管理:</span>
<br />
&nbsp;&nbsp;
<br />
&nbsp;&nbsp; <span style="color: red">evict(Class arg0, Serializable arg1)</span>&nbsp; 将某个类的指定ID的持久化对象从二级缓存中清除,释放对象所占用的资源.
<br />
&nbsp;&nbsp;
<div id="" class="dp-highlighter">
<div>
<div>Java代码 &nbsp;<a title="收藏这段代码"><img src="http://www.iteye.com/images/icon_star.png" alt="收藏代码" /></a></div>
</div>
<ol start="1">
    <li>sessionFactory.evict(Customer.class,&nbsp;new&nbsp;Integer(1));&nbsp;&nbsp;</li>
</ol>
</div>
<br />
&nbsp;&nbsp; <span style="color: red">evict(Class arg0)</span>&nbsp; 将指定类的所有持久化对象从二级缓存中清除,释放其占用的内存资源.
<br />
&nbsp;&nbsp;
<div id="" class="dp-highlighter">
<div>
<div>Java代码 &nbsp;<a title="收藏这段代码"><img src="http://www.iteye.com/images/icon_star.png" alt="收藏代码" /></a></div>
</div>
<ol start="1">
    <li>sessionFactory.evict(Customer.class);&nbsp;&nbsp;</li>
</ol>
</div>
<br />
&nbsp;&nbsp; <span style="color: red">evictCollection(String arg0)</span>&nbsp; 将指定类的所有持久化对象的指定集合从二级缓存中清除,释放其占用的内存资源.
<br />
&nbsp;&nbsp;
<div id="" class="dp-highlighter">
<div>
<div>Java代码 &nbsp;<a title="收藏这段代码"><img src="http://www.iteye.com/images/icon_star.png" alt="收藏代码" /></a></div>
</div>
<ol start="1">
    <li>sessionFactory.evictCollection("Customer.orders");&nbsp;&nbsp;</li>
</ol>
</div>
<br />
<br />
<span style="color: red">Hibernate的二级缓存的配置</span>
<br />
<br />
首先,不是所有的数据都适合放在二级缓存中,看一下,什么样的数据适合放在二级缓存中来?什么样的数据不适合放在二级缓存中来?
<br />
&nbsp; 下面这几种情况就<span style="color: red">不适合</span>加载到二级缓存中:
<br />
&nbsp; 1.经常被修改的数据
<br />
&nbsp; 2.绝对不允许出现并发访问的数据
<br />
&nbsp; 3.与其他应用共享的数据
<br />
&nbsp; 下面这己种情况<span style="color: red">合适</span>加载到二级缓存中:
<br />
&nbsp; 1.数据更新频率低
<br />
&nbsp; 2.允许偶尔出现并发问题的非重要数据
<br />
&nbsp; 3.不会被并发访问的数据
<br />
&nbsp; 4.常量数据
<br />
&nbsp; 5.不会被第三方修改的数据
<br />
<br />
Hibernate的二级缓存功能是靠配置二级缓存插件来实现的,Hibernate为了集成这些插件,Hibernate提供了org.hibernate.cache.CacheProvider借口,它充当缓存插件与Hibernate之间的适配器 .
<br />
<br />
常用的二级缓存插件
<br />
EHCache&nbsp; org.hibernate.cache.EhCacheProvider
<br />
OSCache&nbsp; org.hibernate.cache.OSCacheProvider
<br />
SwarmCahe&nbsp; org.hibernate.cache.SwarmCacheProvider
<br />
JBossCache&nbsp; org.hibernate.cache.TreeCacheProvider
<br />
<br />
简单介绍一下EHCache的配置
<br />
hibernate.cfg.xml
<br />
<div id="" class="dp-highlighter">
<div>
<div>Xml代码 &nbsp;<a title="收藏这段代码"><img src="http://www.iteye.com/images/icon_star.png" alt="收藏代码" /></a></div>
</div>
<ol start="1">
    <li>&lt;hibernate-configuration&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&lt;session-factory&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;设置二级缓存插件EHCache的Provider类--&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="hibernate.cache.provider_class"&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.cache.EhCacheProvider&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;启动"查询缓存"&nbsp;--&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="hibernate.cache.use_query_cache"&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&lt;/session-factory&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&lt;/hibernate-configuration&gt;&nbsp;&nbsp;</li>
</ol>
</div>
<br />
<br />
ehcache.xml
<br />
<br />
<div id="" class="dp-highlighter">
<div>
<div>Xml代码 &nbsp;<a title="收藏这段代码"><img src="http://www.iteye.com/images/icon_star.png" alt="收藏代码" /></a></div>
</div>
<ol start="1">
    <li>&lt;ehcache&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&lt;!--&nbsp;maxElementsInMemory为缓存对象的最大数目,&nbsp;eternal设置是否永远不过期,timeToIdleSeconds对象处于空闲状态的最多秒数,timeToLiveSeconds对象处于缓存状态的最多秒数&nbsp;--&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&lt;diskStore&nbsp;path="java.io.tmpdir"/&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;defaultCache&nbsp;maxElementsInMemory="10000"&nbsp;eternal="false"&nbsp;&nbsp;timeToIdleSeconds="300"&nbsp;timeToLiveSeconds="600"&nbsp;overflowToDisk="true"/&gt;&nbsp;&nbsp;</li>
    <li>&lt;/ehcache&gt;&nbsp;&nbsp;</li>
</ol>
</div>
<br />
<br />
****.hbm.xml
<br />
<br />
<div id="" class="dp-highlighter">
<div>
<div>Xml代码 &nbsp;<a title="收藏这段代码"><img src="http://www.iteye.com/images/icon_star.png" alt="收藏代码" /></a></div>
</div>
<ol start="1">
    <li>&lt;?xml&nbsp;version="1.0"&nbsp;encoding='UTF-8'?&gt;&nbsp;&nbsp;</li>
    <li>&lt;!DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN"&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&nbsp;&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&lt;hibernate-mapping&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&lt;class&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;设置该持久化类的二级缓存并发访问策略&nbsp;read-only&nbsp;read-write&nbsp;nonstrict-read-write&nbsp;transactional--&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cache&nbsp;usage="read-write"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&lt;/class&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&lt;/hibernate-mapping&gt;&nbsp;&nbsp;</li>
</ol>
</div>
<br />
<br />
最近用上了,看看了,有什么不妥的地方,多谢指出.
 <img src ="http://www.blogjava.net/wshsdlau/aggbug/379159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wshsdlau/" target="_blank">哈希</a> 2011-05-10 18:03 <a href="http://www.blogjava.net/wshsdlau/archive/2011/05/10/379159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring中aop和Ioc的理解</title><link>http://www.blogjava.net/wshsdlau/archive/2011/05/10/379160.html</link><dc:creator>哈希</dc:creator><author>哈希</author><pubDate>Tue, 10 May 2011 09:49:00 GMT</pubDate><guid>http://www.blogjava.net/wshsdlau/archive/2011/05/10/379160.html</guid><wfw:comment>http://www.blogjava.net/wshsdlau/comments/379160.html</wfw:comment><comments>http://www.blogjava.net/wshsdlau/archive/2011/05/10/379160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wshsdlau/comments/commentRss/379160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wshsdlau/services/trackbacks/379160.html</trackback:ping><description><![CDATA[<span style="color: red">1.关于spring ioc </span>
<br />
<br />
这段时间也着实好好的看了下spring的相关书籍，对其也有了大概和初步的认识和理解，虽然之前也一直听说spring是一个非常优秀的开源
框架，可一直没有机会学习和使用（是不是有点落伍了？呵呵），所以呢，这段时间就重点学习了spring（一个星期的时间当然是入门级的啦~~）
<br />
<br />
大家一直都说spring的IOC如何如何的强大，其实我倒觉得不是IOC如何的强大，说白了IOC其实也非常的简单。我们先从IOC说起，
这个概念其实是从我们平常new一个对象的对立面来说的，我们平常使用对象的时候，一般都是直接使用关键字类new一个对象，那这样有什么坏处呢？其实很
显然的，使用new那么就表示当前模块已经不知不觉的和new的对象耦合了，而我们通常都是更高层次的抽象模块调用底层的实现模块，这样也就产生了模块依
赖于具体的实现，这样与我们JAVA中提倡的面向接口面向抽象编程是相冲突的，而且这样做也带来系统的模块架构问题。很简单的例子，我们在进行数据库操作
的时候，总是业务层调用DAO层，当然我们的DAO一般都是会采用接口开发，这在一定程度上满足了松耦合，使业务逻辑层不依赖于具体的数据库DAO层。但
是我们在使用的时候还是会new一个特定数据库的DAO层，这无形中也与特定的数据库绑定了，虽然我们可以使用抽象工厂模式来获取DAO实现类，但除非我
们一次性把所有数据库的DAO写出来，否则在进行数据库迁移的时候我们还是得修改DAO工厂类。
<br />
<br />
那我们使用IOC能达到什么呢？IOC，就是DAO接口的实现不再是业务逻辑层调用工厂类去获取，而是通过容器（比如spring）来自动的
为我们的业务层设置DAO的实现类。这样整个过程就反过来，以前是我们业务层主动去获取DAO，而现在是DAO主动被设置到业务逻辑层中来了，这也就是反
转控制的由来。通过IOC，我们就可以在不修改任何代码的情况下，无缝的实现数据库的换库迁移，当然前提还是必须得写一个实现特定数据库的DAO。我们把
DAO普遍到更多的情况下，那么IOC就为我们带来更大的方便性，比如一个接口的多个实现，我们只需要配置一下就ok了，而不需要再一个个的写工厂来来获
取了。这就是IOC为我们带来的模块的松耦合和应用的便利性。
<br />
<br />
那为什么说IOC很简单呢？说白了其实就是由我们平常的new转成了使用反射来获取类的实例，相信任何人只要会用java的反射机制，那么自己写一个IOC框架也不是不可能的。比如：
<br />
<br />
&#8230;&#8230;
<br />
public ObjectgetInstance(String className) throws Exception
<br />
{
<br />
Object obj = Class.forName(className).newInstance();
<br />
Method[] methods = obj.getClass().getMethods();
<br />
for (Method method : methods) {
<br />
if (method.getName().intern() == "setString") {
<br />
method.invoke(obj, "hello world!");
<br />
}
<br />
}
<br />
}
<br />
&#8230;&#8230;
<br />
<br />
上面的一个方法我们就很简单的使用了反射为指定的类的setString方法来设置一个hello
world!字符串。其实可以看到IOC真的很简单，当然了IOC简单并不表示spring的IOC就简单，spring的IOC的功能强大就在于有一系
列非常强大的配置文件维护类，它们可以维护spring配置文件中的各个类的关系，这才是spring的IOC真正强大的地方。在spring的Bean
定义文件中，不仅可以为定义Bean设置属性，还支持Bean之间的继承、Bean的抽象和不同的获取方式等等功能。
<br />
<br />
下次俺再把spring的Bean配置的相关心得和大家一起分享下，如果说的不好，大家可以提意见哦，可千万不要仍臭鸡蛋，嘿嘿~~~~
<br />
<br />
<br />
<span style="color: red">2.关于spring aop</span>
<br />
<br />
反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
<br />
好长时间没有用过Spring了. 突然拿起书.我都发现自己对AOP都不熟悉了.
<br />
其实AOP的意思就是面向切面编程.
<br />
OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解决问题的方法中的共同点,是对OO思想的一种补充!
<br />
还是拿人家经常举的一个例子讲解一下吧:
<br />
比如说,我们现在要开发的一个应用里面有很多的业务方法,但是,我们现在要对这个方法的执行做全面监控,或部分监控.也许我们就会在要一些方法前去加上一条日志记录,
<br />
我们写个例子看看我们最简单的解决方案
<br />
我们先写一个接口IHello.java代码如下:
<br />
1package sinosoft.dj.aop.staticaop;
<br />
2
<br />
3public interface IHello {
<br />
4&nbsp;&nbsp;&nbsp; /** *//**
<br />
5&nbsp;&nbsp;&nbsp;&nbsp; * 假设这是一个业务方法
<br />
6&nbsp;&nbsp;&nbsp;&nbsp; * @param name
<br />
7&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
8&nbsp;&nbsp;&nbsp; void sayHello(String name);
<br />
9}
<br />
10
<br />
里面有个方法,用于输入"Hello" 加传进来的姓名;我们去写个类实现IHello接口
<br />
package sinosoft.dj.aop.staticaop;
<br />
<br />
public class Hello implements IHello {
<br />
<br />
&nbsp;&nbsp;&nbsp; public void sayHello(String name) {
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Hello " + name);
<br />
&nbsp;&nbsp;&nbsp; }
<br />
<br />
}
<br />
<br />
现在我们要为这个业务方法加上日志记录的业务,我们在不改变原代码的情况下,我们会去怎么做呢?也许,你会去写一个类去实现IHello接口,并依赖Hello这个类.代码如下:
<br />
1package sinosoft.dj.aop.staticaop;
<br />
2
<br />
3public class HelloProxy implements IHello {
<br />
4&nbsp;&nbsp;&nbsp; private IHello hello;
<br />
5
<br />
6&nbsp;&nbsp;&nbsp; public HelloProxy(IHello hello) {
<br />
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.hello = hello;
<br />
8&nbsp;&nbsp;&nbsp; }
<br />
9
<br />
10&nbsp;&nbsp;&nbsp; public void sayHello(String name) {
<br />
11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger.logging(Level.DEBUGE, "sayHello method start.");
<br />
12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hello.sayHello(name);
<br />
13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger.logging(Level.INFO, "sayHello method end!");
<br />
14
<br />
15&nbsp;&nbsp;&nbsp; }
<br />
16
<br />
17}
<br />
18
<br />
其中.Logger类和Level枚举代码如下:
<br />
Logger.java
<br />
1package sinosoft.dj.aop.staticaop;
<br />
2
<br />
3import java.util.Date;
<br />
4
<br />
5public class Logger{
<br />
6&nbsp;&nbsp;&nbsp; /** *//**
<br />
7&nbsp;&nbsp;&nbsp;&nbsp; * 根据等级记录日志
<br />
8&nbsp;&nbsp;&nbsp;&nbsp; * @param level
<br />
9&nbsp;&nbsp;&nbsp;&nbsp; * @param context
<br />
10&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
11&nbsp;&nbsp;&nbsp; public static void logging(Level level, String context) {
<br />
12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (level.equals(Level.INFO)) {
<br />
13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new Date().toLocaleString() + " " + context);
<br />
14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br />
15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (level.equals(Level.DEBUGE)) {
<br />
16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(new Date() + " " + context);
<br />
17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br />
18&nbsp;&nbsp;&nbsp; }
<br />
19
<br />
20}
<br />
21Level.java
<br />
<br />
1package sinosoft.dj.aop.staticaop;
<br />
2
<br />
3public enum Level {
<br />
4&nbsp;&nbsp;&nbsp; INFO,DEBUGE;
<br />
5}
<br />
6那我们去写个测试类看看,代码如下:
<br />
Test.java
<br />
1package sinosoft.dj.aop.staticaop;
<br />
2
<br />
3public class Test {
<br />
4&nbsp;&nbsp;&nbsp; public static void main(String[] args) {
<br />
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IHello hello = new HelloProxy(new Hello());
<br />
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hello.sayHello("Doublej");
<br />
7&nbsp;&nbsp;&nbsp; }
<br />
8}
<br />
9运行以上代码我们可以得到下面结果:
<br />
<br />
Tue Mar 04 20:57:12 CST 2008 sayHello method start.
<br />
Hello Doublej
<br />
2008-3-4 20:57:12 sayHello method end!
<br />
从上面的代码我们可以看出,hello对象是被HelloProxy这个所谓的代理态所创建的.这样,如果我们以后要把日志记录的功能去掉.那我们只要把得到hello对象的代码改成以下:
<br />
1package sinosoft.dj.aop.staticaop;
<br />
2
<br />
3public class Test {
<br />
4&nbsp;&nbsp;&nbsp; public static void main(String[] args) {
<br />
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IHello hello = new Hello();
<br />
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hello.sayHello("Doublej");
<br />
7&nbsp;&nbsp;&nbsp; }
<br />
8}
<br />
9
<br />
上面代码,可以说是AOP最简单的实现!
<br />
但是我们会发现一个问题,如果我们像Hello这样的类很多,那么,我们是不是要去写很多个HelloProxy这样的类呢.没错,是的.其实也
是一种很麻烦的事.在jdk1.3以后.jdk跟我们提供了一个API&nbsp;&nbsp;
java.lang.reflect.InvocationHandler的类.
这个类可以让我们在JVM调用某个类的方法时动态的为些方法做些什么事.让我们把以上的代码改一下来看看效果.
<br />
同样,我们写一个IHello的接口和一个Hello的实现类.在接口中.我们定义两个方法;代码如下 :
<br />
<br />
IHello.java
<br />
1package sinosoft.dj.aop.proxyaop;
<br />
2
<br />
3public interface IHello {
<br />
4&nbsp;&nbsp;&nbsp; /** *//**
<br />
5&nbsp;&nbsp;&nbsp;&nbsp; * 业务处理A方法
<br />
6&nbsp;&nbsp;&nbsp;&nbsp; * @param name
<br />
7&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
8&nbsp;&nbsp;&nbsp; void sayHello(String name);
<br />
9&nbsp;&nbsp;&nbsp; /** *//**
<br />
10&nbsp;&nbsp;&nbsp;&nbsp; * 业务处理B方法
<br />
11&nbsp;&nbsp;&nbsp;&nbsp; * @param name
<br />
12&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
13&nbsp;&nbsp;&nbsp; void sayGoogBye(String name);
<br />
14}
<br />
15
<br />
<br />
Hello.java
<br />
<br />
1package sinosoft.dj.aop.proxyaop;
<br />
2
<br />
3public class Hello implements IHello {
<br />
4
<br />
5&nbsp;&nbsp;&nbsp; public void sayHello(String name) {
<br />
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Hello " + name);
<br />
7&nbsp;&nbsp;&nbsp; }
<br />
8&nbsp;&nbsp;&nbsp; public void sayGoogBye(String name) {
<br />
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(name+" GoodBye!");
<br />
10&nbsp;&nbsp;&nbsp; }
<br />
11}
<br />
12
<br />
我们一样的去写一个代理类.只不过.让这个类去实现java.lang.reflect.InvocationHandler接口,代码如下:
<br />
1package sinosoft.dj.aop.proxyaop;
<br />
2
<br />
3import java.lang.reflect.InvocationHandler;
<br />
4import java.lang.reflect.Method;
<br />
5import java.lang.reflect.Proxy;
<br />
6
<br />
7public class DynaProxyHello implements InvocationHandler {
<br />
8
<br />
9&nbsp;&nbsp;&nbsp; /** *//**
<br />
10&nbsp;&nbsp;&nbsp;&nbsp; * 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello)
<br />
11&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
12&nbsp;&nbsp;&nbsp; private Object delegate;
<br />
13
<br />
14&nbsp;&nbsp;&nbsp; /** *//**
<br />
15&nbsp;&nbsp;&nbsp;&nbsp; * 动态生成方法被处理过后的对象 (写法固定)
<br />
16&nbsp;&nbsp;&nbsp;&nbsp; *
<br />
17&nbsp;&nbsp;&nbsp;&nbsp; * @param delegate
<br />
18&nbsp;&nbsp;&nbsp;&nbsp; * @param proxy
<br />
19&nbsp;&nbsp;&nbsp;&nbsp; * @return
<br />
20&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
21&nbsp;&nbsp;&nbsp; public Object bind(Object delegate) {
<br />
22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.delegate = delegate;
<br />
23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Proxy.newProxyInstance(
<br />
24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.delegate.getClass().getClassLoader(), this.delegate
<br />
25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getClass().getInterfaces(), this);
<br />
26&nbsp;&nbsp;&nbsp; }
<br />
27&nbsp;&nbsp;&nbsp; /** *//**
<br />
28&nbsp;&nbsp;&nbsp;&nbsp; * 要处理的对象中的每个方法会被此方法送去JVM调用,也就是说,要处理的对象的方法只能通过此方法调用
<br />
29&nbsp;&nbsp;&nbsp;&nbsp; * 此方法是动态的,不是手动调用的
<br />
30&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
31&nbsp;&nbsp;&nbsp; public Object invoke(Object proxy, Method method, Object[] args)
<br />
32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Throwable {
<br />
33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object result = null;
<br />
34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {
<br />
35&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //执行原来的方法之前记录日志
<br />
36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger.logging(Level.DEBUGE, method.getName() + " Method end .");
<br />
37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //JVM通过这条语句执行原来的方法(反射机制)
<br />
39&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = method.invoke(this.delegate, args);
<br />
40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //执行原来的方法之后记录日志
<br />
41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger.logging(Level.INFO, method.getName() + " Method Start!");
<br />
42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {
<br />
43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();
<br />
44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br />
45&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回方法返回值给调用者
<br />
46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;
<br />
47&nbsp;&nbsp;&nbsp; }
<br />
48
<br />
49}
<br />
50
<br />
上面类中出现的Logger类和Level枚举还是和上一上例子的实现是一样的.这里就不贴出代码了.
<br />
<br />
让我们写一个Test类去测试一下.代码如下:
<br />
Test.java
<br />
1package sinosoft.dj.aop.proxyaop;
<br />
2
<br />
3public class Test {
<br />
4&nbsp;&nbsp;&nbsp; public static void main(String[] args) {
<br />
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IHello hello = (IHello)new DynaProxyHello().bind(new Hello());
<br />
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hello.sayGoogBye("Double J");
<br />
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hello.sayHello("Double J");
<br />
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
9&nbsp;&nbsp;&nbsp; }
<br />
10}
<br />
11
<br />
运行输出的结果如下:
<br />
Tue Mar 04 21:24:03 CST 2008 sayGoogBye Method end .
<br />
Double J GoodBye!
<br />
2008-3-4 21:24:03 sayGoogBye Method Start!
<br />
Tue Mar 04 21:24:03 CST 2008 sayHello Method end .
<br />
Hello Double J
<br />
2008-3-4 21:24:03 sayHello Method Start!
<br />
由于线程的关系,第二个方法的开始出现在第一个方法的结束之前.这不是我们所关注的!
<br />
从上面的例子我们看出.只要你是采用面向接口编程,那么,你的任何对象的方法执行之前要加上记录日志的操作都是可以的.他
(DynaPoxyHello)自动去代理执行被代理对象(Hello)中的每一个方法,一个
java.lang.reflect.InvocationHandler接口就把我们的代理对象和被代理对象解藕了.但是,我们又发现还有一个问题,这
个DynaPoxyHello对象只能跟我们去在方法前后加上日志记录的操作.我们能不能把DynaPoxyHello对象和日志操作对象
(Logger)解藕呢?
<br />
结果是肯定的.让我们来分析一下我们的需求.
<br />
我们要在被代理对象的方法前面或者后面去加上日志操作代码(或者是其它操作的代码),
<br />
那么,我们可以抽象出一个接口,这个接口里就只有两个方法,一个是在被代理对象要执行方法之前执行的方法,我们取名为start,第二个方法就是在被代理对象执行方法之后执行的方法,我们取名为end .接口定义如下 :
<br />
1package sinosoft.dj.aop.proxyaop;
<br />
2
<br />
3import java.lang.reflect.Method;
<br />
4
<br />
5public interface IOperation {
<br />
6&nbsp;&nbsp;&nbsp; /** *//**
<br />
7&nbsp;&nbsp;&nbsp;&nbsp; * 方法执行之前的操作
<br />
8&nbsp;&nbsp;&nbsp;&nbsp; * @param method
<br />
9&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
10&nbsp;&nbsp;&nbsp; void start(Method method);
<br />
11&nbsp;&nbsp;&nbsp; /** *//**
<br />
12&nbsp;&nbsp;&nbsp;&nbsp; * 方法执行之后的操作
<br />
13&nbsp;&nbsp;&nbsp;&nbsp; * @param method
<br />
14&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
15&nbsp;&nbsp;&nbsp; void end(Method method);
<br />
16}
<br />
17
<br />
我们去写一个实现上面接口的类.我们把作他真正的操作者,如下面是日志操作者的一个类:
<br />
LoggerOperation.java
<br />
package sinosoft.dj.aop.proxyaop;
<br />
<br />
import java.lang.reflect.Method;
<br />
<br />
public class LoggerOperation implements IOperation {
<br />
<br />
&nbsp;&nbsp;&nbsp; public void end(Method method) {
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger.logging(Level.DEBUGE, method.getName() + " Method end .");
<br />
&nbsp;&nbsp;&nbsp; }
<br />
<br />
&nbsp;&nbsp;&nbsp; public void start(Method method) {
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger.logging(Level.INFO, method.getName() + " Method Start!");
<br />
&nbsp;&nbsp;&nbsp; }
<br />
<br />
}
<br />
<br />
然后我们要改一下代理对象DynaProxyHello中的代码.如下:
<br />
1package sinosoft.dj.aop.proxyaop;
<br />
2
<br />
3import java.lang.reflect.InvocationHandler;
<br />
4import java.lang.reflect.Method;
<br />
5import java.lang.reflect.Proxy;
<br />
6
<br />
7public class DynaProxyHello implements InvocationHandler {
<br />
8&nbsp;&nbsp;&nbsp; /** *//**
<br />
9&nbsp;&nbsp;&nbsp;&nbsp; * 操作者
<br />
10&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
11&nbsp;&nbsp;&nbsp; private Object proxy;
<br />
12&nbsp;&nbsp;&nbsp; /** *//**
<br />
13&nbsp;&nbsp;&nbsp;&nbsp; * 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello)
<br />
14&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
15&nbsp;&nbsp;&nbsp; private Object delegate;
<br />
16
<br />
17&nbsp;&nbsp;&nbsp; /** *//**
<br />
18&nbsp;&nbsp;&nbsp;&nbsp; * 动态生成方法被处理过后的对象 (写法固定)
<br />
19&nbsp;&nbsp;&nbsp;&nbsp; *
<br />
20&nbsp;&nbsp;&nbsp;&nbsp; * @param delegate
<br />
21&nbsp;&nbsp;&nbsp;&nbsp; * @param proxy
<br />
22&nbsp;&nbsp;&nbsp;&nbsp; * @return
<br />
23&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
24&nbsp;&nbsp;&nbsp; public Object bind(Object delegate,Object proxy) {
<br />
25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.proxy = proxy;
<br />
27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.delegate = delegate;
<br />
28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Proxy.newProxyInstance(
<br />
29&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.delegate.getClass().getClassLoader(), this.delegate
<br />
30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getClass().getInterfaces(), this);
<br />
31&nbsp;&nbsp;&nbsp; }
<br />
32&nbsp;&nbsp;&nbsp; /** *//**
<br />
33&nbsp;&nbsp;&nbsp;&nbsp; * 要处理的对象中的每个方法会被此方法送去JVM调用,也就是说,要处理的对象的方法只能通过此方法调用
<br />
34&nbsp;&nbsp;&nbsp;&nbsp; * 此方法是动态的,不是手动调用的
<br />
35&nbsp;&nbsp;&nbsp;&nbsp; */
<br />
36&nbsp;&nbsp;&nbsp; public Object invoke(Object proxy, Method method, Object[] args)
<br />
37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Throwable {
<br />
38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object result = null;
<br />
39&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {
<br />
40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //反射得到操作者的实例
<br />
41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class clazz = this.proxy.getClass();
<br />
42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //反射得到操作者的Start方法
<br />
43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method start = clazz.getDeclaredMethod("start",
<br />
44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Class[] { Method.class });
<br />
45&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //反射执行start方法
<br />
46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start.invoke(this.proxy, new Object[] { method });
<br />
47&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //执行要处理对象的原本方法
<br />
48&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = method.invoke(this.delegate, args);
<br />
49//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 反射得到操作者的end方法
<br />
50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method end = clazz.getDeclaredMethod("end",
<br />
51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Class[] { Method.class });
<br />
52//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 反射执行end方法
<br />
53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end.invoke(this.proxy, new Object[] { method });
<br />
54
<br />
55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {
<br />
56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();
<br />
57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br />
58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;
<br />
59&nbsp;&nbsp;&nbsp; }
<br />
60
<br />
61}
<br />
62
<br />
然后我们把Test.java中的代码改一下.测试一下:
<br />
package sinosoft.dj.aop.proxyaop;
<br />
<br />
public class Test {
<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IHello hello = (IHello)new DynaProxyHello().bind(new Hello(),new LoggerOperation());
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hello.sayGoogBye("Double J");
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hello.sayHello("Double J");
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;&nbsp; }
<br />
}
<br />
结果还是一样的吧.
<br />
<br />
如果你想在每个方法之前加上日志记录,而不在方法后加上日志记录.你就把LoggerOperation类改成如下:
<br />
1package sinosoft.dj.aop.proxyaop;
<br />
2
<br />
3import java.lang.reflect.Method;
<br />
4
<br />
5public class LoggerOperation implements IOperation {
<br />
6
<br />
7&nbsp;&nbsp;&nbsp; public void end(Method method) {
<br />
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Logger.logging(Level.DEBUGE, method.getName() + " Method end .");
<br />
9&nbsp;&nbsp;&nbsp; }
<br />
10
<br />
11&nbsp;&nbsp;&nbsp; public void start(Method method) {
<br />
12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger.logging(Level.INFO, method.getName() + " Method Start!");
<br />
13&nbsp;&nbsp;&nbsp; }
<br />
14
<br />
15}
<br />
16
<br />
运行一下.你就会发现,每个方法之后没有记录日志了. 这样,我们就把代理者和操作者解藕了!
<br />
<br />
下面留一个问题给大家,如果我们不想让所有方法都被日志记录,我们应该怎么去解藕呢.?
<br />
我的想法是在代理对象的public Object invoke(Object proxy, Method method,
Object[]
args)方法里面加上个if(),对传进来的method的名字进行判断,判断的条件存在XML里面.这样我们就可以配置文件时行解藕了.如果有兴趣的
朋友可以把操作者,被代理者,都通过配置文件进行配置 ,那么就可以写一个简单的SpringAOP框架了.
<br />
 <img src ="http://www.blogjava.net/wshsdlau/aggbug/379160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wshsdlau/" target="_blank">哈希</a> 2011-05-10 17:49 <a href="http://www.blogjava.net/wshsdlau/archive/2011/05/10/379160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第一个Spring程序</title><link>http://www.blogjava.net/wshsdlau/archive/2011/04/28/379180.html</link><dc:creator>哈希</dc:creator><author>哈希</author><pubDate>Thu, 28 Apr 2011 04:19:00 GMT</pubDate><guid>http://www.blogjava.net/wshsdlau/archive/2011/04/28/379180.html</guid><wfw:comment>http://www.blogjava.net/wshsdlau/comments/379180.html</wfw:comment><comments>http://www.blogjava.net/wshsdlau/archive/2011/04/28/379180.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wshsdlau/comments/commentRss/379180.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wshsdlau/services/trackbacks/379180.html</trackback:ping><description><![CDATA[如下分成5个步骤<br />
1，建立xml文件<br />
2，建立bean的接口<br />
3，建立bean<br />
4，写测试程序<br />
5，测试<br />
<br />
准备工作<br />
环境配置如下，需要spring.jar和common-logging.jar两个jar文件<br />
<br />
开始<br />
1，建立xml文件<br />
文件名：beans.xml<br />
文件位置：src目录下<br />
文件内容：<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
<br />
&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://www.springframework.org/schema/beans<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&gt;<br />
<br />
&nbsp; &lt;!-- the application context definition for the springapp DispatcherServlet --&gt;<br />
<br />
&nbsp; <span style="color: #0000cd;">&lt;bean id="sayhello" class="test.service.impl.HelloBean"/&gt;</span><br />
&nbsp;&nbsp;&nbsp; <br />
&lt;/beans&gt;<br />
<br />
2，建立bean的接口<br />
文件名：Hello.java<br />
文件内容：<br />
package test.service;<br />
<br />
public interface Hello {<br />
<br />
&nbsp;&nbsp;&nbsp; <span style="color: #0000cd;">public void sayHello();</span><br />
<br />
}<br />
<br />
3，建立bean<br />
文件名：HelloBean.java<br />
文件内容：<br />
package test.service.impl;<br />
<br />
import test.service.Hello;<br />
<br />
public class HelloBean implements Hello {<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @see test.service.impl.Hello#sayHello()<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;<span style="color: #0000cd;">&nbsp; public void sayHello() {</span><br />
<span style="color: #0000cd;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("这是一个测试程序");</span><br />
<span style="color: #0000cd;">&nbsp;&nbsp;&nbsp; }</span><br />
<br />
}<br />
<br />
4，写测试程序<br />
文件名：FirstSpring.java<br />
文件内容：<br />
package test.spring;<br />
<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
<br />
import test.service.Hello;<br />
<br />
public class FirstSpring {<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; testHello();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static void testHello() {<br />
&nbsp;<span style="color: #0000cd;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");</span><br />
<span style="color: #0000cd;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Hello hello =(Hello) applicationContext.getBean("sayhello");</span><br />
<span style="color: #0000cd;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hello.sayHello();</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
5，测试<br />
运行FirstSpring.java文件，得到输出结果如下：<br />
<span style="color: #ff0000;">2009-6-30 3:33:58 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions</span><br />
<span style="color: #ff0000;">信息: Loading XML bean definitions from class path resource [beans.xml]</span><br />
<span style="color: #ff0000;">2009-6-30 3:33:59 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory</span><br />
<span style="color: #ff0000;">信
息: Bean factory for application context
[org.springframework.context.support.ClassPathXmlApplicationContext@7259da]:
org.springframework.beans.factory.support.DefaultListableBeanFactory@2e7820</span><br />
<span style="color: #ff0000;">2009-6-30 3:33:59 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons</span><br />
<span style="color: #ff0000;">信
息: Pre-instantiating singletons in
org.springframework.beans.factory.support.DefaultListableBeanFactory@2e7820:
defining beans [sayhello]; root of factory hierarchy</span><br />
<span style="color: #0000cd;">这是一个测试程序</span><br />
<br />
上面红字是spring输出的调试信息，蓝字是hellobean实际输入的内容。<br />
<br />
简单总结:<br />
1,环境配置中不要忘记了common-logging.jar文件，我最开始忘记了，还是用junit测试的，结果就是不通过。出错的原因也不明白。后来直接改成普通的main方法测试，才明白原因。<br />
<br />
2，bean的接口和实现的分离在spring中被贯彻执行。同时理解一下IOC（控制反转）的概念。<br />
3，spring中的bean，应该指的是执行各种业务的业务bean才是。不同于strut的formbean和对应db表对象的valuebean。
 <img src ="http://www.blogjava.net/wshsdlau/aggbug/379180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wshsdlau/" target="_blank">哈希</a> 2011-04-28 12:19 <a href="http://www.blogjava.net/wshsdlau/archive/2011/04/28/379180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>strus 图解</title><link>http://www.blogjava.net/wshsdlau/archive/2011/04/28/379181.html</link><dc:creator>哈希</dc:creator><author>哈希</author><pubDate>Thu, 28 Apr 2011 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/wshsdlau/archive/2011/04/28/379181.html</guid><wfw:comment>http://www.blogjava.net/wshsdlau/comments/379181.html</wfw:comment><comments>http://www.blogjava.net/wshsdlau/archive/2011/04/28/379181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wshsdlau/comments/commentRss/379181.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wshsdlau/services/trackbacks/379181.html</trackback:ping><description><![CDATA[<div id="box">
<div id="bgbox">
<div id="content">
<div id="innerContent">
<div id="nav">
<ul class="nav">
    <li><a href="http://blog.tanggaowei.com/" title="Home">首页</a></li>
    <li class="page_item page-item-2"><a href="http://blog.tanggaowei.com/post" title="关于">关于</a></li>
    <li class="page_item page-item-172"><a href="http://blog.tanggaowei.com/post-2" title="我的做什么">我的做什么</a></li>
</ul>
</div>
<ins style="display:inline-table;border:none;height:15px;margin:0;padding:0;position:relative;visibility:visible;width:468px"><ins id="aswift_0_anchor" style="display:block;border:none;height:15px;margin:0;padding:0;position:relative;visibility:visible;width:468px"></ins></ins>    <br clear="all" />
<div class="entry">
<div class="post" id="post-393">
<h2><a href="http://blog.tanggaowei.com/2008/12/myeclipse-2.html" rel="bookmark" title="Permanent Link to MyEclipse 怎样手动编译整个项目">MyEclipse 怎样手动编译整个项目</a></h2>
作者 Neot 写于 <abbr title="2008-12-31 13:17:56">2008-12-31  </abbr>| 3,737 次浏览
<p>MyEclipse 菜单 Project-&gt;Build Automatically
选中后，项目的文件会被自动编辑。要想手动编译整个项目，可使用菜单 Project-&gt;Build All 或
Project-&gt;Build Project。还有个比较笨的方法，就是运行整个项目。运行项目时，MyEclipse 会先对项目进行编译。</p>
<p>但是有个问题，Build All、Build Project 菜单项常常是恢掉的，不可执行。其实，这是因为我们勾选了
Project-&gt;Build Automatically 项。取消掉 Project-&gt;Build Automatically
后，Build All 和 Build Project 菜单项就可以用了。</p>
[ 标签： <a href="http://blog.tanggaowei.com/tag/myeclipse">myeclipse</a>, <a href="http://blog.tanggaowei.com/tag/%e7%bc%96%e8%af%91">编译</a> ] <br />
[ 固定链接：<a href="http://blog.tanggaowei.com/2008/12/myeclipse-2.html">http://blog.tanggaowei.com/2008/12/myeclipse-2.html</a> ]<br />
<p class="postinfo"><a href="http://blog.tanggaowei.com/2008/12/myeclipse-2.html#respond" title="MyEclipse 怎样手动编译整个项目 上的评论">没有评论</a> <img src="http://blog.tanggaowei.com/wp-content/themes/bobv2/i/cm.gif" alt="评论" /> | 分类 &#187; <a href="http://blog.tanggaowei.com/category/soft-dev" title="查看 软件开发 的全部文章" rel="category tag">软件开发</a> |  </p>
</div>
</div>
<div class="entry">
<div class="post" id="post-392">
<h2><a href="http://blog.tanggaowei.com/2008/12/myeclipse.html" rel="bookmark" title="Permanent Link to 为什么取消 MyEclipse 验证后还是有许多红叉叉">为什么取消 MyEclipse 验证后还是有许多红叉叉</a></h2>
作者 Neot 写于 <abbr title="2008-12-31 13:09:02">2008-12-31  </abbr>| 2,610 次浏览
<p>在 MyEclipse 的
windows&#8211;&gt;perferences&#8211;&gt;myeclipse&#8211;&gt;validation 下，把除了manual
下面的全部点掉，build下只留 classpath dependency Validator，这样设置后，MyEclipse就不会老是验证
xml、jsp、html 等文件了。参考如下文章：
</p>
<p><a href="http://eclipse+myeclipse%e7%9a%84%e4%bc%98%e5%8c%96/">Eclipse+MyEclipse的优化</a>
</p>
<p>但是，我设置好了，在 Package Explorer
窗口却还是有许多的红叉叉。翻来覆去弄了好几次，情况都一样。最后，终于发现，在 Package Explorer 窗口
对项目点击右键，在出现的菜单中执行&#8220;MyEclipse-&gt;Remove All Validation
Markers&#8221;，所有的红叉叉就都不见了。</p>
[ 标签： <a href="http://blog.tanggaowei.com/tag/myeclipse">myeclipse</a>, <a href="http://blog.tanggaowei.com/tag/%e4%bc%98%e5%8c%96">优化</a>, <a href="http://blog.tanggaowei.com/tag/%e9%aa%8c%e8%af%81">验证</a> ] <br />
[ 固定链接：<a href="http://blog.tanggaowei.com/2008/12/myeclipse.html">http://blog.tanggaowei.com/2008/12/myeclipse.html</a> ]<br />
<p class="postinfo"><a href="http://blog.tanggaowei.com/2008/12/myeclipse.html#respond" title="为什么取消 MyEclipse 验证后还是有许多红叉叉 上的评论">没有评论</a> <img src="http://blog.tanggaowei.com/wp-content/themes/bobv2/i/cm.gif" alt="评论" /> | 分类 &#187; <a href="http://blog.tanggaowei.com/category/soft-dev" title="查看 软件开发 的全部文章" rel="category tag">软件开发</a> |  </p>
</div>
</div>
<div class="entry">
<div class="post" id="post-299">
<h2><a href="http://blog.tanggaowei.com/2008/10/eclipse-subversion.html" rel="bookmark" title="Permanent Link to Eclipse 中怎样添加 Subversion 插件">Eclipse 中怎样添加 Subversion 插件</a></h2>
作者 Neot 写于 <abbr title="2008-10-30 09:56:28">2008-10-30  </abbr>| 3,280 次浏览
<p>Eclipse 中可以从菜单添加插件：[菜单]Help / Software Updates / Find and
Install。在出现的 Install 窗口，选择&#8220;Search for new features to
install&#8221;项，点击&#8220;Next&#8221;进入下一页。然后点击右侧的&#8220;New Remote
Site&#8221;按钮，在出现的窗口中，设置&#8220;Name&#8221;项为&#8220;Subversion&#8221;，&#8220;URL&#8221;项为&#8220;<a title="http://subclipse.tigris.org/update/" href="http://subclipse.tigris.org/update/">http://subclipse.tigris.org/update/</a>&#8221;，点击&#8220;OK&#8221;按钮。再点击&#8220;Finish&#8221;按钮，Ecplise 就会开始自动下载 Subversion 插件，并安装了。</p>
<p>像 MyEclipse、Carbide 这些基于 Eclipse 的开发工具，同样适用这个方法。</p>
[ 标签： <a href="http://blog.tanggaowei.com/tag/carbide">Carbide</a>, <a href="http://blog.tanggaowei.com/tag/eclipse">eclipse</a>, <a href="http://blog.tanggaowei.com/tag/myeclipse">myeclipse</a>, <a href="http://blog.tanggaowei.com/tag/subversion">subversion</a> ] <br />
[ 固定链接：<a href="http://blog.tanggaowei.com/2008/10/eclipse-subversion.html">http://blog.tanggaowei.com/2008/10/eclipse-subversion.html</a> ]<br />
<p class="postinfo"><a href="http://blog.tanggaowei.com/2008/10/eclipse-subversion.html#respond" title="Eclipse 中怎样添加 Subversion 插件 上的评论">没有评论</a> <img src="http://blog.tanggaowei.com/wp-content/themes/bobv2/i/cm.gif" alt="评论" /> | 分类 &#187; <a href="http://blog.tanggaowei.com/category/soft-dev" title="查看 软件开发 的全部文章" rel="category tag">软件开发</a> |  </p>
</div>
</div>
<div class="entry">
<div class="post" id="post-84">
<h2><a href="http://blog.tanggaowei.com/2007/12/myeclipsesshstrutsspringhibernate.html" rel="bookmark" title="Permanent Link to MyEclipse开发SSH（Struts+Spring+Hibernate）入门">MyEclipse开发SSH（Struts+Spring+Hibernate）入门</a></h2>
作者 Neot 写于 <abbr title="2007-12-13 23:04:00">2007-12-13  </abbr>| 16,744 次浏览
<p>（本文参考自 oksonic 的&#8220;<a id="viewpost1_TitleUrl" href="../../oksonic/archive/2005/11/06/18370.html">Struts+Spring+Hibernate练习(完整)</a>&#8221;）</p>
<p>源码下载：<a id="bon:" title="http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2857703" href="http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2857703">http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2857703</a></p>
<h3>1. 准备</h3>
<p>工具：<a id="z7iy" title="MyEclipse 6.0.1 GA" href="http://www.myeclipseide.com/" target="_blank">MyEclipse 6.0.1 GA</a>、<a id="s2.:" title="mysql-connector-java-5.0.4-bin.jar" href="http://drc-dev.ohiolink.edu/browser/fedora-core/tags/upstream/lib/mysql-connector-java-5.0.4-bin.jar?rev=636" target="_blank">mysql-connector-java-5.0.4-bin.jar</a>、<a id="teuw" title="mysql-gui-tools" href="http://dev.mysql.com/downloads/gui-tools/5.0.html" target="_blank">MySql GUI Tools 5.0</a>（便于管理MySql数据库，不是必须）</p>
<p>环境：<a id="i:oc" title="Tomcat5.5" href="http://tomcat.apache.org/" target="_blank">Tomcat 5.5</a>、<a id="vh5u" title="MySql 5.0" href="http://dev.mysql.com/downloads/mysql/5.0.html" target="_blank">MySql 5.0</a></p>
<p><strong>1.1. 新建工程</strong></p>
<p>操作：[Menu] File/New/Web Project</p>
<p>工程名：login</p>
<p id="tf2p" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_319f9jgqjdg" alt="" /></p>
<h3>2. Struts 部分</h3>
<p><strong><br />
2.1. 添加 Struts 功能支持<br />
</strong><br />
操作：[Menu] MyEclipse/Project Capabilities/Add Struts Capabilities</p>
<p id="nngm" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_335gprx9cdh" alt="" /></p>
<p>将 &#8220;yourcompany&#8221; 替换成 &#8220;login&#8221;。</p>
<p><strong>2.2. 创建 ActionForm 类</strong></p>
<p>操作：[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Form</p>
<p>类名：LoginForm</p>
<p id="vj.:" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_336dkdnvz5n" alt="" /></p>
<p>在 &#8220;Use case&#8221; 里输入 &#8220;Login&#8221; 后，Name、Form type 等会自动填充。</p>
<p>在 &#8220;Form Properties&#8221; 选项卡为 loginForm 新增两个属性：username、password，&#8221;Type&#8221; 和 &#8220;JSP input type&#8221; 分别保持默认的 &#8220;java.lang.String&#8221; 和 &#8220;text&#8221;；</p>
<p>在 &#8220;JSP&#8221; 选项卡钩选 &#8220;Create JSP form&#8221; 选项，将新建路径改为 &#8220;/login.jsp&#8221;（login.jsp文件将被自动创建）。</p>
<p><strong>2.3. 创建 Action 类</strong></p>
<p>操作：[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Action</p>
<p>类名：LoginAction</p>
<p id="bya_" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_334hq8m4jg6" alt="" /></p>
<p>在 &#8220;Form&#8221; 选项卡的 &#8220;Name&#8221; 项选择 &#8220;loginForm&#8221;，&#8221;Input Source&#8221; 项输入 &#8220;/login.jsp&#8221;。</p>
<p><strong>2.4. 创建 index.jsp 文件</strong></p>
<p>如果没有，创建 index.jsp 文件，并添加一个指向 login.jsp 的链接：<span style="color: #3333ff">&lt;a href = &#8220;login.jsp&#8221;&gt;Login&lt;/a&gt;</span>。</p>
<p><strong>2.5. 创建Forword类</strong></p>
<p>操作：[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Forword</p>
<p>类名：indexForword</p>
<p id="x0.w" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_3374rnpstc6" alt="" /></p>
<p>&#8220;Name&#8221; 项输入 &#8220;indexForword&#8221; ，&#8221;Path&#8221; 项选择 &#8220;/index.jsp&#8221; 。</p>
<p><strong>2.6. 修改 LoginAction.java 文件</strong></p>
<p>修改 LoginAction 类的 execute 方法：</p>
<p><span style="color: #0000ff;">public class LoginAction extends Action { </span></p>
<p><span style="color: #0000ff;"> public ActionForward execute ( ActionMapping mapping, ActionForm form,<br />
HttpServletRequest request, HttpServletResponse response ) {<br />
LoginForm loginForm = ( LoginForm ) form;<br />
</span><br />
<span style="color: #009900;"> String username = loginForm.getUsername();<br />
String password = loginForm.getPassword(); </span></p>
<p><span style="color: #009900;"> if ( username.equals ( &#8220;test&#8221; ) &amp;&amp; password.equals ( &#8220;test&#8221; ) ) {<br />
return mapping.findForward ( &#8220;indexForword&#8221; );<br />
} else {<br />
return mapping.getInputForward();<br />
}<br />
</span> <span style="color: #0000ff;">}<br />
}</span></p>
<p><strong>2.7. 修改 login.jsp 文件</strong></p>
<p>修改 &lt;html:form&gt; 标签：<span style="color: #3333ff;">&lt;html:form action=&#8221;/login&#8221;&gt;</span>。</p>
<p><strong>2.8. 测试</strong></p>
<p>操作：[Menu] Run/Run，选择 MyEclipse Server Application 方式运行</p>
<p>（<span style="color: #ff0000;">要正常执行Run操作，需先安装 Tomcat5.5 。</span>）</p>
<p id="g0jz" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_338g2z4pcgz" alt="" /></p>
<p>点击 index.jsp 页面的 &#8220;Login&#8221; 链接，跳转到 login.jsp 页面。在 login.jsp 页面输入
&#8220;test/test&#8221;，应该会登录成功，然后跳转到 index.jsp 页面；输入 &#8220;test/123&#8243; ，应该保持在 login.jsp
页面。</p>
<p>如果测试成功，证明 Structs 运行正常。</p>
<p>如果运行出错，请参考文章最后的&#8220;5. 问题集&#8221;。</p>
<h3>3. Spring 部分</h3>
<p><strong><br />
3.1. 添加 Spring 功能支持</strong></p>
<p>操作：[Menu] MyEclipse/Project Capabilities/Add Spring Capabilities</p>
<p id="fezm" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_323d5wz3kcg" alt="" /></p>
<p>Spring 版本（ Spring version ）选择 &#8220;Spring 1&#8243;；</p>
<p>开发包（libraries）选择 &#8220;Spring 1.2 AOP Libraries、Spring 1.2 Core
Libraries、Spring 1.2 Persistence Core Libraries、Spring 1.2 Persistence
JDBC Libraries&#8221; 四项；</p>
<p>JAR Library Installation 选择 &#8220;copy checked&#8230;&#8221; ，&#8221;Library Folder&#8221; 项选择 &#8220;/WebRoot/WEB-INF/lib&#8221;（这样的话所需的类库都将拷贝到项目目录，方便以后的布署）。</p>
<p>点击 &#8220;下一步(Next)&#8221; 创建配置文件，修改文件路径（Folder）到 &#8220;WebRoot/WEB-INF&#8221; 目录（以便和Struts配置文件一起管理），文件名称为默认的&#8221;applicationContext.xml&#8221;。</p>
<p id="ly45" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_324dxwmk8c7" alt="" /></p>
<p>点击 &#8220;完成(Finish)&#8221; 。</p>
<p><strong>3.2. 配置 struts-config.xml 文件</strong></p>
<p>添加 Spring 插件（在 &lt;message-resources&gt; 标签后面添加）：</p>
<p><span style="color: #3333ff;">&lt;plug-in className=&#8221;org.springframework.web.struts.ContextLoaderPlugIn&#8221;&gt;<br />
&lt;set-property property=&#8221;contextConfigLocation&#8221; value=&#8221;/WEB-INF/applicationContext.xml&#8221; /&gt;<br />
&lt;/plug-in&gt;</span></p>
<p>修改 LoginAction 的配置（只需修改 type 属性）：</p>
<p><span style="color: #3333ff;">&lt;action-mappings &gt;<br />
&lt;action<br />
attribute=&#8221;loginForm&#8221;<br />
input=&#8221;/login.jsp&#8221;<br />
name=&#8221;loginForm&#8221;<br />
path=&#8221;/login&#8221;<br />
scope=&#8221;request&#8221;<br />
type=&#8221;<span style="color: #009900;">org.springframework.web.struts.DelegatingActionProxy</span>&#8221; /&gt;</span></p>
<p><span style="color: #3333ff;">&lt;/action-mappings&gt;<br />
</span><br />
绿色字体部份为被修改过的内容，这里将使用 spring 的代理器 DelegatingActionProxy 来对 Action 进行控制。</p>
<p><strong>3.3. 修改 Spring 配置文件 applicationContext.xml</strong></p>
<p><span style="color: #3333ff;">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &#8220;-//SPRING//DTD BEAN//EN&#8221; &#8220;http://www.springframework.org/dtd/spring-beans.dtd&#8221;&gt;</span></p>
<p><span style="color: #3333ff;">&lt;beans&gt;<br />
<span style="color: #009900;"> &lt;bean name=&#8221;/login&#8221; class=&#8221;com.login.struts.action.LoginAction&#8221; singleton=&#8221;false&#8221;&gt;&lt;/bean&gt;</span><br />
&lt;/beans&gt;<br />
</span><br />
绿色字体是关于接受和处理 Action 控制权的配置内容，&#8221;com.login.struts.action.LoginAction&#8221; 即为原 struts 里的配置。</p>
<p><strong>3.4. 测试</strong></p>
<p>同上一次测试。测试成功证明 Spring 运行正常。</p>
<p>如果运行出错，请参考文章最后的&#8220;5. 问题集&#8221;。</p>
<h3>4. Hibernate 部分</h3>
<p>下面开始 Hibernate 部分，将原例修改为使用数据库进行用户名/密码验证。</p>
<p><strong>4.1. 创建 mysql 数据库和表</strong></p>
<p>添加表的代码如下：</p>
<p><span style="color: #3333ff;">CREATE TABLE user_table(<br />
ID int NOT NULL auto_increment,<br />
USERNAME varchar(45) NOT NULL default &#8221;,<br />
PASSWORD varchar(45) NOT NULL default &#8221;,<br />
PRIMARY KEY (ID)<br />
)<br />
</span><br />
再添加一条记录：</p>
<p><span style="color: #3333ff;">insert into user_table (USERNAME,PASSWORD) values (&#8216;test&#8217;,'test&#8217;)</span></p>
<p><strong>4.2. 创建 MyEclipse 数据库驱动（DB Driver）</strong></p>
<p>操作：[Menu] MyEclipse/Prefrences/MyEclipse/Database Explorer/Database Driver/DB Brower</p>
<p id="qj0v" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_325tpqzkkg5" alt="" /></p>
<p>在 DB Brower 的菜单中选择 &#8220;New&#8221; ，&#8221;Driver Name&#8221; 项输入 &#8220;login-conn&#8221; ，&#8221;Connection
URL&#8221; 项输入 &#8220;jdbc:mysql://localhost:3306/test&#8221; ，然后输入 MySql 的用户名（User
Name）和密码（Password），按实际情况输入；</p>
<p>在 &#8220;Driver JARs&#8221; 项添加 &#8220;mysql-connector-java-5.0.4-bin.jar&#8221; (可从网上下载)，在 &#8220;Driver classname&#8221; 里选择 &#8220;com.mysql.jdbc.Driver&#8221; ，其它自选。</p>
<p>点击 &#8220;完成(Finish)&#8221;。</p>
<p><strong>4.3. 添加 Hibernate 功能支持</strong></p>
<p>操作：[Menu] MyEclipse/Project Capabilities/Add Hibernate Capabilities</p>
<p id="pje4" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_326dg4b4pgq" alt="" /></p>
<p>Hibernate 版本（Hibernate Specification）选择 &#8220;Hibernate 3.1&#8243; ，开发包（libraries）选择 Hibernate 3.1 Core Libraries 一项；</p>
<p>JAR Library Installation 选择 &#8220;copy checked&#8230;&#8221; ，&#8221;Library Folder&#8221; 选择 &#8220;/WebRoot/WEB-INF/lib&#8221; 。</p>
<p><strong>点击 &#8220;下一步(Next)&#8221; 设置配置文件：</strong></p>
<p id="rrh9" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_327v5387zfg" alt="" /></p>
<p>选择 &#8220;Spring configuration file (applicationContext.xml)&#8221; 。</p>
<p><strong>&#8220;下一步(Next)&#8221; 设置 Spring-Hibernate：</strong></p>
<p id="d7.s" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_329gj9xz8g4" alt="" /></p>
<p>选择 &#8220;Existing Spring configuration file&#8221; ，&#8221;SessionFactory ID&#8221; 项输入 &#8220;sessionFactory&#8221; 。</p>
<p><strong>&#8220;下一步(Next)&#8221; 创建数据源对象：</strong></p>
<p id="gmtq" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_330tqtsbr8x" alt="" /></p>
<p>在 Bean Id 中输入 dataSource，&#8221;DataSource&#8221; 项选择 &#8220;Use JDBC Dirver&#8221; ，DB Driver 项选择 &#8220;login-conn&#8221; ，其余项会自动填充。</p>
<p>记得选中 &#8220;Copy DB driver jar(s) to project and add to buidpath&#8221; 项，以便将数据连接的库文件复制到项目，方便以后的布署。</p>
<p><strong>&#8220;下一步(Next)&#8221; 创建 SessionFactory 类：</strong></p>
<p id="jt.1" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_331cpv7g6gx" alt="" /></p>
<p>&#8220;Java package&#8221; 项设置为 &#8220;com.login.Hibernate&#8221; （如果没有，点击 &#8220;New&#8221; 按钮添加），&#8221;Class
name&#8221; 项修改为 &#8220;SessionFactory&#8221; ，Java Compliance Level 选择和创建项目时选择的 Java
版本。（本例中并没有用到 SessionFactory 类，留作今后扩展）</p>
<p>点击 &#8220;完成(Finish)&#8221;。</p>
<p><strong>4.4. 创建对象关系映射(ORM)的相关文件</strong></p>
<p>操作：[Menu] Window/Open Perspective/MyEclipse Database Explorer</p>
<p id="uh95" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_332gxx7rhzt" alt="" /></p>
<p>选中 user_table 表，点击右键，在出现的菜单中选择 &#8220;Hibernate Reverse Engnieering&#8221; 。</p>
<p id="i0nj" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img src="http://docs.google.com/File?id=ajjn4tkm8t6q_333vwh5xphf" alt="" /></p>
<p>在弹出的窗口中保持 &#8220;Java package&#8221; 项为 &#8220;com.login&#8221; ；</p>
<p>选中 &#8220;Hibernate mapping file (*.hbm.xml) for each databases table&#8221; ，并保持 &#8220;Update hibernate&#8230;&#8221; 项选中；</p>
<p>选中 &#8220;Java Data Object&#8221; 项，并保持 &#8220;Create abstract class&#8221; 选中；</p>
<p>&#8220;Base persistent class&#8221; 项留空；</p>
<p>取消 &#8220;Java Data Access Object&#8230;&#8221; 项和 &#8220;Use custom templates&#8221; 项。</p>
<p>点击 &#8220;下一步(Next)&#8221; ，再点击 &#8220;下一步(Next)&#8221; ，在 &#8220;Configure reverse engineering
details&#8221; 页选中 &#8220;user_table&#8221; 表，在右边出现的 &#8220;Class Name&#8221; 项中输入
&#8220;com.login.User&#8221;，其它不变。</p>
<p>点击 &#8220;完成(Finish)&#8221;。</p>
<p>完成此操作，会在 &#8220;com.login&#8221; 包下创建三个文件：AbstractUser.java、User.java、User.hbm.xml。</p>
<p><strong>4.5. 创建 UserDAO.java 接口</strong></p>
<p>操作：[Ctrl+N] Interface，点击 &#8220;下一步( Next )&#8221;</p>
<p>在出现的 &#8220;New Java Interface&#8221; 窗口中，将 &#8220;Source Folder&#8221; 设置为 &#8220;login/src&#8221;，将
&#8220;Package&#8221; 设置为 &#8220;com.login&#8221;， 将 &#8220;Name&#8221;&nbsp; 项设为 &#8220;UserDAO&#8221;，然后点击 &#8220;完成( Finish )&#8221;
按钮。</p>
<p>UserDAO.java 内容如下：</p>
<p><span style="color: #3333ff;">package com.login;</span></p>
<p><span style="color: #3333ff;">public interface UserDAO {<br />
public abstract boolean isValidUser( String username, String password );<br />
}</span></p>
<p><strong>4.6. 创建 UserDAOImpl.java 类</strong></p>
<p>操作：[Ctrl+N] Class，点击 &#8220;下一步( Next )&#8221;</p>
<p>在出现的 &#8220;New Java Class&#8221; 窗口中，将 &#8220;Source Folder&#8221; 设置为 &#8220;login/src&#8221;，将
&#8220;Package&#8221; 设置为 &#8220;com.login&#8221;， 将 &#8220;Name&#8221;&nbsp; 项设为 &#8220;UserDAOImpl&#8221;，在 &#8220;Supperclass&#8221;
项输入 &#8220;org.springframework.orm.hibernate3.support.HibernateDaoSupport&#8221;，在
&#8220;Interface&#8221; 项中添加 &#8220;com.login.UserDAO&#8221; 接口，然后点击 &#8220;完成( Finish )&#8221; 按钮。</p>
<p>UserDAOImpl 通过 Hibernate 访问数据库，做用户验证。</p>
<p>UserDAOImpl.java 内容如下：</p>
<p><span style="color: #3333ff;">package com.login;</span></p>
<p><span style="color: #3333ff;"><span style="color: #009900;">import java.util.List;</span><br />
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;</span></p>
<p><span style="color: #3333ff;">public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {<br />
</span><span style="color: #009900;">private static String hql = &#8220;from User u where u.username=? &#8220;;</span></p>
<p><span style="color: #3333ff;"> public boolean isValidUser( String username, String password ) {<br />
<span style="color: #009900;">// 验证用户<br />
List userList = this.getHibernateTemplate().find( hql, username );<br />
if ( userList.size() &gt; 0 ) {<br />
return true;<br />
}<br />
</span> return false;<br />
}<br />
}</span></p>
<p><strong>4.7. 修改 LoginAction.java 文件</strong></p>
<p>使用 UseDAO 对象来验证：</p>
<p><span style="color: #3333ff;">package com.login.struts.action;</span></p>
<p><span style="color: #3333ff;">import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;<br />
import org.apache.struts.action.Action;<br />
import org.apache.struts.action.ActionForm;<br />
import org.apache.struts.action.ActionForward;<br />
import org.apache.struts.action.ActionMapping;<br />
import com.login.struts.form.LoginForm;<br />
</span><span style="color: #009900;">import com.login.UserDAO;</span></p>
<p><span style="color: #3333ff;">public class LoginAction extends Action {<br />
<span style="color: #009900;">private UserDAO userDAO;</span></span></p>
<p><span style="color: #3333ff;"><span style="color: #009900;">public UserDAO getUserDAO() {<br />
return userDAO;<br />
}</span></span></p>
<p><span style="color: #3333ff;"><span style="color: #009900;">public void setUserDAO(UserDAO userDAO) {<br />
this.userDAO = userDAO;<br />
}</span></span></p>
<p><span style="color: #3333ff;">public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
HttpServletRequest request, HttpServletResponse response) {</span></p>
<p><span style="color: #3333ff;">LoginForm loginForm = (LoginForm) form;<br />
String username=loginForm.getUsername();<br />
String password=loginForm.getPassword();</span></p>
<p><span style="color: #3333ff;">if(<span style="color: #009900;"> userDAO.isValidUser( username, password ) </span>){<br />
return mapping.findForward( &#8220;indexForword&#8221; );<br />
}else{<br />
return mapping.getInputForward();<br />
}<br />
}<br />
}</span></p>
<p>绿色字体为修改部分。</p>
<p><strong>4.8. Spring 的</strong><strong>最终</strong><strong>配制文件 applicationContext.xml</strong></p>
<p><span style="color: #0000ff;">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &#8220;-//SPRING//DTD BEAN//EN&#8221; &#8220;</span><a href="http://www.springframework.org/dtd/spring-beans.dtd%22"><span style="color: #0000ff;">http://www.springframework.org/dtd/spring-beans.dtd&#8221;</span></a><span style="color: #0000ff;">&gt; </span></p>
<p><span style="color: #0000ff;">&lt;beans&gt; </span></p>
<p><span style="color: #0000ff;"> &lt;bean id=&#8221;dataSource&#8221; class=&#8221;org.apache.commons.dbcp.BasicDataSource&#8221;&gt;<br />
&lt;property name=&#8221;driverClassName&#8221; value=&#8221;com.mysql.jdbc.Driver&#8221;&gt;&lt;/property&gt;<br />
&lt;property name=&#8221;url&#8221; value=&#8221;jdbc:mysql://localhost:3306/test&#8221;&gt;&lt;/property&gt;<br />
&lt;property name=&#8221;username&#8221; value=&#8221;root&#8221;&gt;&lt;/property&gt;<br />
&lt;property name=&#8221;password&#8221; value=&#8221;root&#8221;&gt;&lt;/property&gt;<br />
&lt;/bean&gt; </span></p>
<p><span style="color: #0000ff;"> &lt;!&#8211; 配置sessionFactory, 注意这里引入的包的不同 &#8211;&gt;<br />
&lt;bean id=&#8221;sessionFactory&#8221; class=&#8221;org.springframework.orm.hibernate3.LocalSessionFactoryBean&#8221;&gt;<br />
&lt;property name=&#8221;dataSource&#8221;&gt;<br />
&lt;ref local=&#8221;dataSource&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;property name=&#8221;mappingResources&#8221;&gt;<br />
&lt;list&gt;<br />
&lt;value&gt;com/login/User.hbm.xml&lt;/value&gt;<br />
&lt;/list&gt;<br />
&lt;/property&gt;<br />
&lt;property name=&#8221;hibernateProperties&#8221;&gt;<br />
&lt;props&gt;<br />
&lt;prop key=&#8221;hibernate.dialect&#8221;&gt;org.hibernate.dialect.MySQLDialect&lt;/prop&gt;<br />
&lt;prop key=&#8221;hibernate.show_sql&#8221;&gt;true&lt;/prop&gt;<br />
&lt;/props&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt; </span></p>
<p><span style="color: #0000ff;"> &lt;bean id=&#8221;transactionManager&#8221; class=&#8221;org.springframework.orm.hibernate3.HibernateTransactionManager&#8221;&gt;<br />
&lt;property name=&#8221;sessionFactory&#8221;&gt;<br />
&lt;ref local=&#8221;sessionFactory&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt; </span></p>
<p><span style="color: #0000ff;"> &lt;bean id=&#8221;userDAO&#8221; class=&#8221;com.login.UserDAOImpl&#8221;&gt;<br />
&lt;property name=&#8221;sessionFactory&#8221;&gt;<br />
&lt;ref local=&#8221;sessionFactory&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt; </span></p>
<p><span style="color: #0000ff;"> &lt;bean id=&#8221;userDAOProxy&#8221; class=&#8221;org.springframework.transaction.interceptor.TransactionProxyFactoryBean&#8221;&gt;<br />
&lt;property name=&#8221;transactionManager&#8221;&gt;<br />
&lt;ref bean=&#8221;transactionManager&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;property name=&#8221;target&#8221;&gt;<br />
&lt;ref local=&#8221;userDAO&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;property name=&#8221;transactionAttributes&#8221;&gt;<br />
&lt;props&gt;<br />
&lt;prop key=&#8221;insert*&#8221;&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />
&lt;prop key=&#8221;get*&#8221;&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />
&lt;prop key=&#8221;is*&#8221;&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />
&lt;/props&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt; </span></p>
<p><span style="color: #0000ff;"> &lt;bean name=&#8221;/login&#8221; class=&#8221;com.login.struts.action.LoginAction&#8221; singleton=&#8221;false&#8221;&gt;<br />
&lt;property name=&#8221;userDAO&#8221;&gt;<br />
&lt;ref bean=&#8221;userDAOProxy&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt; </span></p>
<p><span style="color: #0000ff;">&lt;/beans&gt;</span></p>
<p><strong>4.9. 测试</strong></p>
<p>同第一次测试。</p>
<p>如果运行出错，请参考文章最后的&#8220;5. 问题集&#8221;。</p>
<p><strong>5. 问题集</strong></p>
<p>5.1. Console 错误信息： <span style="color: #ff0000;">java.net.BindException: Address already in use: JVM_Bind:8080</span></p>
<ul>
    <li>原因：有其它进程占用了 8080 端口，导致绑定失败。</li>
    <li>解决：如果是有 Tomcat 启动了，将其关闭，MyEclipse 会自己启动 Tomcat。</li>
</ul>
<p>5.2. HTTP 错误信息：<span style="color: #ff0000;"><strong>message</strong> <span style="text-decoration: underline;">Servlet action is not available</span></span></p>
<ul>
    <li>原因：找不到相关类。可能配置文件中的某些类或文件的路径填写错误，或是缺少 jar 包。</li>
    <li>解决：如果是在添加 Spring 特性后产生的，可能是 /WEB-INF/lib/ 中缺少 spring.jar 包。从 MyEclipse 目录搜索出 1.2 版的 spring.jar，并将其复制到项目的 /WEB-INF/lib/ 目录下。</li>
</ul>
<p>5.3. Console 错误信息：<span style="color: #ff0000;">java.sql.SQLException: Access denied for user: &#8216;root@localhost&#8217; (Using password: YES)</span></p>
<ul>
    <li>原因：数据库访问被拒绝。可能由于 MySQL 密码被设置成空，而 MyEclipse 又不支持空密码。</li>
    <li>解决：将 MySQL 的 root 用户密码设置成非空，如 &#8220;root&#8221;，然后修改 MyEclipse 中刚才添加的 login-conn 数据源信息的密码项。</li>
</ul>
[ 标签： <a href="http://blog.tanggaowei.com/tag/hibernate">hibernate</a>, <a href="http://blog.tanggaowei.com/tag/j2ee">j2ee</a>, <a href="http://blog.tanggaowei.com/tag/myeclipse">myeclipse</a>, <a href="http://blog.tanggaowei.com/tag/spring">spring</a>, <a href="http://blog.tanggaowei.com/tag/struts">struts</a> ] <br />
[ 固定链接：<a href="http://blog.tanggaowei.com/2007/12/myeclipsesshstrutsspringhibernate.html">http://blog.tanggaowei.com/2007/12/myeclipsesshstrutsspringhibernate.html</a> ]<br />
<p class="postinfo"><a href="http://blog.tanggaowei.com/2007/12/myeclipsesshstrutsspringhibernate.html#comments" title="MyEclipse开发SSH（Struts+Spring+Hibernate）入门 上的评论">16 个评论</a> <img src="http://blog.tanggaowei.com/wp-content/themes/bobv2/i/cm.gif" alt="评论" /> | 分类 &#187; <a href="http://blog.tanggaowei.com/category/soft-dev" title="查看 软件开发 的全部文章" rel="category tag">软件开发</a> |  </p>
</div>
</div>
</div>
</div>
<div id="misc">
<div id="info">
<div style="float:left; ">
<h2>订阅</h2>
<div style="padding-top:6px;">
<a href="http://feed.feedsky.com/tanggaowei" target="_blank"><img src="http://blog.tanggaowei.com/wp-content/themes/bobv2/i/rss-icon.png" title="订阅Rss" alt="" border="0" /></a>
&nbsp;
<a href="http://www.emailrss.cn/?rss=http://feed.feedsky.com/tanggaowei" target="_blank"><img src="http://blog.tanggaowei.com/wp-content/themes/bobv2/i/rss-email.gif" title="订阅到Email" alt="" border="0" /></a>
</div>
<br />
<h2>手机访问</h2>
<a href="http://blog.tanggaowei.com/wap/">http://blog.tanggaowei.com/wap/</a>
</div>
<div style="float:right; ">        <img src="http://tanggaowei.512j.com/blog.head.jpg" alt="" /></div>
</div>
<div id="bsearch">
﻿
<table border="0">
    <tbody>
        <tr>
            <td align="left" height="32" nowrap="nowrap" valign="top">
            <a href="http://www.google.com/">
            <img src="http://www.google.com/logos/Logo_25wht.gif" alt="Google" align="center" border="0" /></a>
            </td>
            <td nowrap="nowrap">
            <input name="q" size="31" maxlength="255" value="" id="sbi" type="text" />
            </td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td nowrap="nowrap">
            <table>
                <tbody>
                    <tr>
                        <td>
                        <input name="sitesearch" value="" id="ss0" type="radio" />
                        <label for="ss0" title="搜索网络"><font color="#000000" size="-1">Web</font></label></td>
                        <td>
                        <input name="sitesearch" value="blog.tanggaowei.com" checked="checked" id="ss1" type="radio" />
                        <label for="ss1" title="搜索 blog.tanggaowei.com"><font color="#000000" size="-1">blog.tanggaowei.com</font></label></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
</div>
</div>
 <img src ="http://www.blogjava.net/wshsdlau/aggbug/379181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wshsdlau/" target="_blank">哈希</a> 2011-04-28 09:39 <a href="http://www.blogjava.net/wshsdlau/archive/2011/04/28/379181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH框架配置步骤详解</title><link>http://www.blogjava.net/wshsdlau/archive/2011/04/26/379184.html</link><dc:creator>哈希</dc:creator><author>哈希</author><pubDate>Tue, 26 Apr 2011 13:14:00 GMT</pubDate><guid>http://www.blogjava.net/wshsdlau/archive/2011/04/26/379184.html</guid><wfw:comment>http://www.blogjava.net/wshsdlau/comments/379184.html</wfw:comment><comments>http://www.blogjava.net/wshsdlau/archive/2011/04/26/379184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wshsdlau/comments/commentRss/379184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wshsdlau/services/trackbacks/379184.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 核心提示：现在开发的一个项目使用S2SH框架，配置环境用了一两天，现在把当时配置环境时写的文档整理下发出来，也算加强点记忆。 1 开发环境 MyEclipse5.5 JDK 1.6 Java EE 5.0Tomcat6.0 Struts2.1.6 Spring2.5.6 Hibernate3.3.1 2 为 ssh 做好准备 2.1 下载包Struts2&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/wshsdlau/archive/2011/04/26/379184.html'>阅读全文</a><img src ="http://www.blogjava.net/wshsdlau/aggbug/379184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wshsdlau/" target="_blank">哈希</a> 2011-04-26 21:14 <a href="http://www.blogjava.net/wshsdlau/archive/2011/04/26/379184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>教你使用dwr，相当犀利</title><link>http://www.blogjava.net/wshsdlau/archive/2011/04/24/379187.html</link><dc:creator>哈希</dc:creator><author>哈希</author><pubDate>Sun, 24 Apr 2011 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/wshsdlau/archive/2011/04/24/379187.html</guid><wfw:comment>http://www.blogjava.net/wshsdlau/comments/379187.html</wfw:comment><comments>http://www.blogjava.net/wshsdlau/archive/2011/04/24/379187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wshsdlau/comments/commentRss/379187.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wshsdlau/services/trackbacks/379187.html</trackback:ping><description><![CDATA[我个人的理解啊：<br />
&nbsp;&nbsp; dwr其实就是一个servlet包，它已经实现了功能，我们呢只需要调用就可以啊，关键在配置：<br />
&nbsp;&nbsp; 好了，二二话不说,看啥叫犀利吧：<br />
&nbsp;&nbsp; 第一步：web.xml配置<br />
&nbsp;&nbsp; <br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&lt;?</span><span style="color: #000000; ">xml&nbsp;version</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;encoding</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">UTF-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">?&gt;</span><span style="color: #000000; ">&nbsp;<br />
</span><span style="color: #000000; ">&lt;!</span><span style="color: #000000; ">DOCTYPE&nbsp;web</span><span style="color: #000000; ">-</span><span style="color: #000000; ">app&nbsp;PUBLIC&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.3//EN</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">http://java.sun.com/dtd/web-app_2_3.dtd</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;<br />
</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">web</span><span style="color: #000000; ">-</span><span style="color: #000000; ">app</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">servlet</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">servlet</span><span style="color: #000000; ">-</span><span style="color: #000000; ">name</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">dwr</span><span style="color: #000000; ">-</span><span style="color: #000000; ">invoker</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000; ">-</span><span style="color: #000000; ">name</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">display</span><span style="color: #000000; ">-</span><span style="color: #000000; ">name</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">DWR&nbsp;Servlet</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">display</span><span style="color: #000000; ">-</span><span style="color: #000000; ">name</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">servlet</span><span style="color: #000000; ">-</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">uk.ltd.getahead.dwr.DWRServlet</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">servlet</span><span style="color: #000000; ">-</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">init</span><span style="color: #000000; ">-</span><span style="color: #000000; ">param</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">param</span><span style="color: #000000; ">-</span><span style="color: #000000; ">name</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">debug</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">param</span><span style="color: #000000; ">-</span><span style="color: #000000; ">name</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">param</span><span style="color: #000000; ">-</span><span style="color: #000000; ">value</span><span style="color: #000000; ">&gt;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">param</span><span style="color: #000000; ">-</span><span style="color: #000000; ">value</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">init</span><span style="color: #000000; ">-</span><span style="color: #000000; ">param</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">servlet</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">servlet</span><span style="color: #000000; ">-</span><span style="color: #000000; ">mapping</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">servlet</span><span style="color: #000000; ">-</span><span style="color: #000000; ">name</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">dwr</span><span style="color: #000000; ">-</span><span style="color: #000000; ">invoker</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">servlet</span><span style="color: #000000; ">-</span><span style="color: #000000; ">name</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">url</span><span style="color: #000000; ">-</span><span style="color: #000000; ">pattern</span><span style="color: #000000; ">&gt;/</span><span style="color: #000000; ">dwr</span><span style="color: #008000; ">/*</span><span style="color: #008000;">&lt;/url-pattern&gt;&nbsp;<br />
&nbsp;&nbsp;&lt;/servlet-mapping&gt;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;welcome-file-list&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;&nbsp;<br />
&nbsp;&nbsp;&lt;/welcome-file-list&gt;&nbsp;<br />
&lt;/web-app&gt;<br />
<br />
<br />
</span></div>
&nbsp;&nbsp; 第二步：dwr配置（<span style="color: red;">先倒入jar包</span>dwr.jar）<br />
&nbsp; <br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&lt;?</span><span style="color: #000000; ">xml&nbsp;version</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;encoding</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">gbk</span><span style="color: #000000; ">"</span><span style="color: #000000; ">?&gt;</span><span style="color: #000000; ">&nbsp;<br />
</span><span style="color: #000000; ">&lt;!</span><span style="color: #000000; ">DOCTYPE&nbsp;dwr&nbsp;PUBLIC&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-//GetAhead&nbsp;Limited//DTD&nbsp;Direct&nbsp;Web&nbsp;Remoting&nbsp;1.0//EN</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">http://www.getahead.ltd.uk/dwr/dwr10.dtd</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;<br />
</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">dwr</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">allow</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp; &lt;create creator="new" javascript="us"&gt;&nbsp; <br />
&nbsp;&nbsp; &lt;param name="class" value="org.man.prj.Hello" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/create&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;create creator="new" javascript="Students"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="class" value="org.man.prj.Students"/&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/create&gt; </span><span style="color: #000000; "><br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">allow</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">dwr</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "> <br />
</span></div>
第三步：写java代码<br />
根据你的需要了啊<br />
第四步：index.jsp<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&lt;%</span><span style="color: #000000; ">@&nbsp;page&nbsp;language</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">java</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">java.util.*</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;pageEncoding</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">utf-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%&gt;</span><span style="color: #000000; "><br />
</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">html</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
&nbsp;&nbsp;<br />
</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">script&nbsp;src</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/mydwr/dwr/interface/Students.js</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;&lt;/</span><span style="color: #000000; ">script</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">script&nbsp;src</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/mydwr/dwr/engine.js</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;&lt;/</span><span style="color: #000000; ">script</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">script&nbsp;src</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/mydwr/dwr/util.js</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;&lt;/</span><span style="color: #000000; ">script</span><span style="color: #000000; ">&gt;</span><span style="color: #000000;">&nbsp;<br />
<br />
&lt;script type="text/javascript"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var dwr_callback = function(data){&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(data);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;&nbsp; <br />
</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">select&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">classid</span><span style="color: #000000;">"</span><span style="color: #000000; ">&nbsp;id</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">classid</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;onchange</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">javascript:update2();</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;&lt;/</span><span style="color: #000000; ">select</span><span style="color: #000000; ">&gt;</span><span style="color: #000000;">&nbsp; <br />
<br />
&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; This is my JSP page. &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="button" value="invoke" onclick="us.hellodwr(dwr_callback)" /&gt;&nbsp; <br />
&nbsp; &lt;/body&gt;<br />
</span></div>
<br />
好了这样就可以使用dwr了，很方便哦！<br />
不懂的话就和他们联系！QQ群：110703194<br />
<br />
<br />
<br />
<br />
<br />
 <img src ="http://www.blogjava.net/wshsdlau/aggbug/379187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wshsdlau/" target="_blank">哈希</a> 2011-04-24 10:49 <a href="http://www.blogjava.net/wshsdlau/archive/2011/04/24/379187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>