Java_Web之分层架构

当我们把业务处理的代码与JSP代码混在一起,不易于阅读,不易于代码维护,这就需要分层。

分层模式

1、分层模式是最常见的一种架构模式

2、分层模式是很多架构模式的基础

分层

将解决方案的组件分隔到不同的层中

1、在同一个层中组件之间保持内聚性

2、层与层之间保持松耦合

三层模式的划分

1、表示层

2、业务逻辑层

3、数据库访问层

层与层之间的关系

表示层依赖于业务逻辑层,业务逻辑层依赖于数据访问层

三层开发遵循的原则

(1)上层依赖其下层,依赖关系不跨层

1、表示层不能直接访问数据访问层

2、上层调用下层的结果,取决于下层的实现

(2)下一层不能调用上一层

(3)下一层不依赖上一层

1、上层的改变不会影响下一层

2、下层的改变会影响上一层得到的结果

(4)在上一层中不能出现下一层的概念

1、分工明确,各司其职

分层开发的特点

(1)下层不知道上层的存在

1、仅完成自身的功能

2、不关心结果如何使用

(2)每一层仅知道其下层的存在,忽略其他层的存在

1、只关心结果的取得

2、不关心结果的实现过程

3、JSTL通常会与EL表达式合作实现JSP页面的编码

分层开发的优势

1、职责划分清晰

2、无损替换

3、复用代码

4、降低了系统内部的依赖程度

分层开发的案例:

package DB;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 数据库连接帮助类
 * @author Administrator
 *
 */
public class BaseDao {
    //=======数据库连接信息========
    static String url = "jdbc:oracle:thin:@localhost:1521:orcl";
    static String username = "news";
    static String password = "news";
    static String driverClassName = "oracle.jdbc.driver.OracleDriver";

    //获取数据库连接
    public static Connection getConnection(){

        Connection connection = null;

        try {
            //加载驱动
            Class.forName(driverClassName);

            //获取连接
            connection = DriverManager.getConnection(url,username,password);

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return connection;
    }

    /*
     * 释放连接
     * */
    public void close_con(Connection connection,Statement st,ResultSet rs){

        try {
            if(connection!= null){
                connection.close();
            }
            if(st!= null){
                st.close();
            }
            if(rs!= null){
                rs.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
package entity;

/**
 * 用户实体
 * @author Administrator
 *
 */
public class User {

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

}
package Dao;
import java.util.List;

import entity.User;

/**
 * 用户数据访问层接口
 * @author Administrator
 *
 */
public interface UserDao {

    /**
     * 查询用户是否存在
     * @param user
     * @return
     */
    public boolean findUser(User user);

    /**
     * 查询用户列表
     */
    public List<User> findUserList();

}
package Dao.Impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import DB.BaseDao;
import Dao.UserDao;
import entity.User;

/**
 * 用户数据访问层实现类
 * @author Administrator
 * 继承数据库连接类
 */
public class UserDaoImpl extends BaseDao implements UserDao {

    //数据库连接对象
    Connection conn = null;
    PreparedStatement stm = null;
    ResultSet rs = null;

    /**
     * 实现查询用户功能
     */
    public boolean findUser(User user) {
        //获得连接
        conn = this.getConnection();
        //编写sql
        String sql = "select * from news_users where uname = ? and upwd = ?";
        try {

            //得到预编译对象
            stm = conn.prepareStatement(sql);
            stm.setString(1, user.getUsername());
            stm.setString(2, user.getPassword());

            //执行sql得到结果集
            rs = stm.executeQuery();

            return rs.next();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            //释放连接
            this.close_con(conn, stm, rs);
        }

        return false;
    }

    /**
     * 查询用户列表
     */
    public List<User> findUserList() {
        //获得连接
        conn = this.getConnection();
        //编写sql
        String sql = "select * from news_users";

        //创建泛型集合
        List<User> userlist = new ArrayList<User>();
        try {

            //得到预编译对象
            stm = conn.prepareStatement(sql);

            //执行sql得到结果集
            rs = stm.executeQuery();
            while(rs.next()){
                User user = new User();
                user.setUsername(rs.getString(2));
                user.setPassword(rs.getString(3));

                userlist.add(user);
            }

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }finally{
            //释放连接
            this.close_con(conn, stm, rs);
        }

        return userlist;
    }

}
package Biz;

import java.util.List;

import entity.User;

/**
 * 用户业务逻辑层接口
 * @author Administrator
 *
 */
public interface UserBiz {

    /**
     * 用户登录
     * @param user
     * @return
     */
    public boolean login(User user);

    /**
     * 查询用户列表
     */
    public List<User> finduserList();

}
import Dao.UserDao;
import Dao.Impl.UserDaoImpl;
import entity.User;
/**
 * 用户业务逻辑实现类
 * @author Administrator
 *
 */
public class UserBizImpl implements UserBiz {

    //创建数据访问层对象
    UserDao userdao = new UserDaoImpl();

    /**
     * 实现登录
     */
    public boolean login(User user) {
        //调用数据访问层查询用户
        return userdao.findUser(user);
    }

    /**
     * 查询用户列表
     */
    public List<User> finduserList() {
        // TODO Auto-generated method stub
        return userdao.findUserList();
    }

}

JSP页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP ‘index.jsp‘ starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
    <form action="dologin.jsp" method="post">
        <p>用户名:<input type="text" name="username" /></p>
        <p>密    码:<input type="password" name="password" /></p>
        <input type="submit" />
    </form>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="Biz.UserBiz"%>
<%@page import="Biz.Impl.UserBizImpl"%>
<%@page import="entity.User"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

    //调用业务逻辑层
    UserBiz userbiz = new UserBizImpl();

    //获取表单项
    request.setCharacterEncoding("utf-8");

    String username = request.getParameter("username");
    String password = request.getParameter("password");

    //创建用户实体
    User user = new User();
    user.setUsername(username);
    user.setPassword(password);

    //实现登录
    boolean f = userbiz.login(user);

    if(f){
        request.getRequestDispatcher("success.jsp").forward(request,response);
    }else{
        %>
            <script type="text/javascript">
                alert("用户名或密码错误!");
                location.href="index.jsp";
            </script>
        <%
    }

%>
时间: 05-20

Java_Web之分层架构的相关文章

[Architect] ABP(现代ASP.NET样板开发框架)(2) 分层架构

本节目录 介绍 Domain Layer Application Layer Infrastructure Layer Web Layer SPA & MPA frameworks/libraries 其他 介绍 为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术. ABP遵循Domain Driven Design,在DDD中,会有4个基础分层. Presentation(展现层): 引用 Application Layer ,提供用户界面. Application(应用层

应用程序框架实战十三:DDD分层架构之我见(转)

前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构,使用单层架构和普通三层架构一样可以,不过你如果希望获得更进一步的复用性和封装度,使用更加面向对象的技术是必经之程. 我在2010年以前还在使用古老的ASP.NET WebForm和原始的Ado.Net.之前我有个观念:.NET技术发展太快,跟着微软屁股后面跑太累,所以只使用它一些原始的东西,自己封

从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构

Microsoft.AspNet.Identity简介 Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的membership以及WebPage所带来的SimpleMembership(在MVC 4中使用)都有所不同. Microsoft.AspNet.Identity是符合微软开放Owin标准里面Security标准的一种实现.且在MVC 5中默认使用EntityFramework作为Microsoft.A

分层架构

分层架构 最近有一位同事在周会上做了有关SOA的分享,在开始时提出了一个问题,在我们开始一个项目时,是按照功能层面进行架构分拆(例如Customer项目,Order项目),还是按照结构层面进行架构分拆(例如Model层,View层).恰巧在前几天的一个后台项目重构过程中,一个同事也问了我类似的问题,所以想在这里简单记录下. 分层架构 1 我们先看传统的分层架构(Layer Pattern),它是以结构层面对软件项目进行分层划分,将应用程序划分为多个子任务,让每个任务处于一个单独的架构层,完成独立

应用程序框架实战七:分层架构的选择

建立应用程序框架,首先要考虑的问题是,你准备采用哪种分层架构,然后根据应用程序框架的逻辑层次来确定需要创建的VS解决方案和程序集. 如果项目很小,需求很简单,时间异常紧迫,且你手上没有任何积累,那么,单层架构将是首选,最简单的单层架构如下图所示(为了集中你的注意力,我把不相关的文件都删除了). 单层架构的主要优势是代码火力集中,干活直截了当,不像多层架构那样拐弯抹角,每个操作都需要层层传递.对于上图的User.aspx,所有相关代码都直接写到aspx页面或后置代码中,包括界面上的控件操作,业务操

.NET应用架构设计—重新认识分层架构(现代企业级应用分层架构核心设计要素)

阅读目录: 1.背景介绍 2.简要回顾下传统三层架构 3.企业级应用分层架构(现代分层架构的基本演变过程) 3.1.服务层中应用契约式设计来解决动态条件不匹配错误(通过契约式设计模式来将问题在线下暴露出来) 3.2.应用层中的应用控制器模式(通过控制器模式对象化应用层的职责) 3.3.业务层中的命令模式(事务脚本模式的设计模式运用,很好的隔离静态数据) 4.服务层作为SOA契约公布后DTO与业务层的DomainModel共用基本的原子类型 5.两种独立业务层职责设计方法(可以根据具体业务要求来搭

ABP分层架构

ABP分层架构 基于DDD的现代ASP.NET开发框架--ABP系列之3.ABP分层架构 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 前言 为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术.为了实现分层的体系结构,ABP遵循D

基于DDD的现代ASP.NET开发框架--ABP系列之3、ABP分层架构

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之3.ABP分层架构 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 前言 为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术.为了实现分层的体系结

应用程序框架实战十五:DDD分层架构之领域实体(验证篇)

在应用程序框架实战十四:DDD分层架构之领域实体(基础篇)一文中,我介绍了领域实体的基础,包括标识.相等性比较.输出实体状态等.本文将介绍领域实体的一个核心内容——验证,它是应用程序健壮性的基石.为了完成领域实体的验证,我们在前面已经准备好了验证公共操作类和异常公共操作类. .Net提供的DataAnnotations验证方法非常强大,Mvc会自动将DataAnnotations特性转换为客户端Js验证,从而提升了用户体验.但是客户端验证是靠不住的,因为很容易绕开界面向服务端提交数据,所以服务端