首页 > 数据库 >使用MVC实现登录注册功能(数据保存到数据库)详细讲解以及代码

使用MVC实现登录注册功能(数据保存到数据库)详细讲解以及代码

时间:2022-11-03 15:01:38浏览次数:45  
标签:String 数据库 sql MVC 讲解 import servlet pstmt

M:代表模型层,解决问题的功能具体实现。比如向数据库添加数据、查询数据 V:代表视图,用户和机器的交互页面。用来展示信息(一般用html,js,css...) C:控制层,用来连接用户提交的操作和调用后台功能(servlet实现)

1、视图层(View)页面的编写:

简单的html页面,这里只显示登录界面,其他的界面很容易写,简单的页面跳转。 提示。登录页面: action="servletControll"。将登录的内容提交都处理登录的的servlet.注册页面的数据提交到处理注册页面的servelet。

<hr>

1.1、登录页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>

     <form action="servletControll" method="post">
            
         用户名:<input type="text" name="uname"/>
         密 码: <input type="password" name="upwd"/><br><br>
                <input type="submit" value="登录"/>
                <input type="reset" value="重置"/>
                <a rel="nofollow" href="register.jsp">注册新用户</a>            
     </form>

</body>
</html>

<hr>

1.2、注册页面


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>

       <form action="servletControllRegiser" method="post">
           用户名:<input type="text" name="uname"/>
           密 码: <input type="password" name="upwd"/>
                  <input type="submit" value="注册"/>
       </form>

</body>
</html>

<hr>

2、控制层(Controller)的编写

servletControll:编写的servlet层,表示将提交的页面内容信息传给servletControll处理。

提交的方式:

  • post:表示提交的内容不显示在浏览器文本框里
  • get:提交的内容显示在URL地址栏中 比较不安全(敏感信息全部暴露出来)。

servlet层:

将前端和后端进行连接的桥梁。 servlet层主要是==获得视图层提交的表单信息==。调用model层提供的功能根据传入的参数进行操作。然后将操作的信息返回给前端显示。

友情提示: 放置提交的信息发生乱码:request.setCharacterEncoding("utf-8");还有相应的信息也需要设置响应编码。目前这里不需要用到response设置相应的信息。 通过request.getParameter("uname")取得值。根据uname取得姓名的值。

<hr>

2.1、 注册


package com.zyz.service;

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

import com.zyz.funciton.RegisterDao;
import com.zyz.login.Login;

/**
 * Servlet implementation class servletControllRegiser
 */
@WebServlet("/servletControllRegiser")
public class servletControllRegiser extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//注册功能、、向数据库添加数据
		
		request.setCharacterEncoding("utf-8");
		String name=request.getParameter("uname");
		String pwd=request.getParameter("upwd");
		
		Login log=new Login(name,pwd);//保存客户端输入的信息
		
		int result=RegisterDao.register(log);
		if(result>0) {
			//注册成功
			response.sendRedirect("successRegister.jsp");
		}else {
			//注册失败重新注册
			response.sendRedirect("register.jsp");
		}
	}

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

}

==友情提示:== 在注册之前可以先调用查询有无此人,如果有此人可以编写提示信息。自己实现,很容易在注册函数调用之前先调用查询函数

<hr>

2.2 、登录


package com.zyz.service;

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

import com.zyz.funciton.LoginDao;
import com.zyz.login.Login;

/**
 * Servlet implementation class servletControll
 */
@WebServlet("/servletControll")
public class servletControll extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//取值
		request.setCharacterEncoding("utf-8");
		String name=request.getParameter("uname");
		String pwd=request.getParameter("upwd");
		//封装	
		Login log=new Login(name,pwd);
		
		//调用业务逻辑层
		int result =LoginDao.login(log);
		
		if(result>0) {
			//登录成功
			response.sendRedirect("success.jsp");//重定向到成功界面
		}else {
			//登录失败
			response.sendRedirect("notsuccess.jsp");//定位到失败页面
		}
		
		
		//请求转发
	}


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

}

==友情提示:==

在servlet层获得的信息实际上就是一个用户的信息。可以设置一个封装了用户信息的实体类(数据库中的一张表) Login log=new Login(name,pwd); 构造方法里的参数根据需要可以增加多个,根据需要自己定义。 然后调用Model层封装好的JavaBean功能函数

<hr>

2.3 、实体类


package com.zyz.login;

public class Login {
	// 封装实体类的JavaBean

	private String name;
	private String password;

	public Login() {

	}

	// 构造方法用来传入数值
	public Login(String name, String password) {
		this.name = name;
		this.password = password;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}


<hr>

3、Model层(Model)的编写

model层(处理业务逻辑的JavaBean,封装实体类信息的JavaBean) 实际上就是操作数据库的一些增删改查。这里只需要编写添加新用户的信息,和查询登录。

数据库的连接过程: 主要五个步骤 1、加载驱动。不同的数据库有不同的驱动,去官网上下载很容易的,然后导入java(我连接的数据库是sqlserver) 2、建立连接。 3、建立sql语句操作数据库。 4、处理结果集。(增删改使用的是executeupdate 查询使用的是executequery)。 5、关闭连接。

<hr>

3.1 登录


package com.zyz.funciton;

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

import com.zyz.login.Login;

//处理业务逻辑的JavaBean
public class LoginDao {

	public static int login(Login login) {
		int flag = -1;
		String NAME = "登录数据库的用户名";
		String PASSWORD = "登录数据库的个人密码";
		String URL = "jdbc:sqlserver://localhost:1433;databaseName=自己的数据库名字";

		Connection connection = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		try {
			// 1、加载驱动
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			// 2、建立连接
			connection = DriverManager.getConnection(URL, NAME, PASSWORD);

			// 3、操作数据库
			String sql = "select count(*) from admins where name=? and password=?";
			pstmt = connection.prepareStatement(sql);
			pstmt.setString(1, login.getName());
			pstmt.setString(2, login.getPassword());
			// 4、执行
			rs = pstmt.executeQuery();

			if (rs.next()) {
				flag = rs.getInt(1);
			}
			if (flag > 0) {// 登录成功
				return 1;
			} else {
				return 0;
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return -1;
		} catch (SQLException e) {
			e.printStackTrace();
			return -1;
		}catch (Exception e) {
			e.printStackTrace();
			return -1;
		}finally {
			
			try {
				if(rs!=null) rs.close();
				if(pstmt!=null) pstmt.close();
				if(connection!=null) connection.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}

	}

}

<hr>

3.2 注册


package com.zyz.funciton;

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

import com.zyz.login.Login;

//封装注册功能业务逻辑的JavaBean
public class RegisterDao {
	
	public static int register(Login login) {
		int count =-1;
String NAME = "登录数据库的用户名";
		String PASSWORD = "登录数据库的个人密码";
		//String URL = "jdbc:sqlserver://localhost:1433;databaseName=test";
		String URL="jdbc:sqlserver://localhost:1433;databaseName=test";
		
		Connection connection=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		
		try {
			//1、加载驱动
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			//2、连接
			connection=DriverManager.getConnection(URL,NAME,PASSWORD);
			//操作数据库
			String sql="insert into admins values(?,?)";//插入数据
			pstmt=connection.prepareStatement(sql);
			pstmt.setString(1, login.getName());
			pstmt.setString(2, login.getPassword());
			
			 count=pstmt.executeUpdate();
			return count;
			
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
			return -1;
		}catch(SQLException e) {
			e.printStackTrace();
			return -1;
		}
		catch(Exception e) {
			e.printStackTrace();
			return -1;
		}finally {
			
			try {
				if(pstmt!=null) pstmt.close();
				if(connection!=null) connection.close();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		
	}
	

}

<hr>

==友情提示==:在建立操作数据库sql对象时.尽量使用PreparedStatement创建对象。相比Statement容易操作

	String sql="insert into admins values(?,?)";//插入数据
	
	pstmt=connection.prepareStatement(sql);
	pstmt.setString(1, login.getName());
	pstmt.setString(2, login.getPassword());

<hr>

4、测试效果

验证 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

<hr>

5、数据库中的数据

在这里插入图片描述

<hr>

基本流程: view 将信息提交给servelt层处理,servlet调用model层。servlet层再将处理后的内容发送到view层。

还有更加高级的三层模式。和mvc很像。但是更加方便。其中数据库的连接有大量的重复代码,可以单独编写一个辅助类。进行数据库的连接和关闭。

<hr>

6、可能操作不成功的原因

1、首先这部分代码是完整的、是没有坑的。这些图也都是程序运行后的截图。 2、这部分代码的运行环境:eclipse+tomcat8+sqlserver 3、使用eclipse需要确定是否导入驱动(jar)、以及导入驱动是否正确(如果驱动没有成功、肯定是无法进行数据库操作的、也就不能实现登录和注册)。一定要确保驱动成功!!!!!!!!!!!! 4、如果使用IDEA、只需要在pom文件中引入对应的驱动版本(这个需要使用Maven) 5、确保环境没有问题后、还是写不进入。就请Debug找一下原因、大致思路:首先判断数据是否传入到controller层、然后在controller层调用Model层的方法是否正确

标签:String,数据库,sql,MVC,讲解,import,servlet,pstmt
From: https://blog.51cto.com/u_15740728/5819180

相关文章

  • 写给关系数据库开发者的 TDengine 入门指南
    MySQL是中国开发者最熟悉的开源数据库产品,在很多开发者心中MySQL就是关系数据库的代名词。开发者们对MySQL数据库的的特性已经非常熟悉了。TDengine (https://github......
  • 什么是mysql数据库?MySQL的特点有哪些?
    MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(Re......
  • [数据库基础]-- 字符串截取函数substr、substring以及 case when函数使用
    使用说明:1、使用:substr使用范围:oracle、mysql、sqlserversubstring使用范围:mysql、sqlserver 2、举例:现有表:t_user name、age字段查询需求:如果name字段中的第5个字符有“......
  • [Spark streaming举例]-- 实时统计并且存储到mysql数据库中
    举例packagecom.scala.myimportorg.apache.spark.SparkConfimportorg.apache.spark.streaming.Durationsimportorg.apache.spark.streaming.StreamingContext/****@......
  • Spring MVC的工作原理,我们来看看其源码实现
    开心一刻晚上陪老丈人吃饭,突然手机响了,我手贱按了免提……哥们:快出来喝酒!哥几个都在呢!我:今天不行,我现在陪老丈人吃饭呢哥们:那你抓紧喝,我三杯白酒,把我岳父放......
  • 关系数据库三大范式
    一、范式分类定义:范式是符合某一级别的关系模式的集合,关系数据库中的关系必须满足一定的要求,即满足不同的范式。第一范式(1NF)第二范式(2NF)第三范式(3NF)Boyee-Codd范......
  • 云数据库时代,DBA将走向何方?
    摘要:伴随云计算的迅猛发展,数据库也进入了云时代。云数据库不断涌现,产品越来越成熟和智能,作为数据库管理员的DBA将面临哪些机遇和挑战?又应该具备什么能力,才能应对未来的不确......
  • SQLServer 还原数据库时提示占用
    --还原数据库提示“因为数据库正在使用,所以无法获得对数据库的独占访问权。--首先选中master数据库,执行以下语句declare@dbnamevarchar(50)set@dbname='mzysgzz'decla......
  • Laravel入门与实战示例代码----数据库和Eloquent
    示例8-1数据库默认连接列表'connections'=>['sqlite'=>['driver'=>'sqlite','database'=>database_path('database.sqlite'),'prefix'......
  • 软件设计__ 数据库逻辑结构设计
    难度:★★☆案例引入YourTour系统(旅游线路预定系统)YourTour是一个为旅行社和其目标顾客提供服务的系统。它能够将多个景点组成一条旅游线路,而且能够为所有参加线路的游......