mvc:一

商城实体:用户  商品  订单  分类(主要涉及到的实体)
实体关系:
  用户和商品: 没关系
  用户和订单:一对多
  用户和分类: 没关系
  商品和订单:多对多
  分类和商品:一对多
  订单和分类: 没关系

用户表

用户表中的字段:看注册就可以了

订单表

用户和订单是一对多关系,需要在订单实体中引用用户

 商品表

分类表

 

 综上

 今日任务:用户模块开发

用户注册  用户激活  用户登录  用户退出,完全可以写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中获取用户名且展示出来

原文地址:https://www.cnblogs.com/djlindex/p/11415327.html