总体的结构如下图。
1 首先建立jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
this is login
<form action="login" method="post" >
用户名:<input type="text" name="username"><br/>
密码: <input type="password" name="password"/><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
2 在lib中添加驱动,在entity中创建User实体
package entity;
public class User {
private Integer uid;
private String username;
private String password;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
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;
}
@Override
public String toString() {
return "User [uid=" + uid + ", username=" + username + ", password=" + password + "]";
}
}
3 创建数据库连接类,方便调用连接
package utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DbConnect {
//连接数据库
public static Connection getConn() {
Connection conn = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
try {
conn = DriverManager.getConnection(url, "root", "123456");
if (conn != null) {
System.out.println("ok");
}
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//关闭数据库
public static void closeConn(Connection conn){
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
///test
/* public static void main(String[] args) {
DbConnect.getConn();
}*/
}
4 建立UserDao,实现用户和数据库之间的操作(crud)。
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import entity.User;
import utils.DbConnect;
public class UserDao {
//判断是否存在
public boolean userExist(String username) {
Connection conn = DbConnect.getConn();
//根据指定的用户名查询信息
String sql = "select * from users where username = ?";
try {
//获取PreparedStatement对象,用于执行数据库查询
PreparedStatement preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, username);
//执行查询获取结果集
ResultSet resultSet = preparedStatement.executeQuery();
while (!resultSet.next()) {
//如果没有此数据,证明该用户名可用
return true;
}
//释放资源,后创建的先销毁
resultSet.close();
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbConnect.closeConn(conn);
}
return true;
}
public User login(String username, String password) {
//实例化一个用户对象
User user =null;
Connection conn = DbConnect.getConn();
String sql = "select * from users where username = ? and password = ?";
try {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
//执行查询获取结果集
ResultSet rs = ps.executeQuery();
//判断结果集是否有效,如过有效,则对用户进行赋值
while (rs.next()) {
System.out.println("user: ");
user = new User();
//对用户对象进行复制
user.setUid(rs.getInt("uid"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
System.out.println(user);
}
//释放资源
rs.close();
ps.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbConnect.closeConn(conn);
}
return user;
}
}
5 创建login servlet,响应用户请求的接口
package 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 dao.UserDao;
import entity.User;
/**
* Servlet implementation class login
*/
@WebServlet("/login")
public class login extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post");
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
UserDao userDao = new UserDao();
//根据密码查询用户
User user = userDao.login(username, password);
//判断user是否为空
if (user != null) {
//将用户的对象放到session中
req.getSession().setAttribute("user", user);
//转发到result.jsp页面
req.getRequestDispatcher("message.jsp").forward(req, resp);
/**
response.sendRedirect(url)跳转到指定的URL地址,产生一个新的request,所以要传递参数只有在url后加参
数,如:
url?id=1.
request.getRequestDispatcher(url).forward(request,response)是直接将请求转发到指定URL,所以该请求
能够直接获得上一个请求的数据,也就是说采用请求转发,request对象始终存在,不会重新创建。而
sendRedirect()会新建request对象,所以上一个request中的数据会丢失。
*/
}else {
//登录失败
req.setAttribute("info","用户名或密码错误!");
req.getRequestDispatcher("message.jsp").forward(req, resp);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post");
doPost(req, resp);
}
}
6 在web.xml中不用配置。。因为
如果再配置,tomcat启动就会报错。
7 数据库数据建表(我用的是test数据库)
users | CREATE TABLE `users` (
`uid` int(50) NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8