疑问:不知道在Struts标签中怎么引用jsp片断里的变量

如下面这段代码:

      <td width = "30%" align="center">

        <%/* pseudo code:

           * get the lastUpdated sub-article of anGoal,called sub-article as:subArt;

           * if (subArt is a goal)

           *   display:Goal:subArt.getArticleName();

           * else if (subArt is a diary)

           *   display:Diary:subArt.getArticleName();

           * else {

           *   if (getTypeIDByID(getParentIDByID(subArt.getArticleID()))==1) 

           *     display:advice for goal:subArt.getArticleName();

           *   else

           *     display:advice for diary:subArt.getArticleName();

           * }       

           */  

           int goalID = anGoal.getArticleID();

   TransContext trans = new TransContext();

           ArticleDB myDB = new ArticleDB(trans);

           ArticleInfo lastUpdatedArt=myDB.getLastArtByID(goalID, Consts.HTML_FLAG);

           int lastArtID=lastUpdatedArt.getArticleID();

           String lastArtName=lastUpdatedArt.getArticleName();

           String lastAuthorName=lastUpdatedArt.getUserName();

           int lastArtTypeID=lastUpdatedArt.getTypeID();

           int lastParentID=lastUpdatedArt.getParentID();

           if (lastArtTypeID==1){

         %>目标:

          <html-el:link action="disGoalContentAction.do?goalID=${anGoal.articleID}&naviStr=${requestScope['naviStr']}" target="_blank">

           <%= lastArtName %>

          </html-el:link><br>

          <%= lastAuthorName %><br>

         <%

           }else if(lastArtTypeID==2){

         %>日记:

          <a href="disDiaryContentAction.do?searchDiaryID=<%= lastArtID %>&goalID=<%= lastArtID %>&naviStr=<%= request.getAttribute("naviStr") %>" target="_blank">

           <%= lastArtName %>

          </a><br>

          <%= lastAuthorName %><br>

         <%

           }else {

               if (myDB.getArtTypeByID(myDB.getParentIDByID(lastArtID))==1){

         %>评论目标:

          <html-el:link action="disGoalContentAction.do?goalID=${anGoal.articleID}&naviStr=${requestScope['naviStr']}" target="_blank">

           <%= lastArtName %>

          </html-el:link><br>

          <%= lastAuthorName %><br>

         <%

           }  else {

         %>评论日记:

          <a href="disDiaryContentAction.do?searchDiaryID=<%= lastParentID %>&goalID=<%= lastParentID %>&naviStr=<%= request.getAttribute("naviStr") %>" target="_blank">

           <%= lastArtName %>

          </a><br>

          <%= lastAuthorName %><br>

         <%

             }

           } 

         %>

        <bean:write name="anGoal" property="lastUpdate" scope="page" filter="false"/>

      </td>

  怎样用Struts的标签完成呢?搞不懂,尤其是: <a href="disDiaryContentAction.do?searchDiaryID=<%= lastArtID %>&goalID=<%= lastArtID %>&naviStr=<%= request.getAttribute("naviStr") %>" target="_blank">

           <%= lastArtName %>

          </a><br>

怎么用<html:link/>来完成这个功能呢?

先记在这里,希望知道的朋友提示一下。

莫名其妙的文件删除

  今天晚上,用eclipse2.1更新白天在单位上做的文件时,突然发现少了很有几个文件,一看是分散的几个目录就有文件被自己删除了。时间大概是上午。

  我上午明明只是更新了几个文件没有删除任何文件,这是怎么一回事呢?搞不懂了。还不会用cvs的文件恢复,只得手工在learndiary.tigris.org上把在attic里的文件下载下来,拷入本地目录中。

疑问:不知道中value的用法

结果用了下列方法完成功能,真被动。还是要好好的把书看一遍了。

       <c:if test="${param.typeID == 3}">

         <html-el:text value="re:${requestScope['parentName']}" property="articleName" maxlength="60" size="60"/>

       </c:if>

       <c:if test="${param.typeID == 4}">

         <input type="text" name="articleName" maxlength="60" size="60" value="<bean:message key="learndiary.message.defaultName"/>">

       </c:if>

或:

<%@ page pageEncoding="gb2312" %>

...

       <c:if test="${param.typeID == 3}">

         <html-el:text value="re:${requestScope['parentName']}" property="articleName" maxlength="60" size="60"/>

       </c:if>

       <c:if test="${param.typeID == 4}">

         <html:text value="留言" property="articleName" maxlength="60" size="60"/>

       </c:if>

来代替。如果把上面"html:text"换成"html-el:text"在tomcat5.0下正常,但在虚拟空间的resin下面就会报错,不知为什么。

         <c:if test="${param.typeID == 4}">

         <html-el:text value="留言" property="articleName" maxlength="60" size="60"/>

       </c:if>

在eclipse中改变文件的binary/ascii属性

  我用的是eclipse2.1,我想所有版本应该差不多吧。

  右键单击文件夹或文件,选择Team->Change file Binary/ASCII property就可以改变文件或文件夹中全部文件的属性。

  添加或修改eclipse默认的Binary/ASCII属性,选择菜单中的:Window->Preferences->Team->File Content就行了。

  eclipse2.1中默认是没有*.jsp和*.tld这两种文本文件的,所以当初把学习日记导入cvs库时,这两种文件变成了binary属性估计跟这个有关。

java.lang.StackOverflowError错误

  今天,在运行wiring your web application with open source java时,当提交一份订单后,老是出现java.lang.StackOverflowError错误,经过调试,发现问题出在SaveOrderAction.java中,

里面有一段代码如下:

order.setOrderLineItems(lineItems);

__log.debug("the order before save is: "+ order.getUserName()+"this order is:"+order);

// delegate the save to the service layer and further upstream

Order returnedOrder = getOrderService().saveNewOrder(order);

__log.debug("the user's name who placed returnedOrder is: "+ returnedOrder.getUserName()+"this order is:"+returnedOrder);

oForm.setOrder(order);

request.setAttribute("form",oForm);

//ActionErrors errors = new ActionErrors();

//errors.add(Globals.ERROR_KEY, new ActionError("message.order.saved.successfully"));

//saveErrors(request, errors);

__log.debug("the order after set into form is: "+ order.getUserName()+"this order is:"+order);

return mapping.findForward("success");

  如果不注释掉上面3行,就会出现这个错误,真不知道是什么原因。报错信息如下:

“type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet execution threw an exception

root cause

java.lang.StackOverflowError

note The full stack trace of the root cause is available in the Apache Tomcat/5.0.25 logs.

  另外,如果把log4j配置成显示debug信息,控制台就会一直报告如下信息,不知是怎么一回事:

2006-01-06 22:40:21,564 DEBUG logicalcobwebs.proxool.spring:181  -> 000003 (00/01/00) - Connection #41 created to achieve minimum of 2 = AVAILABLE

2006-01-06 22:40:21,594 DEBUG logicalcobwebs.proxool.spring:181  -> 000003 (00/02/00) - Connection #42 created to achieve minimum of 2 = AVAILABLE

2006-01-06 22:40:51,618 DEBUG logicalcobwebs.proxool.spring:431  -> 000003 (00/01/00) - #0041 removed because it has problems: java.sql.SQLException: Syntax error or access violation,  message from server: "You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'values(current TimeStamp)' at line 1".

2006-01-06 22:40:51,628 DEBUG logicalcobwebs.proxool.spring:431  -> 000003 (00/00/00) - #0042 removed because it has problems: java.sql.SQLException: Syntax error or access violation,  message from server: "You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'values(current TimeStamp)' at line 1".

2006-01-06 22:40:51,638 DEBUG logicalcobwebs.proxool.spring:181  -> 000003 (00/01/00) - Connection #43 created to achieve minimum of 2 = AVAILABLE

2006-01-06 22:40:51,658 DEBUG logicalcobwebs.proxool.spring:181  -> 000003 (00/02/00) - Connection #44 created to achieve minimum of 2 = AVAILABLE

2006-01-06 22:41:00,661 INFO  proxool.stats.spring:66  -> 22:40:00 - 22:41:00, s:0:0.00/s, r:0:0.00/s, a:0.00ms/0.00

2006-01-06 22:41:21,671 DEBUG logicalcobwebs.proxool.spring:431  -> 000003 (00/01/00) - #0043 removed because it has problems: java.sql.SQLException: Syntax error or access violation,  message from server: "You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'values(current TimeStamp)' at line 1".

2006-01-06 22:41:21,681 DEBUG logicalcobwebs.proxool.spring:431  -> 000003 (00/00/00) - #0044 removed because it has problems: java.sql.SQLException: Syntax error or access violation,  message from server: "You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'values(current TimeStamp)' at line 1".

2006-01-06 22:41:21,711 DEBUG logicalcobwebs.proxool.spring:181  -> 000003 (00/01/00) - Connection #45 created to achieve minimum of 2 = AVAILABLE

2006-01-06 22:41:21,731 DEBUG logicalcobwebs.proxool.spring:181  -> 000003 (00/02/00) - Connection #46 created to achieve minimum of 2 = AVAILABLE

(java.sql.SQLException产生的原因是proxool.xml的配置问题:http://www.learndiary.com/disDiaryContentAction.do?goalID=1468)

我用的是tomcat5.0+mysql4.0.14

运行wiring your web application with...的问题

我用:struts1.1+spring1.2.6+hibernate2.1.8运行wiring your web application with open source java中碰到了如下问题:

  1)、必须遵照作者在源码readme.txt的安装使用说明,尤其是组件版本号,否则就会出问题。

     如:文中要求用 Hibernate 2.1.2,如果用hibernate2.1.8则会出现错误:HibernateException:Unable to locate config file:e:\\pro.xml。(见:HibernateException:Unable to locate config file:e:\\pro.xml (0篇) http://www.learndiary.com/disDiaryContentAction.do?searchDiaryID=1466&goalID=1466&naviStr=a10a2961)因为hibernate2.1.2支持绝对地址文件定位,而2.1.8是把这个文件放在classpath中寻找的,所以把源码中的:“applicationContext-hibernate.xml -

   - <prop key="hibernate.proxool.xml">C:/MyWSADProjects/OnJavaCom/WebContent/WEB-INF/proxool.xml</prop>”

  改为:“applicationContext-hibernate.xml -

   - <prop key="hibernate.proxool.xml">proxool.xml</prop>”

  再把“proxool.xml”放入WEB-INF/classes下面就行了;

  在build.xml文件中要求用:ant1.5.3,我用eclipse2.1下的ant1.5.2出错。

  还有就是源码中没有要求的用:xdolet如果是1.1的版本也不行,用最新的1.2.3解决问题;

  

  2)、把log4j.jar和common-logging.jar(这个文件是否必须这样没有验证)加入系统的classpath,否则会在编译build.xml时说找不到log4j的类。这好像也可以在build.xml文件中指定。

  3)、需要把build.xml中的下列内容改成你机器上的:

“ <property name="xdoclet.lib.home" value="c:/java_api/xdoclet-1.2/lib"/>

<property name="properties.dir"   value="." />

<property name="hibernate.lib.home" value="C:/java_api/hibernate-2.1/lib"/>

<property name="war.webinf.home" value="C:/MyWSADProjects/OnJavaCom/WebContent/WEB-INF"/>

<property name="mysql.lib.home" value="C:/java_api/mysql-connector-java-2.0.14"/>

<property name="db2.lib.home" value="C:/java_api/db2java"/>



   另外,如果你不用db2数据库,就把build.xml中关于db2的东西去掉。否则会出错。

  4)、数据库(mysql)需要先在数据库中把库建起再用build.xml脚本创建表。

  5)、怀疑是作者的笔误,在web.xml文件中的“<param-value>WEB-INF/struts-config.xml</param-value>”应该是“<param-value>WEB-INF/struts-config.xml</param-value>”,否则在我的tomcat5.0下就会报错,但是不知在其它容器中如何?

  6)、还有就是要把每个开源项目的包完整的拷到你的应用程序的lib中,比如:spring就要把它所有的在lib下的第三方支持包全部拷入你的应用程序的lib中。做这些事不要怕有冗余的文件,java的运行机制是要用的时候再去创建类的实例。多些文件只是占点硬盘空间而已。

  我觉得有必要好好的找一找这些错误出现的真正原因。

HibernateException:Unable to locate config file:e:\\pro.xml

在运行:wiring your web application with open source java时,如果不按照说明中的用hibernate2.1.2,比如:用2.1.8,就会出现文中的问题。

转帖:转自:http://spring.jactiongroup.net/viewtopic.php?t=940&highlight=.HibernateException%3A+Unable+to+locate+config+file

--------------------------------------------------------------------------------

 

软件环境:

struts+hibernate+spring

配置文件:

/WEB-INF/web.xml

引用:

..................

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

/WEB-INF/applicationContext-hibernate.xml

</param-value>

</context-param>

<servlet>

<servlet-name>SpringContextServlet</servlet-name>

<servlet-class>

org.springframework.web.context.ContextLoaderServlet

</servlet-class>

<load-on-startup>2</load-on-startup>

</servlet>

.............

 

/WEB-INF/applicationContext-hibernate.xml

引用:

<beans>

<!-- ========================= Start of PERSISTENCE DEFINITIONS ========================= -->

<!-- Choose the dialect that matches your "dataSource" definition -->

<bean id="mySessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">

<property name="mappingResources">

<list>

<value>com/hibernate/po/TbQueue.hbm.xml</value>

<value>com/hibernate/po/TMsgHistory.hbm.xml</value>

<value>com/hibernate/po/TbHistory.hbm.xml</value>

</list>

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">net.sf.hibernate.dialect.SQLServerDialect</prop>

<prop key="hibernate.show_sql">true</prop>

<prop key="connection.useUnicode">true</prop>

<prop key="connection.characterEncoding">GBK</prop>

<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>

<prop key="hibernate.proxool.xml">e:\\pro.xml</prop>

<prop key="hibernate.proxool.pool_alias">spring</prop>

</props>

</property>

</bean>

<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->

<bean id="myTransactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">

<property name="sessionFactory"><ref local="mySessionFactory"/></property>

</bean>

<!-- Add more services here -->

<!-- CommonService-->

<bean id="commonService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

<property name="transactionManager"><ref local="myTransactionManager"/></property>

<property name="target"><ref local="commonServiceTarget"/></property>

<property name="transactionAttributes">

<props>

<prop key="find*">PROPAGATION_REQUIRED,readOnly,-DataAccessException</prop>

<prop key="save*">PROPAGATION_REQUIRED,-DataAccessException</prop>

<prop key="del*">PROPAGATION_REQUIRED,-DataAccessException</prop>

<prop key="update*">PROPAGATION_REQUIRED,-DataAccessException</prop>

<prop key="list*">PROPAGATION_REQUIRED,-DataAccessException</prop>

</props>

</property>

</bean>

<bean id="commonServiceTarget" class="org.common.spring.CommonServiceImpl">

<property name="hibernateDAO"><ref local="hibernateDAO"/></property>

</bean>

<!-- DAO定义区 -->

<bean id="hibernateDAO" class="org.common.hibernate.HibernateDAOImpl">

<property name="sessionFactory"><ref local="mySessionFactory"/></property>

</bean>

</beans>

 

e:\pro.xml

引用:

<proxool>

<alias>spring</alias>

<driver-url>jdbc:jtds:sqlserver://127.0.0.1/test;TDS=8.0</driver-url>

<driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>

<driver-properties>

<property name="user" value="sa" />

<property name="password" value="" />

</driver-properties>

<minimum-connection-count>2</minimum-connection-count>

<maximum-connection-count>20</maximum-connection-count>

<maximum-connection-lifetime>18000000</maximum-connection-lifetime> <!-- 5 hours -->

<house-keeping-test-sql>values(current TimeStamp)</house-keeping-test-sql>

<statistics>1m,15m,1d</statistics>

<statistics-log-level>INFO</statistics-log-level>

<fatal-sql-exception>Connection is closed,SQLSTATE=08003,Error opening socket. SQLSTATE=08S01,SQLSTATE=08S01</fatal-sql-exception>

<fatal-sql-exception-wrapper-class>org.logicalcobwebs.proxool.FatalRuntimeException</fatal-sql-exception-wrapper-class>

<verbose>false</verbose>

</proxool>

 

BaseAction.java

引用:

public abstract class BaseAction extends org.apache.struts.action.Action {

private CommonService commonService;

public void setServlet(ActionServlet actionServlet) {

super.setServlet(actionServlet);

ServletContext servletContext = actionServlet.getServletContext();

WebApplicationContext wac = WebApplicationContextUtils

.getRequiredWebApplicationContext(servletContext);

this.commonService=(CommonService)wac.getBean("commonService");

}

public CommonService getCommonService() {

return commonService;

}

}

 

在服务器启动时报错,信息如下:

引用:

信息: Installing web application at context path /phoneMsg from URL file:F:\tomcat\webapps\phoneMsg

2004-10-26 18:29:19,750 FATAL net.sf.hibernate.util.ConfigHelper - Unable to locate config file: e:\\pro.xml

2004-10-26 18:29:19,781 ERROR org.springframework.web.context.ContextLoader - Context initialization failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory' defined in resource [/WEB-INF/applicationContext-hibernate.xml] of ServletContext: Initialization of bean failed; nested exception is net.sf.hibernate.HibernateException: Unable to locate config file: e:\\pro.xml

net.sf.hibernate.HibernateException: Unable to locate config file: e:\\pro.xml

at net.sf.hibernate.util.ConfigHelper.getConfigStream(ConfigHelper.java:83)

at net.sf.hibernate.util.ConfigHelper.getConfigStreamReader(ConfigHelper.java:104)

at net.sf.hibernate.connection.ProxoolConnectionProvider.configure(ProxoolConnectionProvider.java:122)

at net.sf.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:83)

at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:65)

at net.sf.hibernate.cfg.Configuration.buildSettings(Configuration.java:1155)

 

pro.xml的确在E盘啊???

 

返回页首      

 

 

chinalyc

spring 爱好者

注册时间: 2004-02-16

帖子: 6

来自: 北京

 发表于: Fri Nov 05, 2004 9:45 am    发表主题:   

--------------------------------------------------------------------------------

 

在net.sf.hibernate.util.ConfigHelper类中它是这样取先取一个文件的url。

代码:

final URL url = ConfigHelper.locateConfig(path);

public static final URL locateConfig(final String path) {

      try {

         return new URL(path);

      }

      catch(MalformedURLException e) {

                                               

         return findAsResource(path);

      }

   }

   public static final URL findAsResource(final String path) {

      URL url = null;

      // First, try to locate this resource through the current

      // context classloader.

      url = Thread.currentThread().getContextClassLoader().getResource(path);

      if (url != null)

         return url;

      // Next, try to locate this resource through this class's classloader

      url = ConfigHelper.class.getClassLoader().getResource(path);

      if (url != null)

         return url;

      // Next, try to locate this resource through the system classloader

      url = ClassLoader.getSystemClassLoader().getResource(path);

      // Anywhere else we should look?

      return url;

   }

你还是把这个文件放在classes目录吧

 

 

结合重译wiring web application with open source java学习Spring...

  学习其中的内容。

  totodo在2004年9月就已经翻译了这篇文章,总体还可以。我准备重译的同时学习文中的用Struts+Spring+Hibernate构建web应用。今天下载了文中的源码。

  我觉得当前在完善学习日记用户界面和重译这篇文章这两件事之间,重译和学习这篇文章应该优先。

(转帖)POJO 与 PO的 概念

转自:http://www.kissjava.com/zhuanti/hibernate/2005-06-03/13341117764046.html

[文章信息]

 

作者: robbin

时间: 2005-06-03 13:29:44

出处: KissJava.com

责任编辑: Icy

点击: 

 

[文章导读]

 

POJO 与 PO的 概念

 

 

 

  

专题推荐

 · 手机游戏开发专辑

· Struts专题学习

· Hibernate大杂烩

· WebWork全接触

· Spring - 春的诱惑

· Eclipse使用大全

· JBuilder 开发者指南

· Ant - 让编程更轻松

 

 

 

热门文章

 ·  图解利用Eclipse3+Lomboz3+Tomcat开发JSP(4673)

·  图解利用Eclipse3+Lomboz3+Tomcat开发JSP(4673)

·  史上最简单的struts+spring+hibernate配置实例(4657)

·  Eclipse 平台Java开发入门(4568)

·  Eclipse 平台Java开发入门(4568)

·  Spring 入门(一个简单的例子)(3349)

·  J2SDK和TOMCAT的安装及配置(2680)

·  struts傻瓜式学习(一天篇)(2572)

·  Spring framework 10分钟入门(2188)

·  图解利用Eclipse3+Lomboz3+Tomcat开发JSP(1704)

 

 

 

 

 

[正文]

 

 

 

 

   POJO = pure old java object or plain ordinary java object or what ever.

PO = persisent object 持久对象

就是说在一些Object/Relation Mapping工具中,能够做到维护数据库表记录的persisent object完全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法。全都是这样子的:

public class User {

  private long id;

  private String name;

  public void setId(long id) {

 this.id = id;



public void setName(String name) {

this.name=name;

}

 public long getId() {

 return id;



public String getName() {

return name;

}

--------------------------------------------------------------------------------

首先要区别持久对象和POJO。

持久对象实际上必须对应数据库中的entity,所以和POJO有所区别。比如说POJO是由new创建,由GC回收。但是持久对象是insert数据库创建,由数据库delete删除的。基本上持久对象生命周期和数据库密切相关。另外持久对象往往只能存在一个数据库Connection之中,Connnection关闭以后,持久对象就不存在了,而POJO只要不被GC回收,总是存在的。

由于存在诸多差别,因此持久对象PO(Persistent Object)在代码上肯定和POJO不同,起码PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。而ORM追求的目标就是要PO在使用上尽量和POJO一致,对于程序员来说,他们可以把PO当做POJO来用,而感觉不到PO的存在。

JDO的实现方法是这样的:

1、编写POJO

2、编译POJO

3、使用JDO的一个专门工具,叫做Enhancer,一般是一个命令行程序,手工运行,或者在ant脚本里面运行,对POJO的class文件处理一下,把POJO替换成同名的PO。

4、在运行期运行的实际上是PO,而不是POJO。

该方法有点类似于JSP,JSP也是在编译期被转换成Servlet来运行的,在运行期实际上运行的是Servlet,而不是JSP。

Hibernate的实现方法比较先进:

1、编写POJO

2、编译POJO

3、直接运行,在运行期,由Hibernate的CGLIB动态把POJO转换为PO。

由此可以看出Hibernate是在运行期把POJO的字节码转换为PO的,而JDO是在编译期转换的。一般认为JDO的方式效率会稍高,毕竟是编译期转换嘛。但是Hibernate的作者Gavin King说CGLIB的效率非常之高,运行期的PO的字节码生成速度非常之快,效率损失几乎可以忽略不计。

实际上运行期生成PO的好处非常大,这样对于程序员来说,是无法接触到PO的,PO对他们来说完全透明。可以更加自由的以POJO的概念操纵PO。另外由于是运行期生成PO,所以可以支持增量编译,增量调试。而JDO则无法做到这一点。实际上已经有很多人在抱怨JDO的编译期Enhancer问题了,而据说JBossDO将采用运行期生成PO字节码,而不采用编译期生成PO字节码。

另外一个相关的问题是,不同的JDO产品的Enhancer生成的PO字节码可能会有所不同,可能会影响在JDO产品之间的可移植性,这一点有点类似EJB的可移植性难题。

--------------------------------------------------------------------------------

由这个问题另外引出一个JDO的缺陷。

由于JDO的PO状态管理方式,所以当你在程序里面get/set的时候,实际上不是从PO的实例中取values,而是从JDO ?中取出来,所以一旦PM关闭,PO就不能进行存取了。

在JDO中,也可以通过一些办法使得PO可以在PM外面使用,比如说定义PO是transient的,但是该PO在PM关闭后就没有PO identity了。无法进行跨PM的状态管理。

而Hibernate是从PO实例中取values的,所以即使Session关闭,也一样可以get/set,可以进行跨Session的状态管理。

在分多层的应用中,由于持久层和业务层和web层都是分开的,此时Hibernate的PO完全可以当做一个POJO来用,也就是当做一个VO,在各层间自由传递,而不用去管Session是开还是关。如果你把这个POJO序列化的话,甚至可以用在分布式环境中。(不适合lazy loading的情况)

但是JDO的PO在PM关闭后就不能再用了,所以必须在PM关闭前把PO拷贝一份VO,把VO传递给业务层和web层使用。在非分布式环境中,也可以使用ThreadLocal模式确保PM始终是打开状态,来避免每次必须进行PO到VO的拷贝操作。但是不管怎么说,这总是权宜之计,不如Hibernate的功能强。

一个低级错误:把文本文件设置为-kb

  当初,不会用cvs,不知怎么搞的把*.jsp,*.tld这样的文本文件设置成了-kb(二进制文件的设置),结果,文件头部的“关键字”说明不起作用(从中可以看出,关键字说明只对文本文件有用)。例如:// $Id: readyCreateGoal.jsp,v 1.4 2005/12/30 13:12:44 dashing_meng Exp $ 不会自动更新了。我也是在发现它不能自动更新后才发觉这个低级错误的。

  怎样批量的更改它,我也不知道。只有用wincvs逐个文件夹的更改。还有,改过来后发现所有文字间都多了一个空行。也不知道是怎么一回事。

  这个问题记在这里。