前言
搭建一个项目如同搭建一个房子,要把准备工作做好才能更好的建好这栋房子,比如数据库四大参数啊,JDBC工具类,日期工具类,数据库…
一、项目流程图
正所谓一图走天下,一个项目的流程基本上都在此图上进行操作,以后的框架底层无非也是这样,只是简化了我们对代码的书写,封装了一些冗余的代码
二、项目结构
1.项目搭建介绍
1.db.properties存放的是数据库四大参数然后通过util包下的JdbcUtil连接数据库
2.pojo包:存放实体类的一个包,实体类的属性根据数据库的字段名来编写
其中Admin是管理员的实体类,User是联系人的实体类;
3.dao包:是对数据库的更新
为什么dao层跟service层要写接口跟实现类呢?
接口在JAVA编程语言中是一个抽象类型,是抽象方法的集合,可以将其理解成一种规范.如果项目中,Dao层或Service层只需要一种实现,那么直接编写实现类可以减少代码量与复杂度,如果项目中Dao层或Service层需要有多个实现类,使用接口可以实现解耦,例如Dao层可以使用JDBC或者MyBatis,而不需要修改Service层的代码
4.service层
service层也叫业务逻辑层,而本项目是弱业务基本上就是调用dao层,当然service层也有接口类跟实现类
5.servlet层:
6.util包
util包下就是对一些公共方法的封装
CookieUtil是cookie 就是登录的时候点击记住密码,将用户名密码保存在浏览器的cookie中实现记住我功能
FileUtils是文件类,用与显示用户头像,目前项目的头像是保存在本地的一个包下,然后FileUtils也对这写保存的图片或文件进行加密UUID + 时间戳
JdbcUtil就是jdbc的连接
7.exception包
自定义异常包
也就是web层主要就是获取前端的参数然后对页面进行转发或者重定向,一般在里面不书写逻辑代码只进行简单的if判断
三、前端页面
1.用户列表
<form id="queryForm" class="form-inline" action="${pageContext.request.contextPath}/queryByPage" method="post">
<!--页面传过来-->
<input type="hidden" id="currentPage" name="currentPage" value="1"/>
<div class="form-group">
<label for="exampleInputName2">姓名</label>
<input type="text" name="name" value="${userCondition.name}" class="form-control"
id="exampleInputName2">
</div>
<div class="form-group">
<label for="address">籍贯</label>
<%-- <input type="text" name="address" value="${condition.address[0]}" class="form-control" id="exampleInputName3" >--%>
<select name="address" class="form-control" id="address">
<option value="">请选择</option>
<option value="陕西" <c:if test="${userCondition.address =='陕西'}">selected</c:if>>陕西</option>
<option value="北京" <c:if test="${userCondition.address =='北京'}">selected</c:if>>北京</option>
<option value="上海" <c:if test="${userCondition.address =='上海'}">selected</c:if>>上海</option>
</select>
</div>
<div class="form-group">
<label for="exampleInputEmail2">邮箱</label>
<input type="text" name="email" value="${userCondition.email}" class="form-control"
id="exampleInputEmail2">
</div>
<button type="submit" class="btn btn-default">查询</button>
</form>
这只是部分的前端列表展示的代码,关于jQuery一些事件的操作我都没有放入上面,等这系列博客写完我再把码云地址加入进来
四、后端
首先根据流程图我们知道前端发生请求(get/post)给后台,后台首先进入servlet获取前端请求,然后再调用service层,service书写一些业务逻辑代码,然后再调用dao层对数据库进行更新
这里是查询所有不用带数据过去所有采用get请求 但是后台要把数据库的内容传给前端展示所有service层放回类型为list(因为展示肯定是多个user对象)
servlet
@WebServlet("/listUserServlet")
public class ListUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应编码
response.setContentType("text/html;charset=utf-8");
//业务层
UserService userService = new UserServiceImpl();
List<User> users = userService.queryuser();
//保存到域
request.setAttribute("users", users);
//System.out.println(users);
//转发
request.getRequestDispatcher("/list.jsp").forward(request,response);
}
不设置响应编码的话会出现乱码,同时通过request.setAttribute(“users”, users)保存到域中,users是传过去接收参数,而第二个users是传过去的数据库数据
service
/**
* 查询
* @return
*/
@Override
public List<User> queryuser() {
List<User> users = userDao.queryall();
return users;
}
dao
/**
* 查询所有
*
* @return
*/
@Override
public List<User> queryall() {
Connection coon = null;
PreparedStatement pstm = null;
ResultSet rs = null;
try {
coon = JdbcUtil.getConnection();
String sql = "SELECT * FROM tb_emp";
pstm = coon.prepareStatement(sql);
rs = pstm.executeQuery();
List<User> users = paserResultSet(rs);
return users;
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(rs, pstm, coon);
}
return null;
}
调用Jdbc连接数据库,因为解析result不止这一个方法所有将result的解析进行封装
private List<User> paserResultSet(ResultSet rs) throws SQLException {
if (rs != null) {
List<User> users = new ArrayList<>();
while (rs.next()) {
//创建一个学生对象
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setGender(rs.getString("gender"));
user.setAge(rs.getInt("age"));
user.setAddress(rs.getString("address"));
user.setQQ(rs.getString("qq"));
user.setEmail(rs.getString("email"));
user.setPhoto(rs.getString("photo"));
users.add(user);
}
return users;
}
return null;
}
因为由index跳转到用户展示页面是一个get请求 所以在doget书写代码,前端不传参数过来但是后端要穿数据到前端
通过jsp,jstl解析users,展示用户信息差不多就是这样的一个流程