<?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/%E9%A1%B9%E7%9B%AE/</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/%E9%A1%B9%E7%9B%AE/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><item><title>Java项目实战经验—程序员成长的钥匙</title><link>https://pangyd.com/post/156-java/</link><pubDate>Sun, 05 Nov 2017 19:49:28 +0800</pubDate><guid>https://pangyd.com/post/156-java/</guid><description>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E">&lt;/p>&lt;p>Java就是用来做项目的！Java的主要应用领域就是企业级的项目开发！要想从事企业级的项目开发，你必须掌握如下要点：&lt;/p>&lt;p>1、掌握项目开发的基本步骤&lt;/p>&lt;p>2、具备极强的面向对象的分析与设计技巧&lt;/p>&lt;p>3、掌握用例驱动、以架构为核心的主流开发方法&lt;/p>&lt;p>没有人愿意自己一辈子就满足于掌握了一些代码实现的技巧，别人告诉你要实现什么，你就用代码堆砌来实现别人的要求！你必须学会从整个项目的角度去思考！你必须学会假如你是项目经理，你该如何思考！你必须学会假如你是架构师，你该如何思考！你必须掌握针对某个特定问题领域的分析方法！&lt;/p>&lt;p>关于基础知识：你可以看看这些名词或知识点，看是否能说出个一二三四来。&lt;/p>&lt;p>JavaSE&lt;/p>&lt;p>----基本语法、数据类型、操作符等：int、long、Integer、Long、if、else、for、while&lt;/p>&lt;p>----面向对象：class（类）、Object（对象）、instance（实例）、state（状态）、behavior（行为）、field、method、new、可见性（访问控制）、attribute、property、package、import、static variable、class variable、instance variable、heap、method area、stack、GC（垃圾回收）、override、overload、对象转型(casting)、多态、this、super&lt;/p>&lt;p>----异常处理：理解编译期错误和运行期错误的区别、Exception、RuntimeException、checked exception、unchecked exception、try、catch、finally、throw new XXXException、throws XXXException、异常处理的基本原则&lt;/p>&lt;p>----数组与集合：数组的定义和使用方法、Collection、List、Set、Map、ArrayList、HashSet、HashMap、Iterator、equals、hashCode、Comparable、Comparator&lt;/p>&lt;p>----常用类：String、intern、常量池、StringBuffer、java.util.Date、SimpleDateFormat、Regex（正则表达式）&lt;/p>&lt;p>----反射机制：Class、Method、Field、invoke、newInstance、BeanUtils（apache-commons）、PropertyUtils（apache-commons）&lt;/p>&lt;p>----输入输出流：InputStream、OutputStream、Reader、Writer、Adapter设计模式与原始流类、Decorator设计模式与包装流类、对象序列化和反序列化&lt;/p>&lt;p>----多线程：Thread、Runnable、sleep、wait、notify、synchronized、lock&lt;/p>&lt;p>Servlet和JSP&lt;/p>&lt;p>----HttpServlet、doGet、doPost、HttpServletRequest、HttpServletResponse、request.getParameter()、request.setAttribute()、request.getAttribute()、request.getSession()、ServletContext、Filter、web.xml、tomcat、forward与redirect、http协议的无状态性、cookie、JSP Scope Object、、&lt;/p>&lt;p>HTML与JavaScript&lt;/p>&lt;p>----你需要能够理解常见的网页标签、理解在网页中引入JavaScript的方法、以及JavaScript的基本语法与使用方法&lt;/p>&lt;p>以上，就是你进一步学习Java所必备的基本知识。特别是一些个专业术语和名词，看到这些名词，如果你像看到亲爹一样亲切，那么说明你对Java的基础知识就很熟悉了。&lt;/p>&lt;p>接下来是SSH：&lt;/p>&lt;p>对于初学者来说，这三大框架被赋予了太多神秘的色彩，似乎它们是重中之重的知识！但是对于拥有多年Java开发经验的专业技术人员来说，对于那些Java牛人来说，却对这三大框架不太感冒！难道它们不重要吗？&lt;/p>&lt;p>现在很多企业都在用这三大框架，所以很多企业也把掌握这三大框架作为招聘的必备条件。不可否认的是，也有很多大型企业没有用这三大框架，这些企业经过多年发展，自身已经有一定的技术积累，也形成了自己独特的技术框架体系。这三大框架既可以说很重要，也可以说不重要。&lt;/p>&lt;p>说重要的原因在于：这三大框架对JavaEE开发中所存在的普遍的问题，提供了优美的解决方案，它们蕴含了这个行业中最NB的开发人员的努力和想法，所以，学习这三大框架，你就可以窥探到这些处于技术巅峰的牛人们究竟对一个问题是怎么想的，通过一种什么样的设计思路去解决问题的。所以，对于你来说，你没有太多项目开发的经验，经验是什么？经验就是你知道可能会遇到哪些问题，针对哪个问题可以有哪些解决方法，在某个情景下，哪种解决方法是较好的，哪种方法不太好等等！如果你没做过什么项目，你根本就不会去意识到你可能会遇到哪些问题，而这些问题往往又是非常关键的！解决得不好，会影响到你的程序的稳定性、可扩展性等等！三大框架就给初学者提供了了解你以后可能会遇到哪些问题，以及针对这些问题的解决方案！&lt;/p>&lt;p>当你了解了这三大框架为什么是重要的，那么你也就能理解，为什么这三大框架也可以说是不重要的。如果你曾经开发过很多项目，你碰到了各种各样的问题，凭着你的技术功底，逐个击破了这些问题，在这些人眼里，三大框架（是不是还有N个框架？呵呵）都是浮云！&lt;/p>&lt;p>你属于哪一种人呢？如果你没有太多项目开发经验，那么三大框架对于你来说就是非常重要的！而且，由此你也知道了该怎么去学这三大框架。对于三大框架的学习而言，着力点在于给你展示问题，并触发你自己主动的思考，我们鼓励你提出自己的想法，也许你的想法很白痴，但那毕竟是你自己的想法，如果你不知道牛人的想法，那你怎么知道自己的想法是很白痴的呢？在这种思想的碰撞过程中，你就会逐渐提高自己！所以，三大框架学完之后，你不应该只是看到一大堆配置文件，你不应该只是看到了一些Action，一些Service，一些映射文件，你不应该只知道session.save/update/delete，你不应该只是知道struts2中有一堆interceptor，你不应该只是看到一堆jar包……&lt;/p>&lt;p>如果你只是知道拷贝一堆jar包，定义一系列配置文件之后，SSH三大框架就能够运行起来了，也可以给你干活了，那么，很悲哀的是，你仍然没有掌握三大框架的精粹！请你回答以下问题：&lt;/p>&lt;p>Struts2：&lt;/p>&lt;p>为什么每次请求都要创建一个Action对象？&lt;/p>&lt;p>ModelDriven拦截器的配置中refreshModelBeforeResult解决了什么问题？&lt;/p>&lt;p>为什么在web.xml中配置的StrutsPrepareAndExecuteFilter要过滤所有的请求？&lt;/p>&lt;p>请你给我谈谈ValueStack？&lt;/p>&lt;p>Struts2是如何实现MVC设计模式的？&lt;/p>&lt;p>Spring：&lt;/p>&lt;p>你为什么要用Spring？&lt;/p>&lt;p>请你聊一聊IOC/DI？&lt;/p>&lt;p>什么是声明式的事务管理？为什么要使用声明式的事务管理？Spring如何实现声明式的事务管理？&lt;/p>&lt;p>把spring和hibernate集成，定义事务管理特性的时候，为何要将除了添加、删除、更新操作之外的方法，即主要执行查询任务的方法定义为read-only？&lt;/p>&lt;p>Hibernate：&lt;/p>&lt;p>请你谈谈你对OR映射的理解？&lt;/p>&lt;p>很多人说Hibernate不适合大项目，性能有问题，你是如何理解的？&lt;/p>&lt;p>Hibernate为什么一定要定义一个数据库标识？&lt;/p>&lt;p>为什么Hibernate建议你的实体类实现hashCode和equals方法？&lt;/p>&lt;p>谈谈你对Hibernate实体类中的数据库标识与数据库主键之间关系的认识？&lt;/p>&lt;p>谈谈你对Hibernate关联映射与数据库外键之间关系的认识？&lt;/p>&lt;p>调用session.save()方法，hibernate一定会发出insert语句吗？谈谈你的理解&lt;/p>&lt;p>调用session.update()方法，hibernate一定会发出update语句吗？谈谈你的理解&lt;/p>&lt;p>请你聊一下以下名词、概念或用法：lazy、lazy=”extra”、inverse、fetch、fetch=”join”、fetch=”subselect”、batch-size&lt;/p>&lt;p>配置了lazy=”true”一定会实现懒加载吗？&lt;/p>&lt;p>请你谈谈Hibernate中的“N 1”问题&lt;/p>&lt;p>请你谈谈Hibernate有哪些最佳实践？&lt;/p>&lt;p>以上并非SSH中全部重点的问题，但它们能考察你能否灵活运用SSH框架！如果你能深刻理解这些问题，再配以合适的实战项目训练，你也会逐渐成为牛人！&lt;/p>&lt;p>最后是项目开发能力：&lt;/p>&lt;p>不管你是学Java还是别的技术，你的根本目的在于给客户创造价值！否则，你下大力气学习的东西，随着技术的进步和更新，很快就会过时！所以，技术的核心在于用技术创造有价值的成果！也就是说，客户需要什么，你就要用技术把客户需要的东西给他造出来！一个公司之所以要用各种福利条件极力挽留你，是因为你能够给公司带来极高的利益！那么，你有什么可以给公司利用的呢？公司最看重你的哪方面的能力呢？&lt;/p></description></item><item><title>Java项目实战经验—程序员成长的钥匙</title><link>https://pangyd.com/post/109-java/</link><pubDate>Thu, 21 Sep 2017 22:23:27 +0800</pubDate><guid>https://pangyd.com/post/109-java/</guid><description>&lt;p>Java就是用来做项目的！Java的主要应用领域就是企业级的项目开发！要想从事企业级的项目开发，你必须掌握如下要点：&lt;/p>&lt;p>1、掌握项目开发的基本步骤&lt;/p>&lt;p>2、具备极强的面向对象的分析与设计技巧&lt;/p>&lt;p>3、掌握用例驱动、以架构为核心的主流开发方法&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>没有人愿意自己一辈子就满足于掌握了一些代码实现的技巧，别人告诉你要实现什么，你就用代码堆砌来实现别人的要求！你必须学会从整个项目的角度去思考！你必须学会假如你是项目经理，你该如何思考！你必须学会假如你是架构师，你该如何思考！你必须掌握针对某个特定问题领域的分析方法！&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>关于基础知识：你可以看看这些名词或知识点，看是否能说出个一二三四来。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>JavaSE&lt;/p>&lt;p>----基本语法、数据类型、操作符等：int、long、Integer、Long、if、else、for、while&lt;/p>&lt;p>----面向对象：class（类）、Object（对象）、instance（实例）、state（状态）、behavior（行为）、field、method、new、可见性（访问控制）、attribute、property、package、import、static variable、class variable、instance variable、heap、method area、stack、GC（垃圾回收）、override、overload、对象转型(casting)、多态、this、super&lt;/p>&lt;p>----异常处理：理解编译期错误和运行期错误的区别、Exception、RuntimeException、checked exception、unchecked exception、try、catch、finally、throw new XXXException、throws XXXException、异常处理的基本原则&lt;/p>&lt;p>----数组与集合：数组的定义和使用方法、Collection、List、Set、Map、ArrayList、HashSet、HashMap、Iterator、equals、hashCode、Comparable、Comparator&lt;/p>&lt;p>----常用类：String、intern、常量池、StringBuffer、java.util.Date、SimpleDateFormat、Regex（正则表达式）&lt;/p>&lt;p>----反射机制：Class、Method、Field、invoke、newInstance、BeanUtils（apache-commons）、PropertyUtils（apache-commons）&lt;/p>&lt;p>----输入输出流：InputStream、OutputStream、Reader、Writer、Adapter设计模式与原始流类、Decorator设计模式与包装流类、对象序列化和反序列化&lt;/p>&lt;p>----多线程：Thread、Runnable、sleep、wait、notify、synchronized、lock&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Servlet和JSP&lt;/p>&lt;p>----HttpServlet、doGet、doPost、HttpServletRequest、HttpServletResponse、request.getParameter()、request.setAttribute()、request.getAttribute()、request.getSession()、ServletContext、Filter、web.xml、tomcat、forward与redirect、http协议的无状态性、cookie、JSP Scope Object、&amp;lt;c:out …/&amp;gt;、&amp;lt;c:forEach …&amp;gt;&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>HTML与JavaScript&lt;/p>&lt;p>----你需要能够理解常见的网页标签、理解在网页中引入JavaScript的方法、以及JavaScript的基本语法与使用方法&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>以上，就是你进一步学习Java所必备的基本知识。特别是一些个专业术语和名词，看到这些名词，如果你像看到亲爹一样亲切，那么说明你对Java的基础知识就很熟悉了。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>接下来是SSH：&lt;/p>&lt;p>对于初学者来说，这三大框架被赋予了太多神秘的色彩，似乎它们是重中之重的知识！但是对于拥有多年Java开发经验的专业技术人员来说，对于那些Java牛人来说，却对这三大框架不太感冒！难道它们不重要吗？&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>现在很多企业都在用这三大框架，所以很多企业也把掌握这三大框架作为招聘的必备条件。不可否认的是，也有很多大型企业没有用这三大框架，这些企业经过多年发展，自身已经有一定的技术积累，也形成了自己独特的技术框架体系。这三大框架既可以说很重要，也可以说不重要。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>说重要的原因在于：这三大框架对JavaEE开发中所存在的普遍的问题，提供了优美的解决方案，它们蕴含了这个行业中最NB的开发人员的努力和想法，所以，学习这三大框架，你就可以窥探到这些处于技术巅峰的牛人们究竟对一个问题是怎么想的，通过一种什么样的设计思路去解决问题的。所以，对于你来说，你没有太多项目开发的经验，经验是什么？经验就是你知道可能会遇到哪些问题，针对哪个问题可以有哪些解决方法，在某个情景下，哪种解决方法是较好的，哪种方法不太好等等！如果你没做过什么项目，你根本就不会去意识到你可能会遇到哪些问题，而这些问题往往又是非常关键的！解决得不好，会影响到你的程序的稳定性、可扩展性等等！三大框架就给初学者提供了了解你以后可能会遇到哪些问题，以及针对这些问题的解决方案！&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>当你了解了这三大框架为什么是重要的，那么你也就能理解，为什么这三大框架也可以说是不重要的。如果你曾经开发过很多项目，你碰到了各种各样的问题，凭着你的技术功底，逐个击破了这些问题，在这些人眼里，三大框架（是不是还有N个框架？呵呵）都是浮云！&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>你属于哪一种人呢？如果你没有太多项目开发经验，那么三大框架对于你来说就是非常重要的！而且，由此你也知道了该怎么去学这三大框架。对于三大框架的学习而言，着力点在于给你展示问题，并触发你自己主动的思考，我们鼓励你提出自己的想法，也许你的想法很白痴，但那毕竟是你自己的想法，如果你不知道牛人的想法，那你怎么知道自己的想法是很白痴的呢？在这种思想的碰撞过程中，你就会逐渐提高自己！所以，三大框架学完之后，你不应该只是看到一大堆配置文件，你不应该只是看到了一些Action，一些Service，一些映射文件，你不应该只知道session.save/update/delete，你不应该只是知道struts2中有一堆interceptor，你不应该只是看到一堆jar包……&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>如果你只是知道拷贝一堆jar包，定义一系列配置文件之后，SSH三大框架就能够运行起来了，也可以给你干活了，那么，很悲哀的是，你仍然没有掌握三大框架的精粹！请你回答以下问题：&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Struts2：&lt;/p>&lt;p>为什么每次请求都要创建一个Action对象？&lt;/p>&lt;p>ModelDriven拦截器的配置中refreshModelBeforeResult解决了什么问题？&lt;/p>&lt;p>为什么在web.xml中配置的StrutsPrepareAndExecuteFilter要过滤所有的请求？&lt;/p>&lt;p>请你给我谈谈ValueStack？&lt;/p>&lt;p>Struts2是如何实现MVC设计模式的？&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Spring：&lt;/p>&lt;p>你为什么要用Spring？&lt;/p>&lt;p>请你聊一聊IOC/DI？&lt;/p>&lt;p>什么是声明式的事务管理？为什么要使用声明式的事务管理？Spring如何实现声明式的事务管理？&lt;/p>&lt;p>把spring和hibernate集成，定义事务管理特性的时候，为何要将除了添加、删除、更新操作之外的方法，即主要执行查询任务的方法定义为read-only？&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Hibernate：&lt;/p>&lt;p>请你谈谈你对OR映射的理解？&lt;/p>&lt;p>很多人说Hibernate不适合大项目，性能有问题，你是如何理解的？&lt;/p>&lt;p>Hibernate为什么一定要定义一个数据库标识？&lt;/p></description></item><item><title>导出含有图片的Java项目，图片不显示</title><link>https://pangyd.com/post/69-java/</link><pubDate>Sun, 20 Aug 2017 16:55:36 +0800</pubDate><guid>https://pangyd.com/post/69-java/</guid><description>&lt;div>项目的一些图片资源文件在导出成JAR包后，无法正确读取虽然Java项目还是可以运行，但原来的图片资源全不见了，于是你可以打开JAR包看看里面的东西，确实是有图片在里面，就是无法读取。&lt;/div>&lt;p>&lt;span>其实是因为我们在导出成JAR包后，图片资源的路径已经发生了变化，造成无法读取的问题&lt;/span>&lt;/p>&lt;p>首先在项目的SRC目录下建立一个包，然后再把图片等资源放进包中，然后再通过下面的方法进行读取：&lt;/p>&lt;div>&lt;span>ImageIcon img = new ImageIcon(【你的主类名称】.class.get&lt;/span>&lt;span>getResource("/pic/index.png"));&lt;/span>&lt;/div>&lt;div>比如我在SRC目录下建立了一个pic包，包下面放了一张图片index.png，我的读取图片主类是MySample，那么我需要读取index.png这张图片时就要这样做：&lt;/div>&lt;div>&lt;span>ImageIcon indexImage = new ImageIcon(MySample.class.get&lt;/span>&lt;span>getResource("/pic/index.png"));&lt;/span>&lt;/div>&lt;div>要注意的是路径中pic前面的斜杠不可少，否则会报错读取不到资源造成空指针，其他如音频资源也是类似做法。&lt;img type="face" src="https://pangyd.com/uploads/2017/08/c8ea831c46d1b44c.gif" real_src="https://www.sinaimg.cn/uc/myshow/blog/misc/gif/E___6716EN00SIGG.gif" alt="关于JAVA的SWING项目导出可执行JAR时图片资源问题" title="关于JAVA的SWING项目导出可执行JAR时图片资源问题">&lt;/div></description></item><item><title>”无法解析类型 这是简介引用的类文件要求 从必需的 .class 文件间接引用了“——解决方法</title><link>https://pangyd.com/post/37-class/</link><pubDate>Sun, 06 Aug 2017 19:30:39 +0800</pubDate><guid>https://pangyd.com/post/37-class/</guid><description>&lt;p>&lt;b>百度翻译：&lt;/b>&lt;/p>&lt;p>在线程的“主”java.lang.error例外：解决编制问题： &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 类型javax.swing.jcomponent不能解决。这是间接引用的类文件的要求。 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p>&lt;p>该方法在类型数据库executeupdate()不适用于参数（字符串） &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 方法showmessagedialog（组件对象）在型JOptionPane不适用于参数（null，String，int） &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p>&lt;p>COM。jnzyjsxy。常见。personbean。&amp;lt;初始化&amp;gt;（personbean。java：53） &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; COM。jnzyjsxy。测试。文字。主要（文本。java：13）&amp;nbsp;&lt;/p>&lt;p>&lt;b>这个编译错误有几个原因：&lt;/b>&lt;/p>&lt;p>1、jdk版本问题&lt;/p>&lt;p>要是报错是某些java包里的东西那就可以肯定是jdk版本的问题，&lt;/p>&lt;p>比如无法解析类型java.lang.Object，无法解析类型java.lang.CharSequence.&lt;/p>&lt;p>解决方法：换jdk版本或者重装jdk&lt;/p>&lt;p>2、maven依赖的jar包有问题&lt;/p>&lt;p>当maven项目引用jar包的时候，有些jar包会失效，导致这个问题。&lt;/p>&lt;p>解决方法：把maven本地库jar包删除重新下载，或者删除后换个仓库下载。&lt;/p></description></item></channel></rss>