实验七 登录与注册(JDBC)
目 录
一、实验目的
-
学会安装MySQL数据库;
-
熟练掌握JDBC;
-
理解登录和注册在数据库中的体现。
二、实验要求
基本要求:
- 编写一个UserBean类,要求该类具有两个属性name和password,并给出两个属性对应的getter和setter方法。
- 在MySQL数据库中新建wgw数据库,并建立名为tb_user的用户信息表,tb_user表包括name和password两个属性,此两个属性均为varchar(50)类型,均不为空,name为主键。
- 编写主页面index.jsp,该页面提供两个超链接,分别链接到注册页面和登录页面;
- 编写一个注册页面zhuce.jsp,包括:用户名,密码,密码确认以及确认和重设按钮;
- 编写一个登录页面denglu.jsp,包括:用户名,密码以及确认和重设按钮;
- 注册处理Servlet:treatZhuCe.java。该Servlet判断用户名和密码是否为空、密码和密码确认是否相同。如果用户名和密码不为空且密码和密码确认相同,则认为注册成功,并将用户的姓名和密码存入到数据库wgw的tb_user表中。否则认为注册失败。处理结果交给zhuCeResult.jsp显示。
7.登录处理Servlet:treatDengLu.java。该Servlet判断判断用户名和密码是否为空,若不为空,在数据库wgw的tb_user表中查询用户名和密码是否匹配。如果匹配则认为登录成功,生成UserBean对象user,在session对象以“user”的名字存入。其它情况均认为登录失败。处理结果交给dengLuResult.jsp显示。
三、一些相关方法
boolean java.lang.String.equals(Object anObject)
String java.lang.String.trim()
Object javax.servlet.ServletRequest.getAttribute(String arg0)
void javax.servlet.ServletRequest.setAttribute(String arg0, Object arg1)
String javax.servlet.ServletRequest.getParameter(String arg0)
RequestDispatcher javax.servlet.ServletRequest.getRequestDispatcher(String path)
void javax.servlet. RequestDispatcher. forward(ServletRequest request, ServletResponse response)
HttpSession javax.servlet.http.HttpServletRequest.getSession(boolean arg0)
void javax.servlet.http.HttpSession.setAttribute(String arg0, Object arg1)
void javax.servlet.http.HttpSession.getAttribute(String arg0)
PrintWriter javax.servlet.ServletResponse.getWriter()
ServletContext javax.servlet.GenericServlet.getServletContext()
java.lang.Class.forName(“com.mysql.jdbc.Driver”) throws ClassNotFoundException
Connection java.sql.DriverManager.getConnection(String url,String name,String password) throws SQLException
Statement java.sql.Connection.createStatement() throws SQLException
PreparedStatement java.sql.Connection.prepareStatement(String sql) throws SQLException
int java.sql.Statement.executeUpdate(String sql) throws SQLException
ResultSet java.sql.PreparedStatement.executeQuery() throws SQLException
void java.sql.Connection.close() throws SQLException
void java.sql.Statement.close() throws SQLException
void java.sql.ResultSet.close() throws SQLException
四、相关的SQL语句
1.注册的插入语句
PreparedStatement pmt=null;
/*完成插入*/
pmt=con.prepareStatement("INSERT INTO tb_user (name, password) values(?, ?)");
pmt.setString(1,userName);
pmt.setString(2,userPassw);
pmt.executeUpdate();
2.登录的查询语句
PreparedStatement pmt=null;
/*完成查询*/
pmt=con.prepareStatement("select * from tb_user where name = ? and password = ?");
pmt.setString(1,userName);
pmt.setString(2,userPassw);
rs = pmt.executeQuery();
五、实验步骤
1.基本要求2 在MySQL数据库中新建wgw数据库
(1)下载MySQL,下载地址为MySQL :: Download Connector/JMySQL :: Download Connector/JMySQL :: Download Connector/J(点击即可跳转),选择Platform Independent,选择ZIP点击下载,如图
图 1 下载MySQL页面
(2)加载驱动程序,下载好MySQL后解压,在eclipse中右键项目,点击Build Path->Configure Build Path
图 2 装载MySQL
(3)点击Add External JARs,找到刚才解压MySQL的路径,选择mysql的jar文件,点击应用。
图 3 配置MySQL
(4)可以看到mysql的jar文件出现在Referenced Libraries下,再将驱动程序mysql-connector-java-8.1.0.jar放入Tomcat安装目录的lib文件夹下,配置完成。
图 4 查看MySQL配置
(5)打开MySQL创建数据库www,填写数据库名,点击创建
图 5 创建数据库
(6)双击数据库,右键点击创建表
图 6 创建表
(7)里面有两个属性name和password,两个属性均为varchar(50)类型,均不为空,name为主键。
图 7 填写表名及属性
2.基本要求6
(1)重写doGet和doPost方法
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//判断代码
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
(2)判断用户名和密码是否为空、密码和确认密码是否相同和前面实验相同,但是这里要连接数据库,先写URL地址,我用的是MySQL,端口号为3306,数据库名称为wgw,根据URL的语法规则,jdbc:<subprotocol>:<subname>,代码为:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ylz", "root", "root");
(3)判断用户是否存在,也就是查询数据库有没有与输入用户信息相同的,若有则用户已存在,注册失败,要保证没每个用户名单一性,这里没有做的很复杂,只是判断用户名是否相同,应该还需要判断密码是否相同,这里密码是可以相同的,因为用户名这个属性在表格中是主键,只能出现一次。注册结果有对应的massage给出提示。
使用游标next,下移记录,对应的用户名和密码,将注册的用户名和密码插入数据库中。注册成功,跳转到zhuCeResult.jsp页面
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM tb_user WHERE username = ?");
stmt.setString(1, username);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
response.sendRedirect("zhuCeResult.jsp?register=failed&message=Username already exists.");
(4)用户名还未注册,则将该条信息插入数据库表格中,返回注册成功的消息5
} else {
stmt = conn.prepareStatement("INSERT INTO tb_user (username, password) VALUES (?, ?)");
stmt.setString(1, username);
stmt.setString(2, password);
stmt.executeUpdate();
response.sendRedirect("zhuCeResult.jsp?register=success");
}
(5)使用完数据库关闭连接
rs.close();
stmt.close();
conn.close();
(6)zhuCeResult.jsp作出部分修改,注册不同结果显示不同效果,判断注册是否成功,给出返回首页的链接,注册是否成功都能返回主页继续操作,代码如下:
if (register != null && register.equals("success")) {
out.println("注册成功!");
} else {
out.println("注册失败,错误信息: " + message);
}
<br>
<a href="index.jsp">返回首页</a>
(7)运行结果
①输入一个未注册过的用户名,填写密码和确认密码
图 8 输入未注册过的用户名,正确填写密码和确认密码
②注册成功,输出如下结果,如果想继续登陆可以点击下面的返回首页的链接,跳转到首页,可以继续进行注册和登陆
图 9 注册成功
③用户名或密码未输入
图 10 未输入用户名或密码
④对应的message输出如下,同样可以点击下面的返回主页链接,重新进行注册
图 11 未填写用户名或密码注册结果
⑤密码和确认密码输入不一样也会给出提示
图 12密码和确认密码不一样
⑥输出错误提示,密码和确认密码不匹配
图 13 密码和确认不一致注册结果
⑦如果一个用户名已经注册好了,但是其他用户也想注册这个用户名,就会提示,该用户名已存在,这是数据库中主键的设置,只能不能有相同项出现,前面“源来在”已经注册过,这里又一次注册
图 14 数据库已经存在的用户名注册
⑧用户注册时就会访问数据库,查询该用户名是否存在,若存在给出如下提示。
图 15 用户名也存在注册结果
3.基本要求7
登录处理Servlet:treatDengLu.java。该Servlet判断判断用户名和密码是否为空,若不为空,在数据库wgw的tb_user表中查询用户名和密码是否匹配。如果匹配则认为登录成功,生成UserBean对象user,在session对象以“user”的名字存入。其它情况均认为登录失败。处理结果交给dengLuResult.jsp显示。
(1)重写doGet方法和doPost方法
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//判断代码
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
(2)先判断用户名和密码是否为空,密码和确认密码是否一样,用户名和密码都不为空且密码和确认密码一样时,获取数据库连接
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/wgw";
String dbUsername = "root";
String dbPassword = "root";
conn = DriverManager.getConnection(url, dbUsername, dbPassword);
(3)查询数据库,输入的用户名是否存在数据库中
String query = "SELECT * FROM tb_user WHERE username = ? AND password = ?";
stmt = conn.prepareStatement(query);
stmt.setString(1, username);
stmt.setString(2, password);
rs = stmt.executeQuery();
(4)该用户名是否在数据库内,若不在直接重定向到denglu.jsp,重新登陆,否则查询密码与数据库中的密码是否匹配,匹配成功则提示登陆成功,不匹配则重定向到denglu.jsp。没有登录失败提示。
if (rs.next()) {
UserBean user = new UserBean();
user.setUsername(username);
user.setPassword(password);
HttpSession session = request.getSession();
session.setAttribute("user", user);
response.sendRedirect("dengLuResult.jsp");
} else {
response.sendRedirect("dengLuResult.jsp");
}
(5)匹配成功,生成UserBean对象user,在session对象以“user”的名字存入,否则登陆失败,返回输出错误提示
if (rs.next()) {
UserBean user = new UserBean();
user.setUsername(username);
user.setPassword(password);
HttpSession session = request.getSession();
session.setAttribute("user", user);
response.sendRedirect("dengLuResult.jsp");
} else {
response.sendRedirect("dengLuResult.jsp");
}
(6)最后完成后关闭所有连接,以免占用资源。
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
(7)dengLuResult.jsp判断登陆是否成功,从session中获取UserBean对象,用user是否为空判断,因为前面登陆成功吧user放到session中
<%
}
UserBean user = (UserBean) session.getAttribute("user");
if (user != null) {
%>
<h2>登陆成功</h2>
<p>你好, <%= user.getUsername() %>!</p>
<%
} else {
%>
<h2>登陆失败</h2>
<p>请确保用户名和密码不为空,并且确认密码输入确。</p>
<%
}
%>
(8)运行结果
①用户输入用户名和密码,在数据库中正好存在该用户名,“呜呜呜”前面注册过了,且用户输入密码与数据库中密码匹配
图 16 输入注册过的用户名及密码
②则登陆成功,如图
图 17 登陆成功
③用户名或密码未填写,用户名密码填写错误与数据库中不匹配
图 18 输入数据库中不存在的用户名
图 19 输入密码与数据库中保存密码不匹配
④返回登录失败,并给出错误提示
图 20 登陆失败
六、实验总结
本实验主要考查数据库的连接,对数据库中表格进行增添和查询,安装MySQL,加载驱动程序。数据库连接很简单,前面加载驱动花费了一段时间,总体操作还是很简单的。在调试treatDengLu.java时候一直有错误,404,403,500这些错误可以说都出现了一遍,在实验六中出现的URL不支持get方法,资源不存在或不允许访问的错误本次实验又出现了,总的来说还是有一些小细节问题,最后找了很多资料才把这些问题解决。对每种错误页面提示有了新的认识,对网页输出、跳转等有了进一步的认识。