0%

三层结构归纳整理

三层架构:

用户层UI
服务层Service
数据层DAO

UI—->服务层—–>DAO层—–>数据库
UI<—-服务层<—–DAO层<—–数据库

web项目结构(IDEA):

image.png

DAO层:

DAO层操作数据库—->数据库连接池JDBC、C3P0——–>数据库MySQL
1:导入依赖的jar包,在WEB层里面,WEB-INFO/lib目录下面。
2:在domain中创建数据库中对应的实体类。(传递数据)
2:在具体实现类中,操作流程如下:

  • 继承DAO层父级接口
  • 重写实现方法
  • 获取连接池对象(请配置好对应的c3p0-config.xml文件)
    1
    QueryRunner qr=new QueryRunner(JDBCUtil.dataSource);
    在实现方法中:
    DML—–>qr.update()
    DQL——>qr.query()
    1
    2
    3
    4
    5
    6
    //qr.query(sql语句,resultset结果集处理方式,Object... paramsql中有几个?就应该给几个实参)
    /**
    * sql:select 结果分为三种情况
    * 1. 查询结果是多行多列 BeanListHandler<表对应的java类型>
    * 2. 查询结果是单行多列 BeanHandler<表对应的java类型>
    * 3. 查询结果是单行单列,一般是聚合函数 select count() from sum() max() min() avg() ScalarHandler===>Object
    1
    返回值 int  参数(sql语句,Object... paramsql)

服务层Service:

承上启下,中间过渡。

  1. 定义接口和实现类
  2. 接口可以复制同名的DAO层接口(可以适当的修改方法名,方便前端调用)
  3. 在具体实现类中,操作流程如下:
    1
    UserDao userdao = new UserDaoImpl();
    在具体的方法里面直接调用DaoImpl对象的方法即可。
    当然也可以写入逻辑内容,比如判断传递的数据是否合法。

用户层UI:

在开始写页面前,强烈建议先测试前面的功能是否已经完成无误。
在WEB下面新建网页,开始写前端页面,通过servlet组件来传递数据。

  1. 写一个功能名+servlet的类,使其继承Servlet接口或其子类如HttpServlet等。
  2. 操作如下:
    1
    2
    3
    4
    5
    6
    7
    HttpServletRequest:获取请求对象
    HttpServletResponse:获取响应对象
    1:使用HttpServletRequest对象获取用户传递的信息
    2:创建domain里的对象来保存用户传递的信息
    3:创建ServiceImpl对象,调用方法,获得返回值
    4:使用HttpServletResponse对象的getWriter()方法创建PrintWriter对象
    5:使用PrintWriter对象将返回内容显示给前端网页
    1
    2
    3
    1:获取传递的信息
    2:处理信息(封装成类,验证合法,传递后台)
    3:返回处理的结果
    配置文件web.xml:
    1
    2
    3
    4
    5
    6
    7
    8
    <servlet>
    <servlet-name>UserLoginServlet</servlet-name>
    <servlet-class>servlet.UserLoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>UserLoginServlet</servlet-name>
    <url-pattern>/Login</url-pattern>
    </servlet-mapping>
  • 第2行和第6行的名字必须一样
  • 第3行输入完整的引用名:包名.类名
  • 第7行输入/起的别名(HTML中提交表单要用)
    1
    action:/虚拟路径名称/servlet配置的url-pattern

问题和猜想:

1:为什么要使用一个父接口对应一个实现类?

明明只需要一个实现类就可以完成的,为什么要多此一举?

1
2
3
4
可能是为了解耦,用接口隔离来实现的。
说人话就是,为了防止类和类之间的依赖关系过大。
比如我后期想要修改和维护,如果没有接口的话,我就必须修改类,而且还很难测试。
但是我有了接口,我就完全可以重新写一个实现类,在本地测试完成之后在发布,这样就不会影响到已经发布并且在运行的项目了。

2:为什么要架构三层而不是两层?

1
2
3
4
5
6
7
8
因为如果服务层Service啥事不干的话,我们完全可以直接两层:
UI层-->DAO层
但是问题来了?
如果有人绕过了UI层的验证怎么办?
DAO层是不可能写验证的,那么他将直接将没验证的内容存进数据库,这是危险的操作。
所以,必须要在服务端再加上一层验证:
UI层(js验证)+服务端(java验证)一共两层验证。
因为客户端在用户本地很容易被修改,但是服务器不容易被访问修改,所以在服务端加上一层是很有必要的。