javaweb项目
学习了java语言,跟着优秀项目走了一遍,这里小小的总结一下
Ⅰ.Java
架构图:
下面拿修改密码模块举例
1 pojo
pojo层用于数据库对象与编程语言的ORM,之前我有提过,这样做的好处,是方便对数据库表中元组的操作。
2 DAO
与数据库直接交互
可以把DAO层抽象为数据库,我们在DAO中对数据进行增删改查(可以想象为DAO就是一个数据库)。
public int updatePwd(Connection connection, int id, String pwd) throws Exception { //修改密码函数
PreparedStatement pstm = null; //用户传入的参数
ResultSet rs = null; //查询的结果
String sql = "update test_db set userPassword= ? where id = ?";//预编译用户密码的更改语句
Object[] params = {pwd,id};//接收Service层传递的参数
pstm = connection.pstm(sql);//数据库连接
for(int i=0;i < params.length;i++){ //给预编译sql赋入用户传入参数
preparedStatement.setObject(i+1,params[i]);
}
preparedStatement.executeUpdate();//执行更改语句(executeUpdate是我们自定义的函数)
BaseDao.closeResource(null,preparedStatement,null);//关闭资源
}
上述代码仅适用于增删改,要进行查询操作的话还需要使用resultStatement()函数,存放从数据库中取出的值,但大致思路是一样的。
我们DAO层讲了对数据库操作,但是如果没有连接数据库,这一切都是空谈,因此我们还需要编写BaseDao类来执行一些数据库的基本操作(或者说通用操作),有如获取数据库连接,释放连接资源(很重要),查询,增删改。
3 Service
该层主要是承上启下,接收Servlet传来的参数,并于DAO层交互
可以把Service层抽象为中间件,用来建立servlet和dao之间的连接
public boolean updatePwd(int id, String pwd) {
Connection connection = null; //初始化连接
boolean flag = false;
try {
connection = BaseDao.getConnection();//与数据库进行连接
if(userDao.updatePwd(connection,id,pwd)>0){ //更改密码并返回修改flag
flag = true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
BaseDao.closeResource(connection,null,null);//释放资源
}
System.out.println("update:"+flag);
return flag;
}
看见,service层主要是一个getConnection
()和操作执行updatePwd()
记住在类的开头需要引入DAO层!
public class UserServiceImpl implements UserService{
private UserDao userDao; //实例化userDAO
public UserServiceImpl() {
userDao = new UserDaoImpl();
}
.....
}
4 Servlet
该层用于接收前端传送过来的用户参数等,然后把参数交给service层处理
private void updatePwd(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException{
Object o = req.getSession().getAttribute(Constants.USER_SESSION);//从session获取用户信息
String newpassword = req.getParameter("newpassword");//获取用户参数:新密码
boolean flag = false;
if(o != null && !StringUtils.isNullOrEmpty(newpassword)){ //判断传入参数是否有效
UserService userService = new UserServiceImpl(); //实例化UserService
flag = userService.updatePwd(((User)o).getId(),newpassword);//修改密码并返回flag
if(flag){
req.setAttribute(Constants.SYS_MESSAGE,"密码修改成功,请重新登录");//提示信息
req.getSession().removeAttribute(Constants.USER_SESSION);//删除session
}else {
req.setAttribute(Constants.SYS_MESSAGE, "修改密码失败");//提示信息
}
}else {
req.setAttribute(Constants.SYS_MESSAGE,"新密码有误");//提示信息
}
req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);//转发回密码修改页面
}
1.Object o = req.getSession().getAttribute(Constants.USER_SESSION);
可能有人不清楚这一段代码,SESSION是用户的唯一标识,存储了这个登录用户的所有信息(id,name…)
5 util
工具包,存放一些常量等等
package com.rick.util;
public class Constants {
public final static String USER_SESSION = "userSession";
public final static String SYS_MESSAGE = "message";
public static int pageSize = 5;
}
6 Filter
从架构图可以得知,所有经过后端的流量都会被过滤器处理,其主要功能有用户权限限制,字符编码转换等等。
7 web-xml
在这一切做好之后,我们就要在web-xml中注册servlet映射了,成功注册之后就可以配合前端页面执行我们想要的功能了
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.rick.servlet.user.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/jsp/user.do</url-pattern>
</servlet-mapping>
Ⅱ.Resource
存放一些配置如db.properties(数据库配置)
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms?userUnicode=true&characterEncoding=utf-8
username=root
password=root
上述代码可方便BaseDao层的数据库连接
Ⅲ、End
项目架构图
最后,欢迎来我的博客逛逛
Ⅳ、Reference
[1] https://www.bilibili.com/video/BV12J411M7Sj
[2] https://github.com/WalterWen/smbms/blob/master/smbms.sql
来源:freebuf.com 2021-06-05 19:36:55 by: rickkk
请登录后发表评论
注册