上一篇我们谈到把用户登录时用的登录名输出到控制台,但是并没有对用户的合法性进行验证,下面我们将把程序链接到数据库,然后再数据库里面查询是否有这个用户,然后再判断是否让这个用户登录。
java链接数据库的jar包和servelt的包已经在上篇文章中给大家了,大家也可以自行到官网中下载。
在开始下面的阅读之前,请先自行安装配置好mysql。如果之前对mysql不了解可以先到这个网站去学习一下。http://www.runoob.com/mysql/mysql-tutorial.html
(一):建立用户信息数据表
下面是我建的数据库和里面的几条数据:
我新建的数据库名称是learn,表的名称是t_learn_user.大家可以自行命名。
(二):构建servlet+dao+javabean的框架
(三):填充具体内容
在data包里面新建User持久化类,这是用户数据类,类的内容和数据库里面用户数据表的内容是一一相对的。
User.java源码:
package com.xue.database.data;
import java.io.Serializable;
/**
* 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。
* 持久化的主要应用是将内存中的对象存储在关系型的数据库中,
* 当然也可以存储在磁盘文件中、XML数据文件中等等
*
*/
public class User implements Serializable{
/**
* User里面的内容是和数据库表的列相对应的
*/
private int userId;
private String userName;
private String userPassword;
private String userRole;//用户角色信息
private String userEmail;
private String userPhone;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getUserRole() {
return userRole;
}
public void setUserRole(String userRole) {
this.userRole = userRole;
}
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
public String getUserPhone() {
return userPhone;
}
public void setUserPhone(String userPhone) {
this.userPhone = userPhone;
}
}
我们的用户数据类已经建立好了,下面开始建立数据库链接类。
在dao下面创建一个名称为DataSource.java的文件。这个文件的作用的打开数据库,并返回数据库连接
DataSource.java源码:
package com.xue.database.dao;
import java.sql.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
public class DataSource {
private static String url = "jdbc:mysql://localhost:3306/learn"; //连接路径
private static String user = "root"; //用户名
private static String password = "zxj341204"; //密码
/**
* 打开并返回数据库连接
*/
public static Connection getConnection() {
try {
//创建Mysql数据源对象
MysqlDataSource dataSource = new MysqlDataSource();
//设置连接属性
dataSource.setUrl(url);
dataSource.setUser(user);
dataSource.setPassword(password);
//打开并返回连接
return dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
数据库连接类已经建立好了,但是如果我们想用数据库里面的数据,还需要建立数据库连接类。下面我们现在dao下面建立数据库服务类的接口UserDaoService.java
UserDaoService.java源码:
package com.xue.database.dao;
import com.xue.database.data.User;
/**
* 我们可以在这个接口里面定义数据库的增删查改函数原型,
* 现在我只是定义了用户的登录验证所用的函数
*
*/
public interface UserDaoService {
/**
* 根据用户的昵称和密码查询用户
* @param userName
* @param userPassword
* @return
* @throws Exception
*/
public User check(String userName,String userPassword) throws Exception;
}
定义过服务类的接口,下面我们将要具体把它实现。在dao下面新建包,命名为impl。我们在impl新建一个具体服务类:UserDaoServer.java
UserDaoServer.java源码
package com.xue.database.dao.impl;
import java.sql.ResultSet;
import java.sql.Statement;
import com.mysql.jdbc.Connection;
import com.xue.database.dao.DataSource;
import com.xue.database.dao.UserDaoService;
import com.xue.database.data.User;
public class UserDaoServer implements UserDaoService{
/**
* 在这里我们写出具体是怎么查询
*/
@Override
public User check(String userName, String userPassword) throws Exception {
// TODO Auto-generated method stub
Connection conn = (Connection) DataSource.getConnection();//取得数据库链接
Statement stm = conn.createStatement();//创建数据库操作的语句对象
//查询数据库返回结果集
ResultSet rs = stm.executeQuery("select * from t_learn_user"
+ " where user_name='"+userName+"' and user_password='"+userPassword+"'");
User user = null;
//遍历结果集,封装用户数据
if(rs.next()) {
//创建用户对象
user = new User();
//设置用户的属性值
user.setUserId(rs.getInt("user_id"));
user.setUserName(rs.getString("user_name"));
user.setUserPassword(rs.getString("user_password"));
user.setUserRole(rs.getString("user_role"));
user.setUserEmail(rs.getString("user_email"));
user.setUserPhone(rs.getString("user_telphone"));
}
//关闭连接
conn.close();
return user;//如果没有查询到此用户,那么将返回空指针
}
}
servlet+dao+javabean+jsp架构是客户端提交数据给servlet,servlet把提交的内容转发给javabean,javabean进行与数据库的具体交互工作。下面开始写javabean
在service包下新建java接口类:LoginService.java
LoginService.java源码:
package com.xue.service;
import javax.servlet.http.HttpServletRequest;
public interface LoginService {
//调用数据库服务类,具体查询
public String login(HttpServletRequest request) throws Exception;
}
在service包下新建impl包,里面是服务接口的具体实现,然后再impl包里面新建LoginServer.java.
LoginServer.java源码
package com.xue.service.impl;
import javax.servlet.http.HttpServletRequest;
import com.xue.database.dao.UserDaoService;
import com.xue.database.dao.impl.UserDaoServer;
import com.xue.database.data.User;
import com.xue.service.LoginService;
public class LoginServer implements LoginService {
private UserDaoService dao = new UserDaoServer(); //定义数据访问Dao对象
@Override
public String login(HttpServletRequest request) throws Exception {
String userName = request.getParameter("userName");
String password = request.getParameter("password");
//通过Dao接口,访问数据库,用户名与密码为条件查询用户数据
User user = dao.check(userName, password);
//验证登录是否成功
if(user!=null) { //成功
System.out.println("userName= "+userName+" userPassword= "+password);
request.setAttribute("userName", userName);
return "/main.jsp";
} else { //失败
//请求中添加错误信息
System.out.println("用户名或密码错误!");
request.setAttribute("error", "用户名或密码错误!");
return "/login.jsp";
}
}
}
在上一篇文章中,我们是直接在servlet里面输出用户的用户名称。但是在现在的这种架构中,servlet的作用的转发请求,所以我们要更改我们的servlet的内容。
下面是更改后的代码:
package com.xue.servlet;
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.xue.service.LoginService;
import com.xue.service.impl.LoginServer;
@WebServlet("/LoginServlet")//不要更改
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// System.out.println("name" + request.getParameter("userName"));//这里填写的是我们在html文件里面写的名字
LoginService service = new LoginServer();//新建bean服务类
//设置请求中数据的编码格式
request.setCharacterEncoding("utf-8"); //解决中文乱码问题,只支持post模式
try {
String path = service.login(request);//访问业务Bean,验证登录
request.getRequestDispatcher(path).forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
(四):更改静态页面为动态页面,实现与服务器的数据交互
把login.html更改为login.jsp
更改后的代码为:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<meta charset="utf-8">
<title>用户登录title>
<style type="text/css">
dd,dt{
margin:0;
}
style>
head>
<body>
<div id="login" style="margin:300px auto auto auto;width:300px;border: 3px solid red" >
<form id="form1" name="form1" method="post" action="LoginServlet">
<dl>
<dt style="text-align: center;margin-bottom: 15px;" >用户登录dt>
<dd style="text-align: center;margin-bottom: 10px;"><input type="text" name="userName" placeholder="请输入用户名" required="required" autofocus="autofocus" class="input-size" />dd>
<dd style="text-align: center;"><input type="password" name="password" placeholder="请输入密码" required="required" class="input-size" />dd>
<dd style="text-align: center; color:red;">${error}dd>
<dd style="text-align: center;margin-top: 15px;"><input type="submit" value="登 录" class="btn-submit" />dd>
dl>
form>
div>
body>
html>
因为我们已经更改了登录的界面,所以我们把web.xml里面的欢迎文件列表也要个改成现在的.jsp。如图
新建main.jsp作为登录后的显示界面,下面是main.jsp的源码
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>欢迎界面title>
head>
<body>
<p style="margin-top: 200px;color:red;text-align: center;font-size:xx-large;">欢迎:${userName}p>
body>
html>
数据库里面存储的内容
这是用浏览器实现用户登录的,后面我将会补充上android端用户登录。