﻿<?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-Think in Java -随笔分类-J2EE</title><link>http://www.blogjava.net/yrj11320/category/3858.html</link><description>天生我才必有用，千金散尽还复来！
</description><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 18:26:31 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 18:26:31 GMT</pubDate><ttl>60</ttl><item><title>初学者如何开发出高质量的J2EE系统</title><link>http://www.blogjava.net/yrj11320/archive/2005/10/24/16593.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Mon, 24 Oct 2005 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/archive/2005/10/24/16593.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/16593.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/archive/2005/10/24/16593.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/16593.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/16593.html</trackback:ping><description><![CDATA[J2EE学习者越来越多，J2EE本身技术不断在发展，涌现出各种概念，本文章试图从一种容易理解的角度对这些概念向初学者进行解释，以便掌握学习J2EE学习方向。首先我们需要知道Java和J2EE是两个不同概念，Java不只是指一种语言，已经代表与微软不同的另外一个巨大阵营，所以Java有时是指一种软件系统的流派，当然目前主要是.NET和Java两大主流体系。<BR><BR>　　J2EE可以说指Java在数据库信息系统上实现，数据库信息系统从早期的dBase、到Delphi/VB等C/S结构，发展到B/S（Browser浏览器/Server服务器）结构，而J2EE主要是指B/S结构的实现。<BR><BR>　　J2EE又是一种框架和标准，框架类似API、库的概念，但是要超出它们。如果需要详细了解框架，可先从设计模式开始学习。<BR><BR>　　J2EE是一个虚的大的概念，J2EE标准主要有三种子技术标准：WEB技术、EJB技术和JMS，谈到J2EE应该说最终要落实到这三个子概念上。<BR><BR>　　这三种技术的每个技术在应用时都涉及两个部分：容器部分和应用部分，Web容器也是指Jsp/Servlet容器，你如果要开发一个Web应用，无论是编译或运行，都必须要有Jsp/Servlet库或API支持（除了JDK/J2SE以外）。<BR><BR>　　Web技术中除了Jsp/Servlet技术外，还需要JavaBeans或Java Class实现一些功能或者包装携带数据，所以Web技术最初裸体简称为Jsp/Servlet+JavaBeans系统。<BR>谈到JavaBeans技术，就涉及到组件构件技术（component），这是Java的核心基础部分，很多软件设计概念（设计模式）都是通过JavaBeans实现的。<BR><BR>　　JavaBeans不属于J2EE概念范畴中，如果一个JavaBeans对象被Web技术（也就是Jsp/Servlet）调用，那么JavaBeans就运行在J2EE的Web容器中；如果它被EJB调用，它就运行在EJB容器中。<BR><BR>　　EJB（企业JavaBeans）是普通JavaBeans的一种提升和规范，因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制，这样能保证企业系统平滑发展，而不是发展到一种规模重新更换一套软件系统。<BR><BR>　　至此，JavaBeans组件发展到EJB后，并不是说以前的那种JavaBeans形式就消失了，这就自然形成了两种JavaBeans技术：EJB和POJO，POJO完全不同于EJB概念，指的是普通JavaBeans，而且这个JavaBeans不依附某种框架，或者干脆可以说：这个JavaBeans是你为这个应用程序单独开发创建的。<BR><BR>　　J2EE应用系统开发工具有很多：如JBuilder、Eclipse等，这些IDE首先是Java开发工具，也就是说，它们首要基本功能是可以开发出JavaBeans或Java class，但是如果要开发出J2EE系统，就要落实到要么是Web技术或EJB技术，那么就有可能要一些专门模块功能(如eclipse需要lomboz插件)，最重要的是，因为J2EE系统区分为容器和应用两个部分，所以，在任何开发工具中开发J2EE都需要指定J2EE容器。<BR><BR>　　J2EE容器分为WEB容器和EJB容器，Tomcat/Resin是Web容器；JBoss是EJB容器+Web容器等，其中Web容器直接使用Tomcat实现的。所以你开发的Web应用程序可以在上面两种容器运行，而你开发的Web+EJB应用则只可以在JBoss服务器上运行，商业产品Websphere/Weblogic等和JBoss属于同一种性质。<BR><BR>　　J2EE容器也称为J2EE服务器，大部分时它们概念是一致的。<BR>如果你的J2EE应用系统的数据库连接是通过JNDI获得，也就是说是从容器中获得，那么你的J2EE应用系统基本与数据库无关，如果你在你的J2EE应用系统耦合了数据库JDBC驱动的配置，那么你的J2EE应用系统就有数据库概念色彩，作为一个成熟需要推广的J2EE应用系统，不推荐和具体数据库耦合，当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。<BR><BR>　　衡量J2EE应用系统设计开发水平高低的标准就是：解耦性；你的应用系统各个功能是否能够彻底脱离？是否不相互依赖，也只有这样，才能体现可维护性、可拓展性的软件设计目标。<BR><BR>　　为了达到这个目的，诞生各种框架概念，J2EE框架标准将一个系统划分为WEB和EJB主要部分，当然我们有时不是以这个具体技术区分，而是从设计上抽象为表现层、服务层和持久层，这三个层次从一个高度将J2EE分离开来，实现解耦目的。<BR><BR>　　因此，我们实际编程中，也要将自己的功能向这三个层次上靠，做到大方向清楚，泾渭分明，但是没有技术上约束限制要做到这点是很不容易的，因此我们还是必须借助J2EE具体技术来实现，这时，你可以使用EJB规范实现服务层和持久层，Web技术实现表现层；<BR><BR>　　EJB为什么能将服务层从Jsp/Servlet手中分离出来，因为它对JavaBeans编码有强制的约束，现在有一种对JavaBeans弱约束，使用Ioc模式实现的（当然EJB 3.0也采取这种方式），在Ioc模式诞生前，一般都是通过工厂模式来对JavaBeans约束，形成一个服务层，这也是是Jive这样开源论坛设计原理之一。<BR><BR>　　由此，将服务层从表现层中分离出来目前有两种可选架构选择：管理普通JavaBeans（POJO）框架(如Spring、JdonFramework)以及管理EJB的EJB框架，因为EJB不只是框架，还是标准，而标准可以扩展发展，所以，这两种区别将来是可能模糊，被纳入同一个标准了。　但是，个人认为：标准制定是为某个目的服务的，总要牺牲一些换取另外一些，所以，这两种架构会长时间并存。<BR><BR>　　这两种架构分歧也曾经诞生一个新名词：完全POJO的系统也称为轻量级系统(lightweight)，其实这个名词本身就没有一个严格定义，更多是一个吸引人的招牌，轻量是指容易学习容易使用吗？按照这个定义，其实轻量Spring等系统并不容易学习；而且EJB 3.0（依然叫EJB）以后的系统是否可称为轻量级了呢？<BR>前面谈了服务层框架，使用服务层框架可以将JavaBeans从Jsp/Servlet中分离出来，而使用表现层框架则可以将Jsp中剩余的JavaBeans完全分离，这部分JavaBeans主要负责显示相关，一般是通过标签库（taglib）实现，不同框架有不同自己的标签库，Struts是应用比较广泛的一种表现层框架。<BR><BR>　　这样，表现层和服务层的分离是通过两种框架达到目的，剩余的就是持久层框架了，通过持久层的框架将数据库存储从服务层中分离出来是其目的，持久层框架有两种方向：直接自己编写JDBC等SQL语句（如iBatis）；使用O/R Mapping技术实现的Hibernate和JDO技术；当然还有EJB中的实体Bean技术。<BR><BR>　　持久层框架目前呈现百花齐放，各有优缺点的现状，所以正如表现层框架一样，目前没有一个框架被指定为标准框架，当然，表现层框架现在又出来了一个JSF，它代表的页面组件概念是一个新的发展方向，但是复杂的实现让人有些忘而却步。<BR><BR>　　在所有这些J2EE技术中，虽然SUN公司发挥了很大的作用，不过总体来说：网络上有这样一个评价：SUN的理论天下无敌；SUN的产品用起来撞墙；对于初学者，特别是那些试图通过或已经通过SUN认证的初学者，赶快摆脱SUN的阴影，立即开溜，使用开源领域的产品来实现自己的应用系统。<BR><BR>　　最后，你的J2EE应用系统如果采取上面提到的表现层、服务层和持久层的框架实现，基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系统了。<BR><BR>　　还要注意的是: 开发出一个高质量的J2EE系统还需要正确的业务需求理解，那么域建模提供了一种比较切实可行的正确理解业务需求的方法，相关详细知识可从UML角度结合理解。<BR><BR>　　当然，如果你想设计自己的行业框架，那么第一步从设计模式开始吧，因为设计模式提供你一个实现JavaBeans或类之间解耦参考实现方法，当你学会了系统基本单元JavaBean或类之间解耦时，那么系统模块之间的解耦你就可能掌握，进而你就可以实现行业框架的提炼了，这又是另外一个发展方向了。<BR><BR>　　以上理念可以总结为一句话：<BR>　　J2EE开发三件宝: Domain Model（域建模）、patterns（模式）和framework（框架）。<BR><img src ="http://www.blogjava.net/yrj11320/aggbug/16593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-24 15:29 <a href="http://www.blogjava.net/yrj11320/archive/2005/10/24/16593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP中SQL数据库编程技术 </title><link>http://www.blogjava.net/yrj11320/archive/2005/10/16/15645.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Sun, 16 Oct 2005 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/archive/2005/10/16/15645.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/15645.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/archive/2005/10/16/15645.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/15645.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/15645.html</trackback:ping><description><![CDATA[<SPAN id=LblContent>JSP中SQL数据库编程技术<BR>一，SQL复习<BR>&nbsp;1，SQL语句分为两类：DDL(Data&nbsp;Definition&nbsp;Language)和DML(Dat&nbsp;Manipulation&nbsp;Languge,数据操作语言)。前者主要是定义数据逻辑结构，包括定义表、视图和索引;DML主要是对数据库进行查询和更新操作。<BR>&nbsp;2，Create&nbsp;Table(DDL):<BR>&nbsp;&nbsp;Create&nbsp;Table&nbsp;tabName(<BR>&nbsp;&nbsp;&nbsp;colName1&nbsp;colType1&nbsp;[else],<BR>&nbsp;&nbsp;&nbsp;colName2&nbsp;colType2&nbsp;[else],<BR>&nbsp;&nbsp;&nbsp;...,<BR>&nbsp;&nbsp;&nbsp;colNamen&nbsp;colTypen&nbsp;[else]<BR>&nbsp;&nbsp;);<BR>&nbsp;&nbsp;例如：Cteate&nbsp;Table&nbsp;pJoiner(<BR>&nbsp;&nbsp;&nbsp;pno&nbsp;char(6)&nbsp;not&nbsp;null,<BR>&nbsp;&nbsp;&nbsp;eno&nbsp;char(6)&nbsp;nut&nbsp;null<BR>&nbsp;&nbsp;&nbsp;);<BR>&nbsp;&nbsp;char&nbsp;int&nbsp;varchar等等都是用来定义列数据类型的保留字，其中varchar表示可变字符类型。<BR>&nbsp;3，Select&nbsp;&lt;col1&gt;,&lt;col2&gt;,...,&lt;coln&gt;<BR>&nbsp;&nbsp;From&nbsp;&lt;tab1&gt;,&lt;tab2&gt;,...,&lt;tabm&gt;<BR>&nbsp;&nbsp;[Where&lt;条件&gt;]<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;条件中的子查询：<BR>&nbsp;&nbsp;&nbsp;Where&nbsp;Not&nbsp;Exists(<BR>&nbsp;&nbsp;&nbsp;&nbsp;Select&nbsp;*&nbsp;From&nbsp;tab2&nbsp;Where&nbsp;col1=col2<BR>&nbsp;&nbsp;&nbsp;)//当查询结果为空时，条件为真。<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;4，INSERT&nbsp;INTO&nbsp;&lt;tab1&gt;&nbsp;VALUES(&lt;col1&gt;,&nbsp;...&lt;coln&gt;)<BR>&nbsp;5，DELETE&nbsp;FROM&nbsp;&lt;tab1&gt;&nbsp;[WHERE&lt;条件&gt;]<BR>&nbsp;6，UPDATE&nbsp;&lt;tab1&gt;<BR>&nbsp;&nbsp;SET&nbsp;&lt;tab1&gt;=&lt;vlu1&gt;<BR>&nbsp;&nbsp;...<BR>&nbsp;&nbsp;&lt;tabn&gt;=&lt;vlun&gt;<BR>&nbsp;&nbsp;[WHERE&lt;条件&gt;]<BR>&nbsp;&nbsp;例如：<BR>&nbsp;&nbsp;&nbsp;Update&nbsp;exployee<BR>&nbsp;&nbsp;&nbsp;Set&nbsp;age=27<BR>&nbsp;&nbsp;&nbsp;Where&nbsp;name='赵一'<BR>二，JDBC&nbsp;主要接口：<BR>&nbsp;java.sql.DriverManager类用于处理驱动程序的调入并且对新的数据库连接提供支持。<BR>&nbsp;java.sql.Connection，指应用程序与特定数据库的连接。<BR>&nbsp;java.sql.Statement，用于一般sql语句的执行（可以是查询、更新甚至可以创建数据库的执行过程）<BR>&nbsp;java.sql.ResultSet,查询所返回的结果保存在此对象中，用它可以浏览和存取数据库内的记录。<BR>&nbsp;<BR>&nbsp;1，通过jdbc-odbc桥使用odbc数据库（并不需要jdbc&nbsp;Drivers）<BR>&nbsp;<BR>&nbsp;&nbsp;先在odbc&nbsp;DSN(Data&nbsp;Source&nbsp;Name)设置处设置pubs&nbsp;sysDSN,sa为username,密码为空<BR>&nbsp;&nbsp;Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动程序<BR>&nbsp;&nbsp;con=DriverManager.getConnection("jdbc:odbc:pubs","sa","");//jdbc:odbc:pubs&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;con.close();<BR>&nbsp;&nbsp;//应当catch&nbsp;ClassNotFoundException和SQLException<BR>&nbsp;<BR>&nbsp;&nbsp;Connection的getWarning方法返回一个SQLWarning对象，在连接之前应当先检查。<BR>&nbsp;&nbsp;&nbsp;&nbsp;使用jdbc-odbc的最大好处是：免费的。但是性能受odbc的限制，而且一般odbc驱动比较昂贵。<BR>&nbsp;2，使用专门的jdbc驱动程序。//此处是mm&nbsp;jdbc&nbsp;Driver<BR>&nbsp;&nbsp;先将jar文件放在ClassPath里面。<BR>&nbsp;&nbsp;Class.forName("org.gjt.mm.mysql.Driver");<BR>&nbsp;&nbsp;con=DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname","root","");<BR>&nbsp;&nbsp;con.close();<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;可见使用何种方式连接何种数据库与数据库的操作和连接数据库是无关的。<BR>三，查询数据库<BR>&nbsp;Statement&nbsp;stmt=con.createStatement();<BR>&nbsp;stmt.setMaxRows()可以控制输出记录最大数量;<BR>&nbsp;ResultSet&nbsp;rs=stmt.executeQuery("select&nbsp;.....");<BR>&nbsp;<BR>&nbsp;ResultSet指向当前记录:<BR>&nbsp;&nbsp;int&nbsp;userId=rs.getInt("userid");<BR>&nbsp;&nbsp;String&nbsp;userName=rs.getString("username");<BR>&nbsp;&nbsp;...或者用序号（从1开始的）<BR>&nbsp;&nbsp;int&nbsp;userId=rs.getInt(1);<BR>&nbsp;&nbsp;Stirng&nbsp;userName=rs.getString(2);<BR>&nbsp;<BR>&nbsp;ClassNotFoundException是由于Class.forName()无法载入jdbc驱动程序触发的<BR>&nbsp;SQLException是jdbc在执行过程中发生问题时产生。有一个额外的方法getNextException()<BR>&nbsp;&nbsp;catch(SQLException&nbsp;e){<BR>&nbsp;&nbsp;&nbsp;out.println(e.getMessage());<BR>&nbsp;&nbsp;&nbsp;while(e=e.getNextException()){<BR>&nbsp;&nbsp;&nbsp;&nbsp;out.println(e.getMessage());<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;一般来说并不建议在jsp中编写数据库的访问程序，可以将数据库的访问封装在一个javabean中。<BR>四，ResultSet深入<BR>&nbsp;1，ResultSetMetaData<BR>&nbsp;&nbsp;ResultSet&nbsp;rs=stmt.executeQuery("select....");<BR>&nbsp;&nbsp;ResultSetMetaData&nbsp;rsmd=rs.getMetaData();&nbsp;//获取ResultSetMateData对象<BR>&nbsp;&nbsp;int&nbsp;numberOfColumns=rsmd.getColumnCount();//返回列数<BR>&nbsp;&nbsp;boolean&nbsp;b=rsmd.isSearchable(int&nbsp;i);//返回第i列是否可以用于where子句<BR>&nbsp;&nbsp;String&nbsp;c=rsmd.getColumnLabel(int&nbsp;i);//获取第i列的列标<BR>&nbsp;&nbsp;Objcet&nbsp;obj=rs.getObject();<BR>&nbsp;&nbsp;if(obj!=null)out.println(obj.toString());<BR>&nbsp;&nbsp;else&nbsp;println("");<BR>&nbsp;2，SQL类型与ResultSet的getObject返回类型及对应的XXX&nbsp;getXXX()方法<BR>&nbsp;&nbsp;SQL类型&nbsp;&nbsp;JSP类型&nbsp;&nbsp;&nbsp;对应的getXXX()方法<BR>&nbsp;&nbsp;????????????????????????????????????????????<BR>&nbsp;&nbsp;CHAR&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;String&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;getString()<BR>&nbsp;&nbsp;VARCHAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;getString()<BR>&nbsp;&nbsp;LONGVARCHAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;getAsciiStream()/getUnicodeStream()<BR>&nbsp;&nbsp;NUMERIC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.math.BigDecimal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.math.BigDecimal&nbsp;getBigDecimal()<BR>&nbsp;&nbsp;DECIMAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同上<BR>&nbsp;&nbsp;BIT&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;&nbsp;&nbsp;Boolean&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;getBoolean()<BR>&nbsp;&nbsp;TINYINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;getByte()<BR>&nbsp;&nbsp;SMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short&nbsp;getShort()<BR>&nbsp;&nbsp;INTEGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;getInt()<BR>&nbsp;&nbsp;BIGINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Long&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;getLong()<BR>&nbsp;&nbsp;REAL&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;Float&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;getFloat()<BR>&nbsp;&nbsp;FLOAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Double&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;getDouble()<BR>&nbsp;&nbsp;DOUBLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Double&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;getDouble()<BR>&nbsp;&nbsp;BINARY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;getBytes()<BR>&nbsp;&nbsp;VARBINARY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;getBytes()<BR>&nbsp;&nbsp;LONGVARBINARY&nbsp;&nbsp;&nbsp;byte[]&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;getBinaryStream()<BR>&nbsp;&nbsp;DATE&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;java.sql.Date&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;&nbsp;&nbsp;&nbsp;java.sql.Date&nbsp;getDate()<BR>&nbsp;&nbsp;TIME&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;java.sql.Time&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;&nbsp;&nbsp;&nbsp;java.sql.Time&nbsp;getTime()<BR>&nbsp;&nbsp;TIMESTAMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.sql.Timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.sql.Timestamp&nbsp;getTimestamp()<BR>&nbsp;&nbsp;<BR>&nbsp;3，null&nbsp;<BR>&nbsp;&nbsp;int&nbsp;i=rs.getInt("age");<BR>&nbsp;&nbsp;if(!rs.wasNull())....//RecordSet::wasNull()用来检查null<BR>&nbsp;4,存取大字符串和二进制文本<BR>&nbsp;&nbsp;对于数据库中longvarchar和langvarbinary进行流操作<BR>&nbsp;&nbsp;ResultSet&nbsp;rs=stmt.executeQueryString("select&nbsp;...");<BR>&nbsp;&nbsp;BufferedReader&nbsp;br=new&nbsp;BufferedReader(new&nbsp;InputStream(rs.getAsciiStream("vol1")));//长文本串<BR>&nbsp;&nbsp;BufferedReader&nbsp;br=new&nbsp;BufferedReader(new&nbsp;InputStream(rs.getUnicodeStream("vol1")));<BR>&nbsp;&nbsp;BufferedReader&nbsp;br=new&nbsp;BufferedReader(new&nbsp;InputStream(rs.getBinaryStream("vol2")));//长二进制文本<BR>&nbsp;&nbsp;//取数据必须在rs.getAsciiStream(),&nbsp;rs.getUnicodeStream(),&nbsp;rs.getBinaryStream()等之后马上进行</SPAN><img src ="http://www.blogjava.net/yrj11320/aggbug/15645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-16 16:26 <a href="http://www.blogjava.net/yrj11320/archive/2005/10/16/15645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE应用中常见的反模式(anti-patterns) </title><link>http://www.blogjava.net/yrj11320/archive/2005/10/16/15640.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Sun, 16 Oct 2005 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/archive/2005/10/16/15640.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/15640.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/archive/2005/10/16/15640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/15640.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/15640.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">应用中有一些常见的毛病和错误的观念，按照时下流行的说法，叫反模式。稍不注意，我们自己也会犯，所以大概整理一下，一个是备忘，也是供需要的朋友参考：</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">1- </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">无</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">EJB</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">不叫</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">J2EE<o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">EJB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">一直发展到今天的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">2.1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">仍然被广为诟病，它提供了很多时候我们并不需要的东西，而且我们在很多情况下一旦选用</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">EJB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">就没有其他的方式不去使用那些笨重的功能。但是很多所谓范例让我们有一种错觉，好像不用</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">EJB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">就不是</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">应用。有一些折中的方案是使用</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Session Fa?ade</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">模式，</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Entity Bean</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">采用</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">BMP + </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">本地接口，然后提供一层无状态的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Session Bean</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">，采用远程和本地接口，这样的设计模式，我想，多半是出于无奈。如今，甚至我们经常都能看到不使用</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">EJB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">的言论，炒得很火的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Spring</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">则为这种完全不用</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">EJB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">开发</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">项目提供了实际的、强有力的佐证。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">2- </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">过度分层</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">这个规范肤浅的来看，就是为我们定义了很多“层”，然后还有很多分工明确的“角色”，加上</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">的蓝本应用程序就分了很多“层”，以至于大家都觉得</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">的应用就应该是很多层的，其实不然，需要具体情况具体分析。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">3- </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">频繁的往返调用</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">EJB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">的看似简单造成我们经常忽略可能在使用过程中出现的远程调用，比如有时候为了更新一条记录，每个字段都是远程的去</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">set</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">，大大增加了不必要的开销，于是我们意识到在调用中使用</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">DTO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">是一个建议遵循的方案。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">4- </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">过度使用有状态的</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Session Bean<o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">一般来讲，一个</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Session Bean</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">实例，如果它是有状态的，那么它只对某个固定的用户服务，如果是无状态的，则可以满足不同用户的调用。这有点类似（只是有点类似）一个类的静态方法和非静态方法的区别。我们在实际应用中，应该尽量避免使用有状态的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Session Bean</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">，除非特别必要。我们可以把状态保留在</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Session Bean</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">之外，如</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">容器的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">session</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">对象或者我们自定义的类中，而不是完全依赖有状态的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Session Bean</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">去帮我们做。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">5- </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">过度会话</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">容器的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">session</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">对象是个好东西，用起来也很方便和直截了当，这造成了我们很多人对它的滥用，什么东西都往里面放。这有两个突出的问题，一个是资源浪费；另一个，万一</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">服务器崩溃，那些本来需要持久化的数据就丢失了。我们需要考虑好，哪些数据本可以用</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">request</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">的，哪些数据又是需要持久化到数据库的，等等，不能一味依赖</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">session</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">6- </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">万能</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Servlet</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">或者万能</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">JSP<o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">为我们提供了</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">层丰富的技术选择，</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Servlet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">或者</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">JSP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">都只是其中一种，虽然它很强大，但是也不应该由它一个来承担所有</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">MVC</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">三个部分的功能。现实中我们的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Struts</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">很好的规范了这个问题：</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Servlet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">负责调度，专门的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Action</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">负责处理逻辑，而</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">JSP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">用于用户界面显示。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">JSP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">和</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">Servlet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt">本质上是同一个东西，只是从不同的角度来处理问题，它们各有所长，互为补充。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Trebuchet MS'; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P><img src ="http://www.blogjava.net/yrj11320/aggbug/15640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-16 15:34 <a href="http://www.blogjava.net/yrj11320/archive/2005/10/16/15640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>