登录、注册小练习
1.创建数据库
并添加数据
2.在IDEA中建立项目
如图:
按照我的图建立
dao 接口层
UsersDao接口
//用户的业务逻辑接口
public interface UsersDao {
//用户登录
public Users login(String username, String password);
//用户注册
public Users reg(Users users);
//根据用户编号查询用户
public Users queryUserByUid(int uid);
}
实现UsersDao接口的类
public class UsersDaoImpl implements UsersDao {
//重写登录方法
@Override
public Users login(String username, String password) {
Connection conn; //获得连接对象
ResultSet rs; //获得数据集
List args = new ArrayList();//参数需要
//这里的?是占位符
String sql = "select * from users where username=? and password=?";//数据库操作语言
Users loginUser = null;
try{
conn = DBUtils.getConnection();
args.add(username);
args.add(password);
rs = DBUtils.myExecuteQuery(sql,args);
if(rs.next()){ //进入即说明登录成功了。更改loginUser的值。
loginUser = new Users();
loginUser.setUid(rs.getInt("uid"));
loginUser.setUsername(rs.getString("username"));
loginUser.setPassword(rs.getString("password"));
loginUser.setGender(rs.getString("gender"));
loginUser.setEmail(rs.getString("email"));
loginUser.setBirthday(rs.getString("birthday"));
}
return loginUser;//返回用户资料
}catch(Exception ex){
ex.printStackTrace();
return null;
}
}
//重写注册方法
//这里会更新数据,需要加入事务对数据进行保护
@Override
public Users reg(Users users) {
Connection conn; //连接对象
List args = new ArrayList();
String sql = "insert into users (username,password,gender,email,birthday) values (?,?,?,?,?)";
Users regUser = null;
int result;
try{
conn = DBUtils.getConnection();
DBUtils.startTransaction();//开启事务
args.add(users.getUsername());
args.add(users.getPassword());
args.add(users.getGender());
args.add(users.getEmail());
args.add(users.getBirthday());
result = DBUtils.myExecuteUpdate(sql,args);
if(result>0){ //说明注册成功了。用户资料返回
//获得新生成的用户的编号。
//问题的焦点是你如何获得新添加用户的主键呢?
ResultSet temp = DBUtils.pstm.getGeneratedKeys();
temp.next();
int uid = temp.getInt(1);
regUser = queryUserByUid(uid);
}
DBUtils.commit(); //提交事务
DBUtils.endTransaction();
return regUser;
}catch(Exception ex){
ex.printStackTrace();
DBUtils.rollback(); //回滚
DBUtils.endTransaction(); //关闭事务
return null;
}
}
@Override
public Users queryUserByUid(int uid) {
Connection conn; //连接对象
ResultSet rs; //数据集
List args = new ArrayList();
String sql = "select * from users where uid=?";
Users user = null;
try{
conn = DBUtils.getConnection();
args.add(uid);
rs = DBUtils.myExecuteQuery(sql,args);
if(rs.next()){ //进入,说明登录成功了。给user赋值
user = new Users();
user.setUid(rs.getInt("uid"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setGender(rs.getString("gender"));
user.setEmail(rs.getString("email"));
user.setBirthday(rs.getString("birthday"));
}
return user;//返回用户资料
}catch(Exception ex){
ex.printStackTrace();
return null;
}
}
}
domain 实体层
/**
* 实体层
*/
//用户表
//实体类最好实现一下串行接口
public class Users implements Serializable {
private int uid; //用户编号
private String username; //用户名
private String gender; //性别
private String password; //用户名密码
private String email; //电子邮箱
private String birthday; //出生日期
public Users() {
}
public Users(int uid, String username, String gender, String password, String email, String birthday) {
this.uid = uid;
this.username = username;
this.gender = gender;
this.password = password;
this.email = email;
this.birthday = birthday;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Users{" +
"uid=" + uid +
", username='" + username + '\'' +
", gender='" + gender + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
", birthday='" + birthday + '\'' +
'}';
}
}
servlet 控制层
UsersServlet
import com.cm.domain.Users;
import com.cm.service.UsersService;
import com.cm.service.impl.UsersServieImpl;
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;
@WebServlet(name = "UsersServlet",value="UsersServlet")
public class UsersServlet extends HttpServlet {
private String action ;
private UsersService usersService = new UsersServieImpl();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if(request.getParameter("action")!=null){
this.action = request.getParameter("action");
switch(this.action){
case "login":
login(request,response);
break;
case "reg":
reg(request,response);
break;
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
//执行登录动作
private void login(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
Users loginUser = null;
loginUser = usersService.login(request.getParameter("username"),request.getParameter("password"));
if(loginUser!=null){
System.out.println("登录成功!");
//把登录成功的用户保存到session中
request.getSession().setAttribute("loginUser",loginUser);
response.sendRedirect(request.getContextPath()+"/main.jsp");
}else{
System.out.println("登录失败!");
response.sendRedirect(request.getContextPath()+"/login_failure.jsp");
}
}
//执行注册
private void reg(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
Users user = new Users();
user.setUsername(request.getParameter("username"));
user.setPassword(request.getParameter("password"));
user.setGender(request.getParameter("gender"));
user.setEmail(request.getParameter("email"));
user.setBirthday(request.getParameter("birthday"));
Users regUser = null;
regUser = usersService.reg(user);
if(regUser!=null){
System.out.println("注册成功!");
System.out.println(regUser);
//页面跳转到登录页面。
response.sendRedirect(request.getContextPath()+"/login.jsp");
}else{
System.out.println("注册失败!");
}
}
}
service 服务层
UsersService接口
import com.cm.domain.Users;
public interface UsersService {
//用户登录
public Users login(String username, String password);
//用户注册
public Users reg(Users users);
//根据用户编号查询用户
public Users queryUserByUid(int uid);
实现UsersService接口的UsersServlet类
import com.cm.domain.Users;
import com.cm.service.UsersService;
import com.cm.service.impl.UsersServieImpl;
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;
@WebServlet(name = "UsersServlet",value="UsersServlet")
public class UsersServlet extends HttpServlet {
private String action ;
private UsersService usersService = new UsersServieImpl();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if(request.getParameter("action")!=null){
this.action = request.getParameter("action");
switch(this.action){
case "login":
login(request,response);
break;
case "reg":
reg(request,response);
break;
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
//执行登录动作
private void login(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
Users loginUser = null;
loginUser = usersService.login(request.getParameter("username"),request.getParameter("password"));
if(loginUser!=null){
System.out.println("登录成功!");
//把登录成功的用户保存到session中
request.getSession().setAttribute("loginUser",loginUser);
response.sendRedirect(request.getContextPath()+"/main.jsp");
}else{
System.out.println("登录失败!");
response.sendRedirect(request.getContextPath()+"/login_failure.jsp");
}
}
//执行注册
private void reg(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
Users user = new Users();
user.setUsername(request.getParameter("username"));
user.setPassword(request.getParameter("password"));
user.setGender(request.getParameter("gender"));
user.setEmail(request.getParameter("email"));
user.setBirthday(request.getParameter("birthday"));
Users regUser = null;
regUser = usersService.reg(user);
if(regUser!=null){
System.out.println("注册成功!");
System.out.println(regUser);
//页面跳转到登录页面。
response.sendRedirect(request.getContextPath()+"/login.jsp");
}else{
System.out.println("注册失败!");
}
}
}
filter 过滤器
记死即可
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;
//规定,乌龟的屁股规定。
//这个方法的好处,只需要更改value="utf-8"的值即可。改动少。
@WebFilter(description = "EncodingFilter",value="/*",initParams ={@WebInitParam(name="encoding",value="utf-8")}) // 凡是过滤器一般都是 /* ,过滤所有的请求
public class EncodingFilter implements Filter {
private String encoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.encoding = filterConfig.getInitParameter("encoding");
}
//过滤器过滤的是请求,什么样的请求呢?各种各样请求,只有是请求,就被过滤以下。能理解吗?
//过滤器在过滤器请求的时候,一定会执行doFilter这个方法
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//请求使用utf-8
servletRequest.setCharacterEncoding(this.encoding);
//响应也使用utf-8
servletResponse.setCharacterEncoding(this.encoding);
//以上两步就解决了中文乱码问题
filterChain.doFilter(servletRequest,servletResponse); //千万不要忘了写,过滤器链条,继续向后过滤
}
@Override
public void destroy() {
}
}
test 测试层
import com.cm.dao.UsersDao;
import com.cm.dao.impl.UsersDaoImpl;
import com.cm.domain.Users;
import com.cm.util.DBUtils;
import java.sql.Connection;
public class Test {
public static void main(String[] args) {
//测试DBUtils工具库,以及数据库连接,注意jdbc.properties文档中的数据与自己的数据库信息是否一致。
/*Connection conn;
try{
conn = DBUtils.getConnection();
if(conn!=null){
System.out.println("MySQL连接成功!");
}else{
System.out.println("MySQL连接失败!");
}
}catch(Exception ex){
ex.printStackTrace();
}*/
//测试一下用户登录的效果。
/*Users loginUser = null;
UsersDao usersDao = new UsersDaoImpl();
loginUser = usersDao.login("张三","123456");
if(loginUser!=null){
System.out.println("登录成功!");
}else{
System.out.println("登录失败!");
}
*/
// 测试一下用户注册的效果
Users regUser = new Users();
regUser.setUsername("小沈阳");
regUser.setGender("女");
regUser.setPassword("654321");
regUser.setEmail("xiaosheny@qq.com");
regUser.setBirthday("1998-10-10");
UsersDao usersDao = new UsersDaoImpl();
regUser = usersDao.reg(regUser);
System.out.println(regUser);
}
}
util 工具层
import java.io.InputStream;
import java.sql.*;
import java.util.List;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
public class DBUtils {
//访问数据库的小帮手
public static PreparedStatement pstm;
// 数据库连接池封装对象
public static DataSource dataSource;
// 操作属性文件对象
public static Properties properties = new Properties();
//完成类中静态属性初始化,并且多次访问时,只有一次访问才会执行此静态块,而且只执行一次
static {
//让is输入流对象只想src目录下的jdbc.properties
InputStream is = DBUtils.class.getClassLoader().getResourceAsStream(
"jdbc.properties");
try {
//加载属性文件到properties对象中
properties.load(is);
//数据库连接加载配置文件,完成访问数据库的所有配置
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//保证线程安全的数据库访问,一个线程只绑定一个链接对象,多次访问时同一个连接对象
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
//打开数据库连接
public static Connection getConnection() {
Connection conn = tl.get();// 从当前线程上获得链接
try {
if (conn == null || conn.isClosed() ) {
//从连接池中获取连接对象
conn = dataSource.getConnection();
// 把连接绑定到当前线程上
tl.set(conn);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
//关闭所有数据库访问对象
public static void closeAll(Connection con, PreparedStatement pstm,
ResultSet rs) {
try {
if (rs != null)
rs.close();
if (pstm != null)
pstm.close();
if (con != null && !con.isClosed())
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭所有数据库访问对象
public static void closeAll() {
try {
if (pstm != null)
pstm.close();
if (DBUtils.getConnection() != null && !DBUtils.getConnection().isClosed())
DBUtils.getConnection().close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 所有的增删改的方法
public static int myExecuteUpdate(String sql, List list) throws Exception {
//添加第二个参数的意义是为了获得新增记录的主键。
pstm = getConnection().prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
if (list != null) {
for (int i = 0; i < list.size(); i++) {
pstm.setObject(i + 1, list.get(i));
}
}
return pstm.executeUpdate();
}
// 所有的查询的方法
public static ResultSet myExecuteQuery(String sql, List list) {
try {
pstm = getConnection().prepareStatement(sql);
if (list != null) {
for (int i = 0; i < list.size(); i++) {
pstm.setObject(i + 1, list.get(i));
}
}
return pstm.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void startTransaction() {
Connection conn = getConnection();
try {
conn.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void commit() {
Connection conn = getConnection();
try {
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void rollback() {
Connection conn = getConnection();
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void release() {
Connection conn = getConnection();
try {
conn.close();
tl.remove();// 与线程池有关,解除关系
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void endTransaction() {
Connection conn = getConnection();
try {
conn.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
前端代码
这里设计的比较简单,具体自己实现。
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>系统主页面</h1>
<hr>
<div id="main">
欢迎您:${sessionScope.loginUser.username}<br>
</div>
</body>
</html>
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录</title>
<style>
#regDiv {
/*div水平居中*/
margin: 0px auto;
width: 400px;
height: 70px;
border: 1px solid #ccc;
padding: 10px;
}
h1 {
text-align: center;
}
input {
width: 280px;
}
.label {
width: 30%;
}
.controller {
width: 70%;
}
table {
border-collapse: collapse;
border-spacing: 0px 0px;
height: auto;
}
</style>
</head>
<body>
<h1>用户登录</h1>
<div id="regDiv">
<form action="${pageContext.request.contextPath}/UsersServlet?action=login" method="post">
<table>
<tr>
<td class="label">用户名:</td>
<td class="controller"><input type="text" name="username"></td>
</tr>
<tr>
<td class="label">密码:</td>
<td class="controller"><input type="password" name="password"></td>
</tr>
<tr>
<td colspan="2" style="text-align: center">
<input type="submit" style="width:60px" value="登录">
</td>
</tr>
</table>
</form>
</div>
<div>
当前的会话ID:<%=request.getSession().getId()%><br>
${pageContext.session.id}
</div>
</body>
</html>
login_failure.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登录失败</h1>
<hr>
<a href="login.jsp">返回</a>
</body>
</html>
reg.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户注册</title>
<style>
#regDiv {
/*div水平居中*/
margin: 0px auto;
width: 400px;
height: 160px;
border: 1px solid #ccc;
padding: 10px;
}
h1 {
text-align: center;
}
input {
width: 280px;
}
.label {
width: 30%;
}
.controller {
width: 70%;
}
table {
border-collapse: collapse;
border-spacing: 0px 0px;
height: auto;
}
</style>
</head>
<body>
<h1>用户注册</h1>
<div id="regDiv">
<form action="${pageContext.request.contextPath}/UsersServlet?action=reg" method="post">
<table>
<tr>
<td class="label">用户名:</td>
<td class="controller"><input type="text" name="username"></td>
</tr>
<tr>
<td class="label">密码:</td>
<td class="controller"><input type="password" name="password"></td>
</tr>
<tr>
<td class="label">确认密码:</td>
<td class="controller"><input type="password" name="confirmpass"></td>
</tr>
<tr>
<td class="label">性别:</td>
<td class="controller">
<input type="radio" style="width:20px" name="gender" value="男" checked/>男
<input type="radio" style="width:20px" name="gender" value="女" />女
</td>
</tr>
<tr>
<td class="label">电子邮箱:</td>
<td class="controller"><input type="text" name="email" value=""/></td>
</tr>
<tr>
<td class="label">出生日期:</td>
<td class="controller"><input type="date" name="birthday" value=""/></td>
</tr>
<tr>
<td colspan="2" style="text-align: center">
<input type="submit" style="width:60px" value="注册">
</td>
</tr>
</table>
</form>
</div>
</body>
</html>