当我们把业务处理的代码与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>
<%
} %>

Java_Web之分层架构的更多相关文章

  1. ABP(现代ASP.NET样板开发框架)系列之3、ABP分层架构

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之3.ABP分层架构 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  2. Apworks框架实战(四):使用Visual Studio开发面向经典分层架构的应用程序:从EasyMemo案例开始

    时隔一年,继续我们的Apworks框架之旅.在接下来的文章中,我将逐渐向大家介绍如何在Visual Studio中结合Apworks框架,使用ASP.NET Web API和MVC来开发面向经典分层架 ...

  3. 应用程序框架实战十八:DDD分层架构之聚合

    前面已经介绍了DDD分层架构的实体和值对象,本文将介绍聚合以及与其高度相关的并发主题. 我在之前已经说过,初学者第一步需要将业务逻辑尽量放到实体或值对象中,给实体“充血”,这样可以让业务逻辑高度内聚, ...

  4. 应用程序框架实战十七:DDD分层架构之值对象(层超类型篇)

    上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见.这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好的实践.但是设计与实践的好与坏,对于不 ...

  5. 应用程序框架实战十六:DDD分层架构之值对象(介绍篇)

    前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持.本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分. 如果说你已经在使用DDD分层架构,但你却从来没有使 ...

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

    在应用程序框架实战十四:DDD分层架构之领域实体(基础篇)一文中,我介绍了领域实体的基础,包括标识.相等性比较.输出实体状态等.本文将介绍领域实体的一个核心内容——验证,它是应用程序健壮性的基石.为了 ...

  7. 应用程序框架实战十四:DDD分层架构之领域实体(基础篇)

    上一篇,我介绍了自己在DDD分层架构方面的一些感想,本文开始介绍领域层的实体,代码主要参考自<领域驱动设计C#2008实现>,另外参考了网上找到的一些示例代码. 什么是实体 由标识来区分的 ...

  8. 应用程序框架实战十三:DDD分层架构之我见

    前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构 ...

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

    阅读目录: 1.背景介绍 2.简要回顾下传统三层架构 3.企业级应用分层架构(现代分层架构的基本演变过程) 3.1.服务层中应用契约式设计来解决动态条件不匹配错误(通过契约式设计模式来将问题在线下暴露 ...

随机推荐

  1. C#关键字详解第三节

    byte:字节 字节是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位,也在一些计算机编程 语言中表示数据类型和语言字符.这是百度百科给出的解释,在C#语言中byte也可以是一种 ...

  2. linux学习1-基础知识

    1.输入一行字跳到行头 ctrl+a:跳到行尾 ctrl+e: 2.一次创建多个文件 touch love_{1..10}_linux.txt touch love_{1,3,5}_linux.txt ...

  3. Linux系统自带服务罗列

    /ect/services 文件列出了系统详细的服务 红色字体为常用服务 acpid ACPI(全称 Advanced Configuration and Power Interface)服务是电源管 ...

  4. [POJ2912]Rochambeau(并查集)

    传送门 题意: n个人分成三组,玩石头剪子布游戏,同一组的人只能出同样固定的的手势,其中有一个是裁判不属于任何组,可以出任意手势,给出m个信息x op y 表示x,y是从三个组里面随机抽取的或者是裁判 ...

  5. 在django里用xlwt作EXCEL导出功能

    参考了以前kevin的代码,搞起来快呀,哈哈哈,,阿里亚多.... 代码的意思比较明白,不注释,几乎自解释... 就是定义EXCEL时,比较硬生生的,一步一步没有快捷的方法. 另外就是取时间出来时,如 ...

  6. L - 贪心 基础

    Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major problem. The shor ...

  7. XMPP基本内容简单介绍

    即时通讯技术简单介绍 即时通讯技术(IM)支持用户在线实时交谈.假设要发送一条信息,用户须要打开一个小窗体,以便让用户及其朋友在当中输入信息并让交谈两方都看到交谈的内容.有很多的IM系统,如AOL I ...

  8. 我对ThreadLocal的理解

    声明:小弟菜狗一个.对ThreadLocal的描写叙述和理解难免有所偏差 近期由于须要深入的了解android的handler消息机制而去查看了Looper的源代码.众所周知在主线程中是不须要在程序猿 ...

  9. codeforces Looksery Cup 2015 D. Haar Features

    The first algorithm for detecting a face on the image working in realtime was developed by Paul Viol ...

  10. Modern Qt Development: The Top 10 Tools You Should Be Using

    Published Friday October 12th, 2018Leave a comment Posted in Biz Circuit & Dev Loop, C++, QtCrea ...