狂神说Java【SMBMS】——SMBMS超市订单管理系统(二) ——登陆功能实现

  页面实现逻辑/流程

1、编写前端页面

​ 前端页面直接使用已有的,我们主要编写网页背后的执行代码

2、设置首页

    <!--设置欢迎页/首页-->
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

3、编写Dao层用户登陆的接口

  • 创建一个UserDao接口,然后我们按照"面向接口编程"的原则去接口UserDaoImpl中实现这个接口中的方法

    • 使用面向接口编程的好处就在与我们在接口中只需要定义方法,而不需要实现方法,整个结构和思路都很清晰

    • 其次就是将设计和实现分离,保证了设计专注于设计,实现专注于实现

package com.thhh.dao.user;

import com.thhh.pojo.User;

import java.sql.Connection;

public interface UserDao {
    /**
     * 得到要进行登陆的用户
     * @param conn:数据库连接对象
     * @param userCode:通过用户的用户名userCode查询用户数据
     * @return
     */
    public User getLoginUserInfo(Connection conn,String userCode);
}

4、编写Dao接口的实现类

package com.thhh.dao.user;

import com.thhh.dao.BaseDao;
import com.thhh.pojo.User;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDaoImpl implements UserDao{
    @Override
    public User getLoginUserInfo(Connection conn, String userCode) {
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;
        if (conn!=null){
            String sql = "SELECT * FROM smbms_user WHERE userCode = ?";
            Object[] params = {userCode};
            rs = BaseDao.executeQuery(sql,params,conn,pstmt,rs);//调用项目搭建阶段准备的公共查询方法
            try {
                    while (rs.next()){
                        user = new User();
                        user.setId(rs.getInt("id"));
                        user.setUserCode(rs.getString("userCode"));
                        user.setUserName(rs.getString("userName"));
                        user.setUserPassword(rs.getString("userPassword"));
                        user.setGender(rs.getInt("gender"));
                        user.setBirthday(rs.getDate("birthday"));
                        user.setPhone(rs.getString("phone"));
                        user.setAddress(rs.getString("address"));
                        user.setUserRole(rs.getInt("userRole"));
                        user.setCreatedBy(rs.getInt("createdBy"));
                        user.setCreationDate(rs.getTimestamp("creationDate"));
                        user.setModifyBy(rs.getInt("modifyBy"));
                        user.setModifyDate(rs.getTimestamp("modifyDate"));user.setId(rs.getInt("id"));
                        user.setUserCode(rs.getString("userCode"));
                        user.setUserName(rs.getString("userName"));
                        user.setUserPassword(rs.getString("userPassword"));
                        user.setGender(rs.getInt("gender"));
                        user.setBirthday(rs.getDate("birthday"));
                        user.setPhone(rs.getString("phone"));
                        user.setAddress(rs.getString("address"));
                        user.setUserRole(rs.getInt("userRole"));
                        user.setCreatedBy(rs.getInt("createdBy"));
                        user.setCreationDate(rs.getTimestamp("creationDate"));
                        user.setModifyBy(rs.getInt("modifyBy"));
                        user.setModifyDate(rs.getTimestamp("modifyDate"));
                    }

                //关闭资源
                BaseDao.close(null,pstmt,rs);//因为数据库的连接可能不只是这一个操作,所以我们不应该做完一件事就把数据库连接对象销毁,所以conn处传的null
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        return user;
    }
}

5、编写业务层接口

package com.thhh.service.user;

import com.thhh.pojo.User;

public interface UserService {
    /**
     * 用户登陆身份验证
     * @param userCode:用户账号
     * @param userPassword:用户密码,注意,密码判断我们在service层进行;
     *                      在Dao层只是简单的操作数据库,没有其他的逻辑代码;在servlet层中只是接收和转发请求以及控制视图跳转
     *                      而对于业务层(service)就是用来实现业务逻辑代码的
     * @return
     */
    public User login(String userCode,String userPassword);
}

6、业务层实现类

package com.thhh.service.user;
/**
 * 业务层主要就是编写业务代码,在编写业务代码的时候经常会调用数据库
 * 所以在业务层中需要使用到我们一开始编写好的DAO的代码
 */

import com.thhh.dao.BaseDao;
import com.thhh.dao.user.UserDao;
import com.thhh.pojo.User;
import org.junit.Test;

import java.sql.Connection;

public class UserServiceImpl implements UserService{
    private UserDao userDao;//业务层需要使用Dao,所以直接将Dao作为一个成员变量来使用

    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;//在业务层被实例化的时候就让它得到Dao对象,后面就可以直接去用
    }

    @Override
    public User login(String userCode, String userPassword) {
        Connection conn = null;
        User user = null;

        conn = BaseDao.getConnection();//获取数据库连接对象
        //通过业务层调用Dao层
        user = userDao.getLoginUserInfo(conn,userCode);//调用userDao中的获取用户信息的方法
        BaseDao.close(conn,null,null);

        return user;
    }
}

测试是否能够成功运行

@Test
public void test(){
    UserServiceImpl userService = new UserServiceImpl();
    User admin = userService.login("admin","12bfasbka");
    System.out.println(admin.getUserPassword());
}

7、编写servlet

首先导入我们也用到的JSP页面

​ 其中frame.jsp是登陆成功之后跳转的页面,而common中是页面的头部和底部

​ 注意:我们在编写servlet和注册servlet的时候一定要注意我们使用的前端页面上面写的地址,为了不出错最后时与前端页面上写的地址保持一致;其次就是注意前端使用的JSP内置对象和EL表达式,我们在后端需要使用对应的变量名,否则是取不到值的
servlet编写

package com.thhh.servlet.user;

import com.thhh.pojo.User;
import com.thhh.service.user.UserService;
import com.thhh.service.user.UserServiceImpl;
import com.thhh.utils.Constants;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 控制层调用业务层
 */
public class LoginServlet extends HttpServlet{
    private UserService userService = null;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、获取前端传过来的用户名+密码
        String userCode = req.getParameter("userCode");
        String userPassword = req.getParameter("userPassword");

        //2、调用业务层,将数据库中查出来的密码和用户的输入进行对比
        this.userService = new UserServiceImpl();
        User user = userService.login(userCode,userPassword);//已经把用户查到了

        //3、判断返回是否为null
        if (user!=null){//账号+密码正确
            //将用户的信息存入session中
            req.getSession().setAttribute(Constants.USER_SESSION,user);
            //跳转内部主页
            resp.sendRedirect("jsp/frame.jsp");
        }else{//账号+密码不正确
            req.setAttribute("error","用户名或密码错误");
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }


      /*  if ()
        user.getUserPassword()*/
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

8、注册servlet

    <!--注册登陆的servlet-->
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.thhh.servlet.user.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login.do</url-pattern>
    </servlet-mapping>

注意:这里的映射与我们使用的前端页面表单提交的action要保持一致




9、测试功能,确保上面的代码正确






测试完成!

posted @ 2020-09-09 20:18  Jobito  阅读(2275)  评论(0编辑  收藏  举报