<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>实战 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E5%AE%9E%E6%88%98/</link><description>Recent content in 实战 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 19 Nov 2017 19:53:26 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E5%AE%9E%E6%88%98/index.xml" rel="self" type="application/rss+xml"/><item><title>【SSH网上商城项目实战30】项目总结（附源码下载地址）</title><link>https://pangyd.com/post/174-ssh30/</link><pubDate>Sun, 19 Nov 2017 19:52:46 +0800</pubDate><guid>https://pangyd.com/post/174-ssh30/</guid><description>&lt;table class="layui-table">&lt;tbody>&lt;tr>&lt;td bgcolor="#F5FFFA">&lt;h2 id="0-写在前面">&lt;strong>0. 写在前面&lt;/strong>&lt;/h2>&lt;/td>&lt;/tr>&lt;/tbody>&lt;/table>&lt;p>　　友情提示：点击&amp;gt;&amp;gt;&lt;a href="https://blog.csdn.net/eson_15/article/details/51479994#download" target="_blank">下载地址&lt;/a>&amp;lt;&amp;lt;下载源码。&amp;nbsp;&lt;br>　　项目基本完成了，加上这个总结，与这个项目相关的博客也写了30篇了，积少成多，写博客的过程是固化思路的一个过程，对自己很有用，同时也能帮助别人。顺便说个题外话，在学习的过程中肯定会遇到很多异常出现，我们要做的首先是定位这个异常，一般异常的后面都会跟一个或多个Caused by：xxx，这些都是引起异常的原因，一般我们找最下面的一个Caused by，那里往往才是问题的根源。如果自己解决不了，可以去谷歌、百度搜索（搜索的时候别一大堆异常往上一贴，注意搜关键的部分！），一般我们遇到的问题，99.9%前人都遇到过，基本都能解决，我遇到不能解决的问题基本都是这么干的，自己解决的多了，就有感觉了~最后希望大家在阅读我的博客时会有所收获！　　&amp;nbsp;&lt;br>　　废话就不说了，下面总结一下这个网上商城的项目，我不会面面俱到，主要分为几个模块来总结，包括 用到了哪些技术等等，具体的细节我会在文章中附上快速链接，大家可以查看具体的某篇博文。&amp;nbsp;&lt;br>　　回忆一下这个项目，总共可以分为这些主要的模块：&lt;/p>&lt;blockquote>&lt;ul>&lt;li>&lt;strong>项目环境的搭建&lt;/strong>&lt;/li>&lt;li>&lt;strong>搭建后台管理系统&lt;/strong>&lt;/li>&lt;li>&lt;strong>搭建前台显示页面&lt;/strong>&lt;/li>&lt;li>&lt;strong>购物车相关功能&lt;/strong>&lt;/li>&lt;li>&lt;strong>在线支付功能&lt;/strong>&lt;/li>&lt;li>&lt;strong>邮件和短信的发送功能&lt;/strong>&lt;/li>&lt;li>&lt;strong>域名的申请和项目的部署&lt;/strong>&lt;/li>&lt;li>&lt;strong>表单验证和报表的显示&lt;/strong>&lt;/li>&lt;/ul>&lt;/blockquote>&lt;p>　　下面针对每个模块，做一下具体的分析。&lt;/p>&lt;table class="layui-table">&lt;tbody>&lt;tr>&lt;td bgcolor="#F5FFFA">&lt;h2 id="1-项目环境的搭建">&lt;a name="t1">&lt;/a>&lt;strong>1. 项目环境的搭建&lt;/strong>&lt;/h2>&lt;/td>&lt;/tr>&lt;/tbody>&lt;/table>&lt;p>　　这是每个工程都少不了的环节，而且也会出现很多乱七八糟的问题，刚开始学SSH的时候，总是苦于搭建环境，因为不太熟练，但是熟练了就好了，主要是要“有节奏的”去搭建，也就是说搭建一个环境工程得一步步来，一点点的搭，很多人上来就把jar包啪叽一下全导进去了，然后什么配置文件啊啪叽一下全写好或者从其他地方粘贴来，然后一运行，挂了……然后各种去找问题，何苦呢？这样的话就算搭建10次也不能得心应手。饭要一口口的吃，路要一步一步的走。&amp;nbsp;&lt;br>　　&amp;nbsp;&lt;br>　　SSH的环境搭建，我个人遵循的流程是：&lt;/p>&lt;blockquote>&lt;p>Spring –&amp;gt; Hibernate –&amp;gt; Spring整合Hibernate –&amp;gt; Struts2 –&amp;gt; Spring整合Struts2&lt;/p>&lt;/blockquote>&lt;p>　　每一步做完写个测试类测试一下，这很重要，因为一步步往下走的话，出错了也知道错在哪一步，去哪找问题，最重要的是，这种流程熟练了，下次再搭环境的时候就易如反掌了。关于SSH环境搭建的详细信息请看下面的博文：&amp;nbsp;&lt;br>　　&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51277324" target="&amp;quot;blank">整合Struts2、Hibernate4.3和Spring4.2&lt;/a>&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51297698" target="&amp;quot;blank">基本增删查改、Service和Action的抽取以及使用注解替换xml&lt;/a>&lt;/p>&lt;table class="layui-table">&lt;tbody>&lt;tr>&lt;td bgcolor="#F5FFFA">&lt;h2 id="2-搭建后台管理系统">&lt;a name="t2">&lt;/a>&lt;strong>2. 搭建后台管理系统&lt;/strong>&lt;/h2>&lt;/td>&lt;/tr>&lt;/tbody>&lt;/table>&lt;p>　　后台管理系统我用的是EasyUI搭建的，说真的，EasyUI我也是一知半解，前端的东西我了解的都不深，但是懂一点，具体用的时候也是各种去查的，也没系统的学过，所以没有一个良好的知识体系，但是也不影响去玩。程序猿都喜欢说玩一个技术啥的，听起来好像挺高大上的，慢慢的我也受到一些影响，也喜欢这么说了，不过我对于前端就真的在玩了……　　&amp;nbsp;&lt;br>　　jQuery EasyUI是一组基于jQuery的UI插件集合体，而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面。开发者不需要编写复杂的javascript，也不需要对css样式有深入的了解，开发者需要了解的只有一些简单的html标签。　　&amp;nbsp;&lt;br>　　EasyUI的请求都是Ajax请求，不会有新的页面出来，全都都在tab选项卡中或者弹出一个窗口之类的。后台管理系统主要分为三部分：商品的类别管理、商品的管理以及销售管理。销售管理放在最后再说。&lt;/p>&lt;h3 id="21-商品类别的管理">&lt;a name="t3">&lt;/a>&lt;strong>2.1 商品类别的管理&lt;/strong>&lt;/h3>&lt;p>　　该部分主要涉及到了&lt;strong>EasyUI环境和后台框架的搭建&lt;/strong>、&lt;strong>数据库的级联查询和分页&lt;/strong>、&lt;strong>DataGrid数据显示&lt;/strong>、&lt;strong>Struts2整合json&lt;/strong>以及&lt;strong>商品类别的添加、删除、更新和搜索&lt;/strong>。这也是遵循了该部分的一个完成的顺序。　　&amp;nbsp;&lt;br>　　DataGrid以表格的形式展示数据，开发人员不需要具备特定的知识就可以操作它，它有个很好的帮助文档，比较详细，在本项目中我也介绍了创建DataGrid的几种方式，并且也简单介绍了一下DataGrid的部分属性，算是入门吧，我也是入门，多多开发才能掌握这个技术。　　&amp;nbsp;&lt;br>　　类别的添加、删除、更新和搜索功能，主要都是利用EasyUI自带的验证功能，添加商品类别的时，验证输入框的输入是否正确，是否必填等；删除时是否先选中的某一行或某几行；更新的时候每次只能更新一行等，所有这些都是Ajax请求。　　&amp;nbsp;&lt;br>　　关于这部分内容的详细信息，我已经归类了，请参考这些博文：&amp;nbsp;&lt;br>　　&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51312490" target="&amp;quot;blank">使用EasyUI搭建后台页面框架&lt;/a>&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51297705" target="&amp;quot;blank">EasyUI菜单的实现&lt;/a>&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51320212" target="&amp;quot;blank">数据库的级联查询和分页&lt;/a>&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51322262" target="&amp;quot;blank">基于DataGrid的数据显示功能&lt;/a>&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51332758" target="&amp;quot;blank">Struts2和Json的整合&lt;/a>　　&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51338991" target="&amp;quot;blank">DataGrid实现查询和删除功能&lt;/a>&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51347734" target="&amp;quot;blank">DataGrid实现添加和更新功能&lt;/a>&amp;nbsp;&lt;br>　　　　&amp;nbsp;&lt;br>　　下面是我自己遇到的问题：&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51394302" target="&amp;quot;blank">Struts2和Json整合中的懒加载异常问题&lt;/a>&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51383298" target="&amp;quot;blank">Hibernate4执行save()或update()无效&lt;/a>　　&lt;/p>&lt;h3 id="22-商品的管理">&lt;a name="t4">&lt;/a>&lt;strong>2.2 商品的管理&lt;/strong>&lt;/h3>&lt;p>　　商品的管理也有添加删除等操作，跟类别管理道理上是一样的，有个地方就是商品的添加，需要上传商品的照片，这里涉及到了&lt;strong>Struts2实现文件上传&lt;/strong>的功能，我们需要在服务器端建一个文件夹专门用来存储上传文件的，然后写一个model来接收文件，关于文件上传，要专门写一个工具类，项目中开发就是这样的，共性的代码一定要抽取，哪怕只有一句代码也要抽取！这是习惯，也是必须要做的。具体细节参下面列出的这些的博文：&amp;nbsp;&lt;br>　　&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51354932" target="&amp;quot;blank">商品类基本模块的搭建&lt;/a>　　&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51360804" target="&amp;quot;blank">查询和删除商品功能的实现&lt;/a>　　&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51366370" target="&amp;quot;blank">添加和更新商品功能的实现&lt;/a>　　&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51366384" target="&amp;quot;blank">Struts2实现文件上传功能&lt;/a>　　&lt;/p>&lt;table class="layui-table">&lt;tbody>&lt;tr>&lt;td bgcolor="#F5FFFA">&lt;h2 id="3-搭建前台显示页面">&lt;a name="t5">&lt;/a>&lt;strong>3. 搭建前台显示页面&lt;/strong>&lt;/h2>&lt;/td>&lt;/tr>&lt;/tbody>&lt;/table>&lt;p>　　当然，前台的页面不是我设计的，这一块内容我总结的是跟前台显示相关的一些后台技术，比如：&lt;strong>监听器获取首页数据&lt;/strong>、&lt;strong>定时器同步首页数据&lt;/strong>、&lt;strong>Hibernate二级缓存处理热门商品的缓存&lt;/strong>等。&amp;nbsp;&lt;br>　　以前在学习serlvet的时候，首页显示数据我是这么干的，用一个frame，右边显示数据，那么index.jsp中右边的部分我跳转到一个servlet，然后servlet中去数据库中取出所有商品，放到request域中带过去新的jsp页面显示。这虽然能实现，但是很笨。在这里我用了监听器来干这件事，首先自己定义一个监听器，在项目启动的时候把数据库中所有商品信息给取出来，放到application域中，然后首页中直接用EL表达式从application域中去取即可。　　&amp;nbsp;&lt;br>　　还有个问题，当我在管理系统中添加一个新的商品时，我必须要重启一下tomcat才能将新的商品加到application域中，因为第一次取出来后就一直在application域中了，就定死了，后面新添加的就不在application域里面，为了解决这个问题，我使用了定时器来同步首页数据。于是改写了之前写好的监听器，在监听器中设置一个定时器，获取数据库中商品的数据的代码放到定时器任务中，第一次开启立马执行，然后每6个小时执行一次（时间可以自己随便设定），也就是说每6个小时重新获取一下数据库中的商品，存到application域中。一般网站也是这么干的，像CSDN的个人博客主页也是，每天更新一次排名，大概是晚上10点左右吧，具体时间我忘了。那个时候刷新就会看到数据的更新，这样也减小了服务器的压力。&lt;/p>&lt;p>　　该部分具体的技术细节，参见下面这几篇博文：&amp;nbsp;&lt;br>　　&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51373403" target="&amp;quot;blank">使用监听器获取显示在首页的数据&lt;/a>　　&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51373937" target="&amp;quot;blank">监听器如何获取Spring的配置文件&lt;/a>　&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51387378" target="&amp;quot;blank">线程、定时器定时同步首页数据&lt;/a>　&amp;nbsp;&lt;br>　　&lt;a href="https://blog.csdn.net/eson_15/article/details/51405911" target="&amp;quot;blank">Hibernate二级缓存处理首页的热门显示&lt;/a>&lt;/p>&lt;table class="layui-table">&lt;tbody>&lt;tr>&lt;td bgcolor="#F5FFFA">&lt;h2 id="4-购物车相关功能">&lt;a name="t6">&lt;/a>&lt;strong>4. 购物车相关功能&lt;/strong>&lt;/h2>&lt;/td>&lt;/tr>&lt;/tbody>&lt;/table>&lt;p>　　购物车的部分主要涉及到的技术有：&lt;strong>后台的处理购物车和购物项的逻辑&lt;/strong>、&lt;strong>过滤器判断登陆&lt;/strong>、&lt;strong>订单的级联入库&lt;/strong>以及&lt;strong>页面缓存&lt;/strong>的问题。&amp;nbsp;&lt;br>　　购物车的话主要是后台的一些实现逻辑了，购物车里需要有购物项，啥意思呢？我们在天猫上买东西都知道，可以把不同的商品都放到购物车里，然后购物车里有很多商品，每个商品的数量又可以有多个，每个商品及其相关信息就是一个购物项，所以添加购物车的时候，我们首先要完成一个购物项，再将此购物项添加到购物车里。&amp;nbsp;&lt;br>　　当用户想要结算的时候，我们得首先判断用户有没有登陆，这用到了过滤器技术，专门过滤某一类的url，在过滤器中判断当前session中有没有user对象，如果有说明登陆过了，直接放行就行，如果没有则跳转到登陆页面让用户登陆，登陆完成后跳转到用户原来想去的页面。也就相当于门卫一样~看大门的~&amp;nbsp;&lt;br>　　刚刚也提到了，订单信息包含 购物车和购物项，那么我们在订单入库的时候，就要考虑到它们的级联问题，我们可以通过在两者的POJO中设置相应的注解属性即可，但是有个前提，像这种有外键关联的，在入库之前都要将对应的POJO中的外键部分的字段赋好值，比如订单要将订单项加进去，订单项中的订单属性也得赋好值，然后才可以交给Hibernate，Hibernate根据配置好的注解（或者xml文件）将它们一起级联入库。&amp;nbsp;&lt;br>　　页面缓存的问题指的是，当用户确认了订单后，如果点后退，又会回到订单确认页面，刚刚的订单确认页面又出来了，而且session还在，信息还是刚刚的信息，这明显不是我们想要的结果。我们需要在前台和后台同时进行处理才行。&amp;nbsp;&lt;br>　　该部分具体技术细节，请参见下面的几篇博文：&lt;/p></description></item></channel></rss>