【本案例采用IDEA软件开发】
1、创建数据库
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE
)
【在表中插入一条数据】:
2、开始使用idea实现
【1】、新建web项目
【2】、新建完成目录结构
【3】、开始配置tomcat
【注意这里选择自己的下载的tomcat地址】完成后全程确定即可
【4】、导入mysql驱动包文件
【在web下的WEB-INF下新建一个目录文件夹来存放我们的架包】
【将所需要的架包复制到lib目录下】
【添加架包到我们的项目模块中】
【5】、开始准备jsp页面
【新建jsp方法】
【1、编写login页面,直接在默认的index.jsp中进行修改】
<%--
Created by IntelliJ IDEA.
User: 执手天涯
Date: 2021/10/22
Time: 20:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定义一个path表示我们项目的根路径--%>
<% String path = request.getContextPath(); %>
<html>
<head>
<title>登录</title>
</head>
<body>
<%--method表示提交方式 可以改变为post--%>
<%-- action我们先不写,后面我们写逻辑代码的时候添加--%>
<%--action表示的是我们提交的地址--%>
<form action="<%=path%>/login" method="post">
请输入用户名:<input name="username" type="text"><br>
请输入密码:<input name="password" type="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
【6】、准备登录成功页面
<%--
Created by IntelliJ IDEA.
User: 执手天涯
Date: 2021/10/18
Time: 12:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<--这里的xxx我们后面在从数据库获取-->
<h1>欢迎XXX登录成功</h1>
</body>
</html>
【7】、准备登录失败页面
<%--
Created by IntelliJ IDEA.
User: 执手天涯
Date: 2021/10/18
Time: 12:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
对不起,登陆失败!
</body>
</html>
3、开始编写java代码
【首先我们来说一下MVC结构,详情大家可以百度】
【1】、创建mvc目录结构
【创建包的方法】
【2】、开始编写MVC模式
【3.2.1】、编写数据库连接工具类
package com.Utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnUtil {
//定义一个方法来获取数据库的连接
public static Connection getConn() {
//初始化数据库连接对象conn
Connection conn = null;
//利用try...catch处理异常
try {
//注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//开始连接自己的数据库
//test是数据库名称
//root 一般不需要修改
//password:修改为自己数据库的密码
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
"root",
"XING0710");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
【3.2.2】、编写两个万能的工具类
package com.Utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BaseDao {
/**
* 功能描述
* 增删改的万能方法
*
* @param sql 表示我们传入的sql语句
* @param obj 表示我们自定义的参数
* @return int
*/
public int modifyData(String sql, Object[] obj) {
Connection conn = ConnUtil.getConn();
int result = 0;
try {
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
result = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
/**
* 功能描述
* 查询的万能方法
* @param sql 我们传入的查询sql语句
* @param obj 我们传入的自定义参数
* @return java.sql.ResultSet
*/
public ResultSet getDataByAny(String sql, Object[] obj) {
Connection conn = ConnUtil.getConn();
ResultSet rs = null;
try {
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
rs = ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
}
【3.2.3】开始从实体层entity编写
package com.Entity;
/**
* 功能描述
* 这个类是对于数据库表中tb_user的实体类
* 并添加了get和set方法
*/
public class User {
private Integer id;
private String username;
private String password;
public User(Integer id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
}
【3.2.4】、编写dao层接
package com.Dao;
/**
* 功能描述
* 这里放的是我们所有的用户表的方法
*/
public interface userDao {
/**
* 功能描述
* 用户登录
* @param username 传入获取的用户名
* @param password 传入获取的密码
* @return boolean
* @date
*/
public boolean login(String username, String password);
}
【3.3.5】、编写到dao接口的实现类
package com.Dao.DaoImpl;
import com.Dao.userDao;
import com.Utils.BaseDao;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 功能描述
* 我们通过继承的方法来调用BaseDao工具类中我们写好的查询数据的方法
* 再实现UserDao接口中的方法
*/
public class UserDaoImpl extends BaseDao implements userDao {
@Override
public boolean login(String username, String password) {
//定义一个查询的sql语句
String sql = "select *from tb_user where username=? and password=?";
/**
*功能描述
* 利用super关键字调用BaseDao中getDataByAny方法(也可以用this)
* @param username 我们的查询依据
* @param password 我们查询依据
* @return boolean 返回一个布尔数据类型
* ResultSet 返回一个结果集
*/
ResultSet result = super.getDataByAny(sql, new Object[]{username, password});
//定义一个boolean的变量来确定我们查询是否成功
boolean flag = false;
try {
while (result.next()) {
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return flag;
}
}
【3.3.6】、编写service层接口
package com.Service;
public interface userService {
/**
* 功能描述
* 用户登录 这里和UserDao一样,方便我们servlet的调用
* @param username 传入获取的用户名
* @param password 传入获取的密码
* @return boolean
* @date
*/
public boolean login(String username, String password);
}
【3.3.7】、编写service层接口实现类
package com.Service.Impl;
import com.Dao.DaoImpl.UserDaoImpl;
import com.Dao.userDao;
import com.Service.userService;
public class userServiceImpl implements userService {
/**
* 功能描述
* 由于我们在UserDaoImpl中已经实现了该方法,所以我们在这里不必再去实现该方法
*
* @return
*/
//调用dao层的方法 实例化一个userDao
userDao userDao = new UserDaoImpl();
@Override
public boolean login(String username, String password) {
return userDao.login(username, password);
}
}
【3.3.8】、编写servlet层
package com.Servlet;
import com.Service.Impl.userServiceImpl;
import com.Service.userService;
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 java.io.IOException;
//使用注解的方式来访问我们的servlet
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//这里我们为了简单可以在doPost中调用doGet
doGet(request, response);
//这里是设置数据库获取到的数据的字符集,不设置可能会导致获取的数据是乱码
request.setCharacterEncoding("utf-8");
//从数据库获取用户名和密码
String username = request.getParameter("username");
String psssword = request.getParameter("password");
//这里我们直接调用service层的方法,不必再去调用dao层的方法
userService user = new userServiceImpl();
//开始对获取的结果进行判断
if (user.login(username, psssword)) {
//登录成功
//这里我们设置了一个会话来存放我们获取到的用户名,一会我们将会把用户名渲染到页面当中
request.getSession().setAttribute("username", username);
//登录成功,采用转发的方式到登录成功的页面,当然也可使用重定向
request.getRequestDispatcher("/success.jsp").forward(request, response);
} else {
//登录失败,转发到登录失败页面...
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
【3.3.9】、修改登录成功页面获取用户名
<%--
Created by IntelliJ IDEA.
User: 执手天涯
Date: 2021/10/22
Time: 20:55
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>欢迎你
<%--我们使用session.getAttribute(),获取我们的用户名--%>
<%
Object object=session.getAttribute("username");
if(object!=null) {
out.print(object.toString());
}%>
登录成功</h1>
</body>
</html>
4、开始测试一波
【运行成功】
【输入我们数据库中的账号密码】
【输入其他账号密码】
5、总结
本次案例,主要是利用面向对象的方式,利用MVC开发模式,做了一个简单的登录案例,里面还有很多缺陷,大家可以自行维护,并没有做到完全的面向对象开发,开发过程主要使用了jsp的一些知识,主要设计jsp的九大内置对象的使用,还有部分servlet的使用。