Servlet+JSP+JavaBean整合项目的总结
- 项目分层
本次项目的设计使用MVC模型来进行设计,MVC全称为model view controller,是模型视图控制器的缩写
- Model
模型层是用来获取数据库中的原生数据的,更细分可分为service层,dao层,pojo层,util层;其中pojo层中存放了很多个表实体类,最简单的理解就是一张数据表对应一个实体类(这也可能是片面的理解);
dao层:为持久层,dao层位于最底层主要就是用来与数据库进行交互操作 增删改查;
service层:主要用来对接dao层用来获取dao层所执行完操作的结果;
util层:主要就是用来做一些资源初始化操作以及一些通用方法的创建,例如获取连接数据库的对象,通用的DQL操作方法和通用的DML操作方法,关闭资源流的方法等
- View
视图层用来对浏览器做出响应操作,jsp即属于该层;在jsp文件中主要用来做前端页面的展示、获取作用域中的共享数据以及将请求继续发送给下一个jsp或者是一个servlet - Controller
控制器层用来进行业务逻辑的处理操作,servlet即属于该层;servlet主要就是用来调用model层来进行数据的处理操作,并根据返回的结果来判断做出如何的响应操作
- 项目整体的需求分析以及思路
此次项目的需求主要分为用户登陆、用户退出、用户的注册、用户信息的修改以及删除用户
- Dao层通用工具类的实现
- 在通用工具类中首先读取properties文件获取连接数据库的四个参数信息
- 在静态代码块中加在数据库驱动
- 创建获取连接对象的方法
- 创建关闭资源流的方法
- 创建通用的DML操作的方法
方法流程
第一步 :首先获取连接对象
第二步 :关闭JDBC的自动事务提交
第三步 :创建执行器对象
第四步 :通过getParameterMetaData()方法来获取SQL语句中占位符个数
第四步 :进行SQL语句的参数绑定操作
第五步 :执行SQL语句
第六步 :提交事务
第七步 :如果有异常则回滚事务
第八步 :返回受影响行数
代码实现
- 创建通用的DQL操作的方法
方法流程
第一步 :创建list集合对象
第二步 :获取连接对象
第三步 :创建执行器对象
第四步 :通过getParameterMetaData()方法来获取SQL语句中占位符个数
第五步 :进行SQL语句的参数绑定操作
第六步 :执行SQL语句,创建结果集对象并将获取的结果存放进去
第七步 :遍历结果集,在结果集中首先创建类的对象,接着通过getMetaData()方法获取一行结果集中所有的列信息,列的个数以及列名;接着依据列的个数进行循环,在该循环中首先通过类的模板获取所有类的属性,遍历一下所有属性如果匹配到与列名一致的属性则进行该属性对应的setter方法的创建,接着回调对应的方法将查询出列名中的值传入到实体类对应的属性中;最后将每一次循环所创建的实体类对象都存储到list集合中
第八步 :返回该集合对象
代码实现
- Servlet层通用类的实现
封装一个通用的service方法来提供给所有的servlet使用,该类不能被直接访问也不能被实例化;也就是该类的不在配置文件中进行映射关系的配置且将该类设置抽象类
实现思路
第一步 :创建ServletContext全局对象
第二步 :获取配置文件中的请求和响应编码格式
第三步 :设置请求和响应的编码格式
第四步 :获取request作用域中的方法名
第五步 :获取当前调用该service方法的对象的模板
第六步 :通过反射获取方法名对应的方法
第七步 :回调当前对象的该方法
代码实现
- 用户登陆功能的相关实现
用户登陆功能的逻辑为用户输入用户名和密码点击登陆后,首先需要去数据库中通过uname和pwd来查询匹配的数据,如果未查询到匹配数据则返还给用户提示:用户名或密码错误;如果查询成功接下来开始进行第二次数据库查询操作,这次查询所有用户信息,然后重定向到主界面将所有的用户数据进行展示
- Servlet中UserLogin
实现思路
第一步 :通过request作用域获取用户传递的uname,pwd以及methodName
第二步 :创建service层实现类对象
第三步 :调用其selByUnameAndPwd(Object...obj)方法根据uname和pwd进行查询操作,并将查询出的结果存放入容器中
第四步 :对容器的元素个数进行判断若size=0则代表查询失败,这时可将提示信息存储到session作用域中并将页面重定向到login.jsp提示用户”用户名或密码有误”
第五步 :若size>0则说明查询成功
第六步 :调用实现类对象的selAll()方法进行所有用户的查询操作
第七步 :将所有用户的数据存放到一个list集合中并将该list集合存储到session作用域中
第八步 :将页面重定向到userInfo.jsp
代码实现
- Service中selByUnameAndPwd(Object...obj)
实现思路
第一步 :创建dao层的实现类对象
第二步 :调用该对象的selByUnameAndPwd(Object...obj)方法
代码实现
- Service中selAll()
实现思路
第一步 :创建dao层的实现类对象
第二步 :调用该对象的selAll()方法
代码实现
- Dao中selByUnameAndPwd(Object...obj)
实现思路
第一步 :编写SQL语句
第二步 :调用JDBC中通用的DQL操作方法,将SQL以及uname和pwd作为参数参入
第三步 :将查询到的结果集存放入list集合中进行返回
代码实现
- Dao中selAll()
实现思路
第一步 :编写SQL语句
第二步 :调用JDBC中通用的DQL操作方法,将SQL作为参数传入
第三步 :将查询到的结果集存放入list集合中进行返回
代码实现
- login.jsp
该页面通过session作用域来获取”用户名或密码错误”的提示信息
- userInfo.jsp
该页面通过session作用域来获取所有用户的数据,并将数据展示到页面上
- 用户退出功能的相关实现
用户退出功能的逻辑为用户点击退出,然后服务器将该用户对应的session对象进行销毁操作然后跳转到登陆界面
- Servlet中UserLogout
实现思路
第一步 :获取session对象
第二步 :销毁该session对象
第三步 :重定向到login.jsp
代码实现
- userInfo.jsp
该页面的逻辑首先使用超链接的方法来实现页面的跳转,接着当用户点击退出按钮,询问一下用户”是否确认退出”;若客户点”是”则进行页面的跳转,如果点否则不进行任何操作
- 用户注册功能的相关实现
用户注册功能的逻辑为用户点击注册按钮,首先会跳转到一个注册界面;然后当用户输入完所有的信息点击表单进行提交后,此时就会进行数据的插入操作,将这条用户数据插入到数据库中;当数据库操作结果后返回受影响行数,如果受影响行数大于0则查询所有的用户数据,将查询出的用户数据存储到list集合中,然后将list集合存储到session作用域中,最后重定向到主界面;若受影响行数等于0,则重定向到注册界面并且返回一个”用户注册失败”的提示信息
- Servlet中UserRegister
实现思路
第一步 :获取request作用域中的uname,pwd,sex,age和birthday五个参数信息
第二步 :创建Service层的实现类对象
第三步 :调用该对象的addUser(Object...objs)方法,并且将uname,pwd,sex,age,birthday五个参数传入
第四步 :对受影响行数进行判断,如果受影响行数等于0,则重定向到用户注册界面并且返还一个用户提示信息
第五步 :如果受影响行数>0,则调用实现类对象的selAll()方法
第六步 :将查询出的所有的用户数据存放到一个集合中
第七步 :将集合存储到session作用域中,最后重定向到主界面并且返回给用户一个”注册成功”的提示信息
代码实现
- Service中addUser(Object...objs)
实现思路
第一步 :创建dao层实现类对象
第二步 :调用实现类对象的addUser()方法,并将uname,pwd,sex,
age,birthday五个参数传入
第三步 :返回受影响行数
代码实现
- Dao中addUser(Object...objs)
实现思路
第一步 :编写SQL语句
第二步 :调用JDBC中通用的DML操作方法,将uname,pwd,sex,age
,birthday五个参数参数
第三步 :返回受影响行数
代码实现
- userInfo.jsp
该页面中逻辑是使用超链接标签来实现,跳转到注册界面不进行任何数据库的交互操作
- register.jsp
该页面中的逻辑为表达的提交,表单的使用一个隐藏的input标签来存储方法名,然后在提交后将方法名提交到servlet中进行业务操作
- 用户信息的修改功能的相关实现
用户信息的修改功能的逻辑为用户点击修改按钮,然后在参数中拼接用户uid以及方法名,然后在数据库中根据uid来进行用户数据的匹配查询,接着重定向到用户数据修改界面
在修改界面中显示该用户的所有数据,uid不显示且用户名只能看但不能被修改,接着当用户完成数据的修改后点击提交按钮,这时对数据会进行一次修改操作,接着判断受影响的行数,若受影响行数为大于0则再查询一次所有用户的数据然后重定向到主界面,在界面中展示所有用户的数据信息并且在主界面中显示”用户修改成功”的提示信息
- Servlet中UserEdit
实现思路
第一步 :获取request作用域中的uid
第二步 :创建service层实现类对象
第三步 :调用实现类对象的selUserByUid(int uid)方法
第四步 :将查询出的用户数据存放到list集合中,并将list集合存储到session作用域中
第五步 :重定向到用户修改的界面
代码实现
- Servlet中UserUpdate
实现思路
第一步 :获取request作用域中的uid,uname,pwd,sex,age,
birthday六个参数
第二步 :创建service层实现类对象
第三步 :调用实现类对象的UpdateUserInfo(Object...objs)方法进行数据库数据的更新操作,将六个参数传入
第四步 :判断受影响行数,如果受影响行数大于0则调用实现类对象的selAll()方法来进行所有用户数据的查询操作
第五步 :将查询到的所有用户数据存放到一个list集合中
第六步 :将list集合存储到session作用域中
第七步 :重定向到主界面,并且返回一个”用户信息修改成功”的提示给用户
代码实现
- Service中selUserByUid(int uid)
实现思路
第一步 :创建dao层实现类对象
第二步 :调用实现类的selUserByUid(int uid)方法,将uid传入
第三步 :返回一个list集合
代码实现
- Dao中selUserByUid(int uid)
实现思路
第一步 :编写SQL语句
第二步 :调用JDBC中通用的DQL操作方法,将SQL和uid传入
第三步 :返回一个list集合
代码实现
- Service中UpdateUserInfo(Object...objs)
思想思路
第一步 :创建dao层实现类对象
第二步 :调用实现类的UpdateUserInfo(Object...objs)方法,将六个参数传入
第三步 :返回受影响行数
代码实现
- Dao中UpdateUserInfo(Object...objs)
实现思路
第一步 :编写SQL语句
第二步 :调用JDBC中通用的DML操作方法,将SQL和六个参数传入
第三步 :返回受影响行数
代码实现
- userInfo.jsp
该页面的实现逻辑为当用户点击编辑按钮后,提交的地址中应当拼接方法名和uid信息;且使用session作用域来获取传递过来的用户提示信息
- edit.jsp
该页面使用的实现逻辑为当用户点击提交表单后,将所有的数据信息提交到action所指定的地址,在地址中拼接方法名和uid
- 删除用户功能的相关实现
删除用户功能的相关逻辑为用户点击删除用户,首先判断该用户是否为自身如果是自身则重定向回主界面并提示用户”无法删除自身”,如果不为自身则在数据库中根据uid对该条数据进行删除的操作,返回受影响行数若该值为0则重定向到主界面提示用户”未删除成功”,若该值大于0则进行所有用户数据的查询操作,然后重定向到主界面并返回用户一个”用户数据删除成功”的提示信息
- Servlet中UserRemove
实现思路
第一步 :获取request作用域中的uname以及获取session中的uname进行比较如果相等则重定向会主界面并提示用户”无法将自身删除”
第二步 :获取request作用域中的uid
第三步 :创建service层实现类对象
第四步 :调用实现类对象的removeUserByUid(int uid)方法,将uid参数传入
第五步 :判断受影响行数如果该值为0则重定向当主界面并提示用户”用户数据删除失败”的提示信息
第六步 :若该值大于0则调用实现类对象的selAll()方法进行所有用户数据的查询操作
第七步 :将查询出的所有的用户数据添加到list集合中
第八步 :将list集合存储到session作用域中
第九步 :重定向到主界面并提示用户”用户数据删除成功”的提示
代码实现
- Service中removeUserByUid(int uid)
实现思路
第一步 :创建dao层实现类对象
第二步 :调用实现类对象的delUserByUid(int uid)方法,将uid作为参数传入
第三步 :返回受影响行数
代码实现
- Dao中delUserByUid(int uid)
实现思路
第一步 :编写SQL语句
第二步 :调用JDBC中通用的DML操作方法,并将uid作为参数传入
第三步 :返回受影响行数
代码实现
- userInfo.jsp
该页面的实现逻辑为当用户删除自己时,页面使用session作用域获取用户提示信息;当用户删除失败时,页面使用session作用域获取用户提示信息;用户点击删除时在地址后拼接方法名,uid以及uname三个参数,uid是用来后续根据uid进行用户数据删除操作的,uname参数是在判断是否为删除自己时使用的
- 项目中的注意之处
项目中以下我关注的几个点;路径的使用,接收到用户数据或共享数据之后的转换问题以及重定向或者请求转发的使用
- 路径的使用
无论是在servlet还是在JSP中,路径最好使用绝对路径以防出错,请求转发基于项目根目录,重定向基于服务器根目录
当跳转之后的界面需要前一个界面的参数信息,若是表单提交的方式可直接通过input标签来存储想要传递的数据;若为超链接则可使用地址拼接的方式拼接想要传递的数据;
- 接收到数据的转换问题
- getParameter
使用该方法所获取到的数据类型均为String类型,所以需要做强制类型的转换
- getAttribute
使用该方法所获取到的数据类型均为Object类型,也需要做类型强制转换
- 从数据库中查询到的数据
从数据库中查询到的数据类型与数据的原类型一一对应,无需做强制类型转换
String类型对应varchar
int类型对应number
Date类型对应date
- 响应处理结果方式的选择
由于请求转发会导致表单的重复提交问题,所以请使用重定向的方式进行页面的跳转操作