Codooba
JCenter
posts - 20,comments - 9,trackbacks - 0
一、简介

  JUnit是一个开源的Java单元测试框架。在1997年,由 Erich Gamma 和 Kent Beck 开发完成。这两个牛人中 Erich Gamma 是 GOF 之一;Kent Beck 则在 XP 中有重要的贡献(你觉得眼熟一点都不奇怪)。
正如常言道:“麻雀虽小,五脏俱全。” JUnit设计的非常小巧,但是功能却非常强大。
  下面是JUnit一些特性的总结:
  1) 提供的API可以让你写出测试结果明确的可重用单元测试用例
  2) 提供了三种方式来显示你的测试结果,而且还可以扩展
  3) 提供了单元测试用例成批运行的功能
  4) 超轻量级而且使用简单,没有商业性的欺骗和无用的向导
  5) 整个框架设计良好,易扩展
  对不同性质的被测对象,如Class,jsp,Servlet,Ejb等,Junit有不同的使用技巧。由于本文的性质,以下仅以Class测试为例。

  二、下载

  点击http://www.junit.org可以下载到最新版本的JUnit,本文使用的为3.8.1版。至于安装或者配置之类,你只需要轻松的将下载下来的压缩包中的jar文件,放到你工程的classpath中就可以了。
  这样,你的系统中就可以使用JUnit编写单元测试代码了(是不是很简单)!

  三、HelloWorld

  记得在几乎每本语言教学书上都能找到HelloWorld这个入门代码。今天在这里,我们也从一个简单到根本不用单元测试的例子入手。这是一个只会做两数加减的超级简单的计算器(小学一年级必备极品)。代码如下:

  public class SampleCalculator
  {
   public int add(int augend , int addend)
   {
   return augend + addend ;
   }

   public int suBTration(int minuend , int subtrahend)

   {

   return minuend - subtrahend ;

   }

  }

  将上面的代码编译通过。下面就是我为上面程序写的一个单元测试用例:

  //请注意这个程序里面类名和方法名的特征
  import junit.framework.TestCase;
  public class TestSample extends TestCase

  {

   public void testAdd()

   {

  SampleCalculator calculator = new SampleCalculator();

   int result = calculator.add(50 , 20);

   assertEquals(70 , result);

   }

   public void testSubtration()

   {

   SampleCalculator calculator = new SampleCalculator();

   int result = calculator.subtration(50 , 20);

   assertEquals(30 , result);

   }

  }

  好了,在DOS命令行里面输入javac TestSample.java 将测试类编译通过。然后再输入 java junit.swingui.TestRunner TestSample 运行测试类,你会看到如下的窗口。
        绿色说明单元测试通过,没有错误产生;如果是红色的,则就是说测试失败了。这样一个简单的单元测试就完成了.

  按照框架规定:编写的所有测试类,必须继承自junit.framework.TestCase类;里面的测试方法,命名应该以Test开头,必须是public void 而且不能有参数;而且为了测试查错方便,尽量一个TestXXX方法对一个功能单一的方法进行测试;使用assertEquals等junit.framework.TestCase中的断言方法来判断测试结果正确与否。

  你可以对比着上面测试类中的实现来体会下规定——很简单!而且你在这个测试类中有加入多少个测试方法,就会运行多少个测试方法。

  四、向前一步

  学完了HelloWorld,你已经可以编写标准的单元测试用例了。但是还有一些细节,这里还要说明一下。不要急,很快的!
  另外你是否注意到,上面弹出窗口的一个细节,在绿条下面有Errors、Failures统计。这两者有何区别呢?
  Failures作为单元测试所期望发生的错误,它预示你的代码有bug,不过也可能是你的单元测试代码有逻辑错误(注意是逻辑错误)。Errors不是你所期待的,发生了Error你可以按照下面的顺序来检查:

  检查测试所需的环境,如:数据库连接

  检查单元测试代码

  检查你的系统代码

  五、成批运行test case

  这是前面提到的JUnit特性之一。它方便于系统单元测试的成批运行。使用起来也是非常简单,先看下使用代码:

  import junit.framework.Test;

  import junit.framework.TestSuite;

  public class TestAll{

   public static Test suite(){

   TestSuite suite = new TestSuite("TestSuite Test");

   suite.addTestSuite( TestSample.class);

   return suite;

   }

  }

  这个测试程序的编译、运行,和上面TestSample的方式是一样的。

  javac TestAll.java

  java junit.swingui.TestRunner TestAll

  怎么样?这样你在suite方法里面添加几个TestCase就会运行几个,而且它也可以添加TestSuite来将小一点的集合加入大的集合中来,方便了对于不断增加的TestCase的管理和维护。

  你觉得suite方法的作用是不是于java应用程序的main很类似?并且这里的suite必须严格遵守上面的写法!
posted @ 2007-10-04 01:22 Zhangwenlong 阅读(234) | 评论 (0)编辑 收藏

什么是POJO

简单的JAVA对象(Plain Old Java Objects)实际就是普通JavaBeans,使用POJO名称是为了和EJB混淆起来, 而且简称比较直接. 有一些属性及其getter setter方法的类,有时可以作为value object或dto来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,不能携带有connection之类的
posted @ 2007-09-28 22:21 Zhangwenlong 阅读(940) | 评论 (2)编辑 收藏
servlet有良好的生存期的定义,包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。
1、加载和实例化
容器负责加载和实例化一个servlet。实例化和加载可以发生在引擎启动的时候,也可以推迟到容器需要该servlet为客户请求服务的时候。
首先容器必须先定位servlet类,在必要的情况下,容器使用通常的Java类加载工具加载该servlet,可能是从本机文件系统,也可以是从远程文件系统甚至其它的网络服务。容器加载servlet类以后,它会实例化该类的一个实例。需要注意的是可能会实例化多个实例,例如一个servlet类因为有不同的初始参数而有多个定义,或者servlet实现SingleThreadModel而导致容器为之生成一个实例池。

2、初始化
servlet加载并实例化后,容器必须在它能够处理客户端请求前初始化它。初始化的过程主要是读取永久的配置信息,昂贵资源(例如JDBC连接)以及其它仅仅需要执行一次的任务。通过调用它的init方法并给它传递唯一的一个(每个servlet定义一个)ServletConfig对象完成这个过程。给它传递的这个配置对象允许servlet访问容器的配置信息中的名称-值对(name-value)初始化参数。这个配置对象同时给servlet提供了访问实现了ServletContext接口的具体对象的方法,该对象描述了servlet的运行环境。
    2.1初始化的错误处理
    在初始化期间,servlet实例可能通过抛出UnavailableException 或者 ServletException异常表明它不能进行有效服务。如果一个servlet抛出一个这样的异常,它将不会被置入有效服务并且应该被容器立即释放。在此情况下destroy方法不会被调用因为初始化没有成功完成。在失败的实例被释放后,容器可能在任何时候实例化一个新的实例,对这个规则的唯一例外是如果失败的servlet抛出的异常是UnavailableException并且该异常指出了最小的无效时间,那么容器就会至少等待该时间指明的时限才会重新试图创建一个新的实例。
    2.2、工具因素
    当工具(注:根据笔者的理解,这个工具可能是应用服务器的某些检查工具,通常是验证应用的合法性和完整性)加载和内省(introspect)一个web应用时,它可能加载和内省该应用中的类,这个行为将触发那些类的静态初始方法被执行,因此,开发者不能假定只要当servlet的init方法被调用后它才处于活动容器运行状态(active container runtime)。作为一个例子,这意味着servlet不能在它的静态(类)初始化方法被调用时试图建立数据库连接或者连接EJB容器。

3、处理请求
在servlet被适当地初始化后,容器就可以使用它去处理请求了。每一个请求由ServletRequest类型的对象代表,而servlet使用ServletResponse回应该请求。这些对象被作为service方法的参数传递给servlet。在HTTP请求的情况下,容器必须提供代表请求和回应的HttpServletRequest和HttpServletResponse的具体实现。需要注意的是容器可能会创建一个servlet实例并将之放入等待服务的状态,但是这个实例在它的生存期中可能根本没有处理过任何请求。
    3.1、多线程问题
    容器可能同时将多个客户端的请求发送给一个实例的service方法,这也就意味着开发者必须确保编写的servlet可以处理并发问题。如果开发者想防止这种缺省的行为,那么他可以让他编写的servlet实现SingleThreadModel。实现这个类可以保证一次只会有一个线程在执行service方法并且一次性执行完。容器可以通过将请求排队或者维护一个servlet实例池满足这一点。如果servlet是分布式应用的一部分,那么,那么容器可能在该应用分布的每个JVM中都维护一个实例池。如果开发者使用synchronized关键字定义service方法(或者是doGet和doPost),容器将排队处理请求,这是由底层的java运行时系统要求的。我们强烈推荐开发者不要同步service方法或者HTTPServlet的诸如doGet和doPost这样的服务方法。
    3.2、处理请求中的异常
    servlet在对请求进行服务的时候有可能抛出ServletException或者UnavailableException异常。ServletException表明在处理请求的过程中发生了错误容器应该使用合适的方法清除该请求。UnavailableException表明servlet不能对请求进行处理,可能是暂时的,也可能是永久的。如果UnavailableException指明是永久性的,那么容器必须将servlet从服务中移除,调用它的destroy方法并释放它的实例。如果指明是暂时的,那么容器可以选择在异常信息里面指明的这个暂时无法服务的时间段里面不向它发送任何请求。在这个时间段里面被被拒绝的请求必须使用SERVICE_UNAVAILABLE (503)返回状态进行响应并且应该携带稍后重试(Retry-After)的响应头表明不能服务只是暂时的。容器也可以选择不对暂时性和永久性的不可用进行区分而全部当作永久性的并移除抛出异常的servlet。
    3.3线程安全
    开发者应该注意容器实现的请求和响应对象(注:即容器实现的HttpServletRequest和HttpServletResponese)没有被保证是线程安全的,这就意味着他们只能在请求处理线程的范围内被使用,这些对象不能被其它执行线程所引用,因为引用的行为是不确定的。

4、服务结束
容器没有被要求将一个加载的servlet保存多长时间,因此一个servlet实例可能只在容器中存活了几毫秒,当然也可能是其它更长的任意时间(但是肯定会短于容器的生存期)
当容器决定将之移除时(原因可能是保存内存资源或者自己被关闭),那么它必须允许servlet释放它正在使用的任何资源并保存任何永久状态(这个过程通过调用destroy方法达到)。容器在能够调用destroy方法前,它必须允许那些正在service方法中执行的线程执行完或者在服务器定义的一段时间内执行(这个时间段在容器调用destroy之前)。一旦destroy方法被调用,容器就不会再向该实例发送任何请求。如果容器需要再使用该servlet,它必须创建新的实例。destroy方法完成后,容器必须释放servlet实例以便它能够被垃圾回收。
posted @ 2007-08-11 15:38 Zhangwenlong 阅读(111) | 评论 (0)编辑 收藏

下面以在web应用程序的工程目录下的META-INFO中写配置文件为例,配置数据库连接池,用到的数据库为MS Server 2000,驱动为jtds-1.2.jar,配置过程如下:

    1.  先在META-INFO下建一个xml文件,命名为context.xml,去掉文件中的所有内容,配置信息如下:
<Context path="/sqlpool" docBase="sqlpool" debug="5" reloadable="true">
 <Resource name="jdbc/sql" auth="Container"
  type="javax.sql.DataSource"
  factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
  driverClassName="net.sourceforge.jtds.jdbc.Driver"
  url="jdbc:jtds:sqlserver://localhost/test" username="sa"
  password="sa" maxActive="4" maxIdle="2" maxWait="5000" />
</Context>
    在上面的配置中sqlpool为你的工程名,jdbc/sql可以更改为你喜欢的名字,它即为你要引用的数据源的名字,其他的驱动和密码之类的,要视情况而定。
    2.  在工程目录下的WEB-INF中,在web.xml中web-app子元素内配置如下信息,引用上面的数据源:
<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/sql</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
   </resource-ref>
    3.  接下在jsp页面中做个小测试。但要注意,不要在java类中做测试,这个我试过,会抛出javax.naming.NoInitialContextException异常,原因是DataSource是由容器(TOMCAT)提供的,在jsp页面中测试代码如下:

<%
Context initContext = new InitialContext();

Context envContext = (Context) initContext.lookup    ("java:/comp/env");
DataSource db = (DataSource)envContext.lookup("jdbc/sql");

Connection conn = db.getConnection( );

out.print("ok");

conn.close();
%>

当然还需要导入jar包:

<%@ page import="java.sql.*"%>

<%@ page import="javax.naming.*"%>

<%@ page import="javax.sql.*"%>

以上测试完全通过,表示数据库连接池创建成功,仅已此文献给那些初学者,快速上手!!

 


posted @ 2007-07-28 22:50 Zhangwenlong 阅读(752) | 评论 (0)编辑 收藏
元素

一。语法
        <!ELEMENT NAME CONTENT>
        关键字   元素名称  元素类型
二。元素类型
        EMPTY-该元素不能包含子元素和文本,但可以有属性-(空元素)
        ANY-该元素可以包含任何在DTD中定义的元素内容
        #PCDATA-可以包含任何字符数据,但是不能在其中包含任何子元素
        纯元素类型--只包含子元素,并且这些子元素外没有文本
        混合类型--包含子元素和文本数据的混合体
三。EMPTY示例--空元素  
        <!ELEMENT 人 EMPTY>
        <家庭>
             <人 名字="皮诺曹" 性别="男" 年龄="6"/>
        </家庭>


        <家庭>
             <人>皮诺曹</人>
             <人><大人>皮诺曹爸爸</大人></人>
        </家庭>
        (错误)
四。ANY示例
        <!ELEMENT 人 ANY>
        <家庭>
             <人>皮诺曹</人>
             <人><大人>皮诺曹爸爸</大人></人>
        </家庭>
           
将根元素设为ANY类型后,元素出现的次数和顺序不受限制。
五。#PCDATA示例
        <!ELEMENT 人 (#PCDATA)>
        <家庭>
             <人 性别="男" 年龄="6">皮诺曹</人>
        </家庭>

         <家庭>
             <人><大人>皮诺曹爸爸</大人></人>
         </家庭>
         (错误)

六。组合类型示例
        <!ELEMENT 家庭 (人+, 家电*)>
        <家庭>
                 <人 名字="郭大路" 性别="男" 年龄="25"/>
                 <人 名字="李寻欢" 性别="男" 年龄="38" 爱好="作个教育家和伟人"/>
                 <家电 名称="彩电" 数量="3"/>
        </家庭>

posted @ 2007-07-03 22:31 Zhangwenlong 阅读(121) | 评论 (0)编辑 收藏

商业规则和业务逻辑可以通过程序存储在oracle中,这个程序就是存储过程。

存储过程是SQL, PL/SQL, JAVA 语句的组合, 它使你能将执行商业规则的代码从从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用

要创建一个 过程对象(procedural object),必须有 CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有 CREATE ANY PROCEDURE 权限。

执行 procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。

如果单独赋予权限,如下例所示:  grant  execute on MY_PROCEDURE  to Jelly

调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER');

PROCEDURE 和 FUNCTION 的区别。 function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。

 PACKAGE 是function,procedure,variables 和sql 语句的组合。package允许多个procedure使用同一个变量和游标。

创建 procedure的语法:

CREATE [ OR REPLACE ] PROCEDURE [ schema.]procedure
  [(argument [IN | OUT | IN OUT ] [NO COPY] datatype
    [, argument [IN | OUT | IN OUT ] [NO COPY] datatype]...
  )]
[ authid { current_user | definer }]
{ is | as } { pl/sql_subprogram_body |
language { java name 'String' | c [ name, name] library lib_name
}]

sql 代码
  1. CREATE PROCEDURE sam.credit (acc_no IN NUMBER, amount IN NUMBER) AS    
  2.    BEGIN  
  3.       UPDATE accounts    
  4.       SET balance = balance + amount    
  5.       WHERE account_id = acc_no;    
  6.    END;  

 

可以使用 create or replace procedure 语句, 这个语句的用处在于,你之前赋予的excute权限都将被保留。

IN, OUT, IN OUT 用来修饰参数。IN 表示这个变量必须被调用者赋值然后传入到PROCEDURE进行处理。OUT 表示PRCEDURE 通过这个变量将值传回给调用者。IN OUT 则是这两种的组合。

authid代表两种权限: 定义者权限(difiner right 默认),执行者权限(invoker right)。定义者权限说明这个procedure中涉及的表,视图等对象所需要的权限只要定义者拥有权限的话就可以访问。执行者权限则需要调用这个procedure的用户拥有相关表和对象的权限。

posted @ 2007-07-02 15:46 Zhangwenlong 阅读(790) | 评论 (1)编辑 收藏
     摘要:   阅读全文
posted @ 2007-07-01 21:26 Zhangwenlong 阅读(635) | 评论 (1)编辑 收藏

 在这篇文章中,我将为大家介绍一种基于JSP且灵活有趣的技术,那就是JSTL.JSTL全称为 JAVA SERVER PAGES STANDARD TAG LIBRARY.虽然JSP已经变的非常流行,但JSTL在基于SQL数据库的简单、快速的前后台开发中还是没有被广泛的应用。一旦你了解了JSTL,你就会了解到它的优点,并发现在你作为程序员的日常工作中,它已经被应用到了很多方面。我这里假设你已经熟悉HTML,能理解基本的SQL语句,和JSP的基础知识。因为下面的内容要涉及到这些知识。

  JSTL是一个已经被标准化的标记库集合,她支持迭代、条件、XML文档的解析,国际化,和利用SQL与数据库交互的功能。起初,JSTL规范一直由JCP (JAVA COMMUNITY PROCESS PROGRAM)组织下的JSR #52 发展完善,"JCP肩负着JAVA 技术发展的重任"--官方网站这样评价。JCP作为一个开放性的组织,他同时吸收正式的会员和非正式会员.JCP对于JAVA技术规范的形成与发展发挥了重要的主导作用。 JSTL主要包括四个基本部分的标记库:CORE,XML,国际化,和对SQL的支持。由于这篇文章的主要是以其中的SQL部分的应用来快速了解 JSTL,所以我们这篇文章只介绍了 CORE和SQL标签库的一些基本功能。

  这项技术简单而且功能强大,足以和PHP、 COLDFUSION一较高下.他在拓展JAVA的应用领域方面有足够的能力,这些领域不只包括大型的可再升级的WEB应用程序,对于仅拥有简单主页的 WEB程序一样没问题。这允许你在建立站点的时候可以避免那些经常考虑的XML的集成和与数据库的连接。正如我刚才提到的一样,JSTL的关键点就是简单易用。还有,那就是JSTL是基于JSP构建的, 他允许我们使用所有的JAVA技术,这一点我们有必要记住。

  开始之前,我们需要弄清楚怎样才能运行JSTL.由于是基于JSP技术的,所以我们运行它就需要一个能够编译JSP的容器,这里我们使用免费的JSP容器:TOMCAT (HTTP://JAKARTA.APACHE.ORG/TOMCAT/INDEX.HTML).至于如何安装这个产品已经超出了本文所讲述的范围。毫无疑问,这个软件产品现在已经很普及了,而且关于如何安装的文档资料也是很多。这里假设您已经安装并成功配置了这个容器,你只需再安装JSTL运行所需文件即可,它可以从这里下载HTTP://JAKARTA.APACHE.ORG/TAGLIBS/DOC/STANDARD-DOC/INTRO.HTML 你不需要真正的安装它,只需要将其中的.JAR文件包含到你的应用程序的WEB-INF/LIB目录下即可,稍后我会具体说到该怎么做.

  因为我们要在一个支持标准SQL的数据库上运行程序,你需要在你的电脑上安装有一个数据库。数据库的类型有许多种,这里我选择了MYSQL。我之所以选择他的原因在于首先,我们需要展示JSTL对于构造简单快速的应用程序领域所起的作用,同时能和一直在这个领域处于主导地位的PHP+MYSQL有所比较;第二点那就是MYSQL是可以免费下载并包含有一个针对JAVA的JDBC驱动.总之,为了使用下面的例子,你需要下载一个MYSQL服务器 (HTTP://WWW.MYSQL.COM/PRODUCTS/MYSQL/INDEX.HTML; MYSQL CONNECTOR/J JDBC驱动程序HTTP://WWW.MYSQL.COM/PRODUCTS/CONNECTOR-J/INDEX.HTML;还有就是 MYSQL CONTROL CENTER HTTP://WWW.MYSQL.COM/PRODUCTS/CONNECTOR-J/INDEX.HTML), 这个产品可以让你非常容易的操作管理MYSQL数据库文件。全部下载完成后,你需要安装MYSQL和MYSQL CONTROL CENTER。另外还有就是MYSQL的JDBC驱动需要放到你的WEB应用程序中的/WEB-INF/LIB目录中。

  在创建程序代码之前,你需要创建并填写数据库表。关于这方面的主题文章也相当广泛,具体如何操作超出了本文的范围。这里我推荐给你我们上面提及的一个可视化的管理工具  MYSQL CONTROL CENTER.你可以用他来创建一个用来运行程序的测试用户,数据库以及创建一个测试表,并填写若干记录。关于登陆名及密码 数据库名称这些配置环境参数,你应该记住他们,稍后需要应用到我们的代码中。

  现在,你就可以准备创建自己的第一个JSTL应用程序了它需要我们做下面一些事情:

  整个实例程序代码包括两个文件HELLO.JSP和 CONTINUE.JSP

  HELLO.JSP文件允许你输入数据库名称、登陆名称、登陆密码、数据库表名。CONTINUE.JSP:接受HELLO.JSP中的数据信息并且连接数据库,并对数据库中的表执行一个Select请求.

  下面是这个系统所有的代码文件,我将逐一进行解释。这些代码相当简单,对于代码的结构,我相信你即使没有我的解释你也能理解的.

1: <!-- HELLO.JSP -->
2: <HTML>
3: <HEAD>
4: <TITLE>HELLO</TITLE>
5: </HEAD>
6: <BODY BGCOLOR="#FFFFFF">
7: <H1>PLEASE, ENTER ALL NECESSARY INFORMATION AND CLICK OK.</H1>
8: <FORM METHOD="POST" ACTION="CONTINUE.JSP">
9: <BR>YOUR LOGIN TO DATABASE:
<INPUT TYPE="TEXT" NAME="LOGIN" SIZE="15">
10: <BR>YOUR PASSWORD TO DATABASE: 
<INPUT TYPE="PASSWORD" NAME="PASSWORD" SIZE="15">
11: <BR>YOUR DATABASE NAME:
<INPUT TYPE="TEXT" NAME="DATABASE" SIZE="15">
12: <BR>YOUR DATABASE TABLE:
<INPUT TYPE="TEXT" NAME="TABLE" SIZE="15">
13: <BR><BR><INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE=" OK ">
14: </FORM>
15: </BODY>
16: </HTML> 

  (请注意文本左侧的数字只是为你提供一些标记信息,你不需要将他们输入到你的代码文件中。)

  上面就是所有HELLO.JSP的源代码,很惊奇吧,他仅仅是纯粹的HTML代码,就这么简单,我想应该没有注释的必要了.我之所以将这些代码片段包含进文章中就是为了展示一下JSTL集成到那些需要快速扩充额外功能的HTML站点中是多么的简单.让我再为你展示一下CONTINUE.JSP的全部代码,看过之后,你就会对 JSTL有些了解了。

1: <!-- CONTINUE.JSP -->
2: <%@ TAGLIB PREFIX="C" URI="HTTP://JAVA.SUN.COM/JSTL/CORE" %>
3: <@ TAGLIB PREFIX="SQL" URI="HTTP://JAVA.SUN.COM/JSTL/SQL" %>
4: <C:SET VAR="H" VALUE="LOCALHOST"/>
5: <C:SET VAR="L" VALUE="${PARAM.LOGIN}"/>
6: <C:SET VAR="P" VALUE="${PARAM.PASSWORD}"/>
7: <C:SET VAR="D" VALUE="${PARAM.DATABASE}"/>
8: <C:SET VAR="T" VALUE="${PARAM.TABLE}"/>
9: <HTML>
10: <HEAD>
11: <TITLE>CONTINUE</TITLE>
12: </HEAD>
13: <BODY BGCOLOR="#FFFFFF">
14: <SQL:SETDATASOURCE DRIVER="COM.MYSQL.JDBC.DRIVER"
URL="JDBC:MYSQL://${L}/${D}USER=${U}&PASSWORD=${P}"/>
15: <SQL:QUERY VAR="RESULT">
16: Select * FROM <C:OUT VALUE="${T}"/>
17: </SQL:QUERY>
18: <C:FOREACH VAR="ROW" ITEMS="${RESULT.ROWSBYINDEX}">
19: <C:OUT VALUE="${ROW[0]}"/> <BR>
20: </C:FOREACH>
21: </BODY>
22: </HTML> 

(请注意文本左侧的数字只是为你提供一些标记信息,你不需要将他们输入到你的代码文件中。)

  这就是我们所有的代码了,是不是非常不错?现在我门来解释一下上面这些代码的作用。

  行1 是 HTML 的注释说明。

  行2--3 这些 JSP 标签是为了引用外部的 标签库,更确切的说这里是引用了JSTL库中的 CORE 和SQL标签库部分。我们为他们都设置了前缀名称,以便于我们通过这些前缀名称访问被引入的标签库中的功能方法。

  行4---8正如 HELLO.JSP 真正运行的样子,他将请求CONTINUE.JSP,CONTINUE.JSP获得请求后就需要得到并解析来自 HELLO.JSP的若干变量,我们使用了这样的方式${PARAM.YOUR_VAR}。在第4行<C:SET标签,将变量${H}设置为  "LOCALHOST",第五行变量${L}将获取我们在 HELLO.JSP中的LOGIN文本域中输入的信息,第6,7,8行的变量将分别获得来自 HELLO.JSP中用户所输入的密码,数据库名称,数据表名称。

  行9--13是一些我经常用来常见HTML网页头的简单的HTML标签,马上,重要的功能马上要到了。

  行14,我们试图用我们先前获得的MYSQL驱动程序(COM.MYSQL.JDBC.DRIVER)建立数据库连接,在URL中,我们指明数据库连接所需要的参数,象数据库名称,主机名称,登陆名及登陆密码。依此,我们可以用其它任何的JDBC驱动程序连接其相对的数据库。如果我们需要连接其他的 SQL数据库,只需更改这个 URL就够了。

  行15--17 这里我们执行了一个Select 查询,请特别注意第16行,我们使用了另一个JSTL功能函数<C:OUT 用来输出我们所获取的数据表名称,这里我们同样可以使用其他的SQL命令,比如说 Insert,Delete, 等等。要执行这些没有返回值的查询请求,你就需要使用<SQL:Update JSTL功能函数了。他可以直接执行他们就象<SQL:QUERY一样,只是执行它是不需要特别指定结果变量来存储语句执行返回的结果。

  行18--20 既然我们执行了上面的Select查询语句,我们就应该把他的返回结果显示出来。<C:FOREACH 就是JSTL 中一个具有迭代功能的函数,执行它时,我们通过$ {RESULT.ROWSBYINDEX}将返回的每一个数据行信息返回给变量${ROW},紧接着在第19行, 我们通过<C:OUT VALUE=" ${ROW[0]}"/>显示返回的每个数据行的第一个数据列中的值。只要你的数据表中包含的字段,你都可以通过改变变量 ${ROW}中的数字大小来对请求表中的任意一个字段中的值对他们进行访问。

  行21--22是HTML 页脚

  在你亲自创建JSTL应用程序过程中,可能你还没有发现它有多么的强大,但你应该能够意识到JSTL的功能函数的简单和高效性,试想有了JSTL,整合出一个基于SQL的新闻专栏是何等的快速,集成你现有的WEB站点是何等的容易。

  很好,我们的代码很容易理解的,即使一个非专业程序员的话,打个比方就算是一个设计师也能够读懂它,理解它,还可能进行部分的修改,起码是页面布局上的修改。

点击下载此文件

posted @ 2007-06-18 21:31 Zhangwenlong 阅读(1264) | 评论 (2)编辑 收藏

  该动作把指定文件插入正在生成的页面。其语法如下:

  <jsp:include page="relative URL" flush="true" />

  前面已经介绍过include指令,它是在JSP文件被转换成Servlet的时候引入文件,而这里的jsp:include动作不同,插入文件的时间是在页面被请求的时候。jsp:include动作的文件引入时间决定了它的效率要稍微差一点,而且被引用文件不能包含某些JSP代码(例如不能设置HTTP头),但它的灵活性却要好得多。

  例如,下面的JSP页面把4则新闻摘要插入一个“What's New ?”页面。改变新闻摘要时只需改变这四个文件,而主JSP页面却可以不作修改:

  WhatsNew.jsp

  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

  <HTML>

  <HEAD>

  <TITLE>What's New</TITLE>

  </HEAD>

  <BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"

  VLINK="#551A8B" ALINK="#FF0000">

  <CENTER>

  <TABLE BORDER=5 BGCOLOR="#EF8429">

  <TR><TH CLASS="TITLE">

  What's New at JspNews.com</TABLE>

  </CENTER>

  <P>

  Here is a summary of our four most recent news stories:

  <OL>

  <LI><jsp:include page="news/Item1.html" flush="true"/>

  <LI><jsp:include page="news/Item2.html" flush="true"/>

  <LI><jsp:include page="news/Item3.html" flush="true"/>

  <LI><jsp:include page="news/Item4.html" flush="true"/>

  </OL>

  </BODY>

  </HTML>

posted @ 2007-05-29 21:52 Zhangwenlong 阅读(333) | 评论 (0)编辑 收藏
 

Dojo是一款开源javascript工具包,它能够帮助你在短时间内构建重量级的js应用。它填补了js和各种浏览器之间运行不是特别协调的问题,给予你强大、方便、轻量的性能,并且能够提供构建动态交互界面时的测试工具。

Dojo能够让你快速的部署标准的交互组件,动态变化和最强大简单的AJax请求。这种能力是建立在最轻量级的打包规则(packaging system)之上的,因此你无需在记住哪个命令是出自哪个脚本文件的。

Dojo的打包规则和可选的构造工具帮助你完成快速、优化和透明的开发。Dojo也打包了一个易用的组件系统。

从配置模式看,Dojo的组件始终都是HTML和CSS的。

最重要的是,既然轻便的js是Dojo的核心,那么你的组件就能够方便的用于HTML、SVG或者任何接下来可能出现的什么技术上。

网络正在改变,dojo可以帮助你保持处于前列。Dojo让你的网页开发变得更好更容易更快速。

Dojo 工具包的定义

Dojo 是一个多平台的 JavaScript 工具包。Dojo 之于 JavaScript 就如同 Java™ 运行库之于 Java 语言。目前 JavaScript 最大的应用领域(也是 Dojo 的最大应用领域)就是浏览器端的 Web 开发。

概述

随着最近围绕 Web 2.0 和 Ajax 技术所展开的大肆宣扬,就连一些大型商业项目也已经准备开始实际尝试基于 JavaScript 的应用程序了。如果只考虑到从上世纪 90 年代末期(那时这类项目通常都会失败)至今技术的发展和变革,这样做是一个不错的主意。在过去 10 年中,JavaScript 虚拟机不断成熟,浏览器的兼容性越来越好,一些兼容性标准不断被完善,个人计算机上的 CPU 功率和内存迅速增长,用户也已经累积了大量有关开发 JavaScript 应用程序的知识。Dojo 工具包似乎正处在将这些经验应用到代码中去的阶段。

概念上的方法

从概念上来说,Dojo 非常棒。它的一个引人注意之处是它为 JavaScript 开发带来了高标准的质量,似乎是受到了 Java 语言的启迪。Dojo 从其他几个 JavaScript 框架中发展而来这个事实可以确保它的基本概念已经成熟。工具包 方法(与框架或库方法相比)允许开发人员只在需要时使用 Dojo;在其他情况下,并不需要使用它。Dojo 的对业务友好的开源许可证也使得它对于各种项目来说都非常有吸引力。


获取一个版本

Dojo提供了不同的构建版本,把相关的部分构成一个单一的压缩文件。

不用担心,无论你用的什么版本,都能够毫无困难的调用Dojo提供的所有的API,只是你所选版本的相应的库将会优先引导而已。

相关

posted @ 2007-05-23 23:55 Zhangwenlong 阅读(627) | 评论 (1)编辑 收藏
仅列出标题
共2页: 上一页 1 2