<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title></title>
    <description></description>
    <link>http://qq250203031.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>引用：Struts中基本配置入门</title>
        <author>qq250203031</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qq250203031.javaeye.com">qq250203031</a>&nbsp;
          链接：<a href="http://qq250203031.javaeye.com/blog/189754" style="color:red;">http://qq250203031.javaeye.com/blog/189754</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.为Struts应用配置Web.xml文件<br />　　<br />　　第一步:配置ActionServlet<br />　　<br />　　&lt;servlet><br />　　&lt;servlet-name>action&lt;/servlet-name><br />　　&lt;servlet-class>org.appache.struts.ActionServlet&lt;/servlet-class><br />　　&lt;/servlet><br />　　<br />　　&lt;servlet-mapping><br />　　&lt;servlet-name>action&lt;/servlet-name><br />　　&lt;uri-pattern>*.do&lt;/url-pattern><br />　　&lt;/servlet-mapping><br />　　<br />　　注意:不管应用中包含多少个子应用,都只需配置一个ActionServlet,因为ActionServlet支持多线程,目前的Struts框架只允许在应用中配置一个ActionServlet。<br />　　<br />　　第二步：初始化参数对Servlet的运行环境进行初始化配置。<br />　　<br />　　&lt;servlet><br />　　&lt;servlet-name> action&lt;/servlet-name><br />　　&lt;servlet-class> org.appache.struts.ActionServlet &lt;/servlet-class><br />　　&lt;init-param><br />　　&lt;param-name>config&lt;/param-name><br />　　&lt;param-value>/WEB-INF/struts-config.xml&lt;/param-value><br />　　&lt;/init-param><br />　　&lt;/servlet><br />　　<br />　　表2-1. Struts1.1中用到的初始化参数<br />　　<br />　　参数名　　　　　　 含义/默认值<br />　　config　　　　　以相对路径的方式指明Struts应用程序的配置文件位置。如不设置，则默认值为/WEB-INF/struts-config.xml。<br />　　config/sub1　　 以相对路径的方式指明子应用程序的配置文件位置，一般来说，很少用到子应用程序，在此不多描述。<br />　　debug　　　　　 设置Servlet的debug级别，控制日志记录的详细程度。默认为0，记录相对最少的日志信息。<br />　　detail　　　　　设置Digester的debug级别，Digester是Struts框架所使用的用来解析xml配置文件的一个框架，通过该设置，可以查看不同详细等级的解析日志。默认为0，记录相对最少的日志信息。<br />　　<br />　　第三步：配置欢迎清单<br />　　<br />　　当客户访问Web应用时，如果仅仅给出Web应用的Root URL，没用指定具体的文件名，Web容器会自动调用Web应用的欢迎文件。<br />　　<br />　　&lt;welcome-file-list><br />　　&lt;welcome-file>welcome.jsp&lt;/welcome-file><br />　　&lt;welcome-file>index.jsp&lt;/welcome-file><br />　　&lt;/welcome-fiel-list><br />　　<br />　　说明：&lt;welcome-file-list>可以包含多个&lt;welcome-file>子元素，首先查找第一个&lt;welcome-file>文件。<br />　　<br />　　由于&lt;welcome-file-list>元素中不能配置Servlet映射，因此不能直接把Struts的Action作为欢迎文件，可以采用一种变通的方法来实现在欢迎文件中调用Struts Action。首先，在Struts配置文件中为被调用的Action创建一个全局的转发项，例如：<br />　　&lt;global-forwards><br />　　&lt;forward name=”welcome” path=”HelloWord.do”/><br />　　&lt;/global-forwords><br />　　<br />　　创建一个welcome.jsp的文件<br />　　<br />　　最后在web.xml文件中把welcome.jsp文件配置为欢迎文件，代码如下：<br />　　&lt;welcome-file-list><br />　　&lt;welcome-file>welcome.jsp&lt;/welcome-file><br />　　&lt;/welcome-file-list><br />　　<br />　　第四步：配置错误处理<br />　　<br />　　&lt;error-page><br />　　&lt;error-code>404&lt;/error-code><br />　　&lt;location>/commom/404.jsp&lt;/location><br />　　&lt;/error-page><br />　　&lt;error-page><br />　　&lt;error-code>505&lt;/error-code><br />　　&lt;location>/commom/505.jsp&lt;/location><br />　　&lt;/error-page><br />　　<br />　　也可以为Web容器捕获的Java异常配置&lt;error-page>,需要设置&lt;exception-type>子元素，它用于指定Java异常类。Web容器可能捕获如下异常：<br />　　<br />　　RuntimeException或Error　 ServletException或它的子类　IOException或它的子类<br />　　<br />　　&lt;error-page><br />　　&lt;exception-type>java.io.IOException&lt;/exception-type><br />　　&lt;location>/common/system_ioerror.jsp&lt;/location><br />　　&lt;/error-page><br />　　<br />　　第五步：配置Struts标签库<br />　　<br />　　使用客户化的标签库，要配置它们<br />　　<br />　　&lt;taglib><br />　　&lt;tag-uri>/WEB-INF/struts-html.tld&lt;tag-uri><br />　　&lt;taglib-location>/WEB-INF/struts-html.tld&lt;/taglib-location><br />　　&lt;/taglib><br />　　<br />　　&lt;tag-uri>用于指定标签库的相对或者绝对URI地址，Web应用根据这一URI来访问标签库。<br />　　<br />　　&lt;taglib-location>指定标签描述文件在文件资源系统中的物理位置。<br />　　<br />　　2.Struts配置文件<br />　　<br />　　Struts框架在启动时会读入其配置文件，根据它来创建和配置各种Struts组件。<br />　　<br />　　1&lt;Struts-config>元素<br />　　<br />　　&lt;struts-config>元素是Struts配置文件的根元素，&lt;struts-cofig>元素有8个子元素。它的DTD定义如下：<br />　　<br />　　&lt;!ELEMENT struts-config(data-sources?,formbean?,global-exeception?,global-forward?,action-mapping,controller?,message-resources*,plug-in*)><br />　　<br />　　在Struts配置中，必须按照以上的DTD指定的先后顺序来配置&lt;Struts-config>元素的各个子元素，如果颠倒了这些元素的配置文件中的位置，在Struts应用启动时会生成错误。<br />　　<br />　　&lt;data-sources>元素<br />　　<br />　　&lt;data-sources>元素包含零个、一个或者多个&lt;data-sources>子元素，&lt;data-sources>用于配置特定的数据源，它可以包含多个&lt;set-property>子元素，用于设置数据源的各种属性。<br />　　。。。<br />　　<br />　　配置了数据源后，就可以在Action类中访问数据源，在org.apache.struts.action.Action类中定义了getDataSource(HttpRequrst)方法，它用于获取数据源对象的引用。<br />　　<br />　　DataSource　dataSource;<br />　　Connection　connection;<br />　　dataSource =getDataSource(request);<br />　　connection=dataSource.getConnection();<br />　　<br />　　也可以在配置文件中声明多个数据源，此时需要为每一个数据源分配唯一的key值，通过改值来标识特定的数据源。<br />　　<br />　　2&lt;form-beans>元素<br />　　<br />　　&lt;form-beans>元素用来配置多个ActionForm Bean，&lt;form-beans>包含多个&lt;forom-bean>子元素，,每个&lt;from-bean>包含多个属性，ClassName , name,type<br />　　<br />　　&lt;form-beans><br />　　&lt;form-bean name="HelloForm" type="hello.HelloForm"/><br />　　&lt;/form-beans><br />　　<br />　　注意：配置动态ActionForm Bean，还必须配置&lt;form-bean>元素的&lt;form-property>元素。<br />　　<br />　　&lt;form-beans><br />　　&lt;form-bean name="HelloForm" type="hello.HelloForm"/><br />　　&lt;form-bean name="userForm" type="org.apache.struts.action.DynaAction"><br />　　&lt;from-property name="firstname" type="java.lang.String"/><br />　　&lt;form-property name="secondname" type="java.lang.String"><br />　　&lt;form-property name="age" type="java.Integer" initial="18"><br />　　&lt;/form-beans><br />　　<br />　　3&lt;global-exception>元素<br />　　<br />　　&lt;global-exception>用于配置异常处理，&lt;global-exception>元素可以包含零个或者多个&lt;exception>元素。<br />　　<br />　　&lt;exception>元素用来设置java异常和异常处理类org.apache.struts.action,Exception　Hander之间的映射。<br />　　<br />　　4&lt;gloable-forwards>元素<br />　　<br />　　&lt;global-forwards>元素用来声明全局的转发关系，&lt;global-forwards>有零个或多个&lt;forward>元素组成。&lt;forward>元素用于把一个逻辑映射到特定的URL<br />　　<br />　　属性　　　　　　描　述<br />　　<br />　　className　　和&lt;forward>元素对应的配置类，默认为org.apache.struts.action.ActionForWard<br />　　<br />　　name　　　　 转发路径的逻辑名，此项时必须的<br />　　<br />　　path　　　　 指定或者重定向的URI。此项时必须的，必须以”/”开头<br />　　<br />　　redirect　　 此项是true，表示是执行重定向的****作，此项是false时，表示请求转发。<br />　　<br />　　&lt;global-forwards><br />　　&lt;forward name="forward1" path="/Action1.do"/><br />　　&lt;forward name="forward1" path="/Action2.do"/><br />　　&lt;/global-forwards><br />　　<br />　　如果jsp1.jsp把请求转发给Action1,可以使用以下代码：<br />　　<br />　　&lt;html:link forward=”forward1”><br />　　<br />　　或者&lt;logic:forward name=”forward1”><br />　　<br />　　如果Action1的execute（）方法把请求转发给JSP2.jsp，可以使用一下代码：<br />　　<br />　　return(mapping.findForward(“forward2”))<br />　　<br />　　5&lt;action-mapping>元素<br />　　<br />　　&lt;action-mapping>元素包含零个或者多个&lt;action>元素。&lt;action>元素描述了从特定的请求路径到相应的Action类的映射。<br />　　<br />　　6&lt;controller>元素<br />　　<br />　　&lt;controller>元素用于配置ActionServlet。<br />　　<br />　　7&lt; message-resources>元素<br />　　<br />　　&lt;message-resources>元素用于配置Resource Bundle，Resource Budle用于存放本地化消息文件。<br />　　<br />　　Struts标签<br />　　<br />　　HTML标签<br />　　<br />　　标签名　　　　　　　　描述<br />　　base　　　　　　　　 包装HTML的base元素<br />　　button　　　　　　　 包装HTML的 button类型的input元素<br />　　cancel　　　　　　　 包装HTML cancel 按钮<br />　　checkbox　　　　　　 包装HTML checkbox 类型的输入域<br />　　errors　　　　　　　 有条件地显示一些error消息，显示ActionErrors信息<br />　　file　　　　　　　　 包装HTML文件上传输入域<br />　　form　　　　　　　　 定义HTML form 元素<br />　　frame　　　　　　　　包装HTML frame 元素<br />　　hidden　　　　　　　 包装HTML hidden 输入域<br />　　html　　　　　　　　 包装 HTML中的 html 元素<br />　　image　　　　　　　　包装 "image"类型的输入域<br />　　img　　　　　　　　　包装HTML的 img 元素<br />　　javascript　　　　　 包装根据ValidatorPlugIn提供的校验规则所提供的javascript校验脚本<br />　　link　　　　　　　　 包装超链接<br />　　messages　　　　　　 有条件地显示一些提示信息，显示ActionMessages信息<br />　　multibox　　　　　　 包装多选输入框<br />　　option　　　　　　　 包装一个选择输入框<br />　　options　　　　　　　包装一批选择输入框<br />　　optionsCollection　　包装一批选择输入框集<br />　　password　　　　　　 包装密文输入框<br />　　radio　　　　　　　　包装单选输入框<br />　　reset　　　　　　　　包装“重置”功能的按钮<br />　　rewrite　　　　　　　包装一个URL<br />　　select　　　　　　　 包装一个选择输入框<br />　　submit　　　　　　　 包装一个提交按钮<br />　　text　　　　　　　　 包装一个文本输入框<br />　　textarea　　　　　　 包装一个备注输入框<br />　　<br />　　ActionForm<br />　　ActionForm 的要求<br />　　<br />　　创建一个ActionForm 并不困难，但是你的类必须符合一些要求：<br />　　<br />　　ActionForm 必须扩展自org.apache.struts.ActionForm。基类ActionForm 是不能实例化的。<br />　　<br />　　ActionForm 必须为每个应该从请求中收集的HTML控件定义一个公共属性。<br />　　<br />　　(Struts 1.0 要求每个属性都要mutator 和accessor 。Struts 1.1 则没有如此严格)<br />　　<br />　　ActionForm还可能要符合一些可选的要求:<br />　　<br />　　如果你要求ActionForm 在传递属性到Action之前校验它们，你就必须实现validate<br />　　<br />　　方法；<br />　　<br />　　如果想在组装前初始化属性，必须实现reset , 它在ActionForm 组装前被调用；<br />　　<br />　　动态ActionForm<br />　　<br />　　ActionForm 作为类型转换器<br />　　<br />　　ActionForm的一个强制点是应该使用String 和boolean属性。实际上，这意味着属性<br />　　<br />　　必须得从一种转换到另一种类型。大部分应用也需要一些属性，比如电话号码或者数量，以<br />　　<br />　　一种格式化的方式出现。核心Java 包提供一些工具来做这种事情，但是要清楚地将他们集<br />　　<br />　　成到应用中仍然是一个挑战。<br />　　<br />　　Struts 开发人员经常在ActionForm中包含helper方法，来进行类型转换。helper 方法<br />　　<br />　　可以有很多种实现方式，这我们在5.6种叙述。<br />　　<br />　　5.2.6 ActionForm 作为防火墙<br />　　<br />　　当请求提交时，ActionServlet 使用一个自动组装机制来从请求参数中设置请求的<br />　　<br />　　ActionForm属性。这让你可以通过控制哪个ActionForm 属性被暴露来控制哪个请求参数<br />　　<br />　　是可接受的。这也意味着如果你的ActionForm 的粗心设计你可能失去控制哪个参数可以接<br />　　<br />　　受的能力。ActionForm 一定不能包含看起来像是一个JavaBean 属性，但不能从HTTP 请<br />　　<br />　　求设置的属性方法。<br />　　<br />　　5.3.4 ActionForm 可以嵌套其它bean<br />　　<br />　　因为Struts 标签扩展和自动组装机制都支持点号语法来从ActionForm访问其它<br />　　<br />　　bean。这是一个方便的方式，可以通过ActionForm来组装存在的bean。在JSP 页面, 你可<br />　　<br />　　以象这样引用一个嵌套的bean：<br />　　<br />　　&lt;html:text<br />　　propety="values.telephoneText"<br />　　size="14"<br />　　maxlength="14"/><br />　　<br />　　5.7.2 分发（Dispatch ）<br />　　<br />　　Struts 开发人员通常使用同一个Action处理相关的****作。一个通常做法来选择****作是在HTML表单中使用隐藏属性。BaseForm 的dispatch 属性也可用作这个目的：<br />　　public void setDispatch(String dispatch);<br />　　public String getDispatch();<br />　　<br />　　Struts 配置提供连个级别嵌套的ActionForward:<br />　　<br />　　Global （全局） ActionForward对整个应用中的所有Action 对象均有效；<br />　　<br />　　Local （局部） ActionForward 则在ActionMapping 元素中定义。仅对那些在这个<br />　　<br />　　ActionMapping中调用的Action对象有效。<br />　　<br />　　从Action 对象内部来看，forward 通常像这样来选择：<br />　　ActionForward forward = mapping.findForward("continue");
          <br/>
          <span style="color:red;">
            <a href="http://qq250203031.javaeye.com/blog/189754#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 May 2008 15:36:02 +0800</pubDate>
        <link>http://qq250203031.javaeye.com/blog/189754</link>
        <guid>http://qq250203031.javaeye.com/blog/189754</guid>
      </item>
      <item>
        <title>引用：Java学习之hibernate配置要点详谈 </title>
        <author>qq250203031</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qq250203031.javaeye.com">qq250203031</a>&nbsp;
          链接：<a href="http://qq250203031.javaeye.com/blog/189753" style="color:red;">http://qq250203031.javaeye.com/blog/189753</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          　　1.两种配置文件：<br />　　A.hibernate.cfg.xml和B.hibernate.properties<br />　　<br />　　A中可含映射文件的配置，而B中hard codes加映射文件。<br />　　<br />　　A.Configuration config=new Configuration().config();<br />　　B. Configuration config=new Configuration();<br />　　config.addClass(TUser.class);<br />　　<br />　　2.你不必一定用hibernate.cfg.xml或hibernate.properties这两文件名，你也不一定非得把配置文件放在Classes下，　　File file=new File("c:\\sample\\myhibernate.xml");　　Configuration config=new Configuration().config(file);<br />　　<br />　　3. session.Flush() 强制数据库立即同步，当用事务时，不必用flush,事务提交自动调用flush在session关闭时也会调用flush<br />　　<br />　　4. Hibernate总是使用对象类型作为字段类型<br />　　<br />　　5. XDoclet专门建立了hibernate doclet,就是在java代码上加上一些java docTag，后来再让XDoclet分析该java代码，生成映射文件;<br />　　<br />　　6.HQL子句本身大小写无关，但是其中出现的类名和属性名必须注意大小写区分。<br />　　<br />　　7.关系：　 Constrained : 约束，表明主控表的主键上是否存在一个外键（foreigh key）对其进行约束。<br />　　<br />　　property-ref:关联类中用于与主控类相关联的属性名，默认为关联类的主键属性名<br />　　<br />　　单向一对多需在一方配置，双向一对多需在双方进行配置<br />　　<br />　　8.lazy=false:被动方的记录由hibernate负责记取，之后存放在主控方指定的Collection类型属性中<br />　　<br />　　9. java.util.Set或net.sof.hibernate.collecton.Bag类型的Collection<br />　　<br />　　10.重要：inverse:用于标识双向关联中的被动方一端。<br />　　<br />　　inverse=false的一方（主控方）负责维护关联关系.默认值：false<br />　　<br />　　11.batch-size:采用延迟加载特征时，一次读入的数据数昨。<br />　　<br />　　12.一对多通过主控方更新（主控方为一方时）<br />　　<br />　　user.getAddresses().add(addr);<br />　　<br />　　session.save(user);//通过主控对象级联更新<br />　　<br />　　13.在one-to-many 关系中，将many 一方设为主动方（inverse=false）将有助性能的改善。在一方设置关系时，inverse=true,即将主控权交给多方，　　这样多方可主动从一方获得foreign key,然后一次insert即可完工。<br />　　<br />　　addr.setUser(user);//设置关联的TUser对象<br />　　<br />　　user.getAddresses().add(addr);<br />　　<br />　　session.save(user);//级联更新<br />　　<br />　　14.只有设为主控方的一方才关心（访问）对方的属性，被动方是不关心对方的属性的。<br />　　<br />　　15.one-to-many与many-to-one节点的配置属性不同：<br />　　<br />　　一对多关系多了lazy和inverse两个属性多对多节点属性：<br />　　<br />　　column:中间映射表中，关联目标表的关联字段<br />　　<br />　　class:类名，关联目标类<br />　　<br />　　outer-join:是否使用外联接<br />　　<br />　　注意:access是设置属性值的读取方式。<br />　　<br />　　column是设置关联字段。<br />　　<br />　　16.多对多，注意两方都要设置inverse和lazy,cascade只能设为insert-update<br />　　<br />　　多对多关系中，由于关联关系是两张表相互引用，因此在保存关系状态时必须对双方同时保存。<br />　　<br />　　group1.getRoles().add(role1);　　role1.getGroups().add(group1);<br />　　<br />　　session.save(role1);　　session.save(group1);<br />　　<br />　　17.关于vo和po　　vo经过hibernate容量处理，就变成了po(该vo的引用将被容器保存，并且在session关闭时flush,因此po如果再传到其它地方改变了，就危险了)　　　 vo和po相互转换：BeanUtils.copyProperties(anotherUser,user);<br />　　<br />　　18.对于save操作而言，如果对象已经与Session相关联（即已经被加入Session的实体容器中），则无需进行具体的操作。因为之后的Session.flush过程中，Hibernate 会对此实体容器中的对象进行遍历，查找出发生变化的实体，生成并执行相应的update 语句。<br />　　<br />　　19.如果我们采用了延迟加载机制，但希望在一些情况下，实现非延迟加 载时的功能，也就是说，我们希望在Session关闭后，依然允许操作user的addresses 属性 Hibernate.initialize方法可以通过强制加载关联对象实现这一功能： 这也正是我们为什么在编写POJO时，必须用JDK Collection接口（如Set,Map）, 而非特定的JDK Collection实现类（如HashSet、HashMap）申明Collection属性的 原因。<br />　　<br />　　20.事务：从sessionFactory获得session,其自动提交属性就已经关闭(AutoCommit=false),此时若执行了jdbc操作，如果不显式调用session.BeginTransaction(),是不会执行事务操作的。<br />　　<br />　　jdbc transaction:基于同一个session(就是同一个connection)的事务;<br />　　<br />　　jta　transaction:跨session（跨connection）事务.<br />　　<br />　　对于jta事务，有三种实现方法：<br />　　<br />　　A。UserTransaction tx=new InitialContext().lookup("...");<br />　　tx.commit();<br />　　<br />　　B. 使用hibernate封装的方法：(不推荐)<br />　　<br />　　Transaction tx=session.beginTransaction();<br />　　tx.commit();<br />　　C. 使用ejb之sessionBean的事务技持方法，你只要在把需要在发布描述符中，把需要jta事务的方法声明为require即可<br />　　<br />　　21.悲观锁，乐观锁：　　乐观锁一般通过version来实现，注意version节点必须出现在id后。<br />　　<br />　　22.Hibernate中，可以通过Criteria.setFirstResult和Criteria.setFetchSize方法设定分页范围。<br />　　<br />　　Query接口中也提供了与其一致的方法，hibernate主要在dialect类中实现在这个功能。<br />　　<br />　　23.cache<br />　　<br />　　 ……<br />　　<br />　　net.sf.ehcache.hibernate.Provider　 <br />　　<br />　　还需对ecache本身进配置<br />　　 <br />　　　 <br />　　<br />　　之后在映射文件中指定各个映射实体的cache策略<br />　　<br />　　<br />　　....<br />　　<br />　　<br />　　....<br />　　 <br />　　<br />　　***************************************************** Query.list()跟Query.iterate()的不同： 对于query.list()总是通过一条sql语句获取所有记录,然后将其读出，填入pojo返回; 但是query.iterate()，则是首先通过一条Select SQL 获取所有符合查询条件的记录的 id，再对这个id 集合进行循环操作，通过单独的Select SQL 取出每个id 所对应的记 录，之后填入POJO中返回。<br />　　<br />　　也就是说，对于list 操作，需要一条SQL 完成。而对于iterate 操作，需要n+1 条SQL。，list方法将不会从Cache中读取数据。iterator却会。<br />　　<br />　　24.ThreadLocal:它会为每个线程维护一个私有的变量空间。实际上， 其实现原理是在JVM 中维护一个Map，这个Map的key 就是当前的线程对象，而value则是 线程通过ThreadLocal.set方法保存的对象实例。当线程调用ThreadLocal.get方法时， ThreadLocal会根据当前线程对象的引用，取出Map中对应的对象返回。<br />　　<br />　　这样，ThreadLocal通过以各个线程对象的引用作为区分，从而将不同线程的变量隔离开来。<br />　　<br />　　25.Hibernate官方开发手册标准示例:<br />　　<br />　　public class HibernateUtil { private static SessionFactory sessionFactory;<br />　　static { try { // Create the SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();<br />　　} catch (HibernateException ex) { throw new RuntimeException( "Configuration problem: " + ex.getMessage(), ex );<br />　　} } public static final ThreadLocal session = new ThreadLocal();<br />　　public static Session currentSession() throws HibernateException { Session s = (Session) session.get();<br />　　// Open a new Session, if this Thread has none yet if (s == null) { s = sessionFactory.openSession();<br />　　session.set(s);<br />　　} return s;<br />　　} public static void closeSession() throws HibernateException { Session s = (Session) session.get();<br />　　session.set(null);<br />　　if (s != null) s.close();<br />　　} }<br />　　<br />　　26.通过filter实现session的重用：<br />　　<br />　　public class PersistenceFilter implements Filter { protected static ThreadLocal hibernateHolder = new ThreadLocal();<br />　　public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { hibernateHolder.set(getSession());<br />　　try { …… chain.doFilter(request, response);<br />　　…… } finally { Session sess = (Session)hibernateHolder.get();<br />　　if (sess != null) { hibernateHolder.set(null);<br />　　try { sess.close(); } catch (HibernateException ex) { throw new ServletException(ex);<br />　　} } } } ……}
          <br/>
          <span style="color:red;">
            <a href="http://qq250203031.javaeye.com/blog/189753#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 May 2008 15:35:04 +0800</pubDate>
        <link>http://qq250203031.javaeye.com/blog/189753</link>
        <guid>http://qq250203031.javaeye.com/blog/189753</guid>
      </item>
      <item>
        <title>工作流程与业务表单绑定的困惑</title>
        <author>qq250203031</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qq250203031.javaeye.com">qq250203031</a>&nbsp;
          链接：<a href="http://qq250203031.javaeye.com/blog/189713" style="color:red;">http://qq250203031.javaeye.com/blog/189713</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          关于工作流，有个问题：<br /><br />一个项目，比如OA，　　它的公文表单与流程实例绑定，可以从start节点流转到end节点。可是：<br /><br />但一个ERP中的流，例如一个流程是这样的：<br /><br />start<br />节点A  生成表单i1  审批　审批后流转到<br />节点B  生成表单i2  审批  审批后流转到<br />节点C  生成表单i3  审批  审批后流转到<br />节点D  生成表单i4  审批  审批后流转到<br />end<br /><br />这样的流程，将表单和流程实例如何绑定，这样的话有什么好外吗？<br /><br />现在开发项目要考虑用不用工作流引擎，我想要是用的话，这样的流程，会不会推动使用工作流引擎的意义了？<br /><br />有没有什么好的办法？<br /><br />请大家帮帮忙，十分困惑！
          <br/>
          <span style="color:red;">
            <a href="http://qq250203031.javaeye.com/blog/189713#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 May 2008 14:43:47 +0800</pubDate>
        <link>http://qq250203031.javaeye.com/blog/189713</link>
        <guid>http://qq250203031.javaeye.com/blog/189713</guid>
      </item>
  </channel>
</rss>