基于jsp+servlet完成的用户登录
采用jsp和servlet完成登录案例、意在熟悉三层架构模式。
- 首先创建实体类 User ,本类就封装了用户名、密码和性别、生成对应的getter和setter方法、及toString方法。
- 其次设计与之对应的数据库。
- 接下来是设计UserDao接口,接口中有一个[抽象]方法。登录方法,因为是根据用户名和密码进行查询登录、返回必然是一个用户User,所以返回值类型为User。
- 接下来是设计UserDaoImpl实现类、因为实现类需要实现UserDao接口中全部未实现的方法,则需要覆写login方法
- UserDaoImpl是处理SQL语句的增删改查的地方,但是在处理之前必须要先获取到数据库的连接开关。
- JdbcUtil就是控制数据库的连接开关。本类是一个工具类、工具类则大致全都是使用的静态化...目的在于调用起来更加方便
- UserDaoImpl调用JdbcUtil、就可以获取数据库的连接,有了连接。即con! 则可以进行增删改查操作。通过con 链接创建一个执行SQL语句的对象:Statement对象!通过st“执行查询”的方法,参数为SQL语句、返回值为结果集ResultSet。
判断 结果集中 有没有 数据 :
|--- 有数据: 取到两个数据: Username 和 Password 封装到user,因为返回值类型是User。
|--- 无数据: 返回 null! 思考:返回给谁? 谁调用、返回给谁。 这里是UserDao接口调用的、所以返回给了UserDao接口。
8. 将结果(user或者null)返回给UserServiceImpl ,此时UserServiceImpl 里了数据(数据可能为user或者null)
9. UserServiceImpl 将数据(数据可能为user或者null)返回给UserService
10. UserService 将数据(数据可能为user或者null)返回给UserServlet
11.UserServlet 接受到数据。如下:User u = userService.userLogin(username, password);//u可能为前面传递过来的user或是null
进行判断
如果是user 调整到成功!
如果是null 跳转到失败页面
1. 建类 实体类 User
package cn.javabs.usermanager.entity; /** * 设计 用户 的实体类 * @author Mryang * */ public class User { private Integer id; private String username; private String password; private String sex; 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 getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", password=" + password + ", sex=" + sex + "]"; } }
2. 设计数据库 与 实体类的变量一一对应
-- 创建数据库 名称是usermanager create database usermanager; -- 使用 数据库 use usermanager; -- 建表 create table user( id int primary key auto_increment, -- id 是整型 主键、 自动递增 username varchar(50) not null unique,-- not null unique 不许为空 唯一 password varchar(50) not null , sex varchar(10) );
3. dao
package cn.javabs.usermanager.dao; import cn.javabs.usermanager.entity.User; /** * 用户的dao接口的设计 * @author Mryang * */ public interface UserDao { /** * 用户登录功能 * @param username 参数 为用户名 * @param password 参数 为密码 * @return user */ User login(String username , String password); }
4.设计UserDao接口的实现类UserDaoImpl
package cn.javabs.usermanager.dao.impl; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import cn.javabs.usermanager.dao.UserDao; import cn.javabs.usermanager.entity.User; import cn.javabs.usermanager.exception.UserLoginException; import cn.javabs.usermanager.util.JdbcUtil; /** * userdao的实现类 * @author Mryang * 调用 jdbc * *静态方法优于构造方法先执行 * */ public class UserDaoImpl implements UserDao { @Override public User login(String username, String password) { try { Connection con = JdbcUtil.getConnection(); Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select * from user where username = '"+username+"' and password = '"+password+"';"); if(rs.next()){ User user = new User(); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); System.out.println("userDao中的user的内容是"+ user); return user; }else{ return null; } } catch (SQLException e) { throw new UserLoginException(); } } }
5. 设计工具类 jdbc:
package cn.javabs.usermanager.util; import java.sql.Connection; import java.sql.DriverManager; /** * 因为要使用类名[点]方法名称 所有 方法需要被静态化 * @author Mryang * -------------------------------------------------------------------------------------- * 反射的三种方式: 1. Class.forName() 2. xxx对象.getClass(); 3. Xxx.class() * -------------------------------------------------------------------------------------- * * */ public class JdbcUtil { private static String driver ="com.mysql.jdbc.Driver";// 数据库驱动类 private static String url ="jdbc:mysql://localhost:3306/usermanager";// 数据库链接 private static String user ="root";// 数据库用户名 private static String password ="sorry";// 数据库密码 // 权限修饰符 静态修饰符 返回值类型 方法名称 /** * 获取链接的 * @return conn */ public static Connection getConnection() { try { //1. 类加载 Class.forName(driver); //2. 驱动管理获取链接\三个参数\ 接收 Connection conn = DriverManager.getConnection(url, user, password); return conn; } catch (Exception e) { throw new RuntimeException(e); } } // TODO 关闭链接没写 }
7.设计service接口
package cn.javabs.usermanager.service; import cn.javabs.usermanager.entity.User; public interface UserService { /** * 用户登录功能 * @param username 参数 为用户名 * @param password 参数 为密码 * @return user */ User userLogin(String username , String password); }
8.设计UserService的实现类
package cn.javabs.usermanager.service.impl; import cn.javabs.usermanager.dao.UserDao; import cn.javabs.usermanager.dao.impl.UserDaoImpl; import cn.javabs.usermanager.entity.User; import cn.javabs.usermanager.service.UserService; public class UserServiceImpl implements UserService { // 采用多态的形式进行实例化dao UserDao dao = new UserDaoImpl(); @Override public User userLogin(String username, String password) { //dao代表的是UserDao 这个接口 // .login 用这个接口中的用户登录功能 并且传了两个参数给你 return dao.login(username, password); } }
9. 设计jsp的登录页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> </head> <body> <center> <form action="<%=basePath%>servlet/UserLoginServlet" method="post" > <table border="1px" width="438px" > <tr align="center"> <td>用户名</td> <td> <input type="text" name="username" > </td> </tr> <tr align="center"> <td>密码</td> <td> <input type="password" name="password" > </td> </tr> <tr align="center"> <td colspan="2" > <input type="submit" value="用户登录" > <input type="reset" value="重置内容" > </td> </tr> </table> </form> </center> </body> </html>
10.设计servlet
package cn.javabs.usermanager.web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.javabs.usermanager.entity.User; import cn.javabs.usermanager.service.UserService; import cn.javabs.usermanager.service.impl.UserServiceImpl; public class UserLoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* * 1 set encoding */ response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8"); /* * 2. get 前台 的 参数 */ String username = request.getParameter("username"); String password = request.getParameter("password"); /* * 3. 将获取到的用户名和密码传递给 userService! * 所以 得有 userService 没有 怎么 办? 实例化 就有了 */ UserService userService = new UserServiceImpl(); User u = userService.userLogin(username, password); if(u == null){ response.getWriter().write("您的用户名或密码有误,请检查!"); response.setHeader("Refresh", "5;Url="+ request.getContextPath()); }else{ request.setAttribute("mark", "用户登录成功!"); request.getRequestDispatcher("/message.jsp").forward(request, response); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet( request, response); } }
11设计一个体系页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <h1 style="color: red;"> <%= request.getAttribute("mark") %></h1> </body> </html>