posts - 120,  comments - 19,  trackbacks - 0
 
  关于VO、PO的理解


O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO。
  VO,值对象(Value Object),PO,持久对象(Persisent Object),它们是由一组属性和属性的get和set方法组成。从结构上看,它们并没有什么不同的地方。但从其意义和本质上来看是完全不同的。

1.VO是用new关键字创建,由GC回收的。
  PO则是向数据库中添加新数据时创建,删除数据库中数据时削除的。并且它只能存活在一个数据库连接中,断开连接即被销毁。

2.VO是值对象,精确点讲它是业务对象,是存活在业务层的,是业务逻辑使用的,它存活的目的就是为数据提供一个生存的地方。
  PO则是有状态的,每个属性代表其当前的状态。它是物理数据的对象表示。使用它,可以使我们的程序与物理数据解耦,并且可以简化对象数据与物理数据之间的转换。

3.VO的属性是根据当前业务的不同而不同的,也就是说,它的每一个属性都一一对应当前业务逻辑所需要的数据的名称。
  PO的属性是跟数据库表的字段一一对应的。

PO对象需要实现序列化接口。

(转载:http://www.matrix.org.cn/resource/article/43/43869.html
--------------------------------------------
在 struts+ hibernate 这种结构中,是不应该把Hibernate产生的PO直接传递给JSP的,不管他是

Iterator,还是List,这是一个设计错误。

我来谈谈在J2EE架构中各层的数据表示方法:

Web层的数据表示是FormBean,数据来源于HTML Form POST
业务层的数据表示是VO
持久层的数据表示是PO,其数据来源于数据库,持久层的数据表示例如CMP

在一个规范的J2EE架构中,不同层的数据表示应该被限制在层内,而不应该扩散到其它层,这样可以降

低层间的耦合性,提高J2EE架构整体的可维护性和可扩展性。比如说Web层的逻辑进行了修改,那么只需

要修改FormBean的结构,而不需要触动业务层和持久层的代码修改。同样滴,当数据库表进行了小的调

整,那么也只需要修改持久层数据表示,而不需要触动业务层代码和Web层代码。

不过由于Hibernate的强大功能,例如动态生成PO,PO的状态管理可以脱离Session,使得在应用了

Hibernate的J2EE框架中,PO完全可以充当VO,因此我们下面把PO和VO合并,统称为PO。

先来谈谈ActionFormBean和持久层的PO之间的重大区别。

在简单的应用中,ActionFormBean和PO几乎是没有区别,所以很多人干脆就是用ActionFormBean来充当

PO,于是ActionFormBean从JSP页面到Servlet控制层再到业务层,然后穿过持久层,最后一直映射到数

据库表。真是一竿子捅到了底!

但是在复杂的应用中,ActionFormBean和PO是分离的,他们也不可能一样。ActionFormBean是和网页里

面的Form表单一一对应的,Form里面有什么元素,Bean里面就有什么属性。而PO和数据库表对应,因此

如果数据库表不修改,那么PO也不会修改,如果页面的流程和数据库表字段对应关系不一致,那么你又

如何能够使用ActionFormBean来取代PO呢?

比如说吧,用户注册页面要求注册用户的基本信息,因此HTML Form里面包含了基本信息属性,于是你需

要一个ActionFormBean来一一对应(注意:是一一对应),每个Bean属性对应一个文本框或者选择框什么

的。

而用户这个持久对象呢?他的属性和ActionFormBean有什么明显不同呢?他会有一些ActionFormBean所

没有的集合属性,比如说用户的权限属性,用户的组属性,用户的帖子等等。另外还有可能的是在

ActionFormBean里面有3个属性,分别是用户的First Name, Middle Name, Last Name,而在我的User这

个持久对象中就是一个 Name 对象属性。

假设我的注册页面原来只要你提供First Name,那么ActionFormBean就这一个属性,后来我要你提供全

名,你要改ActionFormBean,加两个属性。但是这个时候PO是不应该修改滴,因为数据库没有改。

那么在一个完整的J2EE系统中应该如何进行合理的设计呢?

JSP(View) ---> ActionFormBean(Module) ---> Action(Control)

ActionFormBean是Web层的数据表示,它和HTML页面Form对应,只要Web页面的操作流程发生改变,它就

要相应的进行修改,它不应该也不能被传递到业务层和持久层,否则一旦页面修改,会一直牵连到业务

层和持久层的大面积的代码进行修改,对于软件的可维护性和可扩展性而言,是一个灾难,Actiont就是

他的边界,到此为止!

Action(Web Control) ---> Business Bean ---> DAO ---> ORM --->DB

而PO则是业务层和持久层的数据表示,它在业务层和持久层之间进行流动,他不应该也不能被传递到Web

层的View中去,而ActionServlet就是他的边界,到此为止!

然后来看一看整个架构的流程:

当用户通过浏览器访问网页,提交了一个页面。于是Action拿到了这个FormBean,他会把FormBean属性

读出来,然后构造一个PO对象,再调用业务层的Bean类,完成了注册操作,重定向到成功页面。而业务

层Bean收到这个PO对象之后,调用DAO接口方法,进行持久对象的持久化操作。

当用户查询某个会员的信息的时候,他用全名进行查询,于是Action得到一个UserNameFormBean包括了3

个属性,分别是first name, middle name, last name,然后Action把UserNameFormBean的3个属性读出

来,构造Name对象,再调用业务Bean,把Name对象传递给业务Bean,进行查询。

业务Bean取得Name(注意: Name对象只是User的一个属性)对象之后调用DAO接口,返回一个User的PO对象

,注意这个User不同于在Web层使用的UserFormBean,他有很多集合属性滴。然后业务Bean把User对象返

回给Action。

Action拿到User之后,把User的基本属性取出(集合属性如果不需要就免了),构造UserFormBean,然后

把UserFormBean request.setAttribute(...),然后重定向到查询结果页面。

查询页面拿到request对象里面的ActionFormBean,自动调用tag显示之。

总结:

FormBean是Web层的数据表示,他不能被传递到业务层;PO是持久层的数据表示,在特定情况下,例如

Hibernate中,他可以取代VO出现在业务层,但是不管PO还是VO都必须限制在业务层内使用,最多到达

Web层的Control,绝不能被扩散到View去。

FormBean和PO之间的数据转化是在Action中进行滴。

BTW:

JDO1.x还不能像Hibernate功能这样强大,PO不能脱离持久层,所以必须在业务层使用VO,因此必须在业

务层进行大量的VO和PO的转化操作,相对于Hibernate来说,编程比较烦琐。

当然咯,理论是一回事,实际操作也不一定非要这样干,你可以自行取舍,在实际项目中灵活一点,增

加一点bad smell,提高开发效率。只不过在大型项目中最好还是严丝合缝,不然的话,改版的时候会痛

苦的很滴。
(转载:http://forum.hibernate.org.cn/viewtopic.php?t=627

posted @ 2006-08-16 13:51 阿成 阅读(522) | 评论 (0)编辑 收藏
     摘要: 自己最近学习了JfreeChart的使用,觉得这个冬冬的功能非常强大,总结一下。一、简单介绍一下    WW 的发展使得基于因特网的应用程序不再局限于静态或者简单的动态内容提供。传统的一些以软件包形式发布应用程序例如报表系统等都在逐渐搬到因特网上。但是这两者之间有着天壤之别,虽然对于数据获取、业务处理等方面基本类似,但是最大的差别在于用户界面。为了能在web浏览器上显示要求用户界面使用 ...  阅读全文
posted @ 2006-08-16 10:44 阿成 阅读(963) | 评论 (0)编辑 收藏
前面已经讲过利用POI读写Excel,下面是一个用POI向Excel中插入图片的例子。

官方文档:
Images are part of the drawing support. To add an image just call createPicture() on the drawing patriarch. At the time of writing the following types are supported:
PNG
JPG
DIB
It is not currently possible to read existing images and it should be noted that any existing drawings may be erased once you add a image to a sheet.

// Create the drawing patriarch. This is the top level container for
// all shapes. This will clear out any existing shapes for that sheet.


通过HSSFPatriarch类createPicture方法的在指定的wb中的sheet创建图片,它接受二个参数,第一个是HSSFClientAnchor,设定图片的大小。

package com.poi.hssf.test;

import java.io.FileOutputStream;
import java.io.File;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import java.awt.image.BufferedImage;
import javax.imageio.*;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;;

public class TestPOI {

    public static void main(String[] args) {
            FileOutputStream fileOut = null;
            BufferedImage bufferImg =null;
            BufferedImage bufferImg1 = null;
            try{
                
          //先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
          ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
          ByteArrayOutputStream byteArrayOut1 = new ByteArrayOutputStream();
          bufferImg = ImageIO.read(new File("d:/PieChart.jpg"));
          bufferImg1 = ImageIO.read(new File("d:/fruitBarChart.jpg"));
          ImageIO.write(bufferImg,"jpg",byteArrayOut);
          ImageIO.write(bufferImg1,"jpg",byteArrayOut1);
          
        //创建一个工作薄
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet1 = wb.createSheet("new sheet");
        //HSSFRow row = sheet1.createRow(2);
        HSSFPatriarch patriarch = sheet1.createDrawingPatriarch();
        HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,512,255,(short) 1,1,(short)10,20);
        HSSFClientAnchor anchor1 = new HSSFClientAnchor(0,0,512,255,(short) 2,30,(short)10,60);
        anchor1.setAnchorType(2);
        //插入图片
        patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
        patriarch.createPicture(anchor1 , wb.addPicture(byteArrayOut1.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
        
            fileOut = new FileOutputStream("d:/workbook.xls");
            //写入excel文件
            wb.write(fileOut);
            fileOut.close();
        
            }catch(IOException io){
                    io.printStackTrace();
                    System.out.println("io erorr :  "+ io.getMessage());
            } finally
            {
                if (fileOut != null)
                {
                           
                    try {
                              fileOut.close();
                         }
                    catch (IOException e)
                    {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                     }
                }
            }
    }
}

posted @ 2006-08-16 09:09 阿成 阅读(2969) | 评论 (4)编辑 收藏

利用Java 操作Excel文档(POI方法)

一.POI简介

Jakarta POI apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API

目前比较成熟的是HSSF接口,处理MS Excel97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。

二.HSSF概况

HSSF Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。

HSSF 为读取操作提供了两类APIusermodeleventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。

三.开始编码

1 准备工作

要求:JDK 1.4+POI开发包

可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 最新的POI工具包

2 EXCEL 结构

HSSFWorkbook excell 文档对象介绍
HSSFSheet excell
的表单
HSSFRow excell
的行
HSSFCell excell
的格子单元
HSSFFont excell
字体
HSSFName
名称
HSSFDataFormat
日期格式
poi1.7中才有以下2项:
HSSFHeader sheet

HSSFFooter sheet

和这个样式
HSSFCellStyle cell
样式
辅助操作包括
HSSFDateUtil
日期
HSSFPrintSetup
打印
HSSFErrorConstants
错误信息表

3 .具体用法实例 (采用 usermodel

如何读Excel

读取Excel文件时,首先生成一个POIFSFileSystem对象,由POIFSFileSystem对象构造一个HSSFWorkbook,该HSSFWorkbook对象就代表了Excel文档。下面代码读取上面生成的Excel文件写入的消息字串:
POIFSFileSystemfs=newPOIFSFileSystem(new FileInputStream("d:\test.xls"));
HSSFWorkbook
 wb = new HSSFWorkbook(fs);
  } catch (IOException e) {
  e.printStackTrace();
  }
  HSSFSheet sheet = wb.getSheetAt(0);
  HSSFRow row = sheet.getRow(0);
  HSSFCell cell = row.getCell((short) 0);
  String msg = cell.getStringCellValue();

如何写excel

excel的第一个表单第一行的第一个单元格的值写成“a test”。

POIFSFileSystem fs =new POIFSFileSystem(new FileInputStream("workbook.xls"));

    HSSFWorkbook wb = new HSSFWorkbook(fs);

    HSSFSheet sheet = wb.getSheetAt(0);

    HSSFRow row = sheet.getRow(0);

    HSSFCell cell = row.getCell((short)0);

    cell.setCellValue("a test");

    // Write the output to a file

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");

    wb.write(fileOut);

fileOut.close();

4 可参考文档

POI 主页:http://jakarta.apache.org/poi/

初学者如何快速上手使用POI HSSF

http://jakarta.apache.org/poi/hssf/quick-guide.html

代码例子 http://blog.java-cn.com/user1/6749/archives/2005/18347.html

里面有很多例子代码,可以很方便上手。

四.使用心得

POI HSSF usermodel包把Excel文件映射成我们熟悉的结构,诸如WorkbookSheetRowCell等,它把整个结构以一组对象的形式保存在内存之中,便于理解,操作方便,基本上能够满足我们的要求,所以说这个一个不错的选择。

 

posted @ 2006-08-16 09:00 阿成 阅读(5397) | 评论 (0)编辑 收藏
8月6号、7号到秦皇岛旅游,玩的挺爽的。

去了鸽子窝和野生动物原,还不错。还有就是到海边游泳,第一次看海。海水很咸。

螃蟹、龙虾吃的也非常过瘾,个大得很,呵呵。

不知明年还有没机会去。
posted @ 2006-08-15 20:10 阿成 阅读(235) | 评论 (0)编辑 收藏
html ,css ,js ,jsp, jdbc, sql ,会java,懂web框架, 数据库 ,会用google
posted @ 2006-06-20 17:25 阿成 阅读(229) | 评论 (0)编辑 收藏

javascript编程起步(第一课)
不管你以前学没有学过javascript,本教程都能带您进入javascript的殿堂,领悟javascript的魅力。
  大家来到这里,都是javascript的爱好者,对javascript都多多少少有一定的理解。关于javascript
的历史等就不做介绍了,我们直接来学习它,用它。
  也许大部分人都认为javascript是在客户端运行的,其实不然。javascript有两种不同的运行环境,
一个是在服务器端的javascript,另一个就是客户端的javascript了。还有就是javascript也是面向对象
的语言。
  作为第一课,只是给大家一个简单的认识,东西不是太多。主要有以下三个方面:
  1、在页面添加javascript
  2、javascript的数据类型
  3、javascript最基本的三个对话框

  关于怎么添加javascript,我想大家都知道,就是
  <script language="javascript">   //这行是javascript脚本标记,斜杠后面的就是注释了
  document.write("在页面显示的javascript") //在页面显示一句话
  </script>
  /*这也是注释,
    不过是多行的。
  */
  我想这个今天就不细讲了,留到下一课讲,就当是这课的作业吧,就是关于适应各种环境的javascript
的添加。如不支持javascript的浏览器,我们该加入些什么才能不让浏览器显示javascript的源代码等等。

  第二个也就是今天讲的最重要的一个,就是javascript的数据类型,主要有以下几个基本的类型。
  字符串(string)
  数字(number)
  布尔值(boolean)
 
  字符串就是由一连串的字符组成的序列。包括字母、数字以及标点符号。当然还可以是汉字等。简单一点
就是表示文本信息。

  数字又分为两类:整型数字和浮点型数字。
  整数包括正整数,零和负整数。

  javascript中的数字可以使用十进制、八进制和十六进制来书写。方法如下:
  十进制:15(直接写数字即可)
  八进制:017(要以零做为引导数字)
  十六进制:0xf(要以0x做为引导数字)

  浮点型数字也叫实数,为了方便,也可以使用科学记数法来表示:
  1.13e1、1.5e3(等价于1.5乘10的3次方)
  javascript的数字范围大约为10的负308次方到10的308次方之间。
  javascript中还有一个特殊的数字值NaN(not a number),javascript 用nan表示这个无意义的结果。

  布尔值:true和false,在计算机中一般用1表示true,用0表示false。

  空值就是null,即不表示任何东西。
  未定义值undefined,有时等于null,有时可能是出了问题。
  特殊字符:也叫转义字符。是一些以反斜杠开头的不可显示的特殊控制字符。
  \b:表示退格
  \n:表示换行
  等等。

  alert()方法的使用:
  <script language="javascript">
  alert("在页面上显示警告对话框");
  </script>
  alert()是javascript产生一个带确认按钮的对话框,上面显示括号内的信息。

  confirm()方法的使用:
  <script language="javascript">
  confirm("在页面上显示确认对话框");
  </script>
  confirm()和alert()差不多,不同的就是多了个取消按钮。按确定返回true,按取消返回false。
  <script language="javascript">
  var con;
  con=confirm("你们喜欢这样的教程吗?");
  if (con==true) alert("喜欢");
  else alert("不喜欢");
  </script>

  prompt()方法的使用:
  <script language="javascript">
  var name,age;
  name=prompt("请问您的名字?");
  alert(name);
  age=prompt("多大?");
  alert(age);
  </script>
  它不但可以显示信息,而且可以输入信息。
----------------------------------------------------------------------------------------
javascript编程起步(第二课)

关于上课的作业,大家都知道,代码如下:
  <script language="javascript">
  <!--
  代码
  //-->
  </script>
  这儿补充一点内容,还可以告诉读者这儿是javascript代码,该浏览器不支持。
  <noscript>
  在浏览器不支持的时候显示这句话
  </noscript>
  今天我们主要学习的内容有以下几块:
  1、javascript变量
  2、javascript表达式和运算符

  可以用var加上为变量指定的名称来声明变量,变量类型可以通过给变量赋值来确定。由于javascript采用的是弱类型的样式,对数据类型要

求不太严格,在程序执行的过程中,会根据需要自动转换。
  对于字符串变量,可以通过“变量名.length”来获得该变量中字符串的长度,如
  var name;
  name="javascript";
  那么name.length的值就是10。

  若在一行中创建多个变量时,记住用逗号来隔开变量名。各语句用分号隔开。(使用分号是个好习惯, 大家在学习的时候尽量养成加分号的习

惯)
 
  类型转换:javascript允许在程序中改变变量的类型,最常见的两个类型转换符Number和String。
  Number(x)是字符型值——〉数字值型。String与之相反。相对于javascript的自动类型转换,可以将这种转换成为强制类型转换。(强制类

型转换需要在javascript1.2及以上版本才可以使用)

  变量的命名:

  1.必须以字母或下划线开头,中间可以有字母数字和或下划线。不能使用空格、+、-等其他符号。
    作为连字符外,变量名称不能有空格、(+)、(-)、(,)或其它符号。
  2.不能使用JavaScript中的关键字作为变量。
  (javascript变量名是区分大小写的,name和Name是不一样的。)

  对于变量还有一个重要性──那就是变量的作用域。在JavaScript中同样有全局变量和局部变量。全局变量是定义在所有函数体之外,其作

用范围是整个函数;而局部变量是定义在函数体之内,只对其该函数是可见的,而对其它函数则是不可见的。

  例子:
<script>
var myStr = "我是全局变量";
function getStr1(){
     var myStr = "我是局部变量";
     alert (myStr);
}
function getStr2(){
     alert (myStr);
}
getStr1();
getStr2();
// 测试会弹出两个提示框,第一个提示“我是局部变量”,第二个提示“我是全局变量”
</script>


  表达式:在定义完变量后,就可以对它们进行赋值、改变、计算等一系列操作,这一过程通常由表达式来完成,可以说它是变量、常量、布

尔及运算符的集合,因此表达式可以分为算术表述式、字串表达式、赋值表达式以及布尔表达式等。
 

  运算符:

  1.算术运算符:+(加) 、-(减)、 *(乘)、 /(除)、 %(取模) -(取反)、
            ++(递加1)、--(递减1)。
            例:11%2=1 ; 如果x=2   ++x+4=7     x+++4=6
          (++x是先执行加1,x++是执行完语句之后x在自加1
例子:

<script>
var i=0, j=0;
alert(i++ + " " + ++j + " " + i);
// 输出 “0 1 1”,可见i++是先输出了i,然后进行运算,而++j是先对j进行了自加运算,然后输出j的值
</script>

  2.比较运算符:<(小于)、>(大于)、<=(小于等于)、>=(大于等于)、==(等于)、!=(不等于)
          (基本操作过程是,首先对它的操作数进行比较,然后再返回一个true或False值。)
  3.逻辑运算符:!(取反)、&=(与之后赋值)、 &(逻辑与)、 |=(或之后赋值)、 |(逻辑或)、
            ^=(异或之后赋值)、 ^(逻辑异或)、 ?:(三目操作符)、||(或)、&& (与)
            ==(等于)、|=(不等于)。
  4.字符串运算符:只有+   (”my“+”javascript“结果等于”my javascript“)
  5.赋值运算符:即=,将右边的值赋给左边的变量。
  6.条件运算符:(?:)
            例:status=(age>=18)?"adult":"child";如果大于18,则表达式的值为adult。
  7.typeof()运算符:用来返回变量或数据的类型。

 

作业:试试能不能做个最最最最简单的计算器?
    (就是我可以输入两个数和一个运算符号,就得出计算结果。结合上一课的prompt())
答案:
<script language="javascript">
function yunshuan(a,op,c)
{
try{
  eval("result=a"+op+"c");
  return result;
}
catch(e){
  alert("Some error occur");
}
}
function main(){
var a,b,c;
a=parseInt(prompt("请输入第一个数"));
op=prompt("请输入运算符");
c=parseInt(prompt("请输入第二个数"));
alert("the result is :" + yunshuan(a,op,c));
}

</script>
-----------------------------------------------
javascript编程起步(第三课)

第三课终于和大家见面了, 大家要感谢 Actions 的辛勤劳动啊, 好好利用论坛给大家提供的资源和教程, 希望大家一起学习提高 :D
大家有什么意见, 建议或者想法, 可以到本版的教程问答区 或 站务管理版的 建议或意见 去发表, 我们会及时给您反馈 :)

下面是今天的学习重点:
A.补充上课的变量内容
B.if语句的基本语法
C.window.com()基本用法

A.变量
1.变量的类型规则
javascript是无类型的,他的变量可以放任何数据类型的值。
2.变量的声明
在javascript程序中,在使用变量之前,必须先声明它。变量是使用关键字var声明的。而实际上,不一定要先声明变量,在某些情况下,变量

声明是可选的。
var i;
var sum;
也可以使用一个var关键字声明多个变量;
var i,sum;
而且还可以将变量声明和变量初始化绑定在一起:
var message = 'hello';
var i = 0,j=0,k=0;
由var声明的变量是永久的,因为各浏览器对是否可以删除全局性的变量的态度是不同的,(都可以删除局部变量)为了安全,最好假设全局变

量不可删除。
可以使用var多次声明同一个变量
当你给一个没有声明的变量赋值时,js会自动用哪个变量为你创建一个全局变量。
如果你想在函数内部创建一个局部变量。那就必须用var在函数内部声明。
3.变量的作用域
如果局部变量和全局变量重名,则局部变量优先。js没有块级作用域。函数中声明的所有的变量,作用域是相同的。
var x;//声明一个未赋值的变量,他的值是undefined。
alert(u); //使用未声明的变量将引发错误。
u=3;//给一个未声明的变量赋值将会创建该变量。
4.原始类型和引用类型
var a=3.14;//原始类型
var b=a;//引用类型

B.if语句

if (条件)
语句段1
else
语句段2

 功能:若表达式为true,则执行语句段1;否则执行语句段2。

 说明:
if -else 语句是JavaScript中最基本的控制语句,通过它可以改变语句的执行顺序。
表达式中必须使用关系语句,来实现判断,它是作为一个布尔值来估算的。
它将零和非零的数分别转化成false和true。
若if后的语句有多行,则必须使用花括号将其括起来。

例子
if (age < 16 )
     alert("小朋友");
else
     alert("成年人");
end if

if语句的嵌套
if (布尔值) 语句1;
else if (布尔值) 语句2;
else if (布尔值) 语句3;
else 语句4;
在这种情况下,每一级的布尔表述式都会被计算,若为真,则执行其相应的语句,否则执行else后的语句。

C.window.com()的用法
  1、基本语法
  window.open(pageURL,name,parameters)
  其中:
    pageURL 为子窗口路径
    name 为子窗口句柄
    parameters 为窗口参数(各参数用逗号分隔)
  例:
      <SCRIPT LANGUAGE="javascript">
      <!--
      window.open ('url') //url为一网址,如:http://www.numb1.com(绝对) 或 index.htm相对)
      -->
      </SCRIPT>
  2. 窗口参数
  其中yes/no也可使用1/0;value为具体的数值,单位象素。
  toolbar=yes,no 是否显示工具条
  location=yes,no 是否显示网址栏
  directories=yes,no 是否显示导航条
  status=yes,no 是否显示状态条
  menubar=yes,no 是否显示菜单
  scrollbars=yes,no 是否显示滚动条
  resizable=yes,no 是否可以改变公告窗口大小
  copyhistory=yes,no 是否显示历史按钮
  width=value 公告窗口的宽
  height=value 公告窗口的高
  left=value 公告窗口的左上顶点距屏幕左边100像素
  top=value 公告窗口的左上顶点距屏幕顶端100像素
  例:
<script language="javascript">
<!--
window.open("http://www.sina.com.cn","newwindow",

"toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,copyhistory=no,width=500,height=500,le

ft=100,top=100")
//-->
</script>
----------------------------------------------------
javascript编程起步(第四课)

前一段有人给我说,第二课就看不明白了,我不知道是不是写的太笼统了,不够细致,还是其他的,有什么问题,大家给提出来,当然我也不

是什么js高手,只不过想把爱好者领进门而已。希望大家多多参与。
今天的主要任务就是for循环。另外就是数据类型。既for in(现在还没有讲数组和对象,先了解一下)。

数据类型的转换:
如果运算的数据类型不是一样的话,js脚本会尽力执行内部转换来解决,但js不了解你的心思。所以得到的结果可能和你想要的不一样。
em:
  3+3   // result=6
  3+"3"   // result="33"

将字符串转换为数值:
javascript语言提供两个内置函数将表示数值的字符串转换为真实的数值:parseInt()和parseFloat()。
为了使用这些函数,需要将进行转换的字符串作为参数传入函数,例:
parseInt("42")     //result=42
parseInt("42.33")   //result=42
不过是浮点数还是整数,函数返回的值都是整数。不存在四舍五入,小数点和它后面的数字将被舍弃。
而parseFloat()则返回浮点数(如果是整数就返回整数),例:
parseFloat("42")   //result=42
parseFloat("42.33") //result=42.33
如果在某处需要进行字符串的转换,只需将函数插入该初即可。如:
3+3+parseInt("3")   //result=9

将数值转换为字符串:
虽然当遇到表达式中含有混合数据类型时,js会倾向于字符串。但为了防止潜在的问题发生,最好先转换以下。在数值中加入空字符串就可以

把数值转换为字符串了:
(""+2500)         //result="2500"
(""+2500).length   //result=4


for:
javascript中最常用的循环结构称之为for循环,关键词放在循环结构的开始位置。正式语法结构如下:
for ([initial expression];[condition];[update expression]){
  statement[s] inside loop
}
例:
for(var i=0;i<9;i++)
{
n+=i
myfunc(n)
}
for...in:
这个语句完全依照变量var所设定的值决定运行次数。你可以用for...in语句在一个对象或一个数组上建立循环
for(var in [obj | array])
{
statements
}
例:
<script language="javascript">
document.writeln("The properties of the document object")
for(var element in document){
document.writein(element+"="+document[element])
}
</script>

----------------------------------------------------
javascript编程起步(第五课)


鼠标事件(上)

  随着课程的进行,能跟着下来的人是越来越少了,不知道是不是因为没有太多的表现,只是死记的东西,大家都没有兴趣啊。其实网页上

的很多特效,动作大都是用javascript来实现的,没有javascript的网页,就象一个人没有了肌肉一样。但是所有的动作都是有函数来控制的

,而控制语句是基础中的基础。希望大家能耐心的学下去。今天的课程就轻松一下,学习点能见到效果的。
主要内容就是基于鼠标的事件,有如下几种:
1.mouseover(鼠标移至)
2.mouseout(鼠标移出)
3.mousemove(鼠标移动)
4.mousedown(鼠标按下)
5.mouseup(鼠标弹起)
6.click(单击)
7.dblclick(双击)

  通常1和2组合起来使用,当用户把鼠标移动到一个超链接或者其他元素时,mouseover事件就会发生,mouseout总会伴随着它,因为当鼠标

离开时,mouseout事件就会发生。
  例子:
<html>
<head>
<title>test</title>
<script language="javascript">
function text_onmouseover(){
mytext.style.fontSize="30pt";
mytext.style.color="red";
mytext.style.fontStyle="italic";
}
function text_onmouseout(){
mytext.style.fontSize="20pt";
mytext.style.color="blue";
mytext.style.fontStyle="normal";
}
</script>
</head>
<body>
<p id=mytext onmouseover="text_onmouseover()" onmouseout="text_onmouseout()">http://www.javascript.com.cn</p>
<p>看看字体样式有什么变化</p>
</body>
</html>

  这里定义了两个函数,来使字体改变样式。关于函数我们以后会详细的讲解。
(注意:ie对页面上的所有元素都支持mouseover和mouseout事件,但对于netscape navigator来说,只有超链接和层支持这两个事件。)

下面看鼠标移动的例子:
<html>
<body onMousemove="micro$oftMouseMove()">
<SCRIPT LANGUAGE="JavaScript">
if (navigator.appName == 'Netscape')
{
document.captureEvents(Event.MOUSEMOVE);
document.onmousemove = netscapeMouseMove;
}

function netscapeMouseMove(e) {
if (e.screenX != document.test.x.value || e.screenY != document.test.y.value)
{
document.test.x.value = e.screenX;
document.test.y.value = e.screenY;
}
}

function micro$oftMouseMove() {
if (window.event.x != document.test.x.value || window.event.y != document.test.y.value)
{
document.test.x.value = window.event.x;
document.test.y.value = window.event.y;
}
}
</SCRIPT>
<FORM NAME="test">
X: <INPUT TYPE="TEXT" NAME="x" SIZE="4"> Y: <INPUT
TYPUE="TEXT" NAME="y" SIZE="4">
</FORM>
</body>
</html>
鼠标移动的事件在鼠标跟随效果的使用上比较多,大家可以看看鼠标跟随特效。网上n多。
(需要注意的是:启动这个事件处理过程存在一个问题,就是它有可能会屏蔽其他事件。另外还增加了页面的处理时间,应尽量少用。)

先说到这儿吧,下节讲鼠标的另外4个事件。


今天的作业是:
1.图片链接的转换(当鼠标放上去时是一个图片,当鼠标离开时是另外一个图片)
2.图片跟随鼠标(当鼠标移动时,会有个图片跟随着鼠标一起移动)
1题答案:
<html>
<body>
<script language="javascript">
   function change()
   {
       //document.test.tupian.src="1.bmp";用test和form[0]都可以
    document.form[0].tupian.src="1.bmp";
   }
   function changeback()
   {
       //document.test.tupian.src="2.bmp";
    document.form[0].tupian.src="1.bmp";
   }
</script>
<form name="test">
<a name="aa" href="http://www.xxx.com" onmouseover="change();" onmouseout="changeback();"><img name="tupian"

src="3.jpg"/></a>
</form>
</body>
</html>
---------------------------------------------------------------------------------------------------
javascript编程起步(第六课)

mouseDown事件和mouseUp事件
 

大家知道,mouseDown事件和mouseUp事件的组合就是click事件,但是如果在链接上按下鼠标,并移到链接之外在放开鼠标,那么就只有mouseD

own事件了。这两个事件可以增加图标按钮的图像效果,
  至于mouseDown和mouseUp的属性,它们是伴随着Click事件发生的,这和keyPress事件是keyDown事件和keyUp事件组合而成的机制是一样的

,这3个鼠标事件也有modifier属性。
  (注意:如果在onClick事件处理中使用return语句,它可以接收任何数值。只要这个值不是False,浏览器就可以完成提交。但如果浏览

器得到的是False值,表单提交操作就会被取消。)

Click事件和dbClick事件
  onClick是单击事件,onDblClick是双击事件,而实际上很难分清连续的单击和双击。它们会互相干扰。而且在ie和其他浏览器的情况还有

不同。有的浏览器是双击事件的每一次单击都会触发单击事件,而在ie中,只有双击事件的第一次单击会触发单击事件。不管怎么样,单击事

件都不会自动的取消或被忽略。因此,如果想使用单击和双击一个链接时触发两个完全不同的过程,则必须通过编程来延迟单击的动作知道双

击。

例:
<script>
var timer=null;
document.onclick=new Function("timer=setTimeout(click,500)")
document.ondblclick=new Function("clearTimeout(timer);dblclick()")
function click(){
alert("click")
}
function dblclick(){
alert("dblclick")
}
</script>

解释:
new Function("timer=setTimeout(click,500)")
新建一个函数,内容为
timer=setTimeout(click,500)
setTimeout(函数或语句,时间以毫秒为单位)
用于设置某函数或语句在某时间后执行,……
clearTimeout(timer);
清除设置,

  在高版本的浏览器中,链接的这两种事件处理程序都监视那些使得脚本阻止链接的特殊行为。
  例如:在想要的导航到另一个页面之前进行某些数据项的确认,如果某些域填得不正确,可以提醒并终止链接。要实现这种确认,必须在

事件处理程序得最后一条语句或者事件处理程序自身返回True或False。如果返回False就终止链接。
------------------------------------------------------
javascript编程起步(第七课)

过年到现在一直都比较忙,辜负大家了.
今天就学习函数吧,虽然语句还没有说完.

函数是javascript语言的一个很重要的内容,但也很复杂.
下面来看看javascript函数.
函数是有function加函数名和一对带有参数括号,以及大括号组成的,其中大括号里是
主体javascript语句.
例:
function hanshuname(js) //hanshuname是函数名.
{
document.write(js,"<br>"); //是函数的主体语句.
}
函数可以嵌套,如下:
function qiantao(a,b){
function lqiantao(x){return x*x;}
return Math.sqrt(lqiantao(a)+lqiantao(b));
}
函数还可以作为数据来应用,因此可以象处理其他数据那样来处理函数,如:赋值,存储,传递等.
例:
function zhi(x){return x*x;}
实际上,函数名没有什么意义,不过是保存函数的变量名而已.
a=zhi(6);//a存放的是数字36;
b=zhi;//现在b和zhi引用同一个函数.
c=b(5);//c存放的是数字25.
在一个函数体内,标识符arguments总是具有特殊含义,它是调用对象的一个特殊属性,用来引用实际参数对象.这个实际参数对象具有大量有用的

属性.除此之外,它还兼有数组的角色.
尽管定义javascript函数时都有固定的参数,但调用这个函数时,传递给它的参数数目却可以是任意的,数组arguments[]允许完全存取那些实

际参数值.另外,arguments有一个length属性,看如下例子:
function zhi(x,y,z)
{
if(arguments.length !=3){
alert("function zhi called with"+arguments.length+"arguments,but it expects 3 arguments.");
return null;
}
}
数组arguments[]还为javascript函数开发了一项重要的可能性,既可以将函数编写为能够接受任意数目的实际参数.
function zhi()
{
var m=Number.NEGATIVE_INFINITY;
//遍历所有参数
//检索并记忆最大的一个.
for(var i=0;i<arguments.length;i++)
if(arguments>m)m=arguments;
//返回最大的参数值.
return m;
}
var lazgest=zhi(1,10,100,2,3,1000,4,5,10000,6);
也可以使用arguments[]数组来编写一个函数.


调用js函数
<a href=”#” onClick=”functionName()”>Link text</a>
<a href=”javascript:functionName()”>Link text</a>
今天先说到这儿吧,下节继续说函数.

posted @ 2006-06-13 17:30 阿成 阅读(520) | 评论 (0)编辑 收藏
在读spring in aciton 时,他用的BeanFactory factory = new XmlBeanFactory(new FileInputStream("hello.xml"));
可是现在的用的1.2.6版本的构造器(XmlBeanFactory)只能接收Resource接口了,所以调不出来是正常的事情,假设现在有一个文件hello.xml
读取方法

1:ApplicationContext cx=new FileSystemXmlApplicationContext("hello.xml");//指定的路径去找文件
2:ApplicationContext factory = new ClassPathXmlApplicationContext("hello.xml");//还会在classpath去找
3:Resource fa = new FileSystemResource("hello.xml");
   BeanFactory factory=new XmlBeanFactory(fa);
4:这个要设制classpath了,麻烦
  Resource res = new ClassPathResource("com/springinaction/chapter01/hello/hello.xml");
  BeanFactory factory=new XmlBeanFactory(res);
好了,用了上面那种方法都可以调用getBean("your bean name")了,
eg: BeanFactory factory=new XmlBeanFactory(fa);
      hello he=(hello)factory.getBean("hello");
              he.getHello();
posted @ 2006-06-08 09:12 阿成 阅读(254) | 评论 (0)编辑 收藏
5月中旬公司开运动会了,报了四百米,铅球,接力。

那天天气很好,很热闹。投铅球的现场很多人,都是懒得报别的项目,到那混的。

我挤了半天,居然都没扔上,没人只扔两次,只能继续别的项目。

下午跑四百时还挺热闹的,不过刚上班不到一年,身体大不如以前,都跑不动了。

四个人跑第三

后来,接力我们组的人没找全,所以没跑。不过,看到还是有很多很有实力的人。

赛后还给了奖品。有的同事那个好几个奖,好几个项目都有名次。

看来以后得经常坚持锻炼。
posted @ 2006-06-07 11:09 阿成 阅读(261) | 评论 (1)编辑 收藏
记住,一定要低调,刚会点东西就浮躁怎么行,要经常提醒自己低调,低调。

明言:枪打出头鸟,人怕出名猪怕壮。
posted @ 2006-06-07 10:58 阿成 阅读(207) | 评论 (0)编辑 收藏
仅列出标题
共10页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last