当我们把业务处理的代码与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. pyhton 网络爬取软考题库保存text

    #-*-coding:utf-8-*-#参考文档#https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#find-al ...

  2. BZOJ 1572 USACO 2009 Open 工作安排

    先把工作按照Deadline从小到大排序 然后按顺序取,deadline大于现在总用时就取,等于现在总用时就从前面已取的工作中找一个P最小的同它比较,取P较大的一个 用优先队列维护已取工作中P的最小值 ...

  3. 优雅到骨子里的Requests

    例子与特性 可以说Requests最大的特性就是其风格的简单直接优雅.无论是请求方法,还是响应结果的处理,还有cookies,url参数,post提交数据,都体现出了这种风格. 以下是一个简单例子: ...

  4. 爬虫——response中获取的不带主域名的url的拼接

    scrapy中response提取的没有主域名的url拼接 # 1.导入urllib的parse # 2.调用parse.urljoin()进行拼接,例子中response.url会自动提取出当前页面 ...

  5. strtod-strtod, 字符串 转 数字 函数

    strtod()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,到出现非数字或字符串结束时('\0')才结束转换,并将结果返回.若endptr不为 NULL,则会将遇 ...

  6. spring mvc之applicationContext

    1.ApplicationContext是在package org.springframework.context下,是spring的,spring context包下的. applicationCo ...

  7. 全部对于Unity3D中 NGUI 触发事件的监听方法

    NGUI事件的种类非常多.比方点击.双击.拖动.滑动等等,他们处理事件的原理差点儿万全一样,本文仅仅用button来举例. 方法一.直接监听事件 把以下脚本直接绑定在button上.当button点击 ...

  8. GDUT Krito的讨伐(bfs&amp;&amp;优先队列)

    题意 Description Krito最终干掉了99层的boss,来到了第100层. 第100层能够表示成一颗树.这棵树有n个节点(编号从0到n-1),树上每个节点可能有非常多仅仅怪物. Krito ...

  9. object-c 不定參数的遍历和原理

    object-c接收随意类型的參数: /** * 接收String类型的多个參数 * @param firsParam 第一个參数 */ -(void)TestString:(NSString*)fi ...

  10. 分享修改密码的SharePoint Web part: ITaCS Change Password web part

    Codeplex 上有一个现成的修改密码的Web part, 在SharePoint 2010和SharePoint 2013都可以用 项目地址:http://changepassword.codep ...