这一节我们开始对项目进行分层,一般来说,一个web项目的层次结构如下图所示:

controller层为我们的控制层,用来接收用户的请求,比如新增一个学生的信息,新增的请求最先就是走到这一层。controller层只管接收用户的请求,不会涉及太多的业务处理操作。但凡涉及到业务处理,就交给service层来操作。所以,controller层中必然拥有某一个service层的引用。

service层主要用来处理一些业务逻辑,不做任何的数据库操作。数据库的操作都交给dao层来做,因此,在service层中必然拥有一个dao层的引用。

一般来说,service层和dao层中,都是直接存放的接口类,然后专门有一个包放所有接口的具体实现类,impl就是指每个接口对应的实现类。

说了这么多概念,还是让我们一步一步来实际操作吧。首先,新建两个包,service包和dao包。

然后,在每个包里面再新建一个impl包,用来放所有的实现类。

接下来,我们在service包里面新建一个UserService接口类,注意,是接口哦:

有了接口以后,就得有对应的实现类,接着就在impl包下面建一个该接口的实现类,注意,是java类哦:

代码:

public class UserServiceImpl implements UserService{

}

同理,建立 UserDao 接口和 UserDaoImpl 类。

建好之后,考虑到我们的UserController中,从前台拿到了username,password,name和sex的值,思考一下如何才能把这些东西传到dao层呢?

我们可以在controller层中加入一个service层的引用:

@Controller
public class UserController { //用户业务类的引用
private UserService userService = new UserServiceImpl(); @RequestMapping("/addUser")
public void addUser(HttpServletRequest request , HttpServletResponse response){
String username = request.getParameter("username");
String password = request.getParameter("password");
String name = request.getParameter("name");
String sex = request.getParameter("sex"); System.out.println(username);
System.out.println(password);
System.out.println(name);
System.out.println(sex); }
}

然后,我们需要在addUser方法里面调用service层的方法,为了避免产生过多的参数,我们先创建一个bean包,专门用来存放实体类。然后,新建一个student实体类:

package com.app.bean;

public class Student {

	private int id;
private String username;
private String password;
private String name;
private String sex; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student [id=" + id + ", username=" + username + ", password=" + password + ", name=" + name + ", sex="
+ sex + "]";
} }

Spring框架支持数据动态绑定,所以我们直接这样写:

@Controller
public class UserController { //用户业务类的引用
private UserService userService = new UserServiceImpl(); @RequestMapping("/addUser")
public void addUser(HttpServletRequest request , HttpServletResponse response,Student student){ System.out.println(student); }
}

可见,我们使用Spring来做数据绑定是非常easy的。

然后,调用service层的方法,把这个学生数据传递到service中去。

UserController:

@Controller
public class UserController { //用户业务类的引用
private UserService userService = new UserServiceImpl(); @RequestMapping("/addUser")
public void addUser(HttpServletRequest request , HttpServletResponse response,Student student){ userService.addUser(student); }
}

UserService:

public interface UserService {

	void addUser(Student student);

}

UserServiceImpl:

public class UserServiceImpl implements UserService{

	@Override
public void addUser(Student student) { } }

同理,在service层中又需要加入一个dao层的引用,最终希望把student对象传递到dao层:

UserServiceImpl :

public class UserServiceImpl implements UserService{

	private UserDao userDao = new UserDaoImpl();

	@Override
public void addUser(Student student) { userDao.addUser(student); } }

UserDao :

public interface UserDao {

	void addUser(Student student);

}

UserDaoImpl :

public class UserDaoImpl implements UserDao {

	@Override
public void addUser(Student student) { } }

图解:

以上就是整个的分层结构,然后,我们继续学生新增的业务流程,改写一下dao层的方法:

package com.app.dao.impl;

import java.util.HashMap;
import java.util.Map; import com.app.bean.Student;
import com.app.dao.UserDao;
import com.simple.dao.SimpleDao; public class UserDaoImpl implements UserDao { @Override
public void addUser(Student student) { SimpleDao dao = new SimpleDao(); Map map = new HashMap(); map.put("id", null);
map.put("username", student.getUsername());
map.put("password", student.getPassword());
map.put("name", student.getName());
map.put("sex", student.getSex()); dao.save("db_student", "t_student", map); } }

因为只是一个简单的保存操作,我们直接调用simpleDao的save即可。测试过后,是完全没问题的。

我要下载源码

【Java框架型项目从入门到装逼】第十二节 项目分层的更多相关文章

  1. 【Java框架型项目从入门到装逼】第七节 - 学生管理系统项目搭建

    本次的教程是打算用Spring,SpringMVC以及传统的jdbc技术来制作一个简单的增删改查项目,对用户信息进行增删改查,就这么简单. 1.新建项目 首先,打开eclipse,新建一个web项目. ...

  2. 【Java框架型项目从入门到装逼】第一节 - Spring框架 IOC的丧心病狂解说

    大家好,好久不见,今天我们来一起学习一下关于Spring框架的IOC技术. 控制反转--Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的 ...

  3. 【Java框架型项目从入门到装逼】第五节 - 在Servlet中接收和返回数据

    在上一节的程序中,我们可以看到HttpServletRequest, HttpServletResponse这两个对象.可以说,这是JavaWeb中至关重要的两个对象.接下来,我们来做一个简短的说明: ...

  4. 【Java框架型项目从入门到装逼】第三节 - 如何用Tomcat发布web项目?

    啥叫Tomcat?有道词典是这么说的. 这个我们姑且不管,实际上呢,Tomcat是一种Web服务器,我们自己做好了一个Web项目,就可以通过Tomcat来发布.服务器呢,又分为硬件服务器和软件服务器. ...

  5. 【Java框架型项目从入门到装逼】第四节 - 编写第一个Servlet程序

    在开始这一节之前呢,我们还需要把Tomcat配置到Eclipse中,配置的方式很简单,打开Eclipse,Window,Preferences,进入到这个页面: 将Tomcat的安装目录配置到Ecli ...

  6. 【Java框架型项目从入门到装逼】第九节 - 数据库建表和CRUD操作

    1.新建学生表 这节课我们来把和数据库以及jdbc相关的内容完成,首先,进行数据库建表.数据库呢,我们采用MySQL数据库,我们可以通过navcat之类的管理工具来轻松建表. 首先,我们得建一个数据库 ...

  7. 【Java框架型项目从入门到装逼】第十四节 查询用户列表展现到页面

    这一节,我们来实现一下用户列表搜索,最终的效果如下: 这边我们要使用easyUI给我们提供的datagrid组件. HTML结构如下 <!-- 数据列表 --> <table id= ...

  8. 【Java框架型项目从入门到装逼】第八节 - 用EasyUI绘制主界面

    1.引入资源包 在上一节中,我们把基本的框架都搭好了,用了Spring,SPringMVC.这一节,我们先来画页面,前端框架采用EasyUI来实现. easyui是一种基于jQuery的用户界面插件集 ...

  9. 【Java框架型项目从入门到装逼】第十三节 用户新增功能完结篇

    这一节,我们把用户新增的功能继续做一个完善.首先,新增成功后,需要给前台返回一个信息,就是告诉浏览器,这次用户新增的操作到底是成功了呢,还是失败了呢?为此,我们需要专门引入一个结果类,里面只有两个属性 ...

随机推荐

  1. Android 根据字符串动态获取资源ID

    1.常用方法public int getResId(String name,Context context){ Resources r = context.getResources(); int id ...

  2. [TLSR8266] 1、搭建tlsr8266编译框架在win服务器中

    前言 泰凌微TLSR8266蓝牙芯片的开发环境在win桌面系统中搭建起来比较简单,在其论坛SDK版块->Telink IDE中可以找到安装包,直接安装即可生成基于Eclipse的开发环境,及相关 ...

  3. For循环将将数字集合分类写入字典

    有以下数字集合[11,22,33,44,55,66,77,88,99,25,35,45,66,88],将所有大于66的值保存至字典的第一个key中,将小于66的值保存至第二个key的值中.即{'k1' ...

  4. ajax 处理请求回来的数据

    比如接口 /test, 请求方式get, 请求过来的数据要处理在container 里,如下代码 $.get("/test", {}, function(result){ $(&q ...

  5. iOS 动画篇 (三) CADisplayLink与CoreGraphics实现动画

    本文主要介绍利用CoreGraphics和CADisplayLink来实现一个注水动画.来一个效果图先: 在介绍注水动画前,先介绍利用CoreGraphics实现进度条的绘制. 一.扇形进度绘制 效果 ...

  6. Flask-SQLAlchemy

    Flask-SQLAlchemy   SQLAlchemy 一. 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言 ...

  7. Java源码解读(一) 8种基本类型对应的封装类型

    说起源码其实第一个要看的应该是我们的父类Object,这里就不对它进行描述了大家各自对其进行阅读即可. 一.八种基本类型 接下来介绍我们的八种基本类型(这个大家都知道吧):char.byte.shor ...

  8. Inception服务的安装以及使用Python 3 实现MySQL的审计

    Inception服务的安装以及使用Python实现MySQL的审计 Bison是Inception服务所依赖的包之一,但是某些Linux版本已安装的Bison,或者是通过yum安装的Bison,通常 ...

  9. CTF---安全杂项入门第三题 这是捕获的黑客攻击数据包,Administrator用户的密码在此次攻击中泄露了,你能找到吗?

    这是捕获的黑客攻击数据包,Administrator用户的密码在此次攻击中泄露了,你能找到吗?分值:30 来源: 2014sctf 难度:难 参与人数:3918人 Get Flag:384人 答题人数 ...

  10. 51 nod 1203 JZPLCM

    原题链接 长度为N的正整数序列S,有Q次询问,每次询问一段区间内所有数的lcm(即最小公倍数).由于答案可能很大,输出答案Mod 10^9 + 7.   例如:2 3 4 5,询问[1,3]区间的最小 ...