2011年2月9日开始学习struts2,到现在,用struts2花了7,8天完成了当当网的核心模块(包含大部分功能)
先对自己做的当当网做个总结吧:
首先是注册,注册页面基本的CSS以及美工,图片都是成品。表单里封装了user的字段,提交到Action中,利用Action中user对象的set方法封装了整个表单的值到他的属性中去,表单项不太多。但是由于整个注册需要2个步骤来完成,第一步简单的提交用户信息,第二部通过验证。第一步与第二步之间user的共享是通过session来做的。本来第二部是需要通过邮件,验证码是通过uuid生成的唯一字串,在通过Base64编码形成的。将发送的验证码,与表中的比较。由于种种原因,邮件的这部分操作,改用了简单的页面提示,只需把页面上显示的验证码复制到文本框提交就可以了。这里需要注意的就是如果用户在完成第一步之后,关掉了浏览器,下次登录的时候需要在Action里检查它是否通过了验证(user表中有对应的字段,同时也存了验证码)。总之注册的Action里做了:1,将用户信息写入d_user表。2,密码加密。3,生成邮箱激活码,并发送,将激活码uuid部分更新到数据库。还有个要点是,此处我的处理时在用户注册成功时,自动登录,将用户信息存入session。此处作的最烦心的事情就是jQry的表单验证,用了jQry的validate插件。由于页面的错误信息放置已经定死,此处需要重写jQry的errorPlacement方法,来定位错误信息的放置。同时使用了添加了一些验证规则,比如说汉字啊,一个汉字作为2个字符长度啊,此处的实现涉及到了addMethod方法(此为全局的方法)。
jQuery.validator.addMethod("character", function(value, element) {
var rules =/^[a-z0-9\u4e00-\u9fa5]+$/;
return this.optional(element) || (rules.test(value));
}, "<img src='../images/wrong.gif'/>请输入正确的昵称!"
);
jQuery.validator.addMethod("myLengthRange",function(value, element, param) {
var rules = /[\u4e00-\u9fa5][\u4e00-\u9fa5]+/;
var rule2 = /[\u4e00-\u9fa5]+/;
return this.optional(element) || (value.length>=param[0] && value.length<=param[1] || rules.test(value) && value.length<3 || value.length==3&&rule2.test(value));
},"<img src='../images/wrong.gif'/>昵称的长度必须大于4小于20!"
);
接下来是登录,登录的时候,登录的时候没有进行表单的验证。我觉得不太必要。但是如果用户名密码错误,或者为空点击登录,会利用Action返回的result定位到原来的页面,显示错误信息。此处需要注意的也就是当用户是还未通过验证的用户,那么他登录之后会跳转到验证页面,验证码从数据表中取得,此处操作通注册的第二步操作。
注册与登录完毕之后,进入main页面。main页面其实就是利用jQry $.load()方法导入一些页面,以及利用ognl标签<s:action />来载入Action。如下:
<s:action name="new" namespace="/main" executeResult="tr"></s:action>
左边栏是Category,分为二级菜单以及三级菜单。因为一级菜单,此处我们只对图书进行操作,所以也就省去了一级菜单的列出,直接设为静态。中间的最新上架,编辑推荐,最新热卖之类的Action做的操作大同小异。也就是利用不同的规则从数据库中查到到对应的list,然后利用ognl的iterator标签在页面中显示,此处,我在Action中设置了num字段用于控制显示的条目数,此字段用于iterator标签中的end属性,此属性在使用时必须声明begin属性。这里得num在getNum方法时,需要在其超出list.size()-1时,对其进行设置,设置为list.size()-1。在点击页面中的更多链接时,通过传入num参数,来改变显示的条目数量。同时main页面上做了jQry处理,在鼠标mouseover,mouseout,mousemove时显示产品大图。
$(function(){
var x = 10;
var y = 20;
$("img.dang_img").mouseover(function(e){
this.myTitle = this.title;
this.title = "";
var imgTitle = this.myTitle? "<br/>" + this.myTitle : "";
var tooltip = "<div id='tooltip'><img height='200px' width='150px' src='"+ this.src +"' alt='产品预览图'/>"+imgTitle+"</div>"; //创建 div 元素
$("body").append(tooltip); //把它追加到文档中
$("#tooltip").css({
"top": (e.pageY+y) + "px",
"left": (e.pageX+x) + "px"
}).show("fast"); //设置x坐标和y坐标,并且显示
}).mouseout(function(){
this.title = this.myTitle;
$("#tooltip").remove(); //移除
}).mousemove(function(e){
$("#tooltip")
.css({
"top": (e.pageY+y) + "px",
"left": (e.pageX+x) + "px"
});
});
})
接下来是购物车的操作。购物车的操作牵涉到了,jQry对按钮的点击的,修改图片的显示,在成功发送Ajax时回调函数,将图片替换为原来的图片。此处对购物车的添加商品也就是通过Ajax完成的。$.post() 购物车中如果购买的是相同产品,那么会通过查找,修改对应的CartItem的数量,若不同产品,则向CartItem的items(ArrayList)添加该商品,同时,更新Cart的总价以及省钱数。(Cart类包含一个List<CartItem>items,以及总价和省钱数;而CartItem中保存的是Book对象以及deleted(用于判断是否从购物车中删除,删除后可以恢复)和数量)。cartlist.jsp显示的2个列表,一个是购物车中的产品信息,一个是从购物车中删除的产品。利用ognl的iterator遍历,显示deleted为tr及false的2个列表。此处可以点击更改数目,此操作同时更新Cart的总价及省钱数。同时在删除某一产品后,再次购买该商品,用户若恢复删除的商品,此处也涉及了同一商品的数量合并,以及从List中删除多余的商品。
在点击结算按钮时,此处设置了拦截器,若用户未登录,则在拦截器中通过reqst.getHeader获得原页面的url在登录之后跳转到原来访问的页面(同理,在main页面的head上的登录按钮也用了这个拦截器)。所以此处在sturts.xml中的配置的result的返回页面是动态的,如下:
<result name="s?ss" type="redirect">${forward_to}</result> 此处购物车的信息需要在浏览器关闭后保留,则此处运用到session和cookie来一起工作来实现此功能。每一次更新购物车都需要将一个cart对象按照指定的规则转成字符串,通过UrlEncoder来编码,存入Cookie,因为涉及到中文问题,同时需要编写对应的方法按照规则将Cookie的字串转会成Cart对象。在session取对象取出来为空时,将cookie的字串转成cart,放入session,即可。
订单模块,牵涉到的业务也比较简单,首先点击结算,跳转到订单信息页面,显示购物车中的信息。同时点击下一步,此时进入一个Action先将表单信息存入数据库,接下来,完善收件地址,若为新地址则加入表中,同时更新order表中的地址信息(order表中存地址信息,本来我觉得字段有冗余,但是经同学点拨,得知用户可以修改,删除地址,所以订单中的地址信息不可存地址表外键)最后完成订单。完成订单后注意要删除cart对应的session以及cookie。
分享到:
相关推荐
python学习资源
jfinal-undertow 用于开发、部署由 jfinal 开发的 web 项目
基于Andorid的音乐播放器项目设计(国外开源)实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
python学习资源
python学习资源
python学习一些项目和资源
【毕业设计】java-springboot+vue家具销售平台实现源码(完整前后端+mysql+说明文档+LunW).zip
HTML+CSS+JavaScarip开发的前端网页源代码
python学习资源
【毕业设计】java-springboot-vue健身房信息管理系统源码(完整前后端+mysql+说明文档+LunW).zip
成绩管理系统C/Go。大学生期末小作业,指针实现,C语言版本(ANSI C)和Go语言版本
1_基于大数据的智能菜品个性化推荐与点餐系统的设计与实现.docx
【毕业设计】java-springboot-vue交流互动平台实现源码(完整前后端+mysql+说明文档+LunW).zip
内容概要:本文主要探讨了在高并发情况下如何设计并优化火车票秒杀系统,确保系统的高性能与稳定性。通过对比分析三种库存管理模式(下单减库存、支付减库存、预扣库存),强调了预扣库存结合本地缓存及远程Redis统一库存的优势,同时介绍了如何利用Nginx的加权轮询策略、MQ消息队列异步处理等方式降低系统压力,保障交易完整性和数据一致性,防止超卖现象。 适用人群:具有一定互联网应用开发经验的研发人员和技术管理人员。 使用场景及目标:适用于电商、票务等行业需要处理大量瞬时并发请求的业务场景。其目标在于通过合理的架构规划,实现在高峰期保持平台的稳定运行,保证用户体验的同时最大化销售额。 其他说明:文中提及的技术细节如Epoll I/O多路复用模型以及分布式系统中的容错措施等内容,对于深入理解大规模并发系统的构建有着重要指导意义。
基于 OpenCV 和 PyTorch 的深度车牌识别
【毕业设计-java】springboot-vue教学资料管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
此数据集包含有关出租车行程的详细信息,包括乘客人数、行程距离、付款类型、车费金额和行程时长。它可用于各种数据分析和机器学习应用程序,例如票价预测和乘车模式分析。
把代码放到Word中,通过开发工具——Visual Basic——插入模块,粘贴在里在,把在硅基流动中申请的API放到VBA代码中。在Word中,选择一个问题,运行这个DeepSeekV3的宏就可以实现在线问答
【毕业设计】java-springboot+vue机动车号牌管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot-vue交通管理在线服务系统的开发源码(完整前后端+mysql+说明文档+LunW).zip