freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Javaweb项目基础
2021-06-05 19:36:55

javaweb项目

学习了java语言,跟着优秀项目走了一遍,这里小小的总结一下

Ⅰ.Java

架构图:

[(img-BWDJGUCN-1588757845419)(JavaWeb.assets/1568424227281.png)]

下面拿修改密码模块举例

1 pojo

pojo层用于数据库对象与编程语言的ORM,之前我有提过,这样做的好处,是方便对数据库表中元组的操作。

[image-20210605164438662]

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

项目架构图

image-20210605171031535

最后,欢迎来我的博客逛逛

Ⅳ、Reference

[1] https://www.bilibili.com/video/BV12J411M7Sj

[2] https://github.com/WalterWen/smbms/blob/master/smbms.sql

# web安全 # java
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录