学习笔记二
书城项目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)用户登陆和注册:
-
web层:com.zy.web/servlet/controller
-
service层:com.zy.service Service 接口包
com.zy.service.impl Service 接口实现类 -
dao持久层:com.zydao Dao 接口包
com.zy.dao.imp Dao 接口实现类 -
实体bean对象:com.zy.pojo/entity/domain/bean JavaBean 类
-
测试包:com.zy.test/junit
-
工具类: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、如果登录成功 —>>>> 返回登陆成功 信息