使用JDBC实现JavaWeb登录注册(详细思路)

一. 数据库(Dao(Database Access Object))

导入jdbc驱动包:可到官网下载:https://dev.mysql.com/downloads/connector/j/

找到对应mysql版本的下载好后,将jar包拖到 /WebRoot/lib/ 里面即可

接下来就可以开始了:

创建UserDao类:

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

import cn.test.bean.User;

public class UserDao {
	//数据库连接
    //数据库地址,其中mec为数据库名称
	private static String sqlurl = "jdbc:mysql:///mec?useSSL=false&serverTimezone=UTC";
    //数据库登录用户名
	private static String sqluser = "root";
    //数据库登录密码
	private static String sqlpwd = "";
    //定义PreparedStatement 对象
	private static PreparedStatement preparedStatement = null;
    //定义ResultSet 结果集对象
	private static ResultSet resultSet = null;
    //定义Connection 对象
	private static Connection connection = null;
	static{
		try {
            //jdbc驱动,版本不同写法可能不同,此处的写法为mysql8.0版本
			Class.forName("com.mysql.cj.jdbc.Driver");//加载MySQL驱动
			connection = DriverManager.getConnection(sqlurl, sqluser, sqlpwd);//获取连接
		} catch (Exception e) {
			e.printStackTrace();
		}
	} 
	//根据用户名和密码查询用户
	public User selectUser(String username, String password){
		User user = new User();
        //确定带参数的sql语句(这是一大缺点,sql语句被写死,Mybatis通过将sql语句写入到xml配置文件中可解决此问题)
		String sql = "select username, upwd from info where username = ? and upwd = ?";
		try {
            //将sql语句发送到sql服务中
			preparedStatement = connection.prepareStatement(sql);
            //对sql语句中的参数赋值
            //所赋的值即为方法中所带的参数“?”,1表示第一个问号,2表示第二个问号
			preparedStatement.setString(1,username);
			preparedStatement.setString(2,password);
            //执行sql语句:(rs 为执行sql语句后返回的结果集)
			resultSet=preparedStatement.executeQuery();
            //取值(调用ResultSet中的next()方法)并将取到的值赋给对象(user)属性
			while (resultSet.next()) {
				user.setUserName(resultSet.getString("username"));//获得指定列名(username)中的值
				user.setPassword(resultSet.getString("upwd"));//获得指定列名(password)中的值
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return user;//返回对象
	}

二. JavaBean

在Bean层中只需要封装类的属性的get和set方法即可,有需要也可以将toString重写。

例如:创建User类

public class User {
    private int id;
    private String username;
    private String password;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return userName;
    }
    public void setUsername(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

}

三. Service业务层

在Service层中,负责完成特定的方法的逻辑代码编写,如登录、注册。此处以登录为例:

public class LoginService {
    private UserDao userDao = new UserDao();//创建userDao对象
    public void login(User user) throws UserException{//添加登录功能

        //调用userDao中的selectUser()查询方法,并将查询结果赋值给新对象user1
        User user1 = userDao.selectUser(user.getUserName(),user.getPassword());
        if(user1.getUserName() == null || user1.getPassword() == null){//对登录条件进行限制
            //输出用户名或密码错误。
            throw new UserException("用户名或密码错误,请重新登录!");//抛出自定义异常
        }
    }
}

四. Exception自定义异常

创建名为UserException的类:

public class UserException extends Exception {

    public UserException(){
        super();
    }
    public UserException(String message, Throwable cause){
        super(message, cause);
    }
    public UserException(String message){
        super(message);
    }
    public UserException(Throwable cause){
        super(cause);
    }
    
}

可以直接快速导入:

Source --> Generate Constructors From SuperClass

五. Servlet层

在Servlet(extends HttpServlet)层中,主要实现HttpServlet中的两个方法:

doGet(HttpServletRequest req, HttpServletResponse resp){}

doPost(HttpServletRequest req, HttpServletResponse resp){}

此处没有写doGet中的内容,是由于仅以登录作为示例,登录通常使用Post请求,by the way:

doGet和doPost的区别,这个比较直观,引用自:https://www.cnblogs.com/alsf/p/9133951.html

具体如下:

public class LoginServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*此处没有写doGet中的内容,是由于仅以登录作为示例,登录通常使用Post请求,by the way:

        *doGet和doPost的区别,这个比较直观,引用自:https://www.cnblogs.com/alsf/p/9133951.html

        */
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        //设置编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        //接收页面传值
        String username = req.getParameter("username");//获取name = "username"输入框里面你输入的内容
        String password = req.getParameter("password");//获取name = "password"输入框里面你输入的内容
        LoginService loginService = new LoginService();//创建loginService 对象
        User user = new User();//创建user 对象
        user.setUsername(username);//获取到输入框里面的你输入的值后,向user对象中的username属性赋值
        user.setPassword(password);//获取到输入框里面的你输入的值后,向user对象中的password属性赋值
        try {
            loginService.login(user);//调用login(user)方法实现登录
            //登录成功后跳转到页面
            req.getRequestDispatcher("/loginSuccess.jsp").forward(req, resp);
        } catch (Exception e) {
            // TODO: handle exception
            //获取异常信息
            req.setAttribute("msg", e.getMessage());
            //将异常信息发送到登录页面便于展示
            req.getRequestDispatcher("/login.jsp").forward(req, resp);
        }
    }

}

六. JSP

以登录为例(涉及到简单的EL表达式的使用,即:${msg }):

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>"> 
    <title>login</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
  <p style=color:red; fontweight:900>${msg }</p>
    <form action="LoginServlet" method="post">
        <div class="sign-in-htm">
            <div class="group">
                <label for="user" class="label">username</label>
                <input name="username" placeholder="请输入用户名" type="text" class="input">
                    </div>
                        <div class="group">
                            <label for="pass" class="label">password</label>
                            <input type="password" class="input" data-type="password" name="password" placeholder="请输入密码">
                        </div>                        
                        <div>
                            <input type="submit" class="button" value="登录" onClick="sub()">
                        </div>
                
            </div>
        </div>
    </form>
  </body>
</html>

七. xml配置文件

在配置文件中配置好了Servlet的属性,才能实现页面之间的跳转:其中cn.test.servlet为Servlet类所在的包的路径

 <servlet>
      <servlet-name>LoginServlet</servlet-name>
      <servlet-class>cn.test.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>LoginServlet</servlet-name>
      <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
原创文章 6 获赞 12 访问量 807

猜你喜欢

转载自blog.csdn.net/qq_40602986/article/details/105978450