0%

简单商品管理系统(下)

上一篇文章实现了对商品信息的增删查改部分,这篇文章讲用户的登录注册部分。其中部分实现原理跟上文类似。

项目实现

数据库建表及插入数据

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{
//代码略,详细代码可见文末的 GitHub 链接
}

//增加用户,并返回新增的用户对象
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();
//第二个参数表明支持获取新增数据的id
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){
//代码略,详细代码可见文末的 GitHub 链接
}
}


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中设置error属性,然后跳转到登录界面,登录界面根据error属性弹出登录失败对话框
request.getSession().setAttribute("error", "用户名或者密码错误");
response.sendRedirect("login.jsp");
}
//如果找到对应用户
else{
//设置session的user属性,并跳转到展示商品的界面,商品界面根据user属性会展示登录用户的信息
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} &nbsp;
</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