随笔 - 7  文章 - 3  trackbacks - 0
<2011年10月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

     摘要: 首先我们需要一个被加载的js文件,我在一个固定文件夹下创建了一个package.js,打开后在里面写一个方法functionOne,很简单,代码如下:function functionOne(){ alert("成功加载"); }后面的html文件都创建在同一个目录下。方法一:直接document.write在同一个文件夹下面创建一个function1.html,代码如下:<ht...  阅读全文
posted @ 2013-06-01 09:19 Tomas 阅读(387) | 评论 (0)编辑 收藏


多文件上传 jquery的插件
使用的方法  导入 jquery.js 及 jquery.MultiFile.js ,
方式一: 后台是文件数组  
 private File[] upload; // 与jsp表单中的名称对应
 private String[] uploadFileName;
 private String[] uploadContentType;
在 form 中加入 <input type="file" name="upload[]" class="multi" /> 即可。

方式二:后台是List<File>
 private List<File> upload; // 与jsp表单中的名称对应
 private List<String> uploadFileName;
 private List<String> uploadContentType;

jquery.MultiFile.js  将选中的文件列在From中,名字为upload的<input>,所以要用 name="upload[]"(方法一)或者name="upload" (方法二) 来接收
class="multi" 是 jQuery 用来作的文件类型,HTML 部份代码如下:

<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
<title>Untitled Document</title>
<script src="/multiple-file-upload/jquery.js" type="text/javascript" language="javascript"></script>
<script src="/multiple-file-upload/jquery.MultiFile.js" type="text/javascript" language="javascript"></script>

</head>
<body>

<form enctype="multipart/form-data" action="<?php $_SERVER['PHP_SELF'] ?>" method="POST">
<input type="file" name="upload[]" class="multi" maxlength="2"/>
//<input type="file" name="upload" class="multi" />

<input type="submit" value="Upload File" />
</form>

</body>

参数说明:

参数 说明 说明
class="multi" maxlength="2" Limit: 2 files.
Allowed extensions: any.
限制数量2
class="multi" accept="gif|jpg" Limit: no limit.
Allowed extensions: gif and jpg.
格式只能 gif  jpg
class="multi" accept="gif|jpg" maxlength="3" Limit: 3 files
Allowed extensions: gif, jpg.
限制数量3,格式只能 gif  jpg


主页:http://www.fyneworks.com/jquery/multiple-file-upload/

下载:http://www.fyneworks.com/jquery/multiple-file-upload/#tab-Download

示例:http://www.fyneworks.com/jquery/multiple-file-upload/#tab-Examples

posted @ 2013-05-17 15:56 Tomas 阅读(4168) | 评论 (2)编辑 收藏
/**
 * 数字转换为大写人民币计数
 * @author 王代军
 * @since Dec 16,2011
 */

public class Num2Rmb
{
    private String[] hanArr = {"零" , "壹" , "贰" , "叁" , "肆" ,
        "伍" , "陆" , "柒" , "捌" , "玖"};
    private String[] unitArr = {"拾","百","千","万"};

    /**
     * 把一个四位的数字字符串变成汉字字符串
     * @param numStr 需要被转换的四位的数字字符串
     * @return 四位的数字字符串被转换成的汉字字符串。
     */
    private String toHanStr(String numStr)
    {
        String result = "";
        int numLen = numStr.length();
        //依次遍历数字字符串的每一位数字
        for (int i = 0 ; i < numLen ; i++ )
        {
            //把char型数字转换成的int型数字,因为它们的ASCII码值恰好相差48
            //因此把char型数字减去48得到int型数字,例如'4'被转换成4。
            int num = numStr.charAt(i) - 48;
            //如果不是最后一位数字,而且数字不是零,则需要添加单位(千、百、十)
            if ( i != numLen - 1 && num != 0)
            {
                result += hanArr[num] + unitArr[numLen - 2 - i];
            }
            //否则不要添加单位
            else
            {
                
                //上一个数是否为“零”,不为“零”时就添加
                if(result.length()>0 && hanArr[num].equals("零") && result.charAt(result.length()-1)=='零')
                    continue;
                result += hanArr[num];
            }
        }
        //只有个位数,直接返回
        if(result.length()==1)
            return result;
        
        int index=result.length()-1;
        while(result.charAt(index)=='零'){
            index--;
        }
        if(index!=result.length()-1)
            return result.substring(0,index+1);
        else {
            return result;
        }
    }
    /**
     * 把一个输入的数字字符串变成汉字字符串
     * @param numStr 需要被转换得到数字字符串
     * @return 数字字符串被转换成的汉字RMB字符串。
     */
    private String toRmbStr(String numStr){
        //获取字符串长度
        int numLen = numStr.length();
        //判断长度小于4(一万以内~0-9999) 调用toHanStr();
        if(numLen<=4){
            return toHanStr(numStr);
        }
        //4<长度<=8 (一亿以内 1000-99999999)
        else if(numLen>4&&numLen<=8){
            String[] subArr={numStr.substring(0, numLen-4),numStr.substring(numLen-4, numLen)};
            return toHanStr(subArr[0])+"万"+toHanStr(subArr[1]);
        }
        //8<长度<=10 (百亿以内 一亿-9999999999)
        else if(numLen>8&&numLen<=10){
            String[] subArr={numStr.substring(0,numLen-8),numStr.substring(numLen-8,numLen-4),numStr.substring(numLen-4,numLen)};
            return toHanStr(subArr[0])+"亿"+toHanStr(subArr[1])+"万"+toHanStr(subArr[2]);
        }
        else return "输入有误!";    
    }          
    public static void main(String[] args)
    {        
        Num2Rmb nr = new Num2Rmb();
        System.out.println("只支持整数(0~99亿)");
        //测试把一个四位的数字字符串变成汉字字符串
        System.out.println(nr.toRmbStr("1"));
        System.out.println(nr.toRmbStr("10"));
        System.out.println(nr.toRmbStr("15"));
        System.out.println(nr.toRmbStr("110"));
        System.out.println(nr.toRmbStr("123"));
        System.out.println(nr.toRmbStr("105"));
        System.out.println(nr.toRmbStr("1000"));
        System.out.println(nr.toRmbStr("1101"));
        System.out.println(nr.toRmbStr("1110"));
        System.out.println(nr.toRmbStr("1005"));
        System.out.println(nr.toRmbStr("101105"));
        System.out.println(nr.toRmbStr("1011109"));
        System.out.println(nr.toRmbStr("9999999999"));
    }
}

posted @ 2011-12-26 13:26 Tomas 阅读(557) | 评论 (0)编辑 收藏
通用的增删该查工具类  可在dao层 new一个
CommonCrudUtil(本类)实例  实现对数据的增删改查




package com.XXXXX.util;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.*;
/**
 * 通用增删改查工具类
 * @author 王代军
 * @since Dec 19,2011
 * @version 1.0
 */
@SuppressWarnings("unchecked")
public class CommonCrudUtil<T> {
    /**
     * 添加功能
     * @param obj 要保存的对象
     */
    public boolean create(Object obj){
        Session session=HibernateSessionFactory.getSession();
        Transaction tx=null;
        boolean flag=false;
        try{
            tx=session.beginTransaction();
            session.persist(obj);
            tx.commit();
            flag=true;
        }catch(Exception e){
            e.printStackTrace();
            if(tx!=null){        
                tx.rollback();
            }
        }finally{
            session.close();
        }    
        return flag;
    }
    /**
     * 查询功能
     * @param clazz 要查询对象的类型  obj 要查询的对象的 可序列化的字段 (本设计指主键 id)
     */
    public Object retrieve(Class clazz,Object obj){
        Session session=HibernateSessionFactory.getSession();
        Transaction tx=null;
        try{
            tx=session.beginTransaction();
            Object object=session.get(clazz,(Serializable) obj);
            tx.commit();
            return object;
        }catch(Exception e){
            e.printStackTrace();
            if(tx!=null){        
                tx.rollback();
            }
            return null;
        }finally{
            session.close();
        }        
    }    
    /**
     * 查询全部功能
     * @param clazz 要查询的对象的类型
     */
    public List<T> retrieve(Class clazz){
        Session session=HibernateSessionFactory.getSession();
        List<T> list=new ArrayList<T>();
        Transaction tx=null;
        try{
            tx=session.beginTransaction();
            Criteria cr=session.createCriteria(clazz);
            list=cr.list();
            tx.commit();
            return list;
        }catch(Exception e){
            e.printStackTrace();
            if(tx!=null){            
                tx.rollback();
            }
            return null;
        }finally{
            session.close();
        }
    }
    /**
     * 更新功能
     * @param obj 要更新的对象
     */
    public boolean update(Object obj){
        Session session=HibernateSessionFactory.getSession();
        boolean flag=false;
        Transaction tx=null;
        try{
            tx=session.beginTransaction();
            session.update(obj);
            tx.commit();
            flag=true;
        }catch(Exception e){
            e.printStackTrace();
            if(tx!=null){            
                tx.rollback();
            }
        }finally{
            session.close();
        }
        return flag;
    }
    /**
     * 删除功能
     * @param clazz 要删除的对象的类型 obj 要删除的对象的 唯一标识(可序列化)字段 (指主键 id)
     */
    public boolean delete(Class clazz,Object obj){
        Session session=HibernateSessionFactory.getSession();
        Transaction tx=null;
        boolean flag=false;
        try{
            tx=session.beginTransaction();
            Object object=session.get(clazz,(Serializable) obj);
            session.delete(object);
            tx.commit();
            flag=true;
        }catch(Exception e){
            e.printStackTrace();
            if(tx!=null){        
                tx.rollback();
            }
        }finally{
            session.close();
        }    
        return flag;
    }
    
}



调用实现   dao层的实现类调用 
   CommonCrudUtil  的方法实现增删改查

import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import com.zhongyou.bean.IDCard;
import com.zhongyou.util.CommonCrudUtil;

public class IDCardDaoImpl implements IDCardDaoIf {

    
     CommonCrudUtil crud=new CommonCrudUtil<IDCard>();
   
     public int addInformation(IDCard card) {

     IDCard card=new IDCard();
     card.setId(16);
     card.setName("xiaoxiao");
     card.setAddress("xiaoxiao");
     card.setBirthday(new Date());
     card.setNumber("29472398734");
     card.setSex("男");


     crud.create(card);//增加.......

}
 
     。。。。。。查询。。。。。
     crud.retrieve(IDCard.class,3);
    。。。。。。查询全部。。。。。
     crud.retrieve(IDCard.class);

    。。。。。。修改。。。。
     crud.update(card);
    。。。。。。删除。。。。
     crud.delete(IDCard.class,3);
。。。。。。。。。



写的简陋些  只是些想法可借鉴而已 同志们 可以自己完善。。。。




posted @ 2011-12-26 13:22 Tomas 阅读(1999) | 评论 (1)编辑 收藏

Oracle的默认服务一共有5个:

1.OracleDBConsoleorcl oem控制台的服务进程

2.OracleJobSchedulerORCL 定时器的服务进程

3.OracleOraDb10g_home1iSQL*Plus isql*plus的服务进程

4.OracleOraDb10g_home1TNSListener 监听器的服务进程


5.OracleServiceORCL 数据库服务进程

要查看系统中已启动的服务,我们可以在“开始→控制面板→管理工具”中双击“服务”,或者直接

在“运行”中输入 “Services.msc”打开服务设置对话框,就可以看到每一个服务都有以下几个属

性:名称、描述、状态、启动类型、登录身份、依存关系。

OracleDBConsoleorcl --可以不启动,用于管理Oracle的企业管理器的服务.

OracleJobSchedulerORCL --通常不启动,用于定期操作任务的服务

OracleOraDb10g_home1iSQL*Plus --可以不启动,这是isqlplus服务,用于用网页执行sql执行,11g已

经取消了这个功能

OracleOraDb10g_home1TNSListener --必须启动,这是临听,用于远程客户端连接你的Oracle

OracleServiceORCL --必须启动,这是Oracle数据库的服务

可以用命令启动:

#启动listener:

lsnrctl start

#启动数据库

net start OracleServiceORCL

只有这两项是必须启动的:

OracleOraDb10g_home1TNSListener

OracleServiceORCL

为什么OracleJobSchedulerORCL会显示禁用?

数据库工作日程调度,一般没有安排工作日程就不需要启动,为什么默认是禁用?因为启动后会占用很大的系统资源。

(1)OracleServiceSID                    

数据库服务,这个服务会自动地启动和停止数据库。如果安装了一个数据库,它的缺省启动类型为自动。服务进程为Oracle.EXE,参数文件initSID.ora,日志文件SIDALRT.log,控制台SVRMGRL.EXE、SQLPLUS.EXE。

(2)OracleHOME_NAMETNSListener

监听器服务,服务只有在数据库需要远程访问时才需要(无论是通过另外一台主机还是在本地通过 SQL.Net 网络协议都属于远程访问),不用这个服务就可以访问本地数据库,它的缺省启动类型为自动。服务进程为TNSLSNR.EXE,参数文件 Listener.ora,日志文件listener.log,控制台LSNRCTL.EXE,默认端口1521、1526。

(3)OracleHOME_NAMEAgent

OEM代理服务,接收和响应来自OEM控制台的任务和事件请求,只有使用OEM管理数据库时才需要,它的缺省启动类型为自动。服务进程为DBSNMP.EXE,参数文件snmp_rw.ora,日志文件nmi.log,控制台LSNRCTL.EXE,默认端口1748。

(4)OracleHOME_NAMEClientCache      

名字缓存服务,服务缓存用于连接远程数据库的Oracle Names 数据。它的缺省启动类型是手动。然而,除非有一台Oracle Names 服务器,否则没有必要运行这个服务。服务进程为ONRSD.EXE,参数文件NAMES.ORA,日志文件ONRSD.LOG,控制台 NAMESCTL.EXE。

(5)OracleHOME_NAMECMAdmin                    

连接管理服务,是构建Connection Manager服务器所用,只有服务器作为Connection Manager才需要,它的缺省启动类型是手动。服务进程为CMADMIN.EXE,参数文件CMAN.ORA,日志文件CMADM_PID.TRC,控 制台CMCTL.EXE,默认端口1830。

(6)OracleHOME_NAMECMan                    

连接网关服务,是构建Connection Manager服务器所用,只有服务器作为Connection Manager才需要,它的缺省启动类型是手动。服务进程为CMGW.EXE,参数文件CMAN.ORA,日志文件CMAN_PID.TRC,控制台 CMCTL.EXE,默认端口1630。

(7)OracleHOME_NAMEDataGatherer

性能包数据采集服务,除非使用Oracle Capacity Planner 和 Oracle Performance Manager,否则不需要启动,它的缺省启动类型是手动。服务进程为VPPDC.EXE,日志文件alert_dg.log,控制台 vppcntl.exe。

(8)OracleHOME_NAMEHTTPServer

Oracle提供的WEB服务器,一般情况下我们只用它来访问Oracle Apache 目录下的Web 页面,比如说JSP 或者modplsql 页面。除非你使用它作为你的HTTP服务,否则不需要启动(若启动它会接管IIS的服务),它的缺省启动类型是手动。服务进程为APACHE.EXE,参 数文件httpd.conf,默认端口80。

(9)OracleHOME_NAMEPagingServer

通过一个使用调制解调器的数字传呼机或者电子邮件发出警告(没试过),它的缺省启动类型是手动。服务进程PAGNTSRV.EXE,日志文件paging.log。

(10)OracleHOME_NAMENames

Oracle Names服务,只有服务器作为Names Server才需要,它的缺省启动类型是手动。服务进程NAMES.EXE,参数文件NAMES.ORA,日志文件NAMES.LOG,控制台NAMESCTL.EXE,默认端口1575。

(11)OracleSNMPPeerMasterAgent

SNMP服务代理,用于支持SNMP的网管软件对服务器的管理,除非你使用网管工具监控数据库的情况,否则不需要启动,它的缺省启动类型是手动。服务进程为AGNTSVC.EXE,参数文件MASTER.CFG,默认端口161。

(12)OracleSNMPPeerEncapsulater

SNMP协议封装服务,用于SNMP协议转换,除非你使用一个不兼容的SNMP代理服务,否则不需要启动,它的缺省启动类型是手动。服务进程为ENCSVC.EXE,参数文件ENCAPS.CFG,默认端口1161。

(13)OracleHOME_NAMEManagementServer

OEM管理服务,使用OEM时需要,它的缺省启动类型是手动。服务进程为OMSNTSVR.EXE,日志文件oms.nohup。

OracleServiceMYDB

OracleOraHome92TNSListener

别的一般不用开,有需要再开






附(批处理)

:doit

  @echo off

  set /p xz=按"kq"键启动服务------按"gb"关闭服务

  if %xz%==kq goto kq

  if %xz%==gb goto gb

  goto doit

  :kq

  @echo off

  echo 正在启动oracle服务,请稍等......

  net start OracleServiceORCL

  net start OracleDBConsoleorcl

  net start OracleOraDb10g_home1TNSListener

  net start OracleOraDb10g_home1iSQL*Plus

  echo 启动oracle服务完成

  echo. & pause

  goto doit

  :gb

  @echo off

  echo 正在关闭oracle服务,请稍等.......

  net stop OracleServiceORCL

  net stop OracleDBConsoleorcl

  net stop OracleOraDb10g_home1TNSListener

  net stop OracleOraDb10g_home1iSQL*Plus

  echo 关闭oracle服务完成

  echo. & pause

  goto doit

把代码复制 保存  修改后缀名为.bat 执行即可;

posted @ 2011-11-09 11:50 Tomas 阅读(156) | 评论 (0)编辑 收藏





会话跟踪,其原理是什么。

我们都知道,为了在WEB服务器中识别发出请求的用户,对于每一个访问者WEB服


务器都会给其创建一个session。在会话的创建于使用中,比较容易犯错误的地


方主要是当我们需要读取出保存在session的数据时,没有转化为相应的格式,


导致程序出错。比如:

HttpSession session=request.getSession();


|\\\\\\\\\\


注意Session在为进行HttpSession session=request.getSession();之前


out.println(request.getSession());


HttpSession hs=request.getSession();
out.println(hs);
两者执行的结果相同;


第一个是获得Tomcat内置的默认Session (就是会话建立时自动生成的Session唯一标记本次会话)


第二次 是把 唯一的标识Session 通过request.getSession()获取内存地址 给hs 然后hs


会获取Session 然后对其操作  其实本质上是对本次会话的唯一Session进行操作.


\\\\\\\\\\\\\\

String MyName="Hello Accp";

session.setAttribute("name",MyName);

String name=seeeion.getAttribute("name");//错误的

String name=(String)seeeion.getAttribute("name");//正确的

由于WEB服务器为用户创建的Session会占用系统内存,所以通常服务器都需要及


时的删除Session信息以释放资源,方法有:

①关闭浏览器,关闭Session。

②调用HttpSession的invalidate()方法,删除HttpSession对象和数据。

③两次访问时间间隔大于Session定义的非活动时间。

在Servlet中的HttpRequestServlet对象创建HttpSession对象有两种方法:

①HttpSession session=request.getSession(boolean value);

②HttpSession session=request.getSession();

第一中方法中,布尔值为true时,如果存在于当前请求相关联的会话,就返回该


会话,否则就返回一个新会话。反之,布尔值为false时,如果存在当前请求相


关联的会话,就返回该会话,否则就返回null。

第二种方法与第一种方法的第一种情况相同。通常我们都喜欢使用第二种方法。

posted @ 2011-10-16 21:29 Tomas 阅读(223) | 评论 (0)编辑 收藏

 今天主要讲解了一下知识点:
  JavaBean、javaBean规范、javaBean的动作、开发模式

先讲一下javaBean的作用,以及我们为什么要使用javabean?
 其实javabean的一个最主要的作用就是对数据进行一个封装,其次是增强代码的复用性、结构更清晰等。
在换句话说javabean他其实本身就是一个对象,之所以学习javabean的好处,就是让我们像操作对象一样进行操作数据。让代码变得更灵活、更简单。

举个小小的例子:
 比如你做一个注册功能。首先呢我们是需要获取用户界面的信息。然后在获取进来的数据传给持久层,进行持久的时候大家有没有注意到,如果表单里面的数据少的话还可以,直接传入参数,而数据一旦超过10个数据,那么你可以想象一个你传入的参数,那该是多么的一大串,所以我们采取javabean的方式,把从页面上取来的信息把它存放到一个对象当中,那么我们在进行持久化传参的时候就只需要传入一个对象就OK。 这就是javabean的好处之一。

JavaBean规范:
 一个javabean由四部分组成:
  第一部分:javabean必须有一个无惨的构造方法。
  第二部分:所有的属性必须都是private的。
  第三部分:必须生成get/set方法。
  第四部分:必须实现序列化(Serializable)这个接口。

下面我呢针对上面这些javabean的规范做一个解释,以及为什么要定义这个规范?
 1:javabean为什么需要一个无惨的构造方法呢?
回答:这个无惨的构造方法的作用主要是针对反射。为什么会针对反射呢?大家知道使用反射实例化一个类,是实例化该类的一个无惨的构造方法。
 比如:
  如果他是一个无惨的构造方法: Class.forName("com.lovo.User").newInstance.
  如果他没有一个无惨的构造方法:Class c = Class.forName("com.lovo.User");
        手动实例化他所有的公共的构造方法: Constructor[] con = c.getConstructors()

 2:javabean为什么所有的属性都是private的呢,为什么不可以是public的?
回答:private属性增强javabean安全性。他们的区别就是如果他的属性设置为public的话,我们可以任意的进行访问或修改(没有安全性)。而private属性为什么要通过get/set去访问这就是下面马上讲到的。

 3:javaBean的get/set方法。
回答:get/set方法也是增加代码的安全性。比如我们可以让外部只可以访问属性不能修改属性的话,那么我在这里只需要生成get方法就行了,无须生成set方法,而public就无法做到这一点。还有一个就是比如我们在设置他的age的时候我们还可以进行验证工作,比如如果你的age小于18,那么就直接跳出,不允许设置该属性。这个功能也是很强大的。

举个小小列子:
 public void setAge(int age){
 //验证传入进来的age否大于18,如果小于就直接return,否则就添加到该对象的age属性中。
  if(age<18){
   return; 
 }
 this.age = age;
}

 4:实现serializable接口?
回答:为了实现远程调用。比如我们要把该JavaBean从一个操作系统中传输到另一台操作系统,我们就只有采取实现该接口。

JavaBean的动作:
    <!-- 创建user对象 -->
 1: 创建动作:  <jsp:useBean id="user" class="com.lovo.User" scope="request" />
    id:一个变量名。可以任意取。
    classs:指明变量的类型,也就是说具体描述的一个对象。包名加类名
    scope:总用于范围。 也就是说在我们在查找一个属性值的时候,首先是从他的一个作用域中去进行查找,如果找到就直接把它输出,否则创建一个新的(null)。

    <!-- 设置user对象中的userName属性 单一属性。。-->
 2:设置动作:     <jsp:setProperty name="user" property="userName" value="222" param="123"/> 
     name:必须和创建动作的id一样。
     property:具体的某一个属性值。
     value:设置该属性的值。
     param:是将请求到的值附加到userName属性中.
  
    <!-- 代表名字相同的自动填充。 如:http://localhost:8080/Huang_JavaBean/index.jsp?userName=444&password=123-->
     <jsp:setProperty name="user" property="*"  /> 
     name:必须和创建动作的id一样。
     property:设置相同属性名的值他会自动填充。
    
 3:输出动作:
   
   <!-- 输出信息 。 相似于 out.println(user.getuserName()) -->
   <jsp:getProperty name="user" property="userName" />
   <jsp:getProperty name="user" property = "password"/>
开发模式:
 为什么进行分层的开发?
  1:主要是为了并发性的开发项目。比如:你做持久层,我做业务层
  2:可以独立的测试,每一个方法。
  3:分层的开发的好处还有一个就是一处代码的改变不会影响到另一处代码的改变。

在这里说一下servlet和jsp的一些缺陷.
 servlet的缺陷使web应用程序开发变得非常繁琐且不利于分工协作。
 jsp页面严重的缺乏代码的可读性而且没有将页面的表现和业务逻辑分开,使维护变得更加复杂。

在这章讲到了两种开发模式:
 模式一:JSP+JavaBean
 模式二:JSP+Servlet+JavaBean

现在大多数情况下都不用模式一,所以我就解释了。
所谓的模式二就是现在比较流行的一个模式,也叫MVC模式。

那么什么是MVC模式?

      M(model)模型层,即完成业务功能部分,也要完成持久功能。

      V(view)视图层,用于客户端进行页面展现的部分,一般是jsp和html。

      C(controller)控制层,转么用于调用业务层,进行逻辑判断,看他跳入那个页面。

MVC的一个最大的好处是实现了良好的松散耦合。

  PO(persistentobject)持久化对象,它通常是在分析系统需求时,外名词或名词短语中抽取出来(javaBan).

  DAO(datebase access  object)数据库访问对象,用于对象关系映射时或对象持久化,他封装了所有的JDBC操作

  BO(business   Object)业务层对象,用于完成业务功能的类

  VO(value object)值对象,用于封装各层次间要传输的数据

 

posted @ 2011-10-10 23:18 Tomas 阅读(481) | 评论 (0)编辑 收藏