学习笔记二

学习笔记二
书城项目1:
(1)表单验证:
验证用户名:必须由字母,数字下划线组成,并且长度为 5 到 12 位
验证密码:必须由字母,数字下划线组成,并且长度为 5 到 12 位
验证确认密码:和密码相同
邮箱验证:xxxxx@xxx.com
验证码:现在只需要验证用户已输入。因为还没讲到服务器。验证码生成。
在这里插入图片描述

<script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>
    <script type="text/javascript">    
        	       
        // 页面加载完成之后Ž
		$(function () {
			// 给注册绑定单击事件
			$("#s6").click(function () {
				// 验证用户名:必须由字母,数字下划线组成,并且长度为 5 到 12 位
				//1 获取用户名输入框里的内容
			    var usernameText = $("#t1").val();
			    //2 创建正则表达式对象
			    var usernamePatt = /^\w{5,12}$/;
			    //3 使用 test 方法验证
			    if (!usernamePatt.test(usernameText)) {
			       //4 提示用户结果žœ
			       $("span.s11").text("用户名不合法!");
			       
			       return false;
			    }
			    
			   // 验证密码:必须由字母,数字下划线组成,并且长度为 5 到 12 位
			   //1 获取用户名输入框里的内容
			    var passwordText = $("#t2").val();
			    //2 创建正则表达式对象
			    var passwordPatt = /^\w{5,12}$/;
			    //3  使用 test 方法验证
			    if(!passwordPatt.test(passwordText)){
			    	//4 提示用户结果žœ
			    	$("span.s11").text("密码不合法!");
			    	
			    	return false;
			    }
			    
			    // 验证确认密码:和密码相同
			    //1 获取确认密码内容
			    var repwdText = $("#t3").val();
			    //2 和密码相比较ƒ
			    if(repwdText != passwordText){
			    	//3 提示用户
			    	$("span.s11").text("确认密码和密码不一致!");
			    	
			    	return false;
			    }
			    
			    // 邮箱验证:xxxxx@xxx.com
                //1 获取邮箱里的内容
			    var emialText = $("#t4").val(); 
			    //2  创建正则表达式对象
			    var emialPatt = /^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/;
			    //3  使用 test 方法验证是否合法•
			    if(!emialPatt.test(emialText)){
			    	//4 提示用户
			    	$("span.s11").text("邮箱格式不合法!");
			    	
			    	return false;
			    }
			    
			    // 验证码:现在只需要验证用户已输入。因为还没讲到服务器。验证码生成。€‚
			    var codeText = $("#d1").val();
                //去掉验证码前后空格
                codeText = $.trim(codeText);
			    if(codeText == null || codeText == ""){
			    	//4 提示用户
			    	$("span.s11").text("验证码不能为空!");
			    	
			    	return false;
			    	
			    }
			    
			    if(codeText != "abcd"){
			    	$("span.s11").text("");
			    	return false;
			    }
			    
			 });

		});
    </script>

在这里插入图片描述
(2)用户登陆和注册:
在这里插入图片描述

  1. web层:com.zy.web/servlet/controller

  2. service层:com.zy.service                              Service 接口包
    com.zy.service.impl                               Service 接口实现类

  3. dao持久层:com.zydao                                        Dao 接口包
    com.zy.dao.imp                                           Dao 接口实现类

  4. 实体bean对象:com.zy.pojo/entity/domain/bean                                                                          JavaBean 类

  5. 测试包:com.zy.test/junit

  6. 工具类:com.zy.utils

在这里插入图片描述
一、创建数据库和表:

create database book;
use book;
create table t_user(
`id` int primary key auto_increment,
`username` varchar(20) not null unique,
`password` varchar(32) not null,
`email` varchar(200)
);
insert into t_user(`username`,`password`,`email`) values('admin','admin','admin@zy.com');
select * from t_user;

二、编写数据库表对应的 JavaBean 对象:

package com.zy.pojo;

public class User {

	private Integer id;
	private String username;
	private String password;
    private String email;
    
	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;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
		
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password=" + password + ", email=" + email + "]";
	}
	
    public User(Integer id, String username, String password, String email) {
		super();
		this.id = id;
		this.username = username;
		this.password = password;
		this.email = email;
	}
    
	public User() {
		
	}
    
    
}

三、编写工具类 JdbcUtils:
3.1、导入需要的 jar 包:

数据库和连接池需要
druid-1.1.9.jar
mysql-connector-java-5.1.7-bin.jar
以下是测试需要:
hamcrest-core-1.3.jar
junit-4.12.jar

3.2、在 src 源码目录下编写 jdbc.properties 属性配置文件:

username=root
password=root
url=jdbc:mysql://localhost:3306/book
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10

3.3、编写 JdbcUtils 工具类:

package com.zy.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;



public class JdbcUtils {
 
	private static DruidDataSource dataSource;
	
	static {
		try {
			Properties properties = new Properties();
			// 读取 jdbc.properties属性配置文件
			InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
			// 从流中加载数据
			properties.load(inputStream);
			// 创建数据库连接池
			dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	/**
	 * 获取数据库连接池中的链接
	 * @return如果返回null,说明获取连接池失败/有值就是获取连接成功
	 */
	public static Connection getConnection() {
		
		Connection conn = null;
		
		   try {
			conn = dataSource.getConnection();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;		
	}
	
	/**
	 * 关闭连接,放回数据库连接池
	 * @param com
	 */
	public static void close(Connection conn) {
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

3.4、JdbcUtils 测试:

package com.zy.test;

import java.sql.Connection;

import org.junit.Test;

import com.zy.utils.JdbcUtils;

public class JdbcUtilsTest {

	
	public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			Connection connection = JdbcUtils.getConnection();
			System.out.println(connection);
			JdbcUtils.close(connection);
		}
	}
	
}

四、编写 BaseDao:

4.1、导入 DBUtils 的 jar 包:
commons-dbutils-1.3.jar

4.2、编写 BaseDao:

package com.zy.dao;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import com.zy.utils.JdbcUtils;

public abstract class BaseDao {

	// 使用 DbUtils 操作数据库
	private QueryRunner queryRunner = new QueryRunner();

	/**
	 * update() 方法用来执行:Insert\Update\Delete 语句 
	 * @return 如果返回-1,说明执行失败<br/>
	 *         返回其他表示影响的行数
	 */
	public int update(String sql, Object... args) {
		Connection connection = JdbcUtils.getConnection();
		try {
			return queryRunner.update(connection, sql, args);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.close(connection);
		}
		return -1;
	}

	/**
	 * 查询返回一个 javaBean 的 sql 语句
	 * @param type 返回的对象类型
	 * @param sql  执行的 sql 语句
	 * @param args sql 对应的参数值
	 * @param <T>  返回的类型的泛型
	 * @return
	 */
	public <T> T queryForOne(Class<T> type, String sql, Object... args) {
		Connection con = JdbcUtils.getConnection();
		try {
			return queryRunner.query(con, sql, new BeanHandler<T>(type), args);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.close(con);
		}
		return null;
	}

	/**
	 * 查询返回多个 javaBean 的 sql 语句
	 * @param type 返回的对象类型
	 * @param sql  执行的 sql 语句
	 * @param args sql 对应的参数值
	 * @param <T>  返回的类型的泛型
	 * @return
	 */
	public <T> List<T> queryForList(Class<T> type, String sql, Object... args) {
		Connection con = JdbcUtils.getConnection();
		try {
			return queryRunner.query(con, sql, new BeanListHandler<T>(type), args);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.close(con);
		}
		return null;
	}

	/**
	 * 执行返回一行一列的 sql 语句
	 * @param sql  执行的 sql 语句
	 * @param args sql 对应的参数值
	 * @return
	 */
	public Object queryForSingleValue(String sql, Object... args) {
		Connection conn = JdbcUtils.getConnection();
		try {
			return queryRunner.query(conn, sql, new ScalarHandler(), args);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.close(conn);
		}
		return null;
	}
}

五、编写UserDao和测试:
5.1、UserDao接口:

package com.zy.dao;

import com.zy.pojo.User;

public interface UserDao {

	/**
	 * 根据用户名查询用户信息
	 * @param username 用户名
	 * @return 如果返回 null,说明没有这个用户。反之亦然
	 */
	public User queryUserByUsername(String username);

	/**
	 * 根据 用户名和密码查询用户信息
	 * @param username
	 * @param password
	 * @return 如果返回 null,说明用户名或密码错误,反之亦然
	 */
	public User queryUserByUsernameAndPassword(String username, String password);

	/**
	 * 保存用户信息 
	 * @param user
	 * @return 返回-1 表示操作失败,其他是 sql 语句影响的行数
	 */
	public int saveUser(User user);
}

5.2、UserDaoImpl实现类:

package com.zy.dao;

import com.zy.pojo.User;

public class UserDaoImpl extends BaseDao implements UserDao {
	@Override
	public User queryUserByUsername(String username) {
		String sql = "select `id`,`username`,`password`,`email` from t_user where username = ?";
		return queryForOne(User.class, sql, username);
	}

	@Override
	public User queryUserByUsernameAndPassword(String username, String password) {
	    String sql = "select `id`,`username`,`password`,`email` from t_user where username = ? and password = ?";
	    return queryForOne(User.class, sql, username,password);
	}

	@Override
	public int saveUser(User user) {
		String sql = "insert into t_user(`username`,`password`,`email`) values(?,?,?)";
		return update(sql, user.getUsername(), user.getPassword(), user.getEmail());
	}
}

5.3、UserDao测试:

package com.zy.test;

import static org.junit.Assert.*;


import org.junit.Test;

import com.zy.dao.UserDao;
import com.zy.dao.UserDaoImpl;
import com.zy.pojo.User;

public class UserDaoTest {

	UserDao userDao = new UserDaoImpl();

	@Test
	public void queryUserByUsername() {
	if (userDao.queryUserByUsername("admin1234") == null ){
		System.out.println("用户名可用!");
		} else {
		System.out.println("用户名已存在!");
		}
	}
	
	@Test
	public void queryUserByUsernameAndPassword() {
		if (userDao.queryUserByUsernameAndPassword("admin", "admin1234") == null) {
			System.out.println("用户名或密码错误,登录失败");
		} else {
			System.out.println("查询成功");
		}
	}
	@Test
	public void saveUser() {
		System.out.println(userDao.saveUser(new User(null, "zyg168", "123456", "zyg168@qq.com")));
	}
	
}

六、编写UserService和测试:
6.1、UserService接口:

package com.zy.service;

import com.zy.pojo.User;

public interface UserService {

	/**
	 * 注册用户
	 * @param user
	 */
	public void registUser(User user);
	
	/**
	 * 登陆
	 * @param user
	 * @return 如果返回null,说明登陆失败,返回有值,说明登陆成功
	 */
	public User login(User user);
	
	/**
	 * 检查 用户名是否可用
	 * @param username
	 * @return 返回true表示用户名已近存在,返回false表示用户名可用
	 */
	public boolean existsUsername(String username);
}

6.2、UserServiceImpl实现类:

package com.zy.service;

import com.zy.dao.UserDao;
import com.zy.dao.UserDaoImpl;
import com.zy.pojo.User;

public class UserServiceImpl implements UserService{

	private UserDao userDao = new UserDaoImpl();
	
	@Override
	public void registUser(User user) {
		userDao.saveUser(user);
		
	}

	@Override
	public User login(User user) {
		return userDao.queryUserByUsernameAndPassword(user.getUsername(), user.getPassword());
	}

	@Override
	public boolean existsUsername(String username) {
		
		if(userDao.queryUserByUsername(username) == null) {
			//等于null,说明没查到,没查到表示可用
			return false;
		}
		
		return true;
		
	}

}

6.3、UserService 测试:

package com.zy.test;

import static org.junit.Assert.*;

import org.junit.Test;

import com.zy.pojo.User;
import com.zy.service.UserService;
import com.zy.service.UserServiceImpl;

public class UserServiceTest {

	UserService userService = new UserServiceImpl();
	
	@Test
	public void testRegistUser() {
		userService.registUser(new User(null, "bbj168", "666666", "bbj168@qq.com"));
		userService.registUser(new User(null, "张宇", "666666", "abc168@qq.com"));
	}

	@Test
	public void testLogin() {
		System.out.println(userService.login(new User(null, "张宇", "666666", "abc168@qq.com")));;
	}

	@Test
	public void testExistsUsername() {
		if (userService.existsUsername("sb")) {
			System.out.println("用户名已存在!");
		} else {
			System.out.println("用户名可用!");
		}
	}

}

七、编写 web 层
7.1、实现用户注册的功能:

7.1.1、图解用户注册的流程:
在这里插入图片描述
7.1.2、修改 regist.html 页面:
1、添加 base 标签:

<!--写 base 标签,永远固定相对路径跳转的结果-->
<base href="http://localhost:8080/book/">

2、修改 base 标签对页面中所有相对路径的影响(浏览器 F12,哪个报红,改哪个)
以下是几个修改的示例:

<base href="http://172.23.61.98:8080/Book/">
<script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>

3、修改注册表单的提交地址和请求方式:

<form action="http://172.23.61.98:8080/Book/registServlet" method="post">

7.1.3、编写 RegistServlet 程序:

package com.zy.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zy.pojo.User;
import com.zy.service.UserService;
import com.zy.service.UserServiceImpl;

public class RegistServlet extends HttpServlet{

	private UserService userService = new UserServiceImpl();
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		// 1、获取请求参数
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		String email = req.getParameter("email");
		String code = req.getParameter("code");

		System.out.println(username+password+email+code);
		// 2、检查 验证码是否正确 === 写死,要求验证码为:abcd
		if ("abcd".equalsIgnoreCase(code)) {
			// 3、检查 用户名是否可用
			if (userService.existsUsername(username)) {
				System.out.println("用户名[" + username + "]已存在!");
				// 跳回注册页面
				req.getRequestDispatcher("pages/regist.html").forward(req, resp);
			} else {
				// 可用
				// 调用 Sservice 保存到数据库
				userService.registUser(new User(null, username, password, email));
				// 跳到注册成功页面 regist_success.html
				req.getRequestDispatcher("pages/test.html").forward(req, resp);
			}
		} else {
			System.out.println("验证码[" + code + "]错误");
			req.getRequestDispatcher("pages/regist.html").forward(req, resp);
		}

	}
	
}

7.2、用户登录功能的实现:

7.2.1、图解用户登录:
在这里插入图片描述
7.2.2、修改 login.html 页面和 login_success.html 页面:

1、添加 base 标签:

<!--写 base 标签,永远固定相对路径跳转的结果-->
<base href="http://localhost:8080/book/">

2、修改 base 标签对页面中所有相对路径的影响(浏览器 F12,哪个报红,改哪个):

<base href="http://172.23.61.98:8080/Book/">
<script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>

7.2.3、LoginServlet 程序:

package com.zy.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zy.pojo.User;
import com.zy.service.UserService;
import com.zy.service.UserServiceImpl;

public class LoginServlet extends HttpServlet {
	
	private UserService userService = new UserServiceImpl();

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1、获取请求的参数
		String username = req.getParameter("username");
		String password = req.getParameter("password");
        // 调用 userService.login()登录处理业务
		User loginUser = userService.login(new User(null, username, password, null));
        // 如果等于 null,说明登录 失败!
		if (loginUser == null) {
            // 跳回登录页面
			req.getRequestDispatcher("pages/login.html").forward(req, resp);
		} else {
            // 登录 成功
            //跳到成功页面 
			req.getRequestDispatcher("pages/test.html").forward(req, resp);
		}
	}
}

八、需求:

8.1、用户注册:

需求如下:
1、访问注册页面
2、填写注册信息,提交给服务器
3、服务器应该保存用户
4、当用户已经存在----提示用户注册 失败,用户名已存在
5、当用户不存在-----注册成功

8.2、用户登陆:

需求如下:
1、访问登陆页面
2、填写用户名密码后提交
3、服务器判断用户是否存在
4、如果登陆失败 —>>>> 返回用户名或者密码错误信息
5、如果登录成功 —>>>> 返回登陆成功 信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值