1、编写UserDao并测试
1.1、编写UserDao接口
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);}
1.2、UserDaoImpl实现类:
public class UserDaoImpl extends BaseDao implements UserDao {@Overridepublic User queryUserByUsername(String username) {String sql = "select `id`,`username`,`password`,`email` from t_user where username = ?";return queryForOne(User.class, sql, username);}@Overridepublic 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);}@Overridepublic int saveUser(User user) {String sql = "insert into t_user(`username`,`password`,`email`) values(?,?,?)";return update(sql, user.getUsername(),user.getPassword(),user.getEmail());}
}
1.3、UserDao测试
public class UserDaoTest {UserDao userDao = new UserDaoImpl();@Testpublic void queryUserByUsername() {if (userDao.queryUserByUsername("admin1234") == null ){System.out.println("用户名可用!");} else {System.out.println("用户名已存在!");}}@Testpublic void queryUserByUsernameAndPassword() {if ( userDao.queryUserByUsernameAndPassword("admin","admin1234") == null) {System.out.println("用户名或密码错误,登录失败");} else {System.out.println("查询成功");}}@Testpublic void saveUser() {System.out.println( userDao.saveUser(new User(null,"wzg168", "123456", "wzg168@qq.com")) );}
}
2、编写UserService并测试
2.1、UserService接口
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);
}
2.2、UserServiceImpl实现类
public class UserServiceImpl implements UserService {private UserDao userDao = new UserDaoImpl();@Overridepublic void registUser(User user) {userDao.saveUser(user);}@Overridepublic User login(User user) {/*** QQ登录 !!!* 1、查询用户名和密码* 2、查询天气信息* 3、查询QQ邮箱几封未读邮件* 4、查询QQ空间留言数* 5、还要查询QQ游戏 有没有什么更新* 6、查询QQ的黄钻,什么什么钻,的皮肤信息。* 7、还要查询个个好友的登录IP和登录位置信息* 8、发QQ好友登录提示音*/return userDao.queryUserByUsernameAndPassword(user.getUsername(), user.getPassword());}@Overridepublic boolean existsUsername(String username) {if (userDao.queryUserByUsername(username) == null) {// 等于null,说明没查到,没查到表示可用return false;}return true;}
}
2.3、UserService测试
public class UserServiceTest {UserService userService = new UserServiceImpl();@Testpublic void registUser() {userService.registUser(new User(null, "bbj168", "666666", "bbj168@qq.com"));userService.registUser(new User(null, "abc168", "666666", "abc168@qq.com"));}@Testpublic void login() {System.out.println( userService.login(new User(null, "wzg168", "123456", null)) );}@Testpublic void existsUsername() {if (userService.existsUsername("wzg16888")) {System.out.println("用户名已存在!");} else {System.out.println("用户名可用!");}}
}
3、编写web层
3.1、实现用户注册的功能
3.1.1、图解用户注册的流程
3.1.2、修改regist.html和regist_success.html页面
1、添加base标签
<!--写base标签,永远固定相对路径跳转的结果-->
<base href="http://localhost:8080/book/">
2、修改base标签对页面中所有相对路径的影响
以下是几个修改的示例:
<link type="text/css" rel="stylesheet" href="static/css/style.css" >
<script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>
3、修改注册表单的提交地址和请求方式
3.1.3、编写RegistServlet程序
public class RegistServlet extends HttpServlet {private UserService userService = new UserServiceImpl();@Overrideprotected 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");// 2、检查 验证码是否正确 === 写死,要求验证码为:abcdeif ("abcde".equalsIgnoreCase(code)) {// 3、检查 用户名是否可用if (userService.existsUsername(username)) {System.out.println("用户名[" + username + "]已存在!");// 跳回注册页面req.getRequestDispatcher("/pages/user/regist.html").forward(req, resp);} else {// 可用// 调用Sservice保存到数据库userService.registUser(new User(null, username, password, email));// 跳到注册成功页面 regist_success.htmlreq.getRequestDispatcher("/pages/user/regist_success.html").forward(req, resp);}} else {System.out.println("验证码[" + code + "]错误");req.getRequestDispatcher("/pages/user/regist.html").forward(req, resp);}}
}
3.2、IDEA中Debug调试的使用
3.2.1、Debug调试代码,需要断点 + Debug启动服务器
1、断点,只需要在代码需要停的行的左边上单击,就可以添加和取消
2、Debug启动Tomcat运行代码
3.2.2、测试工具栏介绍:
3.2.3、变量窗口介绍
变量窗口:它可以查看当前方法范围内所有有效的变量
3.2.4、方法调用栈窗口
1、方法调用栈可以查看当前线程有哪些方法调用信息
2、下面的调用上一行的方法
3、其他常用调试相关按钮
3.3、用户登录功能的实现
3.3.1、图解用户登录
3.3.2、修改login.html页面和login_success.html页面
1、添加base标签
<!--写base标签,永远固定相对路径跳转的结果--><base href="http://localhost:8080/book/">
2、修改base标签对页面中所有相对路径的影响
以下是几个修改的示例:
<link type="text/css" rel="stylesheet" href="static/css/style.css" >
<script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>
3、修改login.html表单的提交地址和请求方式
3.3.3、LoginServlet程序
public class LoginServlet extends HttpServlet {private UserService userService = new UserServiceImpl();@Overrideprotected 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/user/login.html").forward(req, resp);} else {// 登录 成功//跳到成功页面login_success.htmlreq.getRequestDispatcher("/pages/user/login_success.html").forward(req, resp);}}
}