- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章javaweb图书商城设计之用户模块(1)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文主要为大家分析了图书商城的用户模块,具体内容如下 。
1、用户模块的相关类创建 。
domain:User dao:UserDao service:UserDao web.servlet:UserServlet 。
2、用户注册 。
2.1 注册流程 。
/jsps/user/regist.jsp -> UserServlet#regist() -> msg.jsp 。
2.2 注册页面 。
。
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
|
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<
html
>
<
head
>
<
title
>注册</
title
>
<
meta
http-equiv
=
"pragma"
content
=
"no-cache"
>
<
meta
http-equiv
=
"cache-control"
content
=
"no-cache"
>
<
meta
http-equiv
=
"expires"
content
=
"0"
>
<
meta
http-equiv
=
"keywords"
content
=
"keyword1,keyword2,keyword3"
>
<
meta
http-equiv
=
"description"
content
=
"This is my page"
>
<
meta
http-equiv
=
"content-type"
content
=
"text/html;charset=utf-8"
>
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</
head
>
<
body
>
<
h1
>注册</
h1
>
<%--
1. 显示errors --> 字段错误
2. 显示异常错误
3. 回显
--%>
<
p
style
=
"color: red; font-weight: 900"
>${msg }</
p
>
<
form
action="<c:url
value
=
'/UserServlet'
/>" method="post">
<
input
type
=
"hidden"
name
=
"method"
value
=
"regist"
/>
用户名:<
input
type
=
"text"
name
=
"username"
value
=
"${form.username }"
/>
<
span
style
=
"color: red; font-weight: 900"
>${errors.username }</
span
>
<
br
/>
密 码:<
input
type
=
"password"
name
=
"password"
value
=
"${form.password }"
/>
<
span
style
=
"color: red; font-weight: 900"
>${errors.password }</
span
>
<
br
/>
邮 箱:<
input
type
=
"text"
name
=
"email"
value
=
"${form.email }"
/>
<
span
style
=
"color: red; font-weight: 900"
>${errors.email }</
span
>
<
br
/>
<
input
type
=
"submit"
value
=
"注册"
/>
</
form
>
</
body
>
</
html
>
|
2.3 UserServlet 。
User 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/**
* User的领域对象
*/
public
class
User {
/*
* 对应数据库表
*/
private
String uid;
// 主键
private
String username;
// 用户名
private
String password;
// 密码
private
String email;
// 邮箱
private
String code;
// 激活码
private
boolean
state;
// 状态(已激活和未激活)
|
BaseServlet 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public
class
BaseServlet
extends
HttpServlet {
/*
* 它会根据请求中的method,来决定调用本类的哪个方法
*/
protected
void
service(HttpServletRequest req, HttpServletResponse res)
throws
ServletException, IOException {
req.setCharacterEncoding(
"UTF-8"
);
res.setContentType(
"text/html;charset=utf-8"
);
try
{
// 例如:http://localhost:8080/demo1/xxx?m=add
String method = req.getParameter(
"method"
);
// 它是一个方法名称
Class c =
this
.getClass();
Method m = c.getMethod(method, HttpServletRequest.
class
,
HttpServletResponse.
class
);
String result = (String) m.invoke(
this
, req, res);
if
(result !=
null
&& !result.isEmpty()) {
req.getRequestDispatcher(result).forward(req, res);
}
}
catch
(Exception e) {
throw
new
ServletException(e);
}
}
}
|
UserServlet 。
。
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
/**
* User表述层
*/
public
class
UserServlet
extends
BaseServlet {
private
UserService userService =
new
UserService();
/**
* 退出功能
* @param request
* @param response
* @return
* @throws ServletException
* @throws IOException
*/
public
String quit(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
request.getSession().invalidate();
return
"r:/index.jsp"
;
}
public
String login(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
/*
* 1. 封装表单数据到form中
* 2. 输入校验(不写了)
* 3. 调用service完成激活
* > 保存错误信息、form到request,转发到login.jsp
* 4. 保存用户信息到session中,然后重定向到index.jsp
*/
User form = CommonUtils.toBean(request.getParameterMap(), User.class);
try {
User user = userService.login(form);
request.getSession().setAttribute("session_user", user);
/*
* 给用户添加一个购物车,即向session中保存一Cart对象
*/
request.getSession().setAttribute("cart", new Cart());
return "r:/index.jsp";
} catch (UserException e) {
request.setAttribute("msg", e.getMessage());
request.setAttribute("form", form);
return "f:/jsps/user/login.jsp";
}
}
/**
* 激活功能
* @param request
* @param response
* @return
* @throws ServletException
* @throws IOException
*/
public String active(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1. 获取参数激活码
* 2. 调用service方法完成激活
* > 保存异常信息到request域,转发到msg.jsp
* 3. 保存成功信息到request域,转发到msg.jsp
*/
String code = request.getParameter("code");
try {
userService.active(code);
request.setAttribute("msg", "恭喜,您激活成功了!请马上登录!");
} catch (UserException e) {
request.setAttribute("msg", e.getMessage());
}
return "f:/jsps/msg.jsp";
}
/**
* 注册功能
* @param request
* @param response
* @return
* @throws ServletException
* @throws IOException
*/
public String regist(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1. 封装表单数据到form对象中
* 2. 补全:uid、code
* 3. 输入校验
* > 保存错误信息、form到request域,转发到regist.jsp
* 4. 调用service方法完成注册
* > 保存错误信息、form到request域,转发到regist.jsp
* 5. 发邮件
* 6. 保存成功信息转发到msg.jsp
*/
// 封装表单数据
User form = CommonUtils.toBean(request.getParameterMap(), User.class);
// 补全
form.setUid(CommonUtils.uuid());
form.setCode(CommonUtils.uuid() + CommonUtils.uuid());
/*
* 输入校验
* 1. 创建一个Map,用来封装错误信息,其中key为表单字段名称,值为错误信息
*/
Map<String,String> errors = new HashMap<String,String>();
/*
* 2. 获取form中的username、password、email进行校验
*/
String username = form.getUsername();
if(username == null || username.trim().isEmpty()) {
errors.put("username", "用户名不能为空!");
} else if(username.length() < 3 || username.length() > 10) {
errors.put("username", "用户名长度必须在3~10之间!");
}
String password = form.getPassword();
if(password == null || password.trim().isEmpty()) {
errors.put("password", "密码不能为空!");
} else if(password.length() < 3 || password.length() > 10) {
errors.put("password", "密码长度必须在3~10之间!");
}
String email = form.getEmail();
if(email == null || email.trim().isEmpty()) {
errors.put("email", "Email不能为空!");
} else if(!email.matches("\\w+@\\w+\\.\\w+")) {
errors.put("email", "Email格式错误!");
}
/*
* 3. 判断是否存在错误信息
*/
if(errors.size() > 0) {
// 1. 保存错误信息
// 2. 保存表单数据
// 3. 转发到regist.jsp
request.setAttribute("errors", errors);
request.setAttribute("form", form);
return "f:/jsps/user/regist.jsp";
}
/*
* 调用service的regist()方法
*/
try {
userService.regist(form);
} catch (UserException e) {
/*
* 1. 保存异常信息
* 2. 保存form
* 3. 转发到regist.jsp
*/
request.setAttribute("msg", e.getMessage());
request.setAttribute("form", form);
return "f:/jsps/user/regist.jsp";
}
/*
* 发邮件
* 准备配置文件!
*/
// 获取配置文件内容
Properties props = new Properties();
props.load(this.getClass().getClassLoader()
.getResourceAsStream("email_template.properties"));
String host = props.getProperty("host");//获取服务器主机
String uname = props.getProperty("uname");//获取用户名
String pwd = props.getProperty("pwd");//获取密码
String from = props.getProperty("from");//获取发件人
String to = form.getEmail();//获取收件人
String subject = props.getProperty("subject");//获取主题
String content = props.getProperty("content");//获取邮件内容
content = MessageFormat.format(content, form.getCode());//替换{0}
Session session = MailUtils.createSession(host, uname, pwd);//得到session
Mail mail = new Mail(from, to, subject, content);//创建邮件对象
try {
MailUtils.send(session, mail);//发邮件!
} catch (MessagingException e) {
}
/*
* 1. 保存成功信息
* 2. 转发到msg.jsp
*/
request.setAttribute(
"msg"
,
"恭喜,注册成功!请马上到邮箱激活"
);
return
"f:/jsps/msg.jsp"
;
}
}
|
2.4 UserService 。
。
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
/**
* User业务层
*/
public
class
UserService {
private
UserDao userDao =
new
UserDao();
/**
* 注册功能
* @param form
*/
public
void
regist(User form)
throws
UserException{
// 校验用户名
User user = userDao.findByUsername(form.getUsername());
if
(user !=
null
)
throw
new
UserException(
"用户名已被注册!"
);
// 校验email
user = userDao.findByEmail(form.getEmail());
if
(user !=
null
)
throw
new
UserException(
"Email已被注册!"
);
// 插入用户到数据库
userDao.add(form);
}
/**
* 激活功能
* @throws UserException
*/
public
void
active(String code)
throws
UserException {
/*
* 1. 使用code查询数据库,得到user
*/
User user = userDao.findByCode(code);
/*
* 2. 如果user不存在,说明激活码错误
*/
if(user == null) throw new UserException("激活码无效!");
/*
* 3. 校验用户的状态是否为未激活状态,如果已激活,说明是二次激活,抛出异常
*/
if(user.isState()) throw new UserException("您已经激活过了,不要再激活了,除非你想死!");
/*
* 4. 修改用户的状态
*/
userDao.updateState(user.getUid(), true);
}
/**
* 登录功能
* @param form
* @return
* @throws UserException
*/
public User login(User form) throws UserException {
/*
* 1. 使用username查询,得到User
* 2. 如果user为null,抛出异常(用户名不存在)
* 3. 比较form和user的密码,若不同,抛出异常(密码错误)
* 4. 查看用户的状态,若为false,抛出异常(尚未激活)
* 5. 返回user
*/
User user = userDao.findByUsername(form.getUsername());
if
(user ==
null
)
throw
new
UserException(
"用户名不存在!"
);
if
(!user.getPassword().equals(form.getPassword()))
throw
new
UserException(
"密码错误!"
);
if
(!user.isState())
throw
new
UserException(
"尚未激活!"
);
return
user;
}
}
|
2.5 UserDao 。
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
/**
* User持久层
*/
public
class
UserDao {
private
QueryRunner qr =
new
TxQueryRunner();
/**
* 按用户名查询
* @param username
* @return
*/
public
User findByUsername(String username) {
try
{
String sql =
"select * from tb_user where username=?"
;
return
qr.query(sql,
new
BeanHandler<User>(User.
class
), username);
}
catch
(SQLException e) {
throw
new
RuntimeException(e);
}
}
/**
* 按email查询
* @param email
* @return
*/
public
User findByEmail(String email) {
try
{
String sql =
"select * from tb_user where email=?"
;
return
qr.query(sql,
new
BeanHandler<User>(User.
class
), email);
}
catch
(SQLException e) {
throw
new
RuntimeException(e);
}
}
/**
* 插入User
* @param user
*/
public
void
add(User user) {
try
{
String sql =
"insert into tb_user values(?,?,?,?,?,?)"
;
Object[] params = {user.getUid(), user.getUsername(),
user.getPassword(), user.getEmail(), user.getCode(),
user.isState()};
qr.update(sql, params);
}
catch
(SQLException e) {
throw
new
RuntimeException(e);
}
}
/**
* 按激活码查询
* @param code
* @return
*/
public
User findByCode(String code) {
try
{
String sql =
"select * from tb_user where code=?"
;
return
qr.query(sql,
new
BeanHandler<User>(User.
class
), code);
}
catch
(SQLException e) {
throw
new
RuntimeException(e);
}
}
/**
* 修改指定用户的指定状态
* @param uid
* @param state
*/
public
void
updateState(String uid,
boolean
state) {
try
{
String sql =
"update tb_user set state=? where uid=?"
;
qr.update(sql, state, uid);
}
catch
(SQLException e) {
throw
new
RuntimeException(e);
}
}
}
|
3、用户激活 。
流程:用户的邮件中 -> UserServlet#active() -> msg.jsp 。
用户登录 。
流程:/jsps/user/login.jsp -> UserServlet#login() -> index.jsp 。
用户退出 。
流程:top.jsp -> UserServlet#quit() -> login.jsp 。
quit():把session销毁! 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
最后此篇关于javaweb图书商城设计之用户模块(1)的文章就讲到这里了,如果你想了解更多关于javaweb图书商城设计之用户模块(1)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
.NET 框架:4.5.1 我在 Blend for visual studio 2015 中遇到一个奇怪的错误,我找不到它的来源。 如果我在 VS 中打开我的 WPF 解决方案,它会加载并运行良好。
我经常遇到这样的问题,与 Hierarchical RESTful URL design 非常相似 假设该服务仅提供用户上传文档。 POST, GET /accounts PUT, DELETE /a
在 Rails 应用程序中,我使用 devise 来管理我的用户,而我用来销毁 session 的链接不再有效。它正在工作,现在我添加了事件管理员,但没有。 我的链接是 :delete, :clas
我已经坚持了超过 24 小时,试图按照此处发布的其他解决方案进行操作,但我无法使其正常工作。我是 Rails 新手,需要帮助! 我想让我的/users/edit 页面正常工作,以便我可以简单地更改用户
Devise 在以下情况下不会使用户超时: 用户登录,关闭选项卡,然后在超时 + X 分钟内重新访问该 URL。用户仍处于登录状态。 如果选项卡已打开并且稍后刷新/单击,则超时可以正常工作。这意味着
我想使用这样的 slider 我希望该 slider 根据提供给它的值进行相应调整。到目前为止,我只能应用具有渐变效果的背景,但无法获得这种效果。请通过提供样式代码来帮助我。
您应该为每种方法创建一个请求/响应对象,还是应该为每个服务创建一个? 如果我在所有方法中使用它,我的服务请求对象中将只有 5 个不同的东西,因为我对几乎所有方法使用相同的输入。 响应对象将只有一个字典
我正在尝试在 REST 中对实体的附件进行建模。假设一个缺陷实体可以附加多个附件。每个附件都有描述和一些其他属性(上次修改时间、文件大小...)。附件本身是任何格式的文件(jpeg、doc ...)
我有以下表格: Blogs { BlogName } BlogPosts { BlogName, PostTitle } 博客文章同时建模一个实体和一个关系,根据 6nf(根据第三个宣言)这是无效的。
如果 A 类与 B、C 和 D 类中的每一个都有唯一的交互,那么交互的代码应该在 A 中还是在 B、C 和 D 中? 我正在编写一个小游戏,其中许多对象可以与其他对象进行独特的交互。例如,EMP点击
关于如何记住我与 Omniauth 一起工作似乎有些困惑。 根据这个wiki ,您需要在 OmniauthCallbacksController 中包含以下内容: remember_me(user)
设计问题: 使用 非线程安全 组件(集合,API,...)在/带有 多线程成分 ... 例子 : 组件 1 :多线程套接字服务器谁向消息处理程序发送消息... 组件 2 :非线程安全 消息处理程序 谁
我们目前正在设计一个 RESTful 应用程序。我们决定使用 XML 作为我们的基本表示。 我有以下关于在 XML 中设计/建模应用程序数据的问题。 在 XML 中进行数据建模的方法有哪些?从头开始然
我正在设计一个新的 XSD 来从业务合作伙伴那里获取积分信息。对于每笔交易,合作伙伴必须提供至少一种积分类型的积分值。我有以下几点:
设计支持多个版本的 API 的最佳方法是什么。我如何确保即使我的数据架构发生更改(微小更改),我的 api 的使用者也不会受到影响?任何引用架构、指南都非常有用。 最佳答案 Mark Nottingh
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我想用 php 创建一个网站,其工作方式与 https://www.bitcoins.lc/ 相同。确实,就每个页面上具有相同布局但内容会随着您更改链接/页面而改变而言,我如何在 php 中使用lay
我有一个关于编写 Swing UI 的问题。如果我想制作一个带有某些选项的软件,例如在第一个框架上,我有三个按钮(新建、选项、退出)。 现在,如果用户单击新按钮,我想将框架中的整个内容更改为其他内容。
我正在尝试找出并学习将应用程序拥有的一堆Docker容器移至Kubernetes的模式和最佳实践。诸如Pod设计,服务,部署之类的东西。例如,我可以创建一个其中包含单个Web和应用程序容器的Pod,但
我是一名优秀的程序员,十分优秀!