bbs小项目整理(五)(登录模块的完成)

首先完成我的的登录业务逻辑处理,用户输入账号密码后提交数据,后台就会去查询数据库看看该用户是否存在

存在则登录成功,不存在则反馈给用户提示数据错误

1.在com.congbbs.dao包中创建一个用户业务逻辑处理接口. 编写一个查找数据库用户的方法:

package com.congbbs.dao;

import com.congbbs.javabean.User;

public interface UserDao {
  //根据用户传递的用户账号查找用户方法
public User findUserById(int userId); }

 在com.congbbs.dao.imple中创建一个用户业务逻辑处理类 继承 上面的接口,为接口中的方法提供实现:

package com.congbbs.dao.imple;

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

import com.congbbs.dao.UserDao;
import com.congbbs.javabean.User;
import com.congbbs.util.DbConn;

public class UserDaoImpl implements UserDao {

    @Override
    public User findUserById(int userId) {
        Connection conn = DbConn.getConnection(); //获得数据库连接
        PreparedStatement ps = null;         //定义预处理对象
        ResultSet rs = null;                 //定义结果集对象
        User user = new User(); //实例化一个User对象来装载查询结果
        String sql = "select * from tb_user where userId = ?"; //编写sql查询语句
        try {
            ps = conn.prepareStatement(sql);
            ps.setInt(1, userId);
            rs = ps.executeQuery();
            if(rs.next()){   //将查询到的结果装入user中
                user.setUserID(rs.getInt(1));
                user.setUserName(rs.getString(2));
                user.setUserSex(rs.getBoolean(3));
                user.setUserBirth(rs.getDate(4));
                user.setUserPhone(rs.getString(5));
                user.setUserPlace(rs.getString(6));
                user.setJoinTime(rs.getDate(7));
                user.setPassWord(rs.getString(8));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {            //关闭连接对象,有内层到外层关闭
            DbConn.close(rs);
            DbConn.close(ps);
            DbConn.close(conn);
        }
        return user;  //返回user
    }
    
}

 编写获得工厂方法的工厂类

package com.congbbs.factory;

import com.congbbs.dao.UserDao;
import com.congbbs.dao.imple.UserDaoImpl;

public class UserDaoFactory { //工厂类,用于获得相对应的工厂方法
    public static UserDao getUserDaoInstance(){ //获得实例对象的方法
        return new UserDaoImpl();
    }
}

2 通过servlet控制成完成对用户输入数据和从数据库查询数据,完成简单的验证

package com.congbbs.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.congbbs.dao.UserDao;import com.congbbs.factory.UserDaoFactory;import com.congbbs.javabean.User;


public class LoginAction extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        
        ServletContext servletContext =  getServletContext(); //获得上下文ServletContext对象
        RequestDispatcher dispatcher = null; //定义一个页面跳转对象
        //接收从表单提交过来的数据
        String userid=request.getParameter("userID");
        String password=request.getParameter("password");
        String checkcode=request.getParameter("validateCode");
        //从session中获取绘制验证码时保存在其中的验证码信息
        String servletCheckCode = (String)request.getSession().getAttribute("chenkcode");
        //调用findUserById方法查询
        UserDao userDao = UserDaoFactory.getUserDaoInstance(); //获得实例对象
        User user = userDao.findUserById(Integer.parseInt(userid));//简单判断用户账号的输入
        if (userid == null || "".equals(userid)) { // 判断是否输入用户编号
            request.setAttribute("error", "请输入用户编号!");
            dispatcher = servletContext.getRequestDispatcher("/index.jsp");// 设置跳转页面
        } else {
            if (password == null || "".equals(password)) { // 判断是否输入系统密码
                request.setAttribute("error", "请输入密码!");
                dispatcher = servletContext.getRequestDispatcher("/index.jsp");// 设置跳转页面
            } else {
                if (checkcode == null || "".equals(checkcode)) { // 判断是否输入验证码
                    request.setAttribute("error", "请输入验证码!");
                    dispatcher = servletContext
                            .getRequestDispatcher("/index.jsp");// 设置跳转页面
                } else {
                    if (!checkcode.equals(servletCheckCode)) {
                        request.setAttribute("error", "验证码错误");
                        dispatcher = servletContext
                                .getRequestDispatcher("/index.jsp");
                    } else {
                        if (user == null) {
                            request.setAttribute("error", "该用户编号不存在!");
                            dispatcher = servletContext
                                    .getRequestDispatcher("/index.jsp");
                        } else {
                            if (password.equals(user.getPassWord())) {
                                request.getSession().setAttribute("user", user); // 将用户对象信息保存到session范围
                                dispatcher = servletContext
                                        .getRequestDispatcher("/jsp/main.jsp");
                            } else {
                                request.setAttribute("error", "密码不正确!");
                                dispatcher = servletContext
                                        .getRequestDispatcher("/index.jsp");
                            }
                        }
                    }
                }
            }
        }
        dispatcher.forward(request, response);
    }
}

3.登录模块完成

总结:①从表单提交的数据通过request的getParameter()方法进行接收,接收到的数据都是字符串类型的对象

      注:存储在request域中的数据在一次请求中有效

    请求:从客户端到服务器端的请求消息包括,消息首行中,对资源的请求方法、资源的标识符及使用的协议。

   ②通过request.getSession().getAttribute()获得存在session域中的数据

      通过request.getSession().setAttribute()将数据存在session域中的数据

    注:存储在session域中的数据在一次会话中有效

    会话:(Servlet中)这种在多次HTTP连接间维护用户与同一用户发出的不同请求之间关联的情况称为维护一个会话(session)。

          会话的特征:
         会话能够把用户与同一用户发出的不同请求之间关联起来。不同用户的会话应当是相互独立的。
         会话一旦建立就应当一直存在,直到用户空闲时间超过了某一个时间界限,容器才应当释放该会话资源。
         在会话的存活期间,用户可能给服务器发送了很多请求,该用户的这些请求信息都可以存储在会话中。
原文地址:https://www.cnblogs.com/qingcong/p/5828666.html