项目实战(电子商务企业实战项目)
本文记录自己第一个项目(时长预计两个月完成)
1.1需求分析
2.1系统总体流程

3.1概要设计
3.2数据库设计
—分类表
—商品表
—用户表
4.1系统设计
4.2架构设计
—采用mvc加javaweb开发的三层架构:Web层、Servlet层、dao层
5搭建项目环境
5.1通用servlet的编写
目的是为了减少Servlet的数量
原理:从客户端向服务端发起请求,每次都要传递额外的键值对的数据method=“”,服务端获取到method对应的内容(需要去的方法)之后,通过判断不同的内容调用不同的功能。
从客户端向服务端发送请求一般有三种方法:
1.用链接
2.用form表单发送
3.使用Ajax(AJAX = 异步 JavaScript 和 XML)。
其中JavaScript使用:
function fu(){
$.post(往哪发送(一般是Servlet,传什么数据{:,: (键值对)},响应回来的数据function (data){
alert(data);
},“json”
};
写一个公共类(BaseServlet)利用反射来取得服务端请求中的方法,转到对应的页面。
服务端发起请求,找到Servlet,利用反射。从xml里面找到Servlet的路径,调用其无参构造,反射出对象;接着调用第一个方法是Servlet生命周期——init()方法(子类没有就一直往其父类找 快捷键Crtl+o);然后调用service()方法(同上) 先判断是get还是post方法,然后找到当前类的doget()/dopost()方法;最后就是destroy()方法。
5.2
创建DynaWebProject
关于get方法 和post方法 请求数据:
get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
使用方法:get方法是在URL后面用问号❓ 拼接数据;post方法是 POST 请求的 HTTP 消息主体中发送的。
使用建议 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
补充内容:form表单提交的方法有
1.使用input标签中type=“submit”的按钮提交
2.使用js的function方法对button添加点击方法,触发提交表单的操作。
5.3
创建各个包结构
cn.gdut.store.web.servlet
cn.gdut.store.web.fitler(放过滤器的包,过滤器实际上就是对web资源进行拦截,做一些处理后再交给servlet。 通常都是用来拦截request进行处理的)
cn.gdut.store.web.base
cn.gdut.store.web.service :接受servlet信息,并调用dao层
cn.gdut.store.web.dao :接受到数据并对数据库进行增删改查等操作。
cn.gdut.store.web.domain
cn.gdut.store.web.utils(放工具类的包)
5.4
导入jar包和工具类
5.5
导入配置文件
5.6
导入编码过滤器(EncodingFilte)
对过滤器中的三个方法进行增强
5.7
导入jsp页面(美工会做好,但是里面连接都需要自己配置)
6.实现用户注册功能
开发约定:
为了项目管理方便,不会从客户端直接发起请求到JSP页面,都是先请求到Servlet(哪怕只是空跳转),再 由Servlet转发到JSP页面。
使用junit进行测试:使用注解写Test(表示这是一个测试方法)然后导包,在run时双击该方法右键选择run junit即可只跑测试方法。
补充内容:
1)如果想让println打印对象可以直接打印出其中的字符串,需要在该对象的方法中重写Object类的toString()方法;
2)快捷生成带参和无参构造函数,直接alt+shift+s,然后选择Generate Constructors from Superclass或者Generate Constructors using Fields,分别构造空参和带参数的构造函数。
2.1)快捷生成try catch方法;alt+shift+z
2.1.1.断点测试
使用断点进行测试:双击该行前方即可设置断点,然后运行时点击小蚂蚁图案(debug模式),程序会运行到断点处,之后可以一步一步往下运行,查看代码执行情况。⚠️如果想关闭除了当前项目以外的所有项目,需要注意不要关闭servers这个包,否则无法运行Tmocat服务器。
2.1.2. debug
debug模式有时候会进入已经写好的jar包里面,这个时候需要:F5进入函数体,F6不进入函数体单步往下走,F7退出函数体(与F5相反),F8直接执行完程序或者(如果还有下一个断点)去到下一断点停顿。
开发的通用步骤
mvc框架(三层架构)
从浏览器请求——>服务端的Servlet web层 ——>Service(业务)层 ——>dao层 操作数据库的语句(连接数据库)——>数据库——>转回Servlet跳到某个页面(jsp)响应回——>浏览器
步骤实现
1.准备工作/jsp/regist.jsp
设置表单各种属性 action method form表单的input 和提交触发等
2.UserServelt—》userRegist
接受表单参数;
调用业务层注册功能;
注册成功,向用户邮箱发送信息,跳转到提示页面;
注册失败,跳转到提示页面info.jsp;
3.依次实现 service,dao层
在dao层的实现层,使用sql语句时创建的对象需要一一与数据库的匹配,不能打乱顺序。
4.jsp页面
首页
1.用户激活
先在Service层的Imp层写出要用的方法,再ctrl+1进入dao层创建方法,再在dao层选中类名ctrl+shift+r进入dao的Imp实现dao中的方法。(ctrl+q回到上次编辑的地方,ctrl+m最大化编写代码窗口,ctrl+e可以快速去到已经打开的页面)BeanHandle?
点击注册用户后 ,在数据库中生成一个激活码,然后将这个激活码发送到用户邮箱中,让其点击激活。点击该激活码后,提出申请,服务端收到这个激活码:
1、 UserServlet(该层会给用户的一些其他属性赋值如:id和state、code)-》2、service层-》3、dao层-》与数据库中的激活码进行对比,相同则将已经在数据库中的这个用户的状态从0改成1。更新完后需要将激活码清掉,否则几个月后再按一次这个链接还可以激活(只需要激活一次)。最后转到/jsp/login.jsp页面,对用户进行信息提示。
2.登陆
关于网页大刷ctrl+f5,它会重新向服务端请求所有内容(相当于清空内存再申请);而f5的请求如果遇到了之前已经有过的内容,不会服务端不会重新发送一次,而是直接让你用之前的缓存(304)。
关于页面跳转
先去找Servlet时,在html中写${pageContext.request.contextPath}(意思是取到当前项目下的位置)/UserServlet?method=…
重定向和转发的区别 :重定向会重新向服务器发送一个请求(两次请求),之前的URL都会清空(request对象里面的东西清空),如果需要之前的 信息需要使用Session;转发则会携带之前的URL跳转,且新的页面继续处理之前请求,所以转发的速度比重定向快。
点击登陆后还是先到Servlet找到loginUI方法跳转到login.jsp
退出
删除session数据:request.getSession().invalidate();
重定向到主页:response.sendRedirect(“.jsp”);
4.抽取公共页面
如每个页面的上方和下方都不变,可以抽取出来
在需要的地方
使用<%@ include file=“/jsp/header.jsp” %>
5.查询所有分类
domain里面放的是可以创建对象的参数等,与数据库中对应。
由于查询分类每次跳转都要查询,但是放入 session中效率太低且浪费内存。可以使用ajax (通过在后台与服务器进行少部量数据交换,Ajax可以使网页实现异步更新。这意味着可以不重新加载整个网页的情况下,对网页的某部分进行更新,无需重定向或者转发,一般都在整个页面请求结束后再请求)
向服务端发起ajax请求,服务端经过处理,将所有分类信息以JSON格式的数据返回 ,获取到返回的所有分类绑定在页面的现实分类区域
弊端 :如果用户频繁访问包含分类信息的页面,每次都要去数据库中取分类信息,影响性能
使用redis,获取redis中的信息,如果获取不到再去数据库中查询,再缓存进入redis中。获取到就直接使用
6.首页热门商品、最新商品
7.商品详情显示
8.基础分页操作
9.首页分类商品带分页查询
