采用标准的架构:描述从低层到高层
首先是系统分析,找出你需要什么功能,然后按照下面的步骤执行:

数据库层:数据库层就是SQL语句、数据库、表、视图、触发器等等的创建和管理。这一层和JAVA无关,但是却是最重要的一层
持久层(Hibernate、JPA、JDBC):这一层的目的很明确,就是ORM,这里还不用你定义接口和类,你只要使用框架就可以了。
DAO层(Data Access Object):这一层比较重要点,这里定义的都是对一些最原始的类进行操作的方法
打个比方:

我们有一个Account类,用来表示账号,那么对应有一个接口

public interface AccountDao
{
Account create( Account account ); //创建一个Account账号
void update( Account acconut ); //修改账号
void delete( int id ); //通过ID删除Account
void find( int id ); //通过ID找到Account
}

然和我们有具体的实现
public class AccountDaoImplForHibernate implements AccountDao
{
//这里实现AccountDao所有的接口
}

这里要说明一下,为什么要这个DAO层,我直接操纵Hibernate框架去完成不就可以了么?为什么要用一个AccountDao在从中进行阻拦。
这就是Java中接口威力所在,定义了一个接口,你就不用管下面的具体实现是用那个框架实现的,总之实现就可以了。因为软件的目的是要重用,而在WEB开发中,每个网站都有自己不同的要求,所以也就让人觉得重用不重用不关我事情:“反正老子就用Hibernate管理数据库了,下次再开发类似的大不了我重写,反正又不难。”很明显,这种思想很实用,似乎马上就能进行开发,但是这明显是错误的思路。

根据我开发B/S系统的经验(容我这么说吧,其实我也没弄过几个),我喜欢利用Dao层把WEB框架和ORM框架隔离开来进行开发。不知道大家在开发WEB站点的时候有么有觉得,每次修改完一个类都得重新部署,每次部署都得重新加载数据源、连接数据库、配置持久化框架稀里哗啦一大堆事情,部署一个项目往往用掉十几甚至几十秒。但是如果我们能利用Dao层进行隔离,那么情景就又是另外一个样子。

我们可以伪造一个数据库,没错,是伪造的,用了HashMap<Integer,Account>对数据库进行简单的模拟。具体来说,就是为测试写一个类去实现AccountDao接口,但是这个类不再连接数据库,而是直接对伪造的数据库,也就是HashMap表进行操作

public class AccountDaoImplForTest
{
//具体实现
}

这样部署起来就快多了。

而对于AccountDaoImplForHibernate的测试,可以通过J2SE应用程序完成,同样也省下了部署WEB到J2EE服务器的时间。效率第一哈~

顺便说说这一层应该抛出的异常。为了屏蔽掉Dao的具体实现,我们很有必要为Dao层自己定义一些异常,用来替代由Hibernate、JDBC他们抛出的异常。这样对于Dao的上一层Service层来说,只看到Dao的东西,其他什么都没看见,也不知道这个Dao具体是Hibernate呢还是JPA呢还是JDBC

同样的道理,我们来看Service层
Service层:在Service层中我们定义这样的接口
public interface AccountService
{
Account register(Account account); //注册
Account login( String username, String password ); //登录
void modify( Account account ); //修改
Account find( int id ); //通过ID获取Account
Account delete( int id ); //删除Account
}

乍看之下,似乎Service层和Dao层差不多,无谓就是多几个方法,那我直接定义到Dao层不可以吗?答案肯定是不可以,真是废话,可以我就不写了。但还是要说说理由:很简单,Service层隔离了业务需求变化和数据库之间的关系。也就是说,不管上面的业务逻辑怎么变化,你只用修改Service层的代码就可以了,Service通过调用Dao来实现对数据库的操纵,很显然Dao不知道Service的存在,所以Service怎么变Dao都不用去理会。除非Service提出了Dao没有实现的要求,比如说Service需要获取所有账号的人数,而我们当初在系统分析的时候没有做好,没在Dao层预留一个方法去获取所有账号的数量,那么这个时候就得被迫修改Dao层了,但是,也仅仅只是修改到Dao层而已,由于Dao层的功劳,你还不必去修改数据库。

所以说,开始项目之前对整个项目进行详尽的业务分析对你定接口是有很直接的因果关系的,分析没做好,那么接口就得整天改,这个时候你还不如不用接口呢~~~

在Service层抛出的异常也有讲究:在Service层,我们只能抛出业务逻辑上的异常,像AccountExistedException(账号已存在)异常啦、UsernameNotFoundException(用户名没找到异常)啦等等,这样Service的上一层就不会感觉到Dao层的存在。

终于到了最后一层:VIEW层
VIEW层:在这一层你不用定接口,你要使用WEB框架的接口、类,至于是STRUTS还是JSF由你定

java web 应用中包,接口的设计的更多相关文章

  1. Java Web开发中MVC设计模式简介

    一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...

  2. 对Java Web项目中路径的理解

    第一个:文件分隔符 坑比Window.window分隔符 用\;unix采用/.于是用File.separator来跨平台 请注意:这是文件路径.在File f = new File(“c:\\hah ...

  3. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

  4. Java Web项目中连接Access数据库的配置方法

    本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...

  5. 在Java Web程序中使用Hibernate

    在Java Web程序中使用Hibernate与普通Java程序一样.本文中将使用Servlet和JSP结合Hibernate实现数据库表的增删改查操作. Web程序中,hibernate.cfg.x ...

  6. 在Java web项目中防止用户注销后使用浏览器中的“后退”按钮返回注销前页面

    一背景 公司安全整改, 要求:系统中对于关键业务操作应确保使用浏览器"后退"功能无法回到上一步操作界面. 提供:凭证提供所有被检查系统关键业务操作后回退视频,视频显示关键业务操作后 ...

  7. JAVA WEB项目中各种路径的获取

    JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报  分类: JAVA开发(41)  1.可以在s ...

  8. linux 下用renameTo方法修改java web项目中文件夹名称问题

    经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服 ...

  9. 在Java Web项目中添加定时任务

    在Java Web程序中加入定时任务,这里介绍两种方式:1.使用监听器注入:2.使用Spring注解@Scheduled注入. 推荐使用第二种形式. 一.使用监听器注入 ①:创建监听器类: impor ...

随机推荐

  1. python简单实现随机验证码

    这是自己在学习pyton时写的一个随机验证码,有不对的地方欢迎指出 代码 import random def verification(): lis = '' for i in range(4): S ...

  2. java Socket Tcp示例三则(服务端处理数据、上传文件)

    示例一: package cn.itcast.net.p5.tcptest; import java.io.BufferedReader;import java.io.IOException;impo ...

  3. 如何在 Linux 下调试动态链接库

    大家都知道在 Linux 可以用 gdb 来调试应用程序,当然前提是用 gcc 编译程序时要加上 -g 参数.我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题. 首先,假设我们准备这样的一个动 ...

  4. HighCharts/Highstock使用小结,使用汉化及中文帮助文档

       此文档是本人在开发过程图形报表时使用HighCharts所遇到的问题及解决方案 .最后附上有HighCharts中文帮助文档 HighCharts  版本:Highcharts-3.0.1 Hi ...

  5. cocos2d-x 旅程開始--(实现单击与长按)

    小菜鸟一枚,学习cocos2d-x已经有一段时间了,感觉进度非常慢那,CSDN也再次拾了起来.近期自己还在学习做小游戏,跟着前辈做了<忍者打怪物>的小游戏,又学习了瓦片游戏<吃西瓜& ...

  6. java导出文件IE/Google文件名乱码兼容

      导出文件名乱码解决方案: String agent = request.getHeader("User-Agent"); boolean isMSIE = (agent != ...

  7. HDUOJ---What Are You Talking About

    What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K ...

  8. 二叉搜索树 C语言实现

    1.二叉搜索树基本概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是一棵具有如下特性的非空二叉树: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非 ...

  9. Microsoft Excel不能访问文件

    Microsoft Excel 不能访问文件"C:\Users\james\Documents\test.xls". 可能的原因有以下几个: • 文件名称或路径不存在. • 文件正 ...

  10. Template Method - 模板方法模式

    1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1: ...