主要内容: 环境的准备工作 用户注册,邮箱放送验证码,点击激活用户
环境的准备工作
一、创建数据仓库.创建3个表结构,插入数据
-- 1.1 创建用户表
CREATE TABLE `user` (
`uid` varchar(32) NOT NULL, #用户编号
`username` varchar(20) DEFAULT NULL, #用户名
`password` varchar(20) DEFAULT NULL, #密码
`name` varchar(20) DEFAULT NULL, #昵称
`email` varchar(30) DEFAULT NULL, #电子邮箱
`telephone` varchar(20) DEFAULT NULL, #电话
`birthday` date DEFAULT NULL, #生日
`sex` varchar(10) DEFAULT NULL, #性别
`state` int(11) DEFAULT 0, #状态:0=未激活,1=已激活
`code` varchar(64) DEFAULT NULL, #激活码
PRIMARY KEY (`uid`)
) ;
-- 2.1 创建分类表
CREATE TABLE `category` (
`cid` varchar(32) NOT NULL,
`cname` varchar(20) DEFAULT NULL, #分类名称
PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 3.1 创建商品表
CREATE TABLE `product` (
`pid` varchar(32) NOT NULL,
`pname` varchar(50) DEFAULT NULL, #商品名称
`market_price` double DEFAULT NULL, #市场价
`shop_price` double DEFAULT NULL, #商城价
`pimage` varchar(200) DEFAULT NULL, #商品图片路径
`pdate` date DEFAULT NULL, #上架时间
`is_hot` int(11) DEFAULT NULL, #是否热门:0=不热门,1=热门
`pdesc` varchar(255) DEFAULT NULL, #商品描述
`pflag` int(11) DEFAULT 0, #商品标记:0=未下架(默认值),1=已经下架
`cid` varchar(32) DEFAULT NULL, #分类id
PRIMARY KEY (`pid`),
KEY `product_fk_0001` (`cid`),
CONSTRAINT `product_fk_0001` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
项目中表的关系:
二、创建一个通用的servlet
1、从客户端向服务器端发起请求,调用功能的方式:
第一种方式:form 表单
<br>
<form action="/BaseServlet/ServletDemo01?method=add" method="post">
用户:<input type="text" name = "username"><br>
<input type = "submit" value = "提交">
</form>
<br>
第二种方式:a标签 链接的方式
<br>
<a href="/BaseServlet/ServletDemo01?method=del"></a>
<br>
第三种方式:Ajax 的方式
<button onclick = "fun()">点击我</button>
<script >
function fun(){
$.post( "/BaseServlet/ServletDemo01" ,{"method":"find","username","tom" },function(data){
alert(data);
},"jsou" );
}
</script>
2、BaseServlet的两种实现方式
a、普通的请求
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取客户端提交到服务端的method对应的值
String md=request.getParameter("method");
//定义变量,存放功能执行完毕之后要转发的路径
String path=null;
//通过判断md中不同的内容来决定本次功能
if("addStu".equals(md)){
path=addStu(request, response);
}else if("delStu".equals(md)){
path=delStu(request, response);
}else if("checkStu".equals(md)){
path=checkStu(request, response);
}else if("".equals(md)){
}
if(null!=path){
//服务端的转发
request.getRequestDispatcher(path).forward(request, response);
}
}
public String addStu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("添加学生");
return "/test.html";
}
public String delStu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("删除学生");
return "/test.html";
}
public String checkStu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("检查学生");
response.getWriter().println("DDDDDD");
return null;
}
弊端:若有多个则需要添加多个if语句进行判断.
b、通过反射来实现
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取客户端提交到服务端的method对应的值
String md=request.getParameter("method");
//定义变量,存放功能执行完毕之后要转发的路径
String path=null;
//获取到当前字节码对象(ServletDemo02.class在内存中对象)
Class clazz = this.getClass();
try {
//获取clazz上名称为md方法
Method method=clazz.getMethod(md, HttpServletRequest.class,HttpServletResponse.class);
if(null!=method){
//调用找到的方法
path=(String)method.invoke(this, request,response);
}
if(null!=path){
//服务端的转发
request.getRequestDispatcher(path).forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public String addStu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("添加学生");
return "/test.html";
}
public String delStu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("删除学生");
return "/test.html";
}
public String checkStu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("检查学生");
response.getWriter().println("DDDDDD");
return null;
}
将其抽取为工具类:
public class BaseServlet extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("service.....");
//获取客户端提交到服务端的method对应的值
String md=request.getParameter("method");
//定义变量,存放功能执行完毕之后要转发的路径
String path=null;
//获取到当前字节码对象(ServletDemo02.class在内存中对象)
Class clazz = this.getClass();
try {
//获取clazz上名称为md方法
Method method=clazz.getMethod(md, HttpServletRequest.class,HttpServletResponse.class);
if(null!=method){
//调用找到的方法
path=(String)method.invoke(this, request,response);
}
if(null!=path){
//服务端的转发
request.getRequestDispatcher(path).forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、环境的搭建
1、jar包与工具类的引用
2、用户模块的创建:User 与数据库表对应
3、导入JSP页面
4、创建了用户模块相关程序
用户注册,邮箱放送验证码,点击激活用户
四、用户实现登入的功能
开发约定
为了项目管理方便,不会从客户端直接发起请求到JSP页面.
先请求到Servlet,在由Servlet转发到JSP页面.哪怕此次为空的跳转
注册功能原理图
根据功能图实现注册功能的实现
五、搭建邮件服务器
*_邮件服务器:
公司服务器上安装软件,管理各个邮箱账户中的邮件 接收/发送
*_电子邮箱:
各个账户在服务器上开辟一段空间
*_邮件协议: 发送SMTP 接收:pop3/pop/imap
作用:约定了邮件在网络中传输格式
*_搭建邮件服务器
使用
六、激活功能的实现
根据原理图,完成代码的实现.
七、用户登录与退出功能
根据原理图,完成代码的实现.