商城实体:用户 商品 订单 分类(主要涉及到的实体)
实体关系:
用户和商品: 没关系
用户和订单:一对多
用户和分类: 没关系
商品和订单:多对多
分类和商品:一对多
订单和分类: 没关系
用户表
用户表中的字段:看注册就可以了
订单表
用户和订单是一对多关系,需要在订单实体中引用用户
商品表
分类表
综上
今日任务:用户模块开发
用户注册 用户激活 用户登录 用户退出,完全可以写4个servlet但这样不好,所以关于用户的操作都封装usreservlet中
环境搭建:
1.数据库和表
2.新建项目
导入jar包:驱动包c3p0 dbutils beanutils jstl mail
导配置文件(c3p0连接的配置文件)和工具类
原型页面
3.项目目录结构 web model version 2.5 ,tomcat 7
doGet、doPost方法只是为了区分请求的不同来处理编码的,现在有了filter,那么doGet、doPost就失去了它的意义了,我们把处理请求统一放在service周期方法中。处理结果要么请求转发(用的最多),要么重定向,要么向页面打印数据。
/** * 通用的servlet,然后让其它servlet继承BaseServlet,它要在web.xml里面配置 */ public class BaseServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response) */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //1、获取方法名称 String mName = request.getParameter("method"); //判断方法参数是否为空,若为空,执行默认的方法,这个方法index(),所有的servlet都应该有,所以要写在BaseServlet里面,总不能给用户展示404页面吧 if (mName == null || mName.trim().length()==0) { mName = "index"; } //2、获取方法对象 Method method = this.getClass().getMethod(mName, HttpServletRequest.class,HttpServletResponse.class); //3、让方法执行,接收返回值 String path = (String) method.invoke(this,request,response); //4、判断返回值是否为空,若不为空统一请求转发 if (path!=null) { request.getRequestDispatcher(path).forward(request, response); } }catch(Exception e) { e.printStackTrace(); throw new RuntimeException(); } } public String index(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html;charset=utf-8"); //设置响应编码 response.getWriter().print("亲,不要捣乱"); return null; } }
案例一:用户注册
需求:在register.jsp上填写用户的信息,点击保存,将用户信息保存到数据库中
步骤分析:1.设置默认首页(index.jsp),让其自动跳转到/jsp/index.jsp(理解:访问localhost:8080/store时,自动到index.jsp页,这个页自动跳转到项目的主页/jsp/index.jsp)
2、修改index.jsp上的 注册 超链接(说明:可以直接让它链接到那个地址上面,但是不好。要跳转到用户注册页面上,和用户相关,jsp也是一种servlet,用其进行转发过去) <a href='/store/user?method=registUI'>注册</a>
3、在userServlet中编写registUI方法,方法作用请求转发到/jsp/register.jsp(好处:如果把这个页面放在WEB-INF下直接链接不过去,而用转发一点问题没有)
4、修改register.jsp上的表单信息action ="/store/user?method=regist" method 为每一个子标签添加name属性
5、点击注册按钮 向userServlet发送请求
6、userServlet中表写regist方法
获取参数,封装成user对象
调用service完成注册
生成提示信息,转发到/jsp/msg.jsp
7、service中的操作:
调用dao完成注册操作,发送邮件点此激活
8、UserDao往数据库中插入一条数据
最后插入成功
案例二:用户激活
需求:用户登录邮箱之后,点击邮箱中的连接,完成用户激活操作
步骤分析:
1.点击邮箱中的链接,向商城userservlet发送一个请求
user?method = active&code=xxx
2.在userservlet中编写active(积极的)方法
接收code
调用service完成激活 返回值:user
生成提示信息 转发
3.在service中获取激活方法
通过code获取用户
若没有找到:提示重新激活或者重新注册
若找到了:设置激活转台为1 将code设置为null(没有用了,就是用来验证是否激活的)
4.在dao需要编写两个方法:getByCode update
案例三:用户登录
Request的作用范围是一次访问的过程,生命周期随着访问开始而开始,随着服务器的响应完毕而结束.所以更多的数据会添加到这个域对象,(这里我还会啰嗦几句转发和重定向的区别)
需求:在一个登录页面上,输入用户名和密码,点击登录,完成登录操作
步骤分析:
1.在index.jsp点击 登录 连接,跳转到登录页面
2.在userserlvet中编写 loginUI(这里和注册一样通过servlet返回一个路径跳转,而不是直接链接到登录页面)
3.修改login.jsp表单的信息
action: /user?method=login
给子标签添加name属性
5.点击提交发送请求
6.在userservlet中编写login方法
获取用户名和密码
调用service完成登录 返回值:user
若登录成功,跳转到index.jsp 并展示用户信息
若登录失败,
若user为空(用户名在数据库中不存在):提示 用户名和密码 跳转到login.jsp
若user不为空但是未激活:提示信息 "请先去邮箱激活,再登录" 跳转msg.jsp
7.service,dao(获取用户信息就可)
案例四:用户退出
就是把session清空,而不仅仅是移除user信息,因为session里面还有可能有其它信息
需求:点击 index.jsp上 退出连接,退出当前的用户,跳转index.jsp
步骤分析:
1.点击 index.jsp上 退出 连接,向userservlet发送请求
/user?methode=logout
2.在userservlet中编写logout方法
销毁session
重定向到index.jsp
总结:
扩展:
记住用户名
需求:
登录成功之后,若勾选了记住用户名,下一次再登录的时候,会展示出来用户名
步骤分析:
修改login方法的逻辑
登录成功之后,判断是否勾选了记住用户名
若勾选了,将用户名(将用户名编码)保存到cookie中
在login.jsp加载成功的时候需要从cookie中获取用户名且展示出来