本人在学习Servlet+JSP时候,是直接看的一个40课时的实战项目。根据项目学习写这种项目时候的套路。
学习了包括如何分层,数据结构的使用,文件,接口的整理,还有servlet+jsp的基础知识等。
本文主要介绍的是Servlet+jsp 开发图书管理系统的流程。
有关servlet和jsp的基础知识在我的博客中有很多学习笔记可以参考。我都是分模块介绍的。
稍后我还会写一个文章是描述MVC模式的。
下面的分层和如何命名是我查阅资料后自己总结的,肯定还有很多种灵活的写法。
主要有数据层、业务层、控制层、前端界面、4个层、
侧重后端,也就是前3个层。同时我们是从数据层开始写的。
1.数据层----主要功能就是和数据库连接,然后对数据进行处理。把处理后的结果返回
给servlet类。
总结数据层怎么写:
首先要有一个jdbc驱动的连接。然后再写一个抽象函数,每次连接数据库的时候,只
需要生成那个抽象函数的对象就可以连接数据库,不需要在写驱动。
其次,数据库中的表全部都要建好。
然后,根据每个表要执行的不同功能或者对数据库中数据操作的不同,生成不同的
I***DAO的接口和相应的实现类****DAOimpl。
最后,在DAOFactory的工厂中要进行注册,也就是要把每个***DAOimpl对象的创
建写好。工厂类只有一个,但是要进行多次注册。
(为什么写工厂类的问题,在设计模式中有一种模式是工厂模式,此时采用的就是这个,它有它的好处。在我的博客中针对3种不同的工厂模型都有介绍)。
下面是具体的执行步骤:
1.1第一次写的时候,需要写一个工具类,表示JDBC对数据的连接。叫DatebaseConnection类。
其中包括open和close。数据库的连接和关闭。
1.2定义一个抽象类,名称为AbstractDAOImpl.java(实现dao接口),创建了一个Connction和PreparedStatement。直接使用就可以了。
1.3 定义数据库中的表(可以叫VO类或者JavaBean类)
-class:VO类(表示我们数据库中的每个表,每个数据都是private的,每个变量都有相应的setter和getter函数)
举个列子:定义一个管理员的表。其中有5个属性。
1.4 第一次定义一个IDAO类,此后都是继承该接口,用哪个函数override其中的哪个函数
-interface:IDAO(定义公共接口)实现接下来所有可能对数据库中数据进行的各种修改函数的声明
其中可以包括函数为:
-public boolean doCreate(V vo) throws SQLException;
//实现对数据的增加操作,成功返回true,否则返回false
-public boolean doUpdate(V vo) throws SQLException;
//实现对数据的更新操作
-public boolean deRemove(Set> ids) throws SQLException;
//实现对数据的批量删除,ids表示要删除的数据集合
-public V findById( K id) throws SQLException;
//根据用户提供的id进行查询,查询成功返回该数据行中的记录,失败返回null。
-public List
//实现数据的全部查询(查询结果有多行),成功返回多行数据
-public List
//实现数据的分页操作,column 表示要执行查询列;keyword 表示查询的关键字;currentpage表示当前页;linesize表示每页显示记录数。成功返回所有数据。
-public int getAllCount(String column , String keyword ) throws SQLException;
//表示数据量统计操作。
-
1.5 定义和表有关的具体的IDAO(继承IDAO的所有操作数据的方法,并且根据该模块的特殊需求,可以添加所需的新方法)
比如:IAdminDao中,继承了IDAO的所有处理数据的方法(上面的橘色的方法),同时可以有自己的特殊的方法。比如这里是登录的一个验证功能。
1.6 写一个I***DAO的实现类。继承I***DAO的接口,继承接口中的方法,并且具体实现它。
例如:新建一个public class AdminDAOimpl extends AbastractDAOImpl implement IAdminDAO
extends AbastractDAOImpl 的作用:可以直接使用其中的PrepareStatement pstmt语句。和数据库的连接,不需要每次都写了。
AdminDAOImpl就是具体实现了登录功能的方法。包括:sql语句编写;处理sql语句,因为是变量传参所以要pstmt.setString()每个参数;execteQuery()返回的都是resultset集合。所以用next()循环处理。因为这里是判断是否有记录,用if。如果是查找全部的结果就要用while。
1.7编写一个工厂类DAOFactory,实现所有的***DAOimpl创建对象的过程。
例如:这个工厂只注册了一个IAdminDAOImpl的实现类,在我们写完课程表等表后,都需要在其中注册。
2.业务层
----其实本人觉得业务层和控制层可以合并,只是我参考的代码的人是全部分开写的。 如果说数据层是具体的告诉数据库要干啥的,那么业务层我理解为把数据库干的一些事进行整理,然后把最后的一个结果返回给下面的控制层。比如控制层要增加一个数据,那么控制层就调用业务层的一个函数insert(参数)即可。那么业务层的insert(判断是否可以添加(即数据库是否存在该行数据,要调用数据层的函数findById) + 如果可以添加就添加(即调用数据层的函数doCreat()函数))。所以这个insert函数相当于调用了两个数据库中的函数,但是他其中没有任何的具体实现,就是调用数据层写好的函数而已。
总结业务层怎么写:
1.实现service的接口(根据模块的不同,生成的不同)
2.实现与接口对应的具体实现***ServiceImpl
3.在工厂中注册
2.1根据该对象(例如admin)要执行的功能,写一个service类。
例如:根据数据层的IAdminDAO,写一个interface:IAdminService(admin模块)
或者根据lenbookDAO写的一个interface:lenbookService(借书lenbook模块)
2.1 写刚刚接口的实现。
比如:AdminServiceImpl 继承IAdminService接口。
仔细观察,发现调用数据层的函数都是调用的DaoFactory中的函数来创建的对象,然后调用的对象的函数,.findLogin(vo).
比如:lenbookServiceImpl 继承lenbookService接口。
他调用数据层的函数于是调用的工厂中DAOFactory的函数。
2.3第一次的时候,要定义服务层工厂类ServiceFactory
当然下次就只需要在工厂中注册就可以了,不需要定义工厂了。
可以如下定义:
与接口层的工厂定义类似。
3.控制层
-----控制层就是我们的servlet类。就是用来接收request中的函数,然后调用serviceImpl中函数进行处理,然后再和前端界面进行连接(前端连接主要是url到该servlet中)
总结业务层怎么写(控制层一个servlet就可以搞定,但是其中编写具体分如下的几步)
1.doGet()和doPost()函数,用来取到url中“/”后的那个servlet中的函数
2. 编写该函数。包括:接受参数;调用函数传递参数;跳转3个部分。
3.1servlet被调用后,doPost调用doGet方法。在doGet方法中,status就可以取到要调用的servlet中哪个类的名字,然后根据if判断,就可以跳到下面的该类中。
比如下面的函数是用来判断是否是login字段的然,然后调用3.2中login函数。
3.2 编写该函数。包括:接受参数;调用函数传递参数;跳转3个部分。
例如:login函数的编写。
它的密码部分用了一个加密处理,可以忽略。
4前端界面的编写。
-----因为我们编写的时候是从数据层开始编写的,在控制层如果写好了url,那么就
根据写好的编写jsp界面就可以。在其中可以使用html
等方法实现对servlet的调用。当然jsp可以应用我们servlet中传递的各
种参数。
前端用到的技术主要是html+css+js+jsp(偏后台)。