当我们把业务处理的代码与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. springcloud(六):给Eureka Server服务器端添加用户认证

    1.  还未完成 ,客户端有点问题,后期完善 2.

  2. 个人学习记录--取表中Name相同的最大值,非Group By,可延伸

    ), qy ), je INT); INSERT INTO @t SELECT '产品一', '北京', UNION ALL SELECT '产品一', '上海', UNION ALL SELECT ...

  3. linux学习3-简单磁盘管理

    简单的磁盘管理 下面涉及的命令具有一定的危险性,操作不当可能会丢失你的个人数据,初学者建议在虚拟环境中进行操作 通常情况下,这一小节应该直接将如何挂载卸载磁盘,如何格式化磁盘,如何分区,但如你所见,我 ...

  4. hadoop datanode usages方差算法

    stdDev 标准差(方差) 阐述及应用 简单来说,标准差是一组数值自平均值分散开来的程度的一种测量观念.一个较大的标准差,代表大部分的数值和其平均值之间差异较大:一个较小的标准差,代表这些数值较接近 ...

  5. Scrapy——6 APP抓包—scrapy框架下载图片

    Scrapy——6 怎样进行APP抓包 scrapy框架抓取APP豆果美食数据 怎样用scrapy框架下载图片 怎样用scrapy框架去下载斗鱼APP的图片? Scrapy创建下载图片常见那些问题 怎 ...

  6. [luoguP2024] 食物链(并查集)

    传送门 经典的并查集问题 对于这种问题,并查集需要分类 开3*n的并查集,其中x用来连接与x同类的,x+n用来连接x吃的,x+2*n用来连接x被吃的. 1 x y时,如果 x吃y 或 x被y吃,那么为 ...

  7. 【Todo】Java TreeSet学习 & ceiling,floor

    参考 http://www.yiibai.com/java/util/java_util_treeset.html 另,用Java的TreeSet的ceiling可以模拟upper_bound(获得更 ...

  8. Libs文件夹下的Jar文件为什么不会自己主动放在Android Private Libraries文件夹下

    简而言之:这个问题就是由jar包反复冲突了! 这个问题一開始我出现了一种"自以为是"的答案,在Android Private Libraries文件夹下的是会打包到project可 ...

  9. Maven中的dependency的scope作用域详解

    1.test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖 2.compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去 3.provided依赖:在编译和测试的过程有效,最后 ...

  10. 《Android源代码设计模式解析与实战》读书笔记(十八)

    第十八章.代理模式 代理模式也称托付模式,是结构型设计模式之中的一个.是应用广泛的模式之中的一个. 1.定义 为其它对象提供一种代理以控制对这个对象的訪问. 2.使用场景 当无法或不想直接訪问某个对象 ...