网络商城的开发准备与注册模块的编写
还是几年前的写过网上商城的项目,今天一个人在家,准备写一点东西,然后就翻出来老东西了。这里只是简单的介绍一下开发前的准备工作和注册模块的写法。
1.准备工作
系统开发环境 :
eclipse neno + JDK1.8 + Tomcat8.5 +mysql 5.7
首先你要准备好相关的数据库表的创建,以免在开发的时候出现错误。
(这里创建一个网络书城)
例如在数据库创建4个表:
create database bookStore;
use bookStore;
#用户表
CREATE TABLE `user` (
`id` INT(11) AUTO_INCREMENT,
`username` VARCHAR(20) ,
`PASSWORD` VARCHAR(20) ,
`gender` VARCHAR(10) ,
`email` VARCHAR(50) ,
`telephone` VARCHAR(20) ,
`introduce` VARCHAR(100),
`activeCode` VARCHAR(50) ,
`state` INT(11) ,
`role` VARCHAR(10) DEFAULT '普通用户',
`registTime` TIMESTAMP ,
PRIMARY KEY (`id`)
);
#商品表
CREATE TABLE `products` (
`id` VARCHAR(100) ,
`name` VARCHAR(40) ,
`price` DOUBLE ,
`category` VARCHAR(40) ,
`pnum` INT(11) ,
`imgurl` VARCHAR(100) ,
`description` VARCHAR(255) ,
PRIMARY KEY (`id`)
);
#订单表
CREATE TABLE `orders` (
`id` VARCHAR(100) ,
`money` DOUBLE ,
`receiverAddress` VARCHAR(255) ,
`receiverName` VARCHAR(20) ,
`receiverPhone` VARCHAR(20) ,
`paystate` INT(11) ,
`ordertime` TIMESTAMP ,
`user_id` INT(11) ,
PRIMARY KEY (`id`),
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
);
#订单详情表
CREATE TABLE `orderitem` (
`order_id` VARCHAR(100) ,
`product_id` VARCHAR(100),
`buynum` INT(11) ,
PRIMARY KEY (`order_id`,`product_id`),
FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`),
FOREIGN KEY (`product_id`) REFERENCES `products` (`id`)
);
然后,按照JavaEE 三层结构开始划分开发的结构
例如:模型:domain,model,pojo,po,entity
在eclipse 项目里面导入需要用到的jar包:
- 导入mysql驱动
- 导入c3p0
- 导入dbutils
- 导入beanutils
- 导入fileupload
- 导入javamail mail.jar
- 导入jstl jstl.jar standard.jar
2.编写页面
2.1用户注册页面流程图
实现原理:
实现步骤:
Step1: User模型
public class User {
private int id; // 用户编号
private String username; // 用户姓名
private String password; // 用户密码
private String gender; // 用户性别
private String email; // 用户邮箱
private String telephone; // 用户联系电话
private String introduce; // 用户介绍
private String activeCode; // **码
private String role; // 用户角色
private int state; // 用户状态
private Date registTime;// 注册时间
}
Step2:接收请求参数
Step3:添加请求编码的Filter
public class MyEncodingFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//1.设置POST请求中文乱码的问题
request.setCharacterEncoding("UTF-8");
System.out.println("拦截请求:" + request);
//2.解决get请求的中文乱码问题
//request : RequestFacade;
HttpServletRequest hsr = (HttpServletRequest)request;
if(hsr.getMethod().equalsIgnoreCase("get")){
MyRequest myRequest = new MyRequest(hsr);
//放行请求
chain.doFilter(myRequest, response);
}else{
chain.doFilter(request, response);
}
}
}
/**
* Wrapper包装类,装饰设计模式,内部有个真实对象的引用
* @author gyf
*
*/
class MyRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
private boolean isEncoding = false;//是否已经utf-8编码
public MyRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
return getParameterMap().get(name)[0];
}
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> map = request.getParameterMap();
if(isEncoding == true){
return map;
}
//遍历vlaue,改成utf-8编码
for(Entry<String, String[]> entry : map.entrySet()){
//取数组值
String[] values = entry.getValue();
for(int i=0;i<values.length;i++){
try {
values[i] = new String(values[i].getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
isEncoding = true;
return map;
}
}
Step4:配置C3P0
注意:c3p0-config.xml 文件放在src中
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore
</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 初始化连接池数量 -->
<property name="initialPoolSize">10</property>
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime">60</property>
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize">25</property>
<!--连接池中保留的 最小连接数 -->
<property name="minPoolSize">10</property>
</default-config>
</c3p0-config>
public class C3P0Utils {
private static DataSource ds = new ComboPooledDataSource();
public static DataSource getDataSource(){
return ds;
}
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException("服务器错误");
}
}
public static void closeAll(Connection conn,Statement statement,ResultSet resultSet){
if(resultSet != null){
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
resultSet = null;
}
if(statement != null){
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
statement = null;
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
conn = null;
}
}
}
}
Step5:添加Service和Dao
UserService:
Dao:
Step6:修改RegisterServlet逻辑
SQL修改username性一:alter table user add constraint username_uq unique (username);
Step7:验证码
注意:你要准备好一个写有验证码的文件。当时的验证码用的是成语,写在一个TXT文件里面
在Register前面添加验证码
这里附加一个生成图片验证码例子的讲解链接:
https://www.cnblogs.com/zhaotiancheng/p/6687103.html
2.2:**邮件的发送
smtp与pop3
- SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议
- SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器
- POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本
- POP3服务器则是遵循POP3协议的接收邮件服务器
SMTP是发送邮件协议
POP3是接收邮件协议
java如何发送邮件
注意:java中需要使用 这个包来发送邮件
package com.bookstore.utils;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendJMail {
public static boolean sendMail(String email, String emailMsg) {
String from = "aaa@qq.com"; // 邮件发送人的邮件地址
String to = email; // 邮件接收人的邮件地址
final String username = "aaa@qq.com"; //发件人的邮件帐户
final String password = "123456"; //发件人的邮件密码
//定义Properties对象,设置环境信息
Properties props = System.getProperties();
//设置邮件服务器的地址
props.setProperty("mail.smtp.host", "smtp.163.com"); // 指定的smtp服务器
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");//设置发送邮件使用的协议
//创建Session对象,session对象表示整个邮件的环境信息
Session session = Session.getInstance(props);
//设置输出调试信息
session.setDebug(true);
try {
//Message的实例对象表示一封电子邮件
MimeMessage message = new MimeMessage(session);
//设置发件人的地址
message.setFrom(new InternetAddress(from));
//设置主题
message.setSubject("用户**");
//设置邮件的文本内容
//message.setText("Welcome to JavaMail World!");
message.setContent((emailMsg),"text/html;charset=utf-8");
//设置附件
//message.setDataHandler(dh);
//从session的环境中获取发送邮件的对象
Transport transport=session.getTransport();
//连接邮件服务器
transport.connect("smtp.163.com",25, username, password);
//设置收件人地址,并发送消息
transport.sendMessage(message,new Address[]{new InternetAddress(to)});
transport.close();
return true;
} catch (MessagingException e) {
e.printStackTrace();
return false;
}
}
}
在注册的service中,添加发送邮件功能
2.3 **用户
ActiveServlet:**的Servlet
UserService:添加**用户方法
UserDao:添加2个方法
到此为止,整个开发的准备工作和用户的注册模块算是编写完成了,还有重要的 用户权限,商品的录入,购物车,结算等功能下章在写。
===============================================================================================
一章写完有些困难,因为实际上一个网站的全部工作全部写出来整个文章写得太长,也显得太杂乱了,所以分开来写方便点。也方便阅读和复习。
本人自己建立的一个QQ群号。还在完善中,期待你的加入! 本人自己建立的一个微信订阅号。还在完善中,期待你的加入!
推荐阅读
-
网络商城的开发准备与注册模块的编写
-
IOS开发用户登录注册模块所遇到的问题
-
IOS开发用户登录注册模块所遇到的问题
-
C# - SPC(Statistical Process Control)系统 - 6西格玛数据决策和Chart模块的开发与实现
-
基于localStorge开发登录模块的记住密码与自动登录实例
-
.NET应用架构设计—表模块模式与事务脚本模式的代码编写
-
字符设备驱动开发 Linux 设备号 字符设备驱动开发步骤 open 函数调用流程 设备号的组成 设备号的分配 Linux 应用程序对驱动程序的调用 字符设备注册与注销 实现设备的具体操作函数
-
第八天 黑马十次方 十次方的需求分析、十次方的系统设计以及RESTful、项目的前 期准备工作、十次方父模块与公共模块的搭建、基础微服务-标签CRUD的功能
-
Ruby中编写类与模块的风格指南
-
Python中编写与引入自己的包、模块