上一篇文章实现了对商品信息的增删查改部分,这篇文章讲用户的登录注册 部分。其中部分实现原理跟上文类似。
项目实现 数据库建表及插入数据 1 2 3 4 5 6 7 8 create table user ( id int auto_increment, name char (30 ), pwd char (30 ), primary key (id ) ); insert into user (name ,pwd) values ('暗夜' ,'137' );insert into user (name ,pwd) values ('zero' ,'000' );
domain 包 新建 User.java ,代码如下(省略了 setter 和 getter 方法):
1 2 3 4 5 6 7 package domain;public class User { private int id; private String name; private String pwd; }
dao 包 新建 UserDAO 类 ,里面有三个方法,一个用于获取数据库连接,一个是根据用户名和密码查找用户(用于登录判断),一个是增加用户(用于注册)。
注意 :上一篇文章 dao 中新增商品的函数返回的是 int 值。1代表增加成功,0代表失败。增加商品后随即跳转到listProduct.jsp
。但是,注册(调用addUser()
)成功后,跳转到listProduct.jsp
之前,要将 user 信息设置到 session 的属性中。所以addUser()
方法返回的是 User 对象,对象不为 null 则表示增加成功 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 package dao;import domain.User;import java.sql.DriverManager;import java.sql.*;public class UserDAO { public Connection getConnection () throws SQLException { } public User addUser (User u) { Connection conn = null ; PreparedStatement preStmt = null ; ResultSet rs = null ; User user = null ; String sql = "insert into user (name,pwd) values (?,?)" ; try { conn = getConnection(); preStmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); preStmt.setString(1 , u.getName()); preStmt.setString(2 , u.getPwd()); int result = preStmt.executeUpdate(); if (result==1 ){ rs = preStmt.getGeneratedKeys(); if (rs.next()){ int id = rs.getInt(1 ); user = new User(); user.setId(id); user.setName(u.getName()); user.setPwd(u.getPwd()); } } if (conn!=null ) conn.close(); if (preStmt!=null ) conn.close(); }catch (SQLException e){ e.printStackTrace(); } return user; } public User findUser (String name,String pwd) { } }
service 包 service 包调用 dao 包中的方法,来实现业务逻辑 。本项目比较简单,所以这里只是简单地调用 UserDAO 来实现登录和注册功能。
新建 UserService 类 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package service;import dao.UserDAO;import domain.User;public class UserService { private UserDAO udao = new UserDAO(); public User addUser (User u) { return udao.addUser(u); } public User findUser (String name,String pwd) { return udao.findUser(name, pwd); } }
Servlet 包 为了方便,我就把登录界面和注册界面写到了同一个文件loginOrRegister.jsp
,里面包含一个登录用的表单,一个注册用的表单,详细代码可见文末的 Github 链接。
此外,该文件还有一个用于弹出错误对话框 的代码片段:
1 2 3 4 5 6 7 <c:if test="${ not empty error}" > <script type="text/javascript" language="javascript" > alert("${ error }" ); </script> <%session.removeAttribute("error" ); %> </c:if>
直接打开登录注册界面时,error 属性是空的(即 null),所以不会弹出错误对话框 。
登录或者注册时,对应的 servlet 会判断操作是否失败,如果失败了,则在 session 中设置 error 属性,并重定向到 登录注册界面,此时 error 属性非空,就会弹出错误对话框。关闭对话框时,会移除 session 中的 error 属性 。
LoginServlet 类 主要代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package servlet;import domain.User;import service.UserService;@WebServlet ("/loginServlet" )public class LoginServlet extends HttpServlet { private UserService us = new UserService(); public void service (HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { request.setCharacterEncoding("utf-8" ); String name = request.getParameter("name" ); String pwd = request.getParameter("pwd" ); User u = us.findUser(name, pwd); if (u==null ){ request.getSession().setAttribute("error" , "用户名或者密码错误" ); response.sendRedirect("login.jsp" ); } else { request.getSession().setAttribute("user" , u); response.sendRedirect("listProduct" ); } } }
RegisterServlet 类 主要代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package servlet;import domain.User;import service.UserService;@WebServlet ("/registerServlet" )public class registerServlet extends HttpServlet { private UserService us = new UserService(); public void service (HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { request.setCharacterEncoding("utf-8" ); String name = request.getParameter("name" ); String pwd = request.getParameter("pwd" ); User u = new User(); u.setName(name); u.setPwd(pwd); u = us.addUser(u); if (u!=null ){ request.getSession().setAttribute("user" , u); response.sendRedirect("listProduct" ); } else { request.getSession().setAttribute("error" , "注册失败" ); response.sendRedirect("login.jsp" ); } } }
此外,如果登录成功或者注册成功,会设置 session 的 user 属性,然后跳转到 listProduct.jsp
。在listProduct.jsp
中新增用于显示用户信息的代码片段:
1 2 3 4 5 6 7 <div align='center' > <c:if test="${not empty user}" > 你好,${user.name} </c:if> <a href="logout">注销</a> </div>
上面代码中还有注销的链接,对应于 LogoutServlet.java
:
1 2 3 4 5 6 7 8 9 10 @WebServlet ("/logout" )public class LogoutServlet extends HttpServlet { public void service (HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { request.getSession().removeAttribute("user" ); response.sendRedirect("loginOrRegister.jsp" ); } }
现在用户的登录注册功能已经实现了。
输入http://localhost:8080/Management/loginOrRegister.jsp 即可登录或注册
至此,一个简单商品管理系统 已实现完毕。
总结 这个项目虽小,可是还有一些不足,如下:
(1) 提交表单信息时,没有先判断是否输入为空
(2) 提交表单信息后,没有在 servlet 中判断提交信息的合法性,例如填价格时要判断填的是否数字
(3) 没有禁止相同的商品名和相同的用户名。如果要禁止的话,要新增一些用于判断的代码。
哈哈,这些功能有空慢慢补上吧。
**本文章完整代码见 [Github ](https://github.com/anye137/Java-Web-Learning/tree/master/Management)** </font>。
参考资料 (1) JSP 弹出对话框的方式总结 from CSDN