大数据WEB阶段(十四)JavaEE开发模式

来源:互联网 发布:sqlserver免费版 编辑:程序博客网 时间:2024/06/05 17:48

JavaEE开发模式

零、目录

  • 开发模式发展历程
  • MVC设计思想的出现
  • JavaEE经典三层架构
  • 经典三层架构解耦

一、开发模式发展历程

  1. Servlet是JavaEE开发中一种动态web资源开发技术 , 但是在做输出响应页面时及其繁琐 。
  2. JSP表面看上去像是Html , 但本质上是Servlet ,可以在其中插入java代码 , 所以也是一种动态web资源 , 他能更好的用于展示页面 , 也能处理一些业务逻辑 。
  3. JavaEE开发模式一: JSP+JavaBean
  4. JavaEE开发模式二: Servlet+JSP+JavaBean

二、MVC思想的出现

  1. 在开发模式的发展中 , 一些人总结出软件可以人为地分为Model 、 View 、 Controller三部分 , 也就是MVC设计模式的出现 。
  2. MVC设计模式要求这三部分尽量独立开来 , 互不干扰 , 这样使程序结构清晰 ,便于开发和维护

三、JavaEE的经典三层架构

  1. 开发者将MVC设计思想融入了JavaEE开发模式中 ,由此衍生出了JavaEE开发的经典三层架构 。 将JavaEE的开发过程分为web层 、 service层 、 dao层 三层。
  2. 分层的优势:
    1. 分层 的目的在于代码更具有优良的结构 , 便于开发和维护 。
    2. 便于层与层之间实现代码的复用 , 减少代码的冗余 。
    3. 在更改某一模块时可以不影响其他模块的使用 , 实现模块的复用 。
      1. 如:需要将底层的数据库换为Orcal时, 不需要 更改Web层和Service层 。
  3. 为了实现第三个分层的优点 , 三层架构要求 , 层与层之间尽量的独立 , 不要胡乱传递某一层特有的对象 , 例如不要将web层特有的对象传递到 其它层 , 以为一旦这样做 ,这些某一层特有的对象就侵入到了其它层 , 一旦要替换这一层时 , 不可避免的跟着修改其它层 , 这种情况称之为层与层之间发生了耦合 。

四、三层架构解耦

  1. 层与层之间的耦合是有害的 , 应该尽量避免或消除 , 解决 这些耦合的过程称之为解耦 。 最终希望实现高内聚 、 低耦合的状态(提高模块内的利用率, 降低模块之间的依赖性) 。
  2. 解耦的实现:

    1. 不要胡乱传递某一层所特有的对象
    2. 但是再小心 , 层与层之间也必须要存在着某种关系才能成为一个整体的应用 , 这些耦合是无法避免的 。 所以要把这些耦合管理起来 , 把这些耦合控制在可控的范围内 。
    3. 接口+配置文件+工厂设计模式实现层与层之间的解耦:

      1. 案例:

        1. servlet中与要实现的用户业务逻辑未解耦之前:在Servlet中:Userservice us = new UserServiceImpl();//需要指定实例化具体的哪一个对象 , 产生了耦合(Uservice是接口)解耦之后:UserService us = BaseFactory.getFactory().getInstance(UserService.class);//并没有指定具体的对象 , 而是由工厂类从配置文件中读取配置具体的实现类 ,没有耦合2. 配置文件config.properties中的内容:UserService=com.tj.service.UserServiceImpl.java3. 工厂类实现:    public class BaseFactory {    private static BaseFactory base = new BaseFactory();    private static Properties prop = new Properties();    static{        try {            String path = BaseFactory.class.getClassLoader().getResouce("config.properties").getPath();            prop.load(new FileInputStream(path));        } catch (Exception e) {            e.printStackTrace();        }    }    private BaseFactory(){}    public static BaseFactory  getBase(){        return base;    }    public <T>T getInstance(Class<T> clz) throws InstantiationException, IllegalAccessException, ClassNotFoundException{        //读取配置文件中的属性        String name= prop.getProperty(clz.getSimpleName());        return  (T) Class.forName(name).newInstance();    }}