空间站

北极心空

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

1). Eclipse不能热编译:当不通过Eclipse显示的部署(deploy),而通过在Tomcat 5.0\conf\Catalina\localhost下面编写部署文件时,如 wmls.xml :  reloadable="false">
如果替换了web应用程序的某个java文件,而此时Eclipse不会对此文件编译,所以在启动tomcat的时候会提示 ClassNotFoundException。

解决方法:1. 显示的更改对应的java文件,保存后Eclipse就会编译。
2.项目-重建工程

2).使用Spring.jar工具包编写一个简单的Spring相关Demo
1.编写两个(JavaBean)类UpperAction和LowerAction,它们都实现了一个接口Action。
2.编写bean.xml文件,它负责选择JavaBean和配置javabean的属性。
3.编写测试类Test.java,它根据bean.xml创建一个ApplicationContext实现,从ApplicationContext中获得Action接口的实现。执行Action接口中定义的方法。
 Test.java中业务逻辑方法(Action接口中定义的方法)是在运行期间才确定的,是在bean.xml中进行配置的,不需要在Test.java的代码中显示的确定。这样变降低了组件Test和Action实现类的耦合。

 存在的疑问:
由于session是线程,所以每个Action的session不能相同。
但是为什么session不能关闭呢? 

3)Jsp中parameter和attribute区别

Attributes are objects associated with a request. Attributes may be set by the
container to express information that otherwise could not be expressed via the API,or may be set by a servlet to communicate information to another servlet (via the RequestDispatcher).

Request parameters for the servlet are the strings sent by the client to a servlet container as part of its request. the container populates the parameters from the URI query string and POST-ed data.The parameters are stored as a set of name-value pairs. Multiple parametervalues can exist for any given parameter name

Attributes只能用在容器中,或者在容器之间传递,而 parameters是客户端传到服务器端的参数,可以在post和URL参数中。

4).更新时应该根据对象的ID得到缓存在Session中引用。
Session session = SessionFactory.currentSession();
 Demo info  =(Demo)session3.load(Demo.class,new Integer(addForm.getId()));
info.setName(addForm.getName());
session.update(info);
不能直接 info.setID(addForm.getID()); 否则提示 重复ID错误。

5).由于Tomcat没将SQLServer Driver 下面的lib中的三个jar包不添加到工程中,所以提示 空指针 错误。
 java.lang.NullPointerException 。将JDBC 的三个jar包拷贝到\WEB-INF\lib 下面就可以了。 

6).分析JSP页面中URL的书写问题:
1:   / 和 /  :都是相对当前目录。
2:   。。/    :是回到当前目录的上一层目录
3:   什么都不写是相对tomcat的目录:既是相对 http://localhost:8080/
 无论URL怎么写,经过tomcat解释后一定要是可以访问到资源。 

7).session.flush() 和transaction.commit()正常  session.Flush()并不是必须的,它的作用是将持久类的对象更改立刻提交到数据库中 即使不显式调用session.flush(),在transaction.Commit()之前,hibernate会自动调用flush()操作.但是如果在没有使用Transaction的情况下执行持久化操作,没有调用Flush就关闭session,当前session中的持久对象将不会持久化!(即:所做操作将不能反映到数据源的更改)
   执行持久化操作时,很多情况下,操作是被记录下来,并不是立即提交到数据库,直到session调用Flush时才真正提交。在SessionImpl.cs中,定义了三个ArrayList,分别是insertions、 deletions、updates,用于保存对应的持久化操作.例如在update()操作之后执行flush(),hibernate会检查缓存中的持久类,如果发现有更新则会提交到数据库,否则将不会提交.原因应该是为了避免频繁的数据库连接吧,毕竟数据库连接是非常消耗资源的。
 对hibernate的事务处理有待进一步了解和掌握。 

8). 关于PO,VO,DTO的思考  

 struts的ActionForm 类可以和 hibernate的POJO 重叠使用,只要在相应的struts-config.xml的 form-bean属性 和..hmb.xml 的class属性都设置为同一个POJO类就可以了。  POJO可以重用。

对于上个Demo中 ActionForm 和 hibernate的 POJO重用问题,在非常简单的应用中可以这么做,并可以节省一些内存。但是在业务逻辑变复杂时存在以下几个缺点:
1. ActionForm 的属性 和 POJO 的属性不一样时,就重用不了。
比如一个 Customer 包含 一个Adreess类的两个对象 (家庭住址和公司 homeAdress 和 comAdress),此时ActionForm中的属性比POJO的属性多,所以不能重用。
2.这样加大了程序的耦合性,不论是上层组件修改,还是下层组件修改,都会影响到整个应用程序,从而增加修改的复杂性。
3.位于Model层的PO(hibernate中的POJO,Entiry EJB),如果被传递到其他层面。由于PO的更新最终将被映射到实际数据库中,而且具有生命周期,如果PO在其他层面(如View层)发生了变动,那么可能会对Model层造成意想不到的破坏。
4.程序设计的一般原则是上层组件依赖下层,而下层不能依赖上层组件,既上层组件不要在下层组件中使用。因此View层的ActionForm也不能在持久层作为POJO使用。另一方面,表现层(ActionForm)VO直接反映的是表单数据,例如一个String格式的日期或者,前者需要转化为Date类型而后者则在Business层用不到。

结论:
在处理一个case的时候就出现了3个ValueObject:
: 一个是表现层的用于反映页面数据。
: 一个是Business层的,用于作为表现层和Business之间的DTO。
:  另一个是DAO持久层的,用于持久化的ValueObject。 
 DTO: Data Transfer Object
VO : ValueObject
PO : Persitence  Object

9). ..hbm.xml文件: 既OR映射文件,书写要遵循DTD规范,否则会提示错误,如 connect time out 等。

10) tomcat启动时提示:找不到 StandardContext.start() 行。 问题是 自己在程序中或者tomcat自己设置了一些断点。 解决办法: 调整Eclipse到Debug视图,将断点去掉即可。  tomcat启动问题

11).hibernate中的事务提交问题   hibernate一般操作语句如下:
Configuration conf= new Configuration().configure();
SessionFactory sessions=conf.buildSessionFactory()
Session session = sessions.openSession();      
Transaction t =  session.beginTransaction();
session.save(info); //生成SQL语句
t.commit();         //提交SQL语句

 session默认不提交事务。

12).hibernate的配置文件hibernate.cfg.xml中关于  jdbc:microsoft:sqlserver://localhost:1433
熟悉后面应该加上 DatabaseName= value  value代表数据库名。  hibernate的配置文件  
 13).使用AarryList保存数据查询出来的多条记录。
再将AarryList保存到session中,在JSP中边可以使用session中的AayyList中保存的多条结果。在JSP中使用迭代器Iterator控制输出多条记录。  使用AarryList 的add方法出现异常。 原因是add方法只增加对象的引用。所以造成多条相同的记录。

14).Web重定向: Redirect,HTTP协议中的重定向机制是客户端读取需要跳转到的页面的URL并重新加载新的页面。forward()方法和sendRedirect()方法的区别是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。

15).1.Java与数据库交互的具体过程
    1.装入数据库驱动程序 (JDBC 驱动程序或 JDBC-ODBC 桥) 。 
     2.创建数据库的 Connection。 
     3.创建一个 Statement 对象。Statement 对象用于将 SQL 语句发送到数据库中。.
     4.创建一个 ResultSet,然后用执行查询的结果填充
     5.从 ResultSet 检索或更新数据。
2.连接到数据库的两种方法,比较有缺点
3.PreparedStatement代替Statement 的优点
  一.代码的可读性和可维护性.
  二.PreparedStatement尽最大可能提高性能.
  三.最重要的一点是极大地提高了安全性.
4.Statement 接口三种执行 SQL 语句的方法
5.ResultSet的使用
15).tomcat有两种启动方式,一个用startup.bat,一个用tomcat5w.exe。
当用这两种不同的启动方式,运行一个JSP文件(用到了tool.jar包)时,tomcat5w.exe启动方式提示
Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK。

 原因:
tomcat有两种启动方式,一个用startup.bat,一个用tomcat5w.exe。
其中startup.bat使用的是按照系统里设置classpath,
而tomcat5w.exe里面有一个专门设置classpath的地方,在设置的java选项中。

所以解决方法有两种:
1.将用到的工具类包(如tools.jar)直接拷贝到tomcat的common/lib中。
2.classpath中加入相应的工具类包(如tools.jar)。

注:
1.第一次提交JSP请求时,tomcat会编译jsp文件,找到并装入到相应的工具类(如tools.jar)。
2.classpath设置只能用文件名,而不能用目录。 

16).用了package的时候显示"NoClassDefFoundError",把package去掉的时候能正常运行。
 解决过程:将java文件按包名存放。
 工作目录是/source,类是hello.HelloWorld,将它放为/source/hello/HelloWorld.java。如果没有声明包,直接放在/source下。
  在/source下执行javac hello/HelloWorld.java,再执行java hello.HelloWorld.java,一切正常。 注:感觉SUN的软件缺乏用户意识,在源文件中试用了package,在使用javac时却不能自动生成一个包,要用户自己建立文件夹,很是不方便。

17)DispatchAction实现。
DispatchAction通过配置文件(Struts-config.xml)中的parameter参数的值,调用参数值对应的方法,这样便省去了载Action类中编写大量的判断代码。涉及的技术有代理,反射。

 

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=810046

posted on 2006-12-20 14:38 芦苇 阅读(404) 评论(0)  编辑  收藏 所属分类: JAVA

只有注册用户登录后才能发表评论。


网站导航: