??xml version="1.0" encoding="utf-8" standalone="yes"?>av一区二区三区四区,www.成人.com,成人在线免费avhttp://www.aygfsteel.com/yrj11320/category/3858.html天生我才必有用,千金散尽q复来! zh-cnThu, 01 Mar 2007 18:26:31 GMTThu, 01 Mar 2007 18:26:31 GMT60初学者如何开发出高质量的J2EEpȝhttp://www.aygfsteel.com/yrj11320/archive/2005/10/24/16593.html不胖用砖?/dc:creator>不胖用砖?/author>Mon, 24 Oct 2005 07:29:00 GMThttp://www.aygfsteel.com/yrj11320/archive/2005/10/24/16593.htmlhttp://www.aygfsteel.com/yrj11320/comments/16593.htmlhttp://www.aygfsteel.com/yrj11320/archive/2005/10/24/16593.html#Feedback2http://www.aygfsteel.com/yrj11320/comments/commentRss/16593.htmlhttp://www.aygfsteel.com/yrj11320/services/trackbacks/16593.html
  J2EE可以说指Java在数据库信息pȝ上实玎ͼ数据库信息系l从早期的dBase、到Delphi/VB{C/Sl构Q发展到B/SQBrowser览?Server服务器)l构Q而J2EE主要是指B/Sl构的实现?BR>
  J2EE又是一U框架和标准Q框架类似API、库的概念,但是要超出它们。如果需要详l了解框Ӟ可先从设计模式开始学习?BR>
  J2EE是一个虚的大的概念,J2EE标准主要有三U子技术标准:WEB技术、EJB技术和JMSQ谈到J2EE应该说最l要落实到这三个子概念上?BR>
  q三U技术的每个技术在应用旉涉及两个部分Q容器部分和应用部分QWeb容器也是指Jsp/Servlet容器Q你如果要开发一个Web应用Q无论是~译或运行,都必要有Jsp/Servlet库或API支持Q除了JDK/J2SE以外Q?BR>
  Web技术中除了Jsp/Servlet技术外Q还需要JavaBeans或Java Class实现一些功能或者包装携带数据,所以Web技术最初裸体简UCؓJsp/Servlet+JavaBeanspȝ?BR>谈到JavaBeans技术,涉及到lg构g技术(componentQ,q是Java的核心基部分Q很多Y件设计概念(设计模式Q都是通过JavaBeans实现的?BR>
  JavaBeans不属于J2EE概念范畴中,如果一个JavaBeans对象被Web技术(也就是Jsp/ServletQ调用,那么JavaBeansp行在J2EE的Web容器中;如果它被EJB调用Q它p行在EJB容器中?BR>
  EJBQ企业JavaBeansQ是普通JavaBeans的一U提升和规范Q因Z业信息系l开发中需要一个可伸羃的性能和事务、安全机Ӟq样能保证企业系l^滑发展,而不是发展到一U规模重新更换一套Y件系l?BR>
  xQJavaBeanslg发展到EJB后,q不是说以前的那UJavaBeans形式消׃Q这p然Ş成了两种JavaBeans技术:EJB和POJOQPOJO完全不同于EJB概念Q指的是普通JavaBeansQ而且q个JavaBeans不依附某U框Ӟ或者干脆可以说Q这个JavaBeans是你个应用程序单独开发创建的?BR>
  J2EE应用pȝ开发工h很多Q如JBuilder、Eclipse{,q些IDE首先是Java开发工P也就是说Q它们首要基本功能是可以开发出JavaBeans或Java classQ但是如果要开发出J2EEpȝQ就要落实到要么是Web技术或EJB技术,那么有可能要一些专门模块功?如eclipse需要lomboz插g)Q最重要的是Q因为J2EEpȝ区分为容器和应用两个部分Q所以,在Q何开发工具中开发J2EE都需要指定J2EE容器?BR>
  J2EE容器分ؓWEB容器和EJB容器QTomcat/Resin是Web容器QJBoss是EJB容器+Web容器{,其中Web容器直接使用Tomcat实现的。所以你开发的Web应用E序可以在上面两U容器运行,而你开发的Web+EJB应用则只可以在JBoss服务器上q行Q商业品Websphere/Weblogic{和JBoss属于同一U性质?BR>
  J2EE容器也称为J2EE服务器,大部分时它们概念是一致的?BR>如果你的J2EE应用pȝ的数据库q接是通过JNDI获得Q也是说是从容器中获得Q那么你的J2EE应用pȝ基本与数据库无关Q如果你在你的J2EE应用pȝ耦合了数据库JDBC驱动的配|,那么你的J2EE应用pȝ有数据库概念色彩,作ؓ一个成熟需要推q的J2EE应用pȝQ不推荐和具体数据库耦合Q当然这其中如何保证J2EE应用pȝq行性能又是体现你的设计水^了?BR>
  衡量J2EE应用pȝ设计开发水q高低的标准是Q解耦性;你的应用pȝ各个功能是否能够dqQ是否不怺依赖Q也只有q样Q才能体现可l护性、可拓展性的软g设计目标?BR>
  Z辑ֈq个目的Q诞生各U框架概念,J2EE框架标准一个系l划分ؓWEB和EJB主要部分Q当然我们有时不是以q个具体技术区分,而是从设计上抽象现层、服务层和持久层Q这三个层次从一个高度将J2EE分离开来,实现解耦目的?BR>
  因此Q我们实际编E中Q也要将自己的功能向q三个层ơ上靠,做到大方向清楚,泾渭分明Q但是没有技术上U束限制要做到这Ҏ很不Ҏ的,因此我们q是必须借助J2EE具体技术来实现Q这Ӟ你可以用EJB规范实现服务层和持久层,Web技术实现表现层Q?BR>
  EJBZ么能服务层从Jsp/Servlet手中分离出来Q因为它对JavaBeans~码有强制的U束Q现在有一U对JavaBeansq束,使用Ioc模式实现的(当然EJB 3.0也采取这U方式)Q在Ioc模式诞生前,一般都是通过工厂模式来对JavaBeansU束QŞ成一个服务层Q这也是是Jiveq样开源论坛设计原理之一?BR>
  由此Q将服务层从表现层中分离出来目前有两U可选架构选择Q管理普通JavaBeansQPOJOQ框?如Spring、JdonFramework)以及理EJB的EJB框架Q因为EJB不只是框Ӟq是标准Q而标准可以扩展发展,所以,q两U区别将来是可能模糊Q被U_同一个标准了。 但是Q个为:标准制定是ؓ某个目的服务的,总要牺牲一些换取另外一些,所以,q两U架构会长时间ƈ存?BR>
  q两U架构分歧也曄诞生一个新名词Q完全POJO的系l也UCؓ轻量U系l?lightweight)Q其实这个名词本w就没有一个严格定义,更多是一个吸引h的招牌,轻量是指Ҏ学习Ҏ使用吗?按照q个定义Q其实轻量Spring{系lƈ不容易学习;而且EJB 3.0Q依然叫EJBQ以后的pȝ是否可称量了呢Q?BR>前面谈了服务层框Ӟ使用服务层框架可以将JavaBeans从Jsp/Servlet中分d来,而用表现层框架则可以将Jsp中剩余的JavaBeans完全分离Q这部分JavaBeans主要负责昄相关Q一般是通过标签库(taglibQ实玎ͼ不同框架有不同自q标签库,Struts是应用比较广泛的一U表现层框架?BR>
  q样Q表现层和服务层的分L通过两种框架辑ֈ目的Q剩余的是持久层框架了Q通过持久层的框架数据库存储从服务层中分d来是其目的,持久层框架有两种方向Q直接自q写JDBC{SQL语句Q如iBatisQ;使用O/R Mapping技术实现的Hibernate和JDO技术;当然q有EJB中的实体Bean技术?BR>
  持久层框架目前呈现百花齐放,各有优缺点的现状Q所以正如表现层框架一P目前没有一个框架被指定为标准框Ӟ当然Q表现层框架现在又出来了一个JSFQ它代表的页面组件概忉|一个新的发展方向,但是复杂的实现让人有些忘而却步?BR>
  在所有这些J2EE技术中Q虽然SUN公司发挥了很大的作用Q不qM来说Q网l上有这样一个评PSUN的理论天下无敌;SUN的品用h撞墙Q对于初学者,特别是那些试N过或已l通过SUN认证的初学者,赶快摆脱SUN的阴影,立即开溜,使用开源领域的产品来实现自q应用pȝ?BR>
  最后,你的J2EE应用pȝ如果采取上面提到的表现层、服务层和持久层的框架实玎ͼ基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系l了?BR>
  q要注意的是: 开发出一个高质量的J2EEpȝq需要正的业务需求理解,那么域徏模提供了一U比较切实可行的正确理解业务需求的ҎQ相兌l知识可从UML角度l合理解?BR>
  当然Q如果你惌计自q行业框架Q那么第一步从设计模式开始吧Q因计模式提供你一个实现JavaBeans或类之间解耦参考实现方法,当你学会了系l基本单元JavaBean或类之间解耦时Q那么系l模块之间的解耦你可能掌握,q而你可以实现行业框架的提炼了,q又是另外一个发展方向了?BR>
  以上理念可以ȝZ句话Q?BR>  J2EE开发三件宝: Domain ModelQ域建模Q、patternsQ模式)和frameworkQ框Ӟ?BR>

]]>
JSP中SQL数据库编E技?http://www.aygfsteel.com/yrj11320/archive/2005/10/16/15645.html不胖用砖?/dc:creator>不胖用砖?/author>Sun, 16 Oct 2005 08:26:00 GMThttp://www.aygfsteel.com/yrj11320/archive/2005/10/16/15645.htmlhttp://www.aygfsteel.com/yrj11320/comments/15645.htmlhttp://www.aygfsteel.com/yrj11320/archive/2005/10/16/15645.html#Feedback0http://www.aygfsteel.com/yrj11320/comments/commentRss/15645.htmlhttp://www.aygfsteel.com/yrj11320/services/trackbacks/15645.htmlJSP中SQL数据库编E技?BR>一QSQL复习
 1QSQL语句分ؓ两类QDDL(Data Definition Language)和DML(Dat Manipulation Languge,数据操作语言)。前者主要是定义数据逻辑l构Q包括定义表、视囑֒索引;DML主要是对数据库进行查询和更新操作?BR> 2QCreate Table(DDL):
  Create Table tabName(
   colName1 colType1 [else],
   colName2 colType2 [else],
   ...,
   colNamen colTypen [else]
  );
  例如QCteate Table pJoiner(
   pno char(6) not null,
   eno char(6) nut null
   );
  char int varchar{等都是用来定义列数据类型的保留字,其中varchar表示可变字符cd?BR> 3QSelect <col1>,<col2>,...,<coln>
  From <tab1>,<tab2>,...,<tabm>
  [Where<条g>]
  
  条g中的子查询:
   Where Not Exists(
    Select * From tab2 Where col1=col2
   )//当查询结果ؓI时Q条件ؓ真?BR>   
 4QINSERT INTO <tab1> VALUES(<col1>, ...<coln>)
 5QDELETE FROM <tab1> [WHERE<条g>]
 6QUPDATE <tab1>
  SET <tab1>=<vlu1>
  ...
  <tabn>=<vlun>
  [WHERE<条g>]
  例如Q?BR>   Update exployee
   Set age=27
   Where name='赵一'
二,JDBC 主要接口Q?BR> java.sql.DriverManagercȝ于处理驱动程序的调入q且Ҏ的数据库q接提供支持?BR> java.sql.ConnectionQ指应用E序与特定数据库的连接?BR> java.sql.StatementQ用于一般sql语句的执行(可以是查询、更新甚臛_以创建数据库的执行过E)
 java.sql.ResultSet,查询所q回的结果保存在此对象中Q用它可以浏览和存取数据库内的记录?BR> 
 1Q通过jdbc-odbc桥用odbc数据库(q不需要jdbc DriversQ?BR> 
  先在odbc DSN(Data Source Name)讄处设|pubs sysDSN,sa为username,密码为空
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加蝲驱动E序
  con=DriverManager.getConnection("jdbc:odbc:pubs","sa","");//jdbc:odbc:pubs   
  con.close();
  //应当catch ClassNotFoundException和SQLException
 
  Connection的getWarningҎq回一个SQLWarning对象Q在q接之前应当先检查?BR>    使用jdbc-odbc的最大好处是Q免费的。但是性能受odbc的限Ӟ而且一般odbc驱动比较昂贵?BR> 2Q用专门的jdbc驱动E序?/此处是mm jdbc Driver
  先将jar文g攑֜ClassPath里面?BR>  Class.forName("org.gjt.mm.mysql.Driver");
  con=DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname","root","");
  con.close();
  
  可见使用何种方式q接何种数据库与数据库的操作和连接数据库是无关的?BR>三,查询数据?BR> Statement stmt=con.createStatement();
 stmt.setMaxRows()可以控制输出记录最大数?
 ResultSet rs=stmt.executeQuery("select .....");
 
 ResultSet指向当前记录:
  int userId=rs.getInt("userid");
  String userName=rs.getString("username");
  ...或者用序号Q从1开始的Q?BR>  int userId=rs.getInt(1);
  Stirng userName=rs.getString(2);
 
 ClassNotFoundException是由于Class.forName()无法载入jdbc驱动E序触发?BR> SQLException是jdbc在执行过E中发生问题时生。有一个额外的ҎgetNextException()
  catch(SQLException e){
   out.println(e.getMessage());
   while(e=e.getNextException()){
    out.println(e.getMessage());
   }
  }
   
 一般来说ƈ不徏议在jsp中编写数据库的访问程序,可以数据库的访问封装在一个javabean中?BR>四,ResultSet深入
 1QResultSetMetaData
  ResultSet rs=stmt.executeQuery("select....");
  ResultSetMetaData rsmd=rs.getMetaData(); //获取ResultSetMateData对象
  int numberOfColumns=rsmd.getColumnCount();//q回列数
  boolean b=rsmd.isSearchable(int i);//q回Wi列是否可以用于where子句
  String c=rsmd.getColumnLabel(int i);//获取Wi列的列标
  Objcet obj=rs.getObject();
  if(obj!=null)out.println(obj.toString());
  else println("");
 2QSQLcd与ResultSet的getObjectq回cd及对应的XXX getXXX()Ҏ
  SQLcd  JSPcd   对应的getXXX()Ҏ
  ????????????????????????????????????????????
  CHAR                         String                                            String getString()
  VARCHAR                 String                                            String getString()
  LONGVARCHAR      String                                            InputStream getAsciiStream()/getUnicodeStream()
  NUMERIC                  java.math.BigDecimal              java.math.BigDecimal getBigDecimal()
  DECIMAL                   同上
  BIT                              Boolean                                       boolean getBoolean()
  TINYINT                     Integer                                          byte getByte()
  SMALLINT                 Integer                                          short getShort()
  INTEGER                  Integer                                          int getInt()
  BIGINT                       Long                                             long getLong()
  REAL                         Float                                              float getFloat()
  FLOAT                       Double                                          double getDouble()
  DOUBLE                   Double                                          double getDouble()
  BINARY                     byte[]                                              byte[] getBytes()
  VARBINARY              byte[]                                              byte[] getBytes()
  LONGVARBINARY   byte[]                                              InputStream getBinaryStream()
  DATE                          java.sql.Date                               java.sql.Date getDate()
  TIME                           java.sql.Time                               java.sql.Time getTime()
  TIMESTAMP              java.sql.Timestamp                   java.sql.Timestamp getTimestamp()
  
 3Qnull 
  int i=rs.getInt("age");
  if(!rs.wasNull())....//RecordSet::wasNull()用来查null
 4,存取大字W串和二q制文本
  对于数据库中longvarchar和langvarbinaryq行操?BR>  ResultSet rs=stmt.executeQueryString("select ...");
  BufferedReader br=new BufferedReader(new InputStream(rs.getAsciiStream("vol1")));//长文本串
  BufferedReader br=new BufferedReader(new InputStream(rs.getUnicodeStream("vol1")));
  BufferedReader br=new BufferedReader(new InputStream(rs.getBinaryStream("vol2")));//长二q制文本
  //取数据必drs.getAsciiStream(), rs.getUnicodeStream(), rs.getBinaryStream(){之后马上进?/SPAN>

]]>
J2EE应用中常见的反模?anti-patterns) http://www.aygfsteel.com/yrj11320/archive/2005/10/16/15640.html不胖用砖?/dc:creator>不胖用砖?/author>Sun, 16 Oct 2005 07:34:00 GMThttp://www.aygfsteel.com/yrj11320/archive/2005/10/16/15640.htmlhttp://www.aygfsteel.com/yrj11320/comments/15640.htmlhttp://www.aygfsteel.com/yrj11320/archive/2005/10/16/15640.html#Feedback0http://www.aygfsteel.com/yrj11320/comments/commentRss/15640.htmlhttp://www.aygfsteel.com/yrj11320/services/trackbacks/15640.htmlJ2EE应用中有一些常见的毛病和错误的观念Q按照时下流行的说法Q叫反模式。稍不注意,我们自己也会犯,所以大概整理一下,一个是备忘Q也是供需要的朋友参考:

 

1- ?/SPAN>EJB不叫J2EE

EJB一直发展到今天?/SPAN>2.1仍然被广病,它提供了很多时候我们ƈ不需要的东西Q而且我们在很多情况下一旦选用EJB没有其他的方式不去使用那些W重的功能。但是很多所谓范例让我们有一U错觉,好像不用EJB׃?/SPAN>J2EE应用。有一些折中的Ҏ是?/SPAN>Session Fa?ade模式Q?/SPAN>Entity Bean采用BMP + 本地接口Q然后提供一层无状态的Session BeanQ采用远E和本地接口Q这L设计模式Q我惻I多半是出于无奈。如今,甚至我们l常都能看到不?/SPAN>EJB的言论,炒得很火?/SPAN>Spring则ؓq种完全不用EJB开?/SPAN>J2EE目提供了实际的、强有力的佐证?/SPAN>

 

2- q度分层

J2EEq个规范肤浅的来看,是为我们定义了很多“层”,然后q有很多分工明确的“角艜y,加上J2EE的蓝本应用程序就分了很多“层”,以至于大安觉得J2EE的应用就应该是很多层的,其实不然Q需要具体情况具体分析?/SPAN>

 

3- 频繁的往q调?/SPAN>

EJB的看似简单造成我们l常忽略可能在用过E中出现的远E调用,比如有时候ؓ了更C条记录,每个字段都是q程的去setQ大大增加了不必要的开销Q于是我们意识到在调用中使用DTO是一个徏议遵循的Ҏ?/SPAN>

 

4- q度使用有状态的Session Bean

一般来Ԍ一?/SPAN>Session Bean实例Q如果它是有状态的Q那么它只对某个固定的用h务,如果是无状态的Q则可以满不同用户的调用。这有点cMQ只是有点类|一个类的静态方法和非静态方法的区别。我们在实际应用中,应该量避免使用有状态的Session BeanQ除非特别必要。我们可以把状态保留在Session Bean之外Q如Web容器?/SPAN>session对象或者我们自定义的类中,而不是完全依赖有状态的Session Beand我们做?/SPAN>

 

5- q度会话

Web容器?/SPAN>session对象是个好东西,用v来也很方便和直截了当Q这造成了我们很多h对它的滥用,什么东襉K往里面放。这有两个突出的问题Q一个是资源费Q另一个,万一Web服务器崩溃,那些本来需要持久化的数据就丢失了。我们需要考虑好,哪些数据本可以用request的,哪些数据又是需要持久化到数据库的,{等Q不能一味依?/SPAN>session?/SPAN>

 

6- 万能Servlet或者万?/SPAN>JSP

J2EE为我们提供了Web层丰富的技术选择Q?/SPAN>Servlet或?/SPAN>JSP都只是其中一U,虽然它很强大Q但是也不应该由它一个来承担所?/SPAN>MVC三个部分的功能。现实中我们?/SPAN>Struts很好的规范了q个问题Q?/SPAN>Servlet负责调度Q专门的Action负责处理逻辑Q?/SPAN>JSP用于用户界面昄?/SPAN>JSP?/SPAN>Servlet本质上是同一个东西,只是从不同的角度来处理问题,它们各有所长,互ؓ补充?/SPAN>



]]>
վ֩ģ壺 | | | | | | ͭϿ| ½| | Ԫ| | | | | | ξ| ɽ| | | ԰| | ¤| ɽ| ɽ| | | | | | | | | | ̨ʡ| ɽ| ͼ| | | | ʡ| |