首页> 搜索结果页
"myeclipse怎么使用mysql数据库" 检索
共 38 条结果
活动总结:阿里专家技术问答第一期,帮帮我的Java!
本期Java问答集锦 问:学生一枚,想问问丙辰大师,JAVA学习中的一些问题! 答:http://yq.aliyun.com/ask/695 问:用Java上传的war包运行后,提示无法连接数据库,请大神告诉我,应该怎么弄,MyEclipse上怎么配,mysql上怎么配?谢谢谢谢!! 答:http://yq.aliyun.com/ask/643 问:java系统,想用分布式服务器和云数据库?能给点意见吗?需要租几台服务器等等 答:http://yq.aliyun.com/ask/651 问:高并发,大数据的java系统,采用应用服务器,数据库服务器,分布式,给点意见? 答:http://yq.aliyun.com/ask/571 云栖社区是阿里神侠们的聚义厅,在这里,他们会经常现身,为您带来技术分享。为了更加贴近开发者的需求,云栖社区将会在问答频道(yq.aliyun.com/ask)开展“阿里专家技术问答”系列活动, 每次活动将为期一周,由某一技术领域的阿里专家坐镇问答频道,帮助开发者解答该领域的相关技术难题。 即将在1月19日推出的是第一期“帮帮我的Java",由阿里巴巴资深开发工程师王震(昵称:丙辰)来为大家解答在Java开发工作和学习中遇到难题,爪哇(Java)国的各位苦行僧们,抓紧准备自己的难题吧,看看能不能让咱们的丙辰大师悄悄流汗! 如何参加? 在1月19日-1月25日期间访问问答版块(yq.aliyun.com/ask),提出问题(切记提问时请打上“Java核心技术”标签),当丙辰大师来巡场时就会发现并设法解决。 特别提示:本次专家问答活动针对Java技术类问题交流,涉及阿里云产品使用相关问题不属于本次活动回复范围,但可以在问答平台正常提问。 介绍一下本次出场的丙辰大师: 6年企业级开发平台研发经验,是阿里内部讲师,为dojo社区贡献dojox.app前端开发框架,参与研发IBM MobileFirst移动开发平台,参与构建12306手机订票移动平台。对跨平台移动应用开发、安全有深入研究,对PaaS和SaaS服务有涉猎。 下期预告:HTML5,我有话说! 时间:1月26日-2月1日,出场专家:阿里巴巴前端专家胡才俊(昵称:前道)
文章
Java  ·  数据库
2016-01-12
程序员到架构师需要的编程基础
程序员到架构师的进阶之路是非常艰辛和漫长的,不但需要掌握很多高级的知识技能,还需要有过硬的基础知识。《Java架构师指南》就是这样一本指导小白到架构师进阶的书。本文摘取了这本书中的第一章节,主要介绍Java程序员走向架构师的基础知识,还有开发环境的搭建。通过本文的学习,可以大致了解程序员的进阶之路,也可更加深刻地认识到程序员的发展方向。 ​ ​点此链接购买纸书 本书特别适合Java Web领域的开发人员以及刚步入职场的新手。本书通过讲述Java架构师必备的知识技能,让广大读者在原有知识的基础上更上一个台阶,争取早日实现架构师的梦想。 对于架构师的定义,每个人的看法都不尽相同,我结合自己多年的工作经验,也只是大致定义了一个范围,希望可以帮助到别人。读者可以结合自己的实际情况,通过阅读本书,不断地扩展和充实这种范围,以达到自己理想中的境界。“不想当将军的士兵,不是好士兵。”在软件行业中,也似乎有这样一句话:“不想当架构师的程序员,不是好程序员。”虽然这看似是一种调侃,但从学习的角度来说,成为架构师,显然是一个好的目标!人只有在心里有了目标,才会变得更加幸福。 如果你不希望一直停留在Java的初级阶段,想在未来成为架构师,那么本书非常适合用来全面提高自己的开发水平。如果你想转项目经理,那么本书同样适合你,因为书中的每个项目都是完整的迭代过程。    1.1 程序员进阶 大学毕业后,初出茅庐的菜鸟经过千辛万苦,总算是找到了人生中的第一份工作。但是,随着工作的开展,菜鸟所面对的问题越来越多。有些人坚持了下来,有些人中途放弃,有些人则在职业生涯中选择了转型。作为一名程序员,不但需要编写大量的代码,还需要对自己的职业生涯做一个规划。结合前辈们所走过的道路,这个职业规划大致是图1-1所示的这个样子。​ ​图1-1 程序员职业生涯 一般来说,从初级程序员到高级程序员需要经过5年的磨砺,这个时间段基本上是业界的共识了。而且,在众多招聘信息中也可以发现程序员的起点都是需要两年工作经验的。也许,有些天赋异禀的程序员可能经过3年的刻苦学习也能达到高级阶段,但是,他们的知识技能往往并不全面,可能只是在某些方面比较熟悉罢了。到了高级程序员的阶段,可供选择的方案就比较多了,大概有图1-2所示的这3个走向。​ ​图1-2 程序员发展方向 如果高级程序员再向上进阶的话,会面临3个选择。第一种方案是成为项目经理,负责管理加上部分开发。因为高级程序员对公司的项目是非常了解的,对公司目前的开发过程也驾轻就熟。如果本人有这方面的意愿,很容易胜任项目经理这个角色。而且,公司通常会从内部选择项目经理,空降项目经理的方式并不是常态,归其原因就是难以熟悉项目架构。 第二种方案是高级程序员可能更喜欢专著于技术,不喜欢出差和撰写大量的项目文档。在这种情况下,他可以成为一名架构师,专门负责维护公司的项目、产品方面的架构工作。如果公司有一定的规模,他可能会成为研发平台的负责人。当然,这种情况的前提是该程序员没有跳槽。 第三种方案是高级程序员可能经历了若干年的开发后,对写代码已经深恶痛绝,丝毫感受不到任何快乐了,但他对公司的项目和产品又非常熟悉,也有深厚的研发积累。在这种情况下,他可以彻底转型成为一名产品经理,纯粹负责公司产品的规划、设计、包装,甚至肩负一定的市场职责。当然,成为产品经理的前提是公司的项目已经产品化或者正在产品化之中。所谓的产品经理,通常就是向技术部提出一个原型设计:“看吧,这就是我想要的东西,至于怎么实现,你们看着办!”如果他懂代码还好说,但如果不懂代码,可能会让程序员陷入抓狂状态! 到了高级程序员的阶段,很多人就开始思考:究竟是去做项目经理?产品经理?还是继续写代码成为优秀的架构师呢?每个人的想法是不一样的,所作出的选择也是不一样的,这跟自己的能力和性格也有一定的关系。 项目经理:在大型公司里,主要起协调资源的作用,再往上还有项目集经理。而在一些中小型公司里,项目经理不但要做好管理,还要兼备一部分代码的开发工作,但与此同时,也会有5年经验左右的项目组长,来管理不同的项目组。在软件行业中,经常有这样一个争论,项目经理到底应该不应该写代码?支持和反对的人都很多,但作者认为,这也是仁者见仁、智者见智的事情。首先,项目经理自身也是资源,是资源就有消耗,有些老板可能会认为:“我花这么多钱,请一个项目经理过来只为了写写文档,是不是太亏本了?”但到了数万人的大公司,该公司的项目通常特别多,就需要项目经理非常专注地管理项目,而不是分心去写代码。这种情况下,老板的思路就会转变,你写什么代码?好好地管理好公司的项目,不让它出乱子就可以了。 产品经理:一般则是公司已经将项目过渡到了产品后,才能发挥更大的作用。如果公司一开始只有项目,则需要大量的时间来积累,最终实现产品化。在这个过程中,往往不是很需要专职的产品经理,可能项目中的每个人都会对项目献计献策,来使项目更加通用化。产品经理自身也是需要积累的,如果他成功地设计了一款App,并且在市场上取得了极大的成功,那么他的职业生涯可能会因此镀金,这个App将会成为他能力的体现。 架构师:专注于公司的研发平台,管理框架方面的东西。例如,写核心代码,并且指导底下的开发人员合理地编码,维护代码库。在小公司里可能只有一两名架构师,但是在数万人的公司里,架构师会非常多。在这种情况下,架构师有可能会成为程序员级别称谓。例如,你在该公司待了8年,虽然你干的活一直是普通研发,并不负责实际上的架构,但是公司有正常的晋升渠道,你的级别就会从高级软件工程师上升到软件架构师。这种情况,在外包公司比较常见。 全栈工程师:是最近才兴起的一个概念,但全栈工程师说到底还是程序员,类似于高级开发的角色,只不过是懂的东西比较多,前端和后端都可以做,技术比较全面。全栈工程师极大地拓展了自己的开发技能,成为了项目中的骨干成员,类似于技术专家的角色。一般而言,小公司比较喜欢这样的人,招募一个可以顶3个。但从学习的角度来说,全栈依然是不错的目标。因为只有成了全栈工程师,才更能接近架构师。 每种开发语言,都有自己领域的架构师,如C++架构师、PHP架构师,当然也有Java架构师了。架构师需要对公司的整个研发平台了如指掌,清楚平台中细枝末节的东西。他极有可能是陪伴着这个公司成长起来的程序员;也极有可能是在别的公司工作多年后跳槽过来的。前者对公司的项目、产品非常熟悉,甚至自己还动手写过业务层。后者可能只是从大体上了解公司的研发平台,毫不深入,但这并不影响他的发挥,真正的架构师看到代码就有一种亲切感,可以很容易分析出隐藏在代码前后的业务过程。 Java架构师,至少需要在Java领域有5年的开发经验。他需要掌握的内容很多,简单点可以分为前端、后端、数据库、服务器、中间件等。前端插件可以极大地提高开发效率,甚至在不需要美工的情况下做出时尚的界面,类似的插件有AngularJS、Avalon、Bootstrap、ExtJS、jQuery EasyUI、jQuery UI等,这些前端插件也可以称作前端组件或者前端框架,种种叫法也看人的习惯了,没必要吹毛求疵。除了这些前端插件外,还需要掌握JavaScript、HTML等技能。后端需要掌握的技能主要是Java、JVM、Servlet、Struts、Spring、Hibernate、MyBatis等,还有最近流行起来的Spring MVC、Spring Boot等。这些技能和框架只有综合起来使用,并且合理地搭配才能发挥出最好的效果。至于效果能够达到什么程度就需要看架构师的本事了。也许有的架构师可以把这个积木撘得很好,也许有的架构师在搭积木的过程中,这个积木就倒下了。数据库方面需要掌握的内容有Oracle、MySQL、SQL Server,一般常用的数据库大概就是这3个。当然近年来,对于架构师需要掌握的数据库又有所增加,它们主要是代表了NoSQL的MongoDB等区别于传统关系型的数据库。但是,数据库相关的内容有不少,例如,需要熟练掌握SQL的各种语法,还需要掌握数据库性能的调优、备份和恢复。服务器并不是重点,但作为Java架构师,仍然需要有所了解。服务器包括物理服务器、云服务器,还有Web服务器,包括我们在开发中使用的Tomcat。中间件在一些中小型项目中并不怎么常用,如EJB技术、消息中间件ActiveMQ。当然,Web服务器也可以算作中间件,如Tomcat、Weblogic、WebShpere和JBoss等。 只有熟练掌这几个方面的技能后,才能算是一个初级架构师。如果想成为大神级别的架构师,还需要学习更多的知识。Java架构师需要对这些技能非常熟悉,并且能像搭积木一样把他们整合在一起,构建出成熟的、完整的软件开发平台,以供底下的程序员在此基础上进行业务层的开发。但是,随着软件技术日新月异地发展,越来越多的框架进入眼帘,这对于我们来说既是好处又是坏处。好处是我们可以选择更好的、更合适的框架来提高项目的性能,降低开发难度,简化开发流程。坏处是可选择的框架太多,以至于让我们难以选择。所以,本书为大家精心挑选出了一名合格的架构师所必备的专业技能和开发思想,以供大家学习和参考,争取尽早地成为Java架构师。    1.2选择开发工具 孔子曰:“工欲善其事,必先利其器。”这是一个千古不变的哲理,工匠想要使他的工作做好,一定要先让工具锋利,这样才能发挥出最大的效率。这个哲理告诉我们,不管做什么事情,都要选择合适的工具。那么在软件开发的道路上,选择一个合适的开发工具也是极其重要的事情了。Java的开发工具有几种,这里不做太多的赘述,我们只需要对比它们的特点,即可从中选择出一款最适合自己的。 Java中常用的开发工具有NetBeans、JBuilder、Eclipse、MyEclipse、IntelliJ IDEA等。其中,NetBeans是Sun公司开发的,JBuilder是Borland公司开发的,这两个开发工具的功能和界面跟我们常用的Eclipse是没有很大的区别的,之所以在市场占有率方面输给Eclipse,完全是因为细节方面做得不好,还有在用户感知方面不太好。曾经有网友也在社区里面说过这样的问题,我尝试使用过NetBeans或者JBuilder,但总是因为个人习惯的原因没有坚持下来。可能Eclipse是大多数人接触的第一款开发工具吧,这种先入为主的感觉会一直伴随着我们。 Eclipse是完全免费和开源的,它的功能非常强大,开发起来也很顺手。MyEclipse是在Eclipse的基础上加上了自己的插件后的企业级集成开发环境,尤其善于开发Java、Java EE方面的项目。于是,在市场占有率方面Eclipse和MyEclipse非常高,这也在另一方面促进了它们的发展。这两者其实是一个核心,所以选择哪一个都看自己的习惯了。IntelliJ IDEA是Java开发的集成环境,在业界被公认为最好的Java开发工具之一,尤其在代码提示、重构、J2EE支持等方面非常强大。其中有一点对程序员的帮助非常大,就是调试功能,此外在某些细节方面似乎比Eclipse做得更好。而且,IntelliJ IDEA与GIT结合得非常好,而Eclipse与SVN结合得非常好。时间久了,这一开发工具与版本控制工具相结合的特点,也渐渐被程序员们认可,甚至成了项目选择开发工具的一种参考。 举个例子,如果A项目列入了开发计划,为了保持大家代码的一致性,可能项目组内会统一使用开发工具。如何选择呢?如果,这个项目使用SVN来管理代码,那么大家就会优先使用Eclipse;如果使用GIT管理代码,那么大家就会优先使用IntelliJ IDEA。当然,这似乎只是一种约定俗成的参考,并不是硬性要求。 在接下来的学习中,我们以MyEclipse和Eclipse为主来开发项目,并且会讲述SVN和GIT的不同,让大家在以后的工作中更加灵活地搭配开发工具和版本控制工具的组合。至于IntelliJ IDEA,因为它的入手门槛确实有点高,而且一旦选定,后面对于代码的重构会非常麻烦(指Eclipse和IntelliJ IDEA之间),所以本书暂不做相应的讲解。 另外,本书还会使用Eclipse相对较新的版本来做一些练习。其中,MyEclipse的版本是10.7,Eclipse的版本是Kepler,IntelliJ IDEA的版本是2016。SVN和GIT的版本带来的差别并不大,所以并不对版本做具体的规定,MyEclipse10.7的界面如图1-3所示。​ ​图1-3 MyEclipse 10.7的界面 Eclipse Kepler的界面如图1-4所示。​ ​图1-4 Eclipse Kepler的界面 IntelliJ IDEA 2016的界面如图1-5所示。​ ​图1-5 IntelliJ IDEA 2016的界面    1.3 安装JDK JDK是Java开发的核心,包含了Java运行环境、工具、基础类库。如果没有JDK,Java开发是无法进行的,Java项目也无法运行起来。所以要做任何项目的开发,第一件事情就是安装好JDK。接下来,我们才可以做更多的事情。 通常来说,每一个开发工具都会携带JDK,例如,MyEclipse 10.7自带的Sun JDK 1.6.0_13,但是IntelliJ IDEA并没有携带,需要自行配置。鉴于这种情况,我们在安装完开发工具后紧接着就应该安装合适的JDK。使用MyEclipse 10.7自带的JDK也可以完成日常的开发,但这款JDK没有进行环境变量的设置,可能在后续的开发中会有影响,而且这款JDK是混杂在MyEclipse 10.7的安装目录下的,给人的直观感觉不太好。为此,我们需要单独安装一款JDK,而说到安装JDK,就不免要选择合适的版本。目前,JDK版本已经到了8,但是因为历史原因,使用JDK 8来开发项目的公司并不多,第一个吃螃蟹的人会有惊喜也有潜在的风险。使用JDK7也是个不错的选择,但是因为本书中所涉及的项目众多,为了项目的稳定性,还有学习的顺序性,我们仍然使用久经历史验证的JDK 1.6版本,也可以称作JDK 6,对于这个名称不用纠结,是因为历史原因造成的。JDK 1.6以上的版本才正式改变了叫法,如JDK 7,也有开发人员习惯叫它JDK 1.7。读者可以在JDK 1.6版本下熟练掌握本书的内容后,自行更用更高级的版本来测试程序的运行性能和代码编译方面的不同。因为本书的主旨是讲述常规的技术,所以对于JDK的新特性并没有过多讲解。 首先,需要在Oracle官方网站下载JDK 6。因为Oracle官网经常更新,具体的地址也会经常改变,很难有一个确切的下载地址。但是,在Oracle官网可以找到Downloads的菜单,基本上Oracle公司所有的产品都可以在这里找到。另一种方法是可以在其他的网站下载JDK 6,例如,国内的一些网站,下载起来速度也相对比较快,Oracle官网下载JDK如图1-6所示。​ ​图1-6 Oracle官网下载JDK 下载完JDK6之后,最好将它安装在非系统盘里。接着,需要对刚才安装好的JDK进行环境变量的设置,以方便我们在DOS系统下使用JDK命令。例如,最常用的编译命令javac,显示JDK版本的命令java -version,这些命令的使用都依赖于环境变量的配置。如果没有配置,是不会生效的。 首先,打开Windows的环境变量界面,新建系统变量JAVA_HOME和CLASSPATH。编辑JAVA_HOME变量,在变量值里输入JDK6的安装地址,如D:\Program Files\Java\jdk1.6.0_43,点击“确定”保存。接着,编辑CLASSPATH变量,在变量值里输入 %JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar,点击确定保存。最后,选择系统变量名为Path的环境变量,在原有变量值的基础上追加%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin,点击“确定”保存,添加环境变量的界面如图1-7所示。​ ​图1-7 Windows环境变量设置界面 为了验证Java环境变量是否设置成功,可以运行CMD程序,打开Windows的命令行模式,输入 java -version 命令,如果环境变量设置成功,会在下面输出当前的JDK版本号以及JDK位数,正确的输出结果如图1-8所示。​ ​图1-8 命令行模式下输出JDK版本 配置好了环境变量,还需要在MyEclipse 10.7中配置JDK,使其可以在开发工具中使用。打开MyEclipse 10.7,在Preferences菜单中的Java选项下找到Installed JREs选项,就可以看到当前工作空间中的JDK设置,MyEclipse 10.7默认自带一个JDK6,如图1-9所示。​ ​图1-9 MyEclipse10.7自带的JDK6 点击Add按钮,在弹出的Add JRE对话框中选择Standard VM点击Next按钮进入下一步,在弹出的对话框中点击Directory按钮,选择JDK6的安装目录,点击确定。对话框会自动识别出JDK的相关信息,并且在JRE system libraries列表框中显示出来,如图1-10所示。​ ​图1-10 MyEclipse 10.7中设置JDK6 点击Finish按钮完成设置。这时,MyEclipse 10.7会自动回到Installed JREs对话框中,刚才的列表中会多出一栏我们刚刚设置好的JDK选项,在勾选框中选择它点击OK。至此,MyEclipse10.7下的JDK设置就成功了,在以后的开发工作中,我们全依赖这个JDK提供的基础JAR包来开发和运行项目。    1.4 安装Tomcat服务器 安装好了JDK,我们就可以在MyEclipse 10.7中进行一系列代码编写工作了。例如,可以在开发工具中写一些类,做一些练习。普通的包含main函数的Java类,我们可以通过Run As菜单下的Java Application命令来运行,输出程序结果。例如,可以在MyEclipse 10.7下新建一个Java Web工程practise。具体的过程如下,选择File菜单下的New选项,在弹出的右侧菜单中选择Web Project,在对话框的Project Name文本框中输入 practise ,将J2EE Specification Level选项设置为Java EE 6.0,和安装的JDK保持一致,点击Finish按钮,practise项目就建立好了。 选中practise项目的src目录,右键选择新建Package,在对话框的Name文本框中输入 com.manage.practise ,点击Finish,就可以给这个项目建立一个空包。接下来,就可以在这个空包里新建类。选中Java包,右键选择New菜单下的Class,在弹出的对话框中在Name处输入类名 Test ,并且勾选 public static void main(String[] args) ,点击Finish。这样,在practise包下的第一个类Test就建立成功了。打开Test类,在main函数中输入第一行Java语句 System. out.println("Hello World"); ,使用Java Application来运行。此时,控制台会在空白区域输出Hello World。理论上来说,我们的第一个Java程序就这样诞生了,尽管这个程序非常简单! 如果只是在MyEclipse 10.7下安装了JDK,这款开发工具能做的事情无非是编写类,利用Java Application来运行,并且进行程序的测试。在这种情况下,我们的代码中所设定的数值均是由自己输入的参数;然后再根据程序中的处理逻辑,做一些简单的运算;最后,输出正确的结果。可是,程序开发远远不是这么简单的事情,我们需要做的是开发一个具有交互能力的项目,而不仅仅是写一段简单的程序。要达成这个目标,我们就必须在MyEclipse 10.7安装Web服务器来运行项目。在这里,我们选择使用Tomcat服务器,这是因为Tomcat服务器具有简单、易用的优点。 首先,打开Apache的官方网站,在下载Tomcat 6.0的页面找到对应的软件,在Core列表中选择64-bit Windows zip的版本,将Tomcat 6.0保存到本地,并且解压缩到本地的非系统盘内,如E盘的根目录。下载Tomcat 6.0如图1-11所示。​ ​图1-11 下载Tomcat 6.0 打开MyEclipse 10.7的Preferences对话框,在MyEclipse的列表中选择Servers,这时,会出现一个列表,列出MyEclipse 10.7支持的服务器。选择Tomcat,再选择Tomcat 6.x。这时,对话框右侧会出现Tomcat 6.x的配置项,选择Enable,启用Tomcat 6.x。点击Tomcat home directory对应的Browse按钮,在弹出的磁盘目录列表中选择Tomcat 6.0所在的位置,MyEclipse 10.7会自动补齐其他的两处空白,点击OK按钮,Tomcat 6.0服务器就配置好了。 我们通过工具栏运行Tomcat 6.0,启动成功后,点击工具栏的Open MyEclipse Web Browser功能的图标,在地址栏中输入http://localhost:8080/,就可以看到Tomcat 6.0运行成功的画面。接下来,就可以通过在Tomcat服务器里部署Web项目来进行正式地编码工作了,运行界面如图1-12所示。​ ​图1-12 Tomcat 6.0运行成功    1.5 Hello World程序 完成了前面几节的配置,MyEclipse 10.7 的开发环境已经正式配置成功了。这时,我们可以在MyEclipse10.7下完成第一个Hello World程序来结束本章的学习。 在MyEclipse 10.7的界面中,我们可以看到Package Explorer视图下有一个Java Web项目practise,这个项目是之前创建好的,并且在包里建立了一个Test类。我们通过运行该类,可以在控制台里输出了Hello World,说明这个类没有问题。但是,这种简单的编码没有交互性,是不能满足项目的需求的。如果要开发一个项目,必须让其在Tomcat服务器里运行,才能起到交互的作用。那么我们可以把practise项目部署到Tomcat服务器里试试效果。 选中practise项目,右键弹出功能菜单选择MyEclipse,在弹出的右侧菜单中选择Add and Remove Project Deployments功能,在弹出的对话框中可以看到Deployments列表中为空,说明Tomcat服务器里并没有部署任何项目。这时,我们点击Add按钮,在Server下拉框中选择Tomcat 6.x,点击Finish,把practise项目正式部署到Tomcat服务器中。部署好的 practise 项目如图1-13所示。​ ​图1-13 部署好的practise项目 这时,我们启动Tomcat服务器就会自动加载部署到服务器里的practise项目。通过控制台,可以看到服务器的启动日志,如果没有报错的话,说明practise项目没有编译错误,那么Tomcat服务器启动成功。打开IE浏览器,在地址栏中输入http://localhost:8080进行访问,可以看到程序运行成功,但显示的仍然是Tomcat服务器的默认页面,这是因为我们没有输入项目名称。 打开practise项目的WebRoot文件夹下的index.jsp文件,把title标签里的内容修改成First Page,把body标签里的内容修改成Hello World,保存index.jsp文件。再次打开IE浏览器,访问http://localhost: 8080/practise,可以看到页面上已经发生了变化,如图1-14所示。​ ​图1-14 practise项目运行    1.6 小结 本文我们全面阐述了程序员的职业发展规划,从而为广大读者提供一个晋级的参考。从程序员到项目经理、产品经理、架构师的过程至少需要5年。这5年是一个学习期,5年后就可以进行转型了。所以,建议大家在工作的前5年不要频繁跳槽,还是需要系统地掌握知识技能,积累经验才是硬道理。频繁跳槽不但让自己的知识会出现断层,也可能影响到自己在HR心中的形象。 接着介绍了Java开发中常用的工具,并且做了简单的对比,相信读者可以根据自己的喜好选择其中的一款。因为本书主要采用MyEclipse 10.7作为开发工具,所以读者最好先使用这款开发工具,其他的工具会在后面的章节中介绍。等对这些工具驾轻就熟的时候,再随意切换。每个开发工具都有自己的优缺点,但不要人云亦云,选择自己最习惯用的才是最好的。最后介绍了安装JDK、Tomcat服务器的过程,并且开发了第一个Hello World程序。如果读者已经牢牢掌握了本章的内容,这就是万里长征迈出了坚实的第一步,相信在以后的学习当中大家的收获会更多。 本文摘自《Java架构师指南》​ ​《Java架构师指南》 王波  著 点击封面购买纸书 资深Java专家多年经验总结,全程项目驱动,首本完整介绍Java入门进阶到架构师的编程技术图书。 程序员走向架构师是必经之路,本书基于官方API的完美解读,从架构师的角度来讲解Java知识技能,并且从搭建虚拟机开始,学习常用的Linux命令,力争做到使程序员在较短的时间内成功迈入架构师的殿堂。 今日互动(​仅限微信端点击参加) 你是怎么入行的?第一份工作是什么?截止时间6月15日17时,留言+转发本活动到朋友圈,小编将抽奖选出3名读者赠送纸书1本和2张e读版80元异步社区代金券,(留言点赞最多的自动获得一张)。​​ ​​推荐阅读 2018年5月新书书单(文末福利) 2018年4月新书书单 异步图书最全Python书单 一份程序员必备的算法书单 第一本Python神经网络编程图书​​ ​​长按二维码,可以关注我们哟 每天与你分享IT好文。 在“异步图书”后台回复“关注”,即可免费获得2000门在线视频课程 点击阅读原文购买《Java架构师指南》 阅读原文 ​​​​
文章
架构师  ·  Java  ·  程序员  ·  应用服务中间件  ·  开发工具
2018-06-13
Java Web简明教程–开发环境介绍[3]–图文安装流程
为了跟大家保持步调一致,猫哥一狠心,把自己电脑上用了有一段时间的Java开发环境全卸载了,哈哈,怎么突然有一种很清爽的感觉捏。好了,闲话也不能说太多,说太多了也不好,嗯,是的,闲话少说,进入正题。具体安装中,需要说明的我截图,其他的默认下一步下一步安装就行Setup1,在D盘建一个Java目录,在Java目录下建立【安装包】目录,用于存放下载的安装包。Setup2,下载JDK1.7,下载地址为:【http://www.Oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html】,点击链接,因为猫哥计算机是windows7 64位的,所以选择图片中最后一个下载,如果是32位的系统,请选择倒数第二个下载。注意下载前要选择【accept license agreement】,表示同意。Setup3,一直点击【同意】或者【下一步】即可,需要说明的我说明,这个JDK真没有啥好说明的,默认往下安装就行。Setup4,现在呢,开始下载Tomcat,下载地址:【点此下载tomcat7】,打开如下图所示网页:考验各位English能力的时候来了,点哪个表示下载呢?其实很简单,依然是【64-bit Windows zip】,32位系统的同学就选32-bit windows就行。至于在后面那个32-bit/64-bit Windows Service Installer 这个是windows服务安装版本的tomcat,咱们用免安装的就行。下载完毕后,将其解压至【D:Java】下即可,无需安装,解压完毕后【D:Java】目录,此时已完成两项了jdk和tomcat:setup5,下载并安装myeclipse,下载地址:【 http://downloads.myeclipseide.com/downloads/products/eworkbench/2014/installers/myeclipse-pro-2014-GA-offline-installer-windows.exe】,建议直接使用迅雷下载就行(猫哥20M带宽8分钟不到下完了,资源还是很不错啊,哈哈)。下载完成后依然一步步安装,需要说明的如下:说明1:安装位置依然在D:Java下说明2:依然注意选择操作系统种类,64位系统选64 Bit,其余的直接默认下一步,提示安装成功即可。至此,除了Mysql数据库外,均已安装完成,下面介绍MySql的安装和配置:Setup6,下载MySql,链接为:【http://tomcat.apache.org/download-70.cgi】,打开下图所示网页:又是那一套啊,注意平台选【windows】,版本选【5.5.52】,依然选择64-bit,下载后双击安装。稍微需要注意的是,点击上图的【download】按钮后,第二页可以点击【 No thanks, just start my download】链接,可以不用登录就下载。(注意mysql官网有非常多不同的版本,这里给的下载链接是安装版本的,也有免安装版本的)Setup7,开始安装MySql,双击下载的程序,需要注意的是:注意1:选择安装类型【custom】,表示自定义注意2:安装位置依然D:Java目录下注意3:此处直接下一步注意4:需要选中复选框,表示安装完成后,开始配置注意5:选择第二个,标准配置就够了【Standard】注意6:选择第一个,开发者机器,不用选第二个服务器,第二个浪费资源多,咱开发用,越省越好。注意7:选一,多用途数据库,实际上可能用2、3,根据需求来定,具体什么需求,介绍里很丰富了。注意8:默认即可,允许链接个数,默认20个就够了。注意9:要悬赏那个复选框,表示防火墙不拦截。Port Number是端口号,这个要注意是3306,以后会用到。端口是区分计算机不同程序接入点的很重要的东西,以后详述。注意10:选最后一个——自定义,然后建议选utf8,毕竟是中文嘛。注意11:Install as windows service表示安装为服务,待会演示服务在哪里启动和关闭,服务名是MySQL,复选框要打勾,表示服务自动启动,也就是开机启动mysql数据库服务。注意12:设定密码,猫哥设的是Pass1234,复选框打勾表示允许远程链接。注意14:出现此界面,4个勾都打上了,表示完成。(注意有时候到此界面死机,可以重启电脑,然后在mysql安装目录下有一个【MySQLInstanceConfig.exe】,双击执行它,同样可以完成配置)至此MySQL安装和配置完成,这里有一些选项不理解不要紧,只需要知道数据库咱有了就OK,刚刚说道咱把数据库安装为服务了,那在哪看服务呢,猫哥简单说下。依次打开【控制面板】-【管理工具】-【服务】,找到名为MySQL的服务。如图:右击可以选择启动、停止。只有在启动状态,MySQL数据库才能提供查询等功能。OVER,这一篇写的心都碎了,截图太麻烦了。
文章
Java  ·  关系型数据库  ·  MySQL  ·  应用服务中间件  ·  网络安全  ·  数据库  ·  数据安全/隐私保护  ·  开发者  ·  Windows
2021-11-08
编码,解码,乱码,问题详解
编码解码核心 字符 内码 字符集 系统编码 windows Linux Python中的编码问题 系统编码 Python编码 方式一 方式二 方式三 文件编码 实例一 实例二 Python中字符串和Unicode的区别 PHP中的编码 header set names XX 数据库中的编码 JSP乱码 JSP页面本身 数据库连接语句 Tomcat方面 过滤器Filter 总结 在开发的过程中,我们不可避免的会遇到各种各样的编码,解码,或者乱码问题,很多时候,我们可以正常的解决问题,但是说实在的,我们有可能并不清楚问题到底是怎么被解决的,秉承知其然,更要知其所以然的理念,经过一番研究,就有了下面的这篇文章,鉴于本人功力尚浅,有错误请给予纠正 :-) 编码解码核心 简单的来说,编码是从一个字符,比如‘郭’,到一段二进制码流的过程。解码是从一段二进制码流到一个字符的过程。 但是,就计算机工作原理而言,这其中涉及到了三个对象。 字符 (我们在各种终端上面看得到的显示结果) 内码 (对应显示的字符的计算机存储数据) 字符集 (内码在内存中的具体实现) 这三者之间的配合如下图。 字符 对于字符而言,是我们程序员而言想必是最熟悉的了吧。什么Abs_=+/.80,都是我们所熟悉使用的字符。虽然我们表面上看到的是一个个的字符,但是在计算机而言,其真正识别和处理的不过是对应于显示的字符的一个个的内码。 内码 内码是汉字在计算机内部存储,处理和传输用的信息编码。它必须与ASCII码兼容但又不能冲突。 也许你会想,ASCII码又是什么? 对此,百度百科是这样解释的: ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。 从这里我们不禁会想,既然是单字节编码,那么汉字这种多字节表示的信息又是怎么被计算机识别和处理的呢? 国标码规定:一个汉字用两个字节来表示,每个字节只用前七位,最高位均未作定义。但我们要注意,国标码不同于ASCII码,并非汉字在计算机内的真正表示代码,它仅仅是一种编码方案,计算机内部汉字的代码叫做汉字机内码,简称汉字内码。 所以,这也是国人在平时开发过程中经常会遇到的乱码问题的根源。 字符集 字符集作为内码在内存中的具体实现,肩负着很大的责任。 ascii不仅仅指英文对应的内码,还包括它的具体实现,也就是它的字符集。它是用一个字节存储每个内码的。 unicode是所有文字(包括英文,中文,日文等)所对应的内码的集合。 unicode的实现方式比较多样,常用的有UTF-8,GBK,GB18030。 其中,UTF-8是一种不定长的内码实现方式。 GB18030兼容GBK,GBK兼容GB2312。 严格点来讲,我们所谓的编码解码问题:编码指内码编码成字符集;解码指字符集解码为内码 系统编码 众所周知,在不同的操作系统上,支持的编码也是不太一致的。所以我们在跨平台操作的时候,需要重点考虑的问题就包括系统编码问题。 windows 在Windows上查询当前系统的活动代码页,就可以知道当前系统使用的编码。 调出命令行之后输入: chcp 即可。 基本上国人的电脑上会显示936 936 代表GBK 扩展的EUC-CN 编码( GB 2312-80编码,包含 6763 个汉字)到Unicode (GB13000.1-93)中定义的20902个汉字,即中国大陆使用的是简体中文zh_CN.。 Linux 在Linux操作系统上查看系统编码更是方便。 locale是最核心的一个变量。它包括12个基本属性。这12个基本属性构成某个地区的语言习惯,日期,货币,单位等文化因素。LC_ALL是强制修改locale信息的命令。LANG是locale的默认设置命令。因此,当LC_ALL强制locale信息以后,LANG的设置也就失效了。 当然了,我们可以根据自己的喜好,来为自己的linux计算机分配系统编码。 Python中的编码问题 一般而言,谈到程序编码问题,首屈一指的就是Python语言中的编码了。尤其是Unicode字符集的使用,更是让人摸不着头脑。不过,现在不用担心了,待会我会出绝招滴。 系统编码 经过了刚才的知识的铺垫,大家肯定对此也有了一定的感悟了。Python中的系统编码充当了一个桥梁的作用。其通常也是写源码的编辑器的编码方式。它代表源码文件内的所有内容都是根据词方式编码成二进制码流,存入到磁盘中的。 系统编码可以通过locale命令查看(LINUX)。 说白咯,就是操作系统是怎么存储我们的Python源程序的。 Python编码 这是一个比较新的概念,也是Python编码问题的根源。那就是指python内设置的解码方式。如果不设定的话,python默认是ascii解码。所以我们不难理解为什么有汉字的时候很容易出现乱码的情况了吧。 为了解决Python默认编码不支持汉字的窘境。我们需要手动的设置,让其识别咱们可爱的博大精深的汉字。一般有如下三种方式。 方式一 只能Python识别 在源码文件开头(一定要是第一行):#coding=UTF-8,源码文件的设置解码方式为UTF-8 方式二 可以被其他的语言识别 在源码文件开头(一定是第一行):#--coding:UTF-8--,源码文件的设置解码方式是UTF-8 方式三 我经常使用的方式是方式一加方式三 import sys reload(sys) sys.setdefaultencoding('UTF-8') 文件编码 对于文件编码,大体意思就是系统为我们即将存储的文件而进行的编码操作。 实例一 系统编码:locale:gbk python源文件test.py #coding='UTF-8' s='郭' print s 在test.py被保存的那一刻,系统会以gbk的方式将数据存储到本地硬盘上,而在下次我们运行这段代码的时候,Python编码会按照源文件开头指定的utf-8编码来解码并运行,所以遇到’郭’的时候,由于码制的不同,出现乱码或者出现错误就不难理解了。 实例二 系统编码:locale:gbk test.py #coding='gbk' s='郭' ss=s.encode('UTF-8') 这个时候,系统编码仍然会以gbk的变啊买房时对源文件进行编码处理,但是在遇到ss=s.encode('UTF-8')的时候,会先以Python编码指定的方式将对应的字符串(二进制码流)编码,再按照系统编码对其进一步的编码处理。 而在下次加载的时候,程序会被以对二进制码流,按照解码的编码处理原则处理。也就是说Python解释到ss=s.encode('UTF-8')行的时候,会对相应的二进制码流以utf-8的方式解码,这样就能很好的解决掉字符集不匹配的问题了。 二进制码流(python中,所有字符串都表示的是相应的二进制码流,所有的unicode都表示的是相应的内码) Python中字符串和Unicode的区别 字符串表示的是编码后的二进制码流,unicode表示的是内码。所以,为了避免解码错误的出现,最好使用unicode表示 unicode的定义,使用 s=u’郭’:定义unicode字符串s。s表示的是哈的unicode内码 ss=unicode(s,’gbk’):对字符串s按照gbk方式解码,ss表示解码后的内码 import codecs f=codecs.open(filename,’r’,’gbk‘) s=f.read() 按照gbk方式读取filename,读取后的内容转变成unicode内码存在变量s中。 了解了以上编码解码的底层原理之后,基本上就可以应对相关的乱码问题了。 PHP中的编码 在PHP中我们也经常会遇到页面出现乱码的情况,有了上面的知识基础,我们再过来看PHP中的乱码问题,就会迎刃而解了。当然了,今天主要是来讲一讲如何解决PHP中文乱码问题。 header header("Content-Type:text/html;charset=utf-8"); 加上头信息的作用就是告诉浏览器,以XX方式来解码。基本上而言不会有太大的问题,但是前提是双方的系统编码能保持一致,否则也会出现由于系统编码不同而引起的乱码问题,对照Python的案例,我们也很容易可以理解。 set names XX mysql_query("set names UTF-8"); 这个是对数据库数据乱码的很好的解决办法。说白了这就是所谓的“系统编码不同而引起的乱码问题的一类”。就拿MySQL数据库而言,我们是以客户端的形式来访问的数据,如果MySQL客户端的编码为gbk,而我们的浏览器解码使用的是UTF-8,请问怎么可能不会乱码呢? 只要保持双方的编码,解码方式一致,乱码问题,不攻自破。 数据库中的编码 通过刚才的学习,类比系统编码和文件编码。我们经常遇到的数据库信息存取出现乱码问题就可以很容易的解决了。 修改字符集设置即可。但是这不是一个好习惯,比较好的做法是修改读取出来的数据的编码。 以MySQL为例。 可以先输入查询语句SHOW VARIABLES LIKE ‘character_set_%’;,查看所有的编码是否是UTF-8. 如果不是可以使用Server Instance Config 把默认的字符集设置为utf-8或者修改/MySQL/MySQL Server 5.0/my.ini中的default-character-set=gbk character-set-server=gbk; 然后重新启动mysql的服务就行了 JSP乱码 在开发JavaWeb的时候,遇到JSP乱码的情况有很多,下面着重的来探讨一下解决方案呢。 JSP页面本身 每个页面上加上 这样在jsp页面里,点右键,查看编码方式则为UTF-8. <%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> 也可以把设置myEclipse中默认的contentTyepe。步骤是:windows->preferences->Generl->ContentType.然后设置成UTF-8.一定要update~~ 在JSP页面头部加入下面这句话,告诉浏览器应该调用UTF-8的字符集。 或者使用HTML标签来声明 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 数据库连接语句 设置characterencoding为UTF-8 如jdbc.mysql.url=jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF8 如果使用Hibernate,那就把所有的配置文件头部的编码格式改成UTF-8。 Tomcat方面 为了保证get/post数据都采用相同的UTF8编码,我们在server.xml中进行了如下设置: <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"redirectPort="8443" URIEncoding="UTF-8" /> 过滤器Filter 有些时候,使用过滤器可以一劳永逸的解决乱码问题,原理就是强化了通信双方的编码一致性。 //在doFilter方法中添加这样的代码 HttpServletRequest request = (HttpServletRequest )req; HttpServletResponse response = (HttpServletResponse )resp; request.setCharacterEncoding("UTF-8"); response.setHeader("Content-Type:text/htmlcharset=UTF-8"); response.setCharacterEncoding("UTF-8"); //放行 chain.doFilter(request,response); 总结 回顾一下,解决乱码问题的核心就是保证编码与解码工作的一致性。无论是系统编码还是文件编码,保证编码工作和解码工作的反向一致性,基本上就不会出现乱码问题。 如果你发现文章中有不恰当的地方,欢迎批评指正。
文章
存储  ·  关系型数据库  ·  Java  ·  数据库  ·  Python
2016-08-19
Hibernate框架学习之一:Hello World程序
前言 对一个框架的直观认识,往往是从一个Hello World程序开始。Hibernate是一个ORM(Object Relationship Mapping)对象映射框架。实现了JDBC轻量级的封装,使得在进行JDBC开发的时候可以直接使用面向对象的思维进行开发,说白了Hibernate框架的作用是在Java对象与关系数据库中做了一个映射,使得程序员不用再使用各种SQL了。所以总结Hibernate以下几点: 1、完成了对JDBC的封装,不用再与各种Connection打交道了 2、在业务体系中是一个持久层框架(除了持久层还有业务层,主要使用Struts2或者SpringMVC完成,还有视图层,就是诸如jsp、freemarker啦这些显示信息的技术),对持久层的解释,我摘抄了官方的一句话: Persistence simply means that we would like our application’s data to outlive the applications process. In Java terms, we would like the state of (some of) our objects to live beyond the scope of the JVM so that the same state is available later. 3、是一个ORM框架,不用与各种SQL打交道 Hibernate 入门程序:XML版 第一步:在myeclipse中创建一个web项目,取名为hibernate 第二步:在项目中添加使用Hibernate框架必须的jar包:如下图: 第三步:编写hibernate.cfg.xml配置文件,代码如下: <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 数据库连接配置 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost/test</property> <property name="connection.username">root</property> <property name="connection.password">1234</property> <!-- JDBC 连接池 --> <property name="connection.pool_size">1</property> <!-- SQL 方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- 禁用二级缓存 --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <!-- 是否显示执行的SQL语句 --> <property name="show_sql">true</property> <!-- 删除并重建数据库 --> <property name="hbm2ddl.auto">update</property> <!-- 引入外部映射文件 --> <mapping resource="bean/Person.hbm.xml"/> </session-factory> </hibernate-configuration> 上面的配置文件指明了一些必要的数据库连接属性,通过这些属性,Hibernate可以连接上数据库。可以配置各种不同的数据库,其中sql 方言属性指明了使用你所配置的数据库的sql语法(比如Oracle与MySQL中一些语法还是存在很大不同的)。 第四步:创建bean对象 package bean; public class Person { private int id; private String sname; private int age; private float salary; //无参构造方法,但是如果不写的话。Person类已经有一个默认的构造方法,那就是无参构造方法 public Person(){} //省略get和set方法,这里把id的set方法设为private private void setId(int id){ this.id = id; } @Override public String toString() { return "Person [id=" + id + ", sname=" + sname + ", age=" + age + ", salary=" + salary + "]"; } } 这是一个标准JavaBean对象,Hibernate也建议我们这么写。但是在编写这个JavaBean的时候,有几点需要注意:一是对象的id属性,另一个是id属性的set方法。在Hibernate框架中,使用一个id为标识一个对象,所以在JavaBean中为一个对象添加id属性是必要的,因为在使用Hibernate框架时候,只有Hibernate才可以为一个对象分配id值(你可以试试在没有添加id属性的时候会出现什么异常)。另外,由于id是一个对象的标示符,所以我们一般禁止其他对象对这个属性进行随意的修改,所以将其set访问设为private也是出于这个层面的考虑。 第五步:编写Person.hbmxml映射文件,该文件的作用是把Java中的Bean对象与数据库中(确切说是RDBMS,关系数据库)中一条记录做了一个映射(这里就是ORM的关键),代码如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC '-//Hibernate/Hibernate Mapping DTD 3.0//EN' 'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'> <hibernate-mapping package="bean"> <class name="Person" table="PERSON"> <!--id就是指明对象标识符 name属性对应Person对象id属性 column表示该属性映射到数据表的哪个字段 --> <id name="id" column="PERSON_ID"> <!-- 主键生成策略,native表示使用本地数据库的生成策略 比如这里使用的是MySQL,那么使用的主键策略就是MySQL的自动增长策略 --> <generator class="native"/> </id> <!-- 普通属性name属性表示Person对象中的字段,type属性表示该属性的类型 当然也可以指明column属性,如果不知名,数据表中的字段与属性名称是一致的 --> <property name="sname" type="java.lang.String"/> <property name="age"/> <property name="salary"/> </class> </hibernate-mapping> 创建JavaBean之后,就是上面的映射文件了,上面的文件名以及文件内容可能有一些难以理解的地方。首先我们得知道,一个映射文件(后缀hbm也正是hibernate映射文件的意思)的作用是什么?前面提到了Hibernate是一个对象映射框架,对象映射到哪里去了呢?当然是数据库中数据表的一条记录(一个对象映射到了数据库表的一条记录,就这么理解)了。那么这个映射的过程的实现就是通过上面的映射文件了。映射文件告诉Hibernate怎么样去加载和存储持久化类的对象,映射文件告诉Hibernate去数据库中的那张表寻找以及应该使用表中的哪些字段。 除此之外,我们注意到,有一些属性并没有指定type属性,有一些却指定了,那么什么类型属性需要指定,什么类型又不需要呢?对于一些常见的类型( 第六步:编写测试程序实现CRUD操作 package manager; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import utils.HibernateUtils; import bean.Person; public class PersonManager { public static void main(String[] args) { SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); Session session = sessionFactory.openSession(); Transaction t = session.beginTransaction(); // 创建一个Person对象并保存到数据库中 /*Person p = new Person(); p.setSname("赵云"); p.setAge(23); p.setSalary(10000); session.save(p); // 开启事务并提交 t.commit(); // 查询 List list = session.createCriteria(Person.class).list(); for (Object object : list) { Person pe = (Person) object; System.out.println(pe); } // 更新 Person p2 = (Person) session.load(Person.class, new Integer(1)); p2.setSname("黄忠"); session.save(p2); t.commit(); // 查询 List list2 = session.createCriteria(Person.class).list(); for (Object object : list2) { Person pe = (Person) object; System.out.println(pe); }*/ //删除 Person p3 = (Person) session.get(Person.class, 2); session.delete(p3); t.commit(); } } 在测试的时候,为了对每个操作是否成功进行测试,可以把其他程序注释。其中涉及了Hibernate一些核心类:SessionFactory、Session和Transaction。 1、SessionFactory 熟悉设计模式的小伙伴应该知道,这是典型的工厂模式,一个org.hibernate.SessionFactory工厂对象就是生成org.hibernate.Session实例的。在整个应用程序总一个org.hibernate.SessionFactory应该只被初始化一次,并且应该是线程安全的。所以上面的代码使用HibernateUtils类封装了SessionFactory实例,从而保证了整个应用期间,只有一个SessionFactory实例。这也是设计模式的一种——单例模式。对SessionFactory的解释我引用官方的一句话: A threadsafe, immutable cache of compiled mappings for a single database. A factory for Session and a client of ConnectionProvider, SessionFactory can hold an optional (second-level) cache of data that is reusable between transactions at a process, or cluster, level. 下面是HibernateUtils.java的代码: package utils; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { // 创建全局单一sessionFactory对象 private static final SessionFactory sessionFacoty = buildSessionFactory(); private static SessionFactory buildSessionFactory() { try { return new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory(){ return sessionFacoty; } } 2、Session Session代表了一个工作单元,一个Session的产生往往是在事务开始的时候创建的,比如在调用getCurrentSession方法的时候,一个事务就开始了。通过这种方式获取的Session与openSession方法的不同在于前者在事务结束的时候就会自动关闭,所以在一个事务commit或者rollback的时候,该session对象就已经关闭了。而后者则可以一直生效,每次得到的Session都是一个新的对象。 Session is a single-threaded, short-lived object representing a conversation between the application and the persistent store. It wraps a JDBC connection and is a factory for Transaction. Session holds a mandatory first-level cache of persistent objects that are used when navigating the object graph or looking up objects by identifier. 3、Transaction 数据库中事务的概念是指访问并且可能更新数据项的程序执行单元,在sql编程中,一个事务可能是一条SQL查询语句。在Hibernate中,事务是与Session相关的。对此官方解释如下: (Optional) A single-threaded, short-lived object used by the application to specify atomic units of work. It abstracts the application from the underlying JDBC, JTA or CORBA transaction. A Session might span several Transactions in some cases. However, transaction demarcation, either using the underlying API or Transaction, is never optional.
文章
SQL  ·  Java  ·  关系型数据库  ·  数据库连接  ·  数据库  ·  MySQL  ·  数据格式  ·  XML  ·  设计模式  ·  程序员
2015-12-12
程序员报错行为大赏-配置报错
Maven本地仓库配置报错:配置报错  GO语言配置什么的都没问题,但就是LiteIDE配置不好。。。:配置报错  Maven 配置nexus仓库 POM文件报错:配置报错  10个你可能从未用过的PHP函数:配置报错  QTableWidget修改表头颜色的代码为什么只在QMainWindow中有效?:配置报错  你好,我想问一下,asterisk sip我想用mysql读数据库配置,:配置报错  RedisScheduler中层级关系setPriority无效?:配置报错  关于ie8下 getElementById为空的问题..:配置报错  一个命令可以攻击所有的Linux系统:配置报错  resin转Tomcat,一个tomcat部署多个web application的配置?:配置报错  MyBatis 如何实现可配置模式名:配置报错  osc的git版本控制能解决这个问题吗?:配置报错  Apache Click框架入门问题click.xml配置与页面显示问题:配置报错  Android隐藏顶部状态栏无效:配置报错  spring maven pom配置 artifactId 能否支持通配符?:配置报错  求教sock5客户端---linux安装与配置:配置报错  生成树idKey pId指定无效:配置报错  用hibernate就非要用关联配置么?:配置报错  MongoDB入门安装配置视频教程:配置报错  还是openemm的问题:配置报错  druid getConnection慢的问题:配置报错  Spring使用XML配置好还是注解的方式好?哪种优点更多,整体更好?:配置报错  Struts2 的配置:配置报错  Apache+Tomcat集群:配置报错  MyEclipse 10咋配置的Android。?:配置报错  QQ互联PHP_SDK 在SAE上 session_start() 的问题:配置报错  tool.xml文件的配置:配置报错  各项配置已经配置好了还是有 :配置报错  GridView 设置项监听事件 怎么无效?:配置报错  还有必要配置HotModuleReplacementPlugin 插件吗?:配置报错  struts2的注解模式配置action:配置报错  varnish-dashboard 如何实现监控多台varnish服务器:配置报错  netty怎么判断客户端是纯socket还是websocket:配置报错  ie11 浏览器用@font-face 无效:配置报错  返回的ActiveDataProvider分页无效的问题:配置报错  shiro配置问题,我配置了缓存然后自己重写了一个Realm,冲突:配置报错  Eclipse LUNA 4.40如何配置GWT web开发环境:配置报错  android 三个配置放在一起代表什么意思:配置报错  jquery 如何操作隐藏的DOM元素:配置报错  nginx 配置增加一个固定的重写规则:配置报错  android FTP客户端开发:配置报错  下载无效是一个空的war包:配置报错  jfinal_weixin获取accesstoken的问题.会是一个框架源码本身的bug?:配置报错 tomcat 配置memcached 配置报错  jboot内置的undertow参数怎么配置 配置报错  一个关于笔记本使用无线键盘的问题 配置报错  ignite的h2控制台如何配置实用 配置报错  详解 Spring 3.0 基于 Annotation 的依赖注入实现 配置报错  nginx配置问题 配置报错  Tp3.0Rc2 存在 {NO_TOKEN} 标识无效的问题 配置报错  SpringFramework hibernate constraint无效 配置报错  比较两个List把不同的值取出来,contains无效 配置报错  android隐藏listview中的某一项,总是有问题。 配置报错  为何PublicCMS后台管理的页面片段插入无效? 配置报错  Nginx跳转路径配置问题:配置报错 java 服务器:配置报错  spring事务配置的一个问题 配置报错  mybatisplus 在同一个事务中,查询有缓存,如何不要缓存 配置报错  windows系统nginx限制链接数配置:配置报错  Mybatis配置问题:配置报错  mysql的服务器内存64G,请教优化配置 配置报错  MYCP开发指南系列之:开发第一个C++ APP 1    开发第一个 C++ APP 配置报错  spring boot lo4j2多环境配置不起作用 配置报错  bootstrap4中给ul添加类list-inline无效,li不能水平排列:配置报错  Android中shape中的属性大全:配置报错  谁在用cakephp啊 为么我的显示不了正确页面呢:配置报错  solr5.3 配置IK分词器报错 配置报错  Hanlp分词器的停用词无效:配置报错  pom.xml如何配置自定义的测试代码目录? 配置报错  微信后台配置的URL可以使用二级域名吗?:配置报错  mybatis配置问题(已经解决) 配置报错  db.tx的事务回滚问题:配置报错  Ubuntu系统VPS下Nginx配置多域名失败,是否是配置的原因? 配置报错  ADO MFC编程连接数据库出现无效指针 配置报错  nginx重定向配置问题 配置报错 ajax提交数据, 返回类型为json, redirect无效 配置报错  echarts折线图/柱状图横屏显示时,label数值怎么打横显示?:配置报错  php关于ob_start()问题 配置报错  java算法研究,在线等:配置报错  logback配置问题 配置报错  Vmware15 安装后没有出现虚拟网卡,已重装过好几次,还原默认设置也设置过,无效:配置报错  外卖功能中15分钟未支付则自动取消订单 热 配置报错  shiro 注解没起作用 配置报错  请高手指点,spring 配置类中相同类型的template配置问题 配置报错  过年找工作,迷茫了。难道我真的落伍了吗? 配置报错  maven jetty run 多profile配置问题 配置报错  spring3.1,cache的配置问题 配置报错  关于oracle 中delete之后释放空间的问题。:配置报错  请问在windows下,如何实现多主一从,相关配置是怎么配置的:配置报错  Sonar安装配置异常:配置报错  velocity模版文件修改后怎样不用重启tomcat? 配置报错  springboot2.1.0 activemq.pool配置 配置报错  SpringMVC配置jackson后,启动tomcat就报错!在线等!急!! 配置报错 telnet配置中inet.conf下面这行是什么意思? 配置报错  SpringMVC+Hibernate双向一对一关系转换json出现无线递归 配置报错  java 进程 cpu一直占用50%:配置报错  centos6.3 nginx wordpress 安装问题:配置报错  多数据源配置后衍生问题 配置报错 python的easy_install如何使用http proxy方式安装包?:配置报错  这个程序有什么问题?新手一个 配置报错  linux 最大打开文件数配置值 有没有限制:配置报错  Linux下服务器的配置及项目部署 配置报错  Sublime Text2 常用快捷键 配置报错  IKAnalyzer配置了扩展词典不管用呢:配置报错  jquery选择器无效 配置报错  jfinal 加入sqllite如何配置? 配置报错  Ingress traefik配置问题 配置报错  Spring Security框架怎么设置响应为json格式 配置报错  hibernate 查询 多对一的对象 配置报错  grails 怎么配置和调用dubbo服务 配置报错  pyinstaller打包后os.system无效 配置报错  百度离线地图2.0应用中,下载了你给的测试代码,但是基本的地图类型和缩放功能都无效了 配置报错  mybatis配置报错 配置报错  struts配置冲突问题 配置报错  ion-slide-box 两项数据时BUG 配置报错  dwz点击横向菜单的问题 配置报错  Nginx没有办法配置前缀过滤吗? 配置报错  tengine+tomcat 做反向代理,不能保持会话 配置报错  java+flex 交互以及在svn上的配置 配置报错  react-route动态路由,它的子路由路径配置在什么地方? 配置报错  数据库里的数据导不出来了,是不是数据损坏了?:配置报错  nginx 在windows 环境worker_connections 1024的问题咋办配置报错  ECharts 3 图(graph)连线(links)支持特效吗?:配置报错  linux dhcp 冗余这么配置 配置报错  vmware重启后之前的配置都无效了:配置报错  Hudson下面配置任务时git方式的源代码配置怎么配置呢?:配置报错  hibernate4关于getCurrentSession()的事务配置问题:配置报错  SQLServerException 配置报错  请教 IPHONE开发硬件配置要求以及推荐些相关书籍? 配置报错  OSChina 周末服务器故障原因和疑问 配置报错  设置了setTempFolder("c:/temp") 无效 配置报错  Linux环境下怎样去配置安装PHP的环境 配置报错  mysql主从同步配置问题:配置报错  Eclipse 配置Tomcat 的问题 配置报错  hibernate三表配置:配置报错  谁说nginx不支持.htaccess文件?:配置报错  如何用redis存储mysql数据和关联关系? 配置报错  分页接口传入的分页参数页码、页大小小于等于零 配置报错  奇怪的问题,列名无效:配置报错  Spring+hibernate+druid配置报错403.10 禁止访问:配置无效  elasticsearch安装配置:配置报错 jetty嵌入式开发配置问题:配置报错  采用配置的形式,spring mvc 该该怎么实现rest风格的URL?:配置报错  CentOS grub 误修改,如何修复?:配置报错  改了 #postfix# 的 message_size_limit 配置后无法收到邮件:配置报错  getAuthentication() 为何有时为空 有时不为空?空指针异常 配置报错  shiro 动态更新权限配置 配置报错  请问,图中所示的配置界面怎样用Qt实现? 配置报错  关于nginx安装的问题 配置报错  Nginx 配置中 worker_connections 65535 是怎么来的? 配置报错 注意,JFinal使用tomcat时,如果不设置DevMode=true的话会有缓存问题配置报错  更新ORACLE数据库DATE类型的字段时报错 配置报错  tomcat jvm 按照什么比例配置 好 配置报错  关于springboot热部署启动的问题 配置报错  spring 的配置信息 配置报错  bootstrap-treeview 2.1.0 的 uncheckNode 无效! 配置报错  请问一个可配置的web表格 要如何设计 配置报错  SpringCloud配置中心如何支持多个配置文件? 配置报错  Oracle 执行语句问题 配置报错  Apache + JK 如何配置?:配置报错  关于eclipse配置GTK:配置报错  spring-mybatis的多数据源配置 配置报错  uwsgi 配置不成功啊 求救求救:配置报错  Mysql 字符集utf8mb4设置无效 配置报错  Nginx无法轮询 是配置出错了吗:配置报错  hibernate的二级缓存配置报错,代码 配置报错  springboot配置utf8mb4不起作用 配置报错  spirngMVC的配置中view能不能同时配置jsp和html两种 配置报错  setOption对option.dataZoom的start和end好像无效 配置报错  ubuntu作为服务器为何在客户端浏览器不能正常显示视频(HTML5编写)? 配置报错  Dubbox Rest 接口Get请求时参数为对象的时候该如何配置 配置报错  centos 6.2 64位的lamp环境配置 配置报错  关于linux下php权限问题 配置报错  tomcat 7 在项目的/META-INF/context.xml配置数据源不起作用 配置报错  为什么appcan的文件夹下面只有jre,,而没有jdk??? 配置报错  MySQL Cluster的配置优化问题 配置报错  dwz的checkbox全选功能有时有效,有时无效,请问我应该怎么解决? 配置报错  shiro过滤配置 问题在哪 配置报错  spring4.2中如何配置html解析器 403.10 禁止访问:配置报错  eclipse cdt 编译中的一个问题 配置报错  正式环境上面tomcat配置参数修改 配置报错  Struts2整合Spring,Action配置报错,请问什么情况?403.10 禁止访问:配置无效 @OneToMany(mappedBy)的配置问题? 配置报错  关于javascript中callback函数的疑问 配置报错  jfinal关闭控制台输出信息配置该怎么配置? 配置报错  Spring Cache 在同一个类中调用缓存无效? 配置报错  jersey怎么配置log4j.properties 配置报错  Maven3的类冲突问题以及打包删除配置问题 配置报错  请教红薯,为什么onkeypress事件输入中文时不触发事件 配置报错  100元现金奖赏征求算法 热 配置报错  SpringMVC 4 + Hibernate4的Entity自动扫描配置问题? 配置报错  sql 的jdbc怎么配置 配置报错  tomcat配置虚拟目录后启动报错? 配置报错  intellij IDEA软件配置Tomcat的问题 配置报错  如何设置php全局代理? 配置报错  LNMPA,单独配置的问题 热 配置报错  Oracle数据库走索引问题 配置报错  Nexus 搭建私服 配置代理仓库不起效 配置报错  nginx配置网站子域名,该怎么配置??? 配置报错  apache配置多域名后,所有的网站无法打开.. 配置报错  求一个完美的跨域解决方案! 配置报错  AOP在spring的controller里无效的问题 配置报错 koala的防止重复提交要怎么配置:配置报错  配置完数据库后,直接跳转到首页,无法设定管理员:配置报错 Erlang的在Eclipse中的开发环境配置问题求解:配置报错  如何更好的管理系统配置信息 配置报错  关于jqGrid数据排序的问题:配置报错  phonegap push-消息推送实现 配置报错  nginx反向代理丢失端口怎么解决:配置报错  CKfinder上传图片问题:配置报错  SpringCache配置多个cacheManager的问题 配置报错  《Spring4+Hibernate4+proxool配置多数据源实现读写分离》:配置报错  jfinal使用druid怎么配置druid登录权限:配置报错  Resin4.0.24|配置多个应用各自启动独立 配置报错  Flume配置avro sink出现问题 配置报错  php,微信网页授权,配置多个授权文件到指定目录。:配置报错  springcloud获取不到consul刷新后个配置:配置报错  单个cookie的value能存多大的值呢?:配置报错  php打开word文档提示"因为没有打开的文档,所以这一命令无效" 配置报错 chrome有个奇怪的问题 配置报错  java SWT多线程问题 配置报错  logback中设置maxHistory属性无效? 配置报错  个推推送Android问题检测 :配置报错  JFinal关于静态资源的拦截:配置报错 Ehcache使用配置+硬编码实现缓存遇到的问题 配置报错  中文匹配汉字多次失败:配置报错  echache的一个配置的问题 配置报错  各种默认回车提交表单 配置报错  一级以下的节点的target无效。:配置报错  treenode.open无效 配置报错  Ehcache以JGroups方式配置集群的问题:配置报错  mysql分区问题后的效率问题:配置报错 adapter 使用 overridePendingTransition 无效:配置报错  新手配置Maven环境时 :配置报错  Jetty8怎么配置DataSource?在jetty-maven-plugin中:配置报错  win7下IIS配置PHP:配置报错  gcc安装后如何配置,才能使用:配置报错  Duplicate config file paths found:配置报错  Nutz的Ioc配置问题?:配置报错  重装了eclipse,maven出错了,求助:配置报错  如何将一个 mysql 风格的 sql 脚本转换为 oracle 导入的 sql 脚本:配置报错  eclipse报错:android sdk content loader:配置报错  怎么配置数据分析,机器学习的环境,有没有大佬给指点一下:配置报错  请问如何在Interceptor中获取配置(loadPropertyFile)呢?:配置报错  springMVC3.2+velocity1.7一般是怎么配置的呢:配置报错  nginx跳转配置问题:配置报错  请教关于建表的问题,希望大家多少能给个提示,谢谢~:配置报错  关于Druid配置问题:配置报错  JFinal.start()如何用非当前项目的工作目录作为部署目录?:配置报错  勿在 LogBack 的配置中使用相对路径:配置报错  路由配置configRoute出问题了 - 配置报错 thinker-md不支持表格么? -配置报错 RedisScheduler中层级关系setPriority无效? - 配置报错 jradius配置 - 配置报错 rhel 6 ldap server 的配置-配置报错 DWZ表单提交验证无效 - 配置报错 IBatis sqlMap resource配置路径问题-配置报错 网页视频播放使用流媒体应该怎么配置? - 配置报错 如何在AIX 6.1系统上安装 net-snmp 5.7.2,并配置使用 - 配置报错 配置工程的环境--error C2039: 'Packet' - 配置报错 微信公众账号服务器配置-配置报错 微信关注页菜单配置问题 - 配置报错 折线图data级itemStyle设置无效的问题。-配置报错 配置问题,登录不进去 - 配置报错 配置虚拟目录(Apache) - 配置报错 coreseek的同义词配置怎么无效啊?急急急!-配置报错 Ceph可以配置单副本吗 - 配置报错 javaweb和php环境配置问题 - 配置报错 使用eclipse Luna配置PHP servers,配置不正确显示“此程序无法显示网页-配置报错 playFrameWork的数据库在applicaiton.conf中配置 - 配置报错 Struts2整合Spring,Action配置报错,请问什么情况? - java报错 Symfony2 Demo配置失败 - 配置报错 Spring+hibernate+druid配置报错 - java报错
问答
程序员
2020-06-11
Java+MyEclipse+Tomcat (四)Servlet提交表单和数据库操作
        前面三篇文章讲述了如何配置MyEclipse和Tomcat开发JSP网站、如何配置Servlet简单实现表单提交、如何配置MySQL实现JSP数据库查询。        这篇文章主要讲述Servlet表单的提交、Java中实现数据库的查询操作和自己遇到的瓶颈及理解。Java Web基础性文章,希望对大家有所帮助~        Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门        Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交         Java+MyEclipse+Tomcat (三)配置MySQL及查询数据显示在JSP网页中         两个项目的免费下载地址(希望对你有所帮助):         http://download.csdn.net/detail/eastmount/8701707 一. Servlet表单提交         新建Web Project,项目名称为TestServlet01。项目结构如下图所示:         然后修改index.jsp代码如下:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <style> body, div, td, input {font-size:18px; margin:0px; } .line {margin:2px; } </style> </head> <body> <form action="/TestServlet01/servlet/PostServlet" method="POST"> <div align="center"> <br/> <fieldset style='width:60%'> <legend>填写用户信息</legend> <br/> <div class='line'> <div align="left">出发地: <input type="text" id="start" name="start" style='font-size:18px' width=200/> </div> </div> <div class='line'> <div align="left">到达地: <input type="text" id="end" name="end" style='font-size:18px'/> </div> </div> <div class='line'> <br /> <div align="left">请选择性别: <input type="radio" name="sex" value="男" id="sexMale"> <label for="sexMale">男</label> <input type="radio" name="sex" value="女" id="sexFemale"> <label for="sexFemale">女</label> </div> </div> <div class='line'> <div align="left">请选择您的爱好: <input type="checkbox" name="interesting" value="音乐" id="i1"> <label for="i1">音乐</label> <input type="checkbox" name="interesting" value="旅游" id="i2"> <label for="i2">旅游</label> <input type="checkbox" name="interesting" value="运动" id="i3"> <label for="i3">运动</label> </div> </div> <div class='line'> <div align="left">请选择车票类型: <select name="seat"> <option>---请选择乘坐类型---</option> <optgroup label="卧铺"> <option value="上铺">上铺</option> <option value="中铺">中铺</option> <option value="下铺">下铺</option> </optgroup> <optgroup label="其他"> <option value="硬座">硬座</option> <option value="软座">软座</option> <option value="站票">站票</option> </optgroup> </select> </div> </div> <div class='line'> <br /> <div align="left" class='leftDiv'>备注信息:</div> <div align="left" class='rightDiv'> <textarea name="description" rows="8" style="width:300px; ">请填写备注信息... </textarea> </div> </div> <div class='line'> <div align="left"> <br/><input type="submit" name="Select" value="提交信息" style='font-size:18px'/><br/> </div> </div> </fieldset> </div> </form> </body> </html>         运行效果如下图所示:         核心代码:         <form action="/TestServlet01/servlet/PostServlet" method="POST">             出发地:<input type="text" id="start" name="start" style='font-size:18px'/>             <input type="submit" name="Select" value="提交信息"/>         </form>         然后再src中右键添加Package,包名为servlet;再添加Servlet文件,文件名PostServlet.java。选择图标。前面文章讲述过Servlet的手动配置过程,包括servlet类、映射等,现在它自动生成的WebRoot/WEB-INF/web.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>PostServlet</servlet-name> <servlet-class>servlet.PostServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>PostServlet</servlet-name> <url-pattern>/servlet/PostServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>         同时修改src/servlet/PostServlet.java文件,采用POST方法显示表单数据:package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class PostServlet extends HttpServlet { public PostServlet() { super(); } public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the GET method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); //设置输出编码 request.setCharacterEncoding("UTF-8"); String startName = request.getParameter("start"); //获取出发地 String endName = request.getParameter("end"); //获取到达地 String sex = request.getParameter("sex"); //获取性别 String [] interest = request.getParameterValues("interesting"); //获取兴趣 String seat = request.getParameter("seat"); //获取座位 String info = request.getParameter("description"); //获取备注信息 response.setContentType("text/html"); //设置输出类型 PrintWriter out = response.getWriter(); //获取out对象 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.println("<H2>出发地:"+ startName +"</H2>"); out.println("<H2>到达地:"+ endName +"</H2>"); out.println("<H2>性别:"+ sex +"</H2>"); out.println("<H2>兴趣"); for(String str:interest) { out.println(str+" "); } out.println("</H2><H2>座位类型:"+ seat +"</H2>"); out.println("<H2>备注信息:"+ info +"</H2>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { // Put your code here } }         运行效果如下图所示:          二. Servlet数据库查询         还是使用上面的项目进行修改,实现Servlet数据库查询操作。数据库配置可以参照上一篇博客配置MySQL的过程,我新建数据库test01,插入表Train,表中数据如下图:         然后修改index.jsp,代码如下:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <style> body, div, td, input {font-size:18px; margin:0px; } .line {margin:2px; } </style> </head> <body> <form action="/TestServlet01/servlet/PostServlet" method="POST"> <div align="center"> <br/> <fieldset style='width:60%'> <legend>填写用户信息</legend> <br/> <div class='line'> <div align="left">出发地: <input type="text" id="start" name="start" style='font-size:18px' width=200/> </div> </div> <div class='line'> <div align="left"> <br/><input type="submit" name="Select" value="提交信息" style='font-size:18px'/><br/> </div> </div> </fieldset> </div> </form> </body> </html>         修改的PostServlet.java代码如下: package servlet; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class PostServlet extends HttpServlet { //自定义变量 private Connection connection = null; //定义数据库连接对象 private String driverName = "com.mysql.jdbc.Driver"; //数据库驱动器 private String userName = "root"; //数据库用户名 private String userPasswd = "123456"; //密码 private String dbName = "test01"; //数据库名称 private String tableName = "Train"; //表明 //连接字符串 数据库地址URL MySQL数据库端口3306 private String url = "jdbc:mysql://localhost:3306/" + dbName + "?user=" + userName + "&password=" + userPasswd; //初始化方法 public void init(ServletConfig config) throws ServletException { super.init(config); } public PostServlet() { super(); } //处理GET请求方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); //设置输出编码 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); //设置输出类型 PrintWriter out = response.getWriter(); //获取out对象 try { //数据库操作 Class.forName(driverName).newInstance(); connection = DriverManager.getConnection(url); Statement statement = connection.createStatement(); String startName = request.getParameter("start"); //获取出发地 //注意:startName需要加单引号 否则报错 ——错误:Unknown column 'BeiJing' in 'where clause' String sql = "SELECT * FROM " + tableName +" WHERE startname='" + startName+"';"; if(startName=="") { sql = "SELECT * FROM " + tableName; } ResultSet rs = statement.executeQuery(sql); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.println(" <fieldset style='width:60%' ><legend>搜索结果</legend><br />"); out.println(" <TABLE align='center'border='1' cellspacing='1' cellpadding='1'>"); out.println(" <TR><TH>车号</TH><TH>出发地</TH><TH>到达地</TH></TR>"); //循环输出查询结果 while(rs.next()) { out.println(" <TR><TD>" + rs.getString(1) + "</TD>"); out.println(" <TD>" + rs.getString(2) + "</TD>"); out.println(" <TD>" + rs.getString(3) + "</TD></TR>"); } out.println(" </TABLE>"); out.println(" </fieldset>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); rs.close(); // 关闭记录集 statement.close(); // 关闭声明 } catch(Exception e) { System.out.println("错误:"+e.getMessage()); response.sendRedirect("index.jsp"); } } //处理POST请求方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } //销毁方法 public void destroy() { super.destroy(); // Just puts "destroy" string in log try { connection.close(); // 关闭连接对象 }catch(Exception e) { System.out.println("关闭数据库错误:"+e.getMessage()); } } }         同时WebRoot/WEB-INF/web.xml文件Servlet映射都没有变化,需要在WebRoot/WEB-INF/lib中添加mysql-connector-java-5.1.15-bin.jar,否则会报错“com.mysql.jdbc.Driver错误”。         运行效果如下图所示:         写到此处我产生了一个疑问,当表单提交信息时,获取数据库的结果有两种方法:        1.第一种是上一篇博客中写到的,在JSP中通过<% ....%>调用Java代码实现连接数据库,获取MySQL表中数据并显示;         2.第二种就是这篇博客中写到的,在JSP中通过Post方法提交表单Form,在Java中通过Servlet获取请求/响应,再通过Java中out.println("<HTML>...")输出数据库中值。         就这两种方法而言,我想实现的功能是:JSP就赋值布局,显示界面;Java就负责连接数据库、数据库增删改查,处理结果再返回给JSP中显示,而不是相互嵌套的。换句话说:JSP中点击“提交”按钮,TextBox中传递出发地,Java中介绍请求,数据库查询,得到的结果再返回给JSP中显示。         那怎么实现呢?后面的文章可能会讲到。         DAO和Java Bean是对JDBC进行分层、模块化的最有效两个方法。DAO(数据库操作对象,Database Access Object)是JDBC下常用模式,DAO出现之前,操作数据库的代码与业务代码都出现在Servlet或者JSP中,不利用业务代码的分离。DAO出现后,所有与数据库相关的操作全被拿到了DAO层实现,Servlet或JSP只操作Java Bean或者DAP层,而DAO层值操作数据库。         PS:非常高兴我自己通过实际项目找到了这个难点,然后又找到了解决方法。虽然才学习Java Web一周时间,还是学到很多东西的。个人感觉DAO类似于中间件的东西吧!最后希望文章对你有所帮助,这篇文章是讲述Servlet连接MySQL数据库及表单交互之间的知识。如果文章有不足或错误的地方,还请海涵!下一篇文章讲讲Session和一个典型简单的界面布局等相关知识吧!        (By:Eastmount 2015-5-15 半夜1点   http://blog.csdn.net/eastmount/)
文章
Java  ·  关系型数据库  ·  MySQL  ·  数据库  ·  数据格式
2015-05-15
软件技术专业-就业提示(三、Java工程师必备技能)
基本信息:(略)开发技能:Java基础扎实,理解并能使用Java 多线程及线程池,集合框架,IO类库等,良好的编程习惯熟悉主流Spring、Spring cloud、SpringBoot、SpringMVC、MyBatis等框架,快速上手新型框架熟练使用Oracle、MySQL关系型数据库熟悉利用redis来实现的缓存、分布式锁、分布式session、前后端分离、页面静态化、秒杀优化等技术熟悉dubbo+zookeeper(分布式服务框架)、webService、HttpClient远程服务调用技术熟悉rabbitMq消息队列熟练使用Eclipse,MyEclipse做Junit单元测试熟练的优化能力(代码优化、业务优化、sql优化等)熟练使用tomcat服务器、SVN版本管理工具、Maven项目构建工具、FindBugs项目管理工具熟练使用js、jQuery、ECharts等前台集成UI框架技术掌握编写接口文档和接口开发具有一定的开发小组管理经验、能够完成公共组件的封装熟悉linux常用命令、redis服务部署、RabbitMQ的安装、MySQL数据库的安装使用了解nginx 底层知识: 1. Java SE,就是java基础、JDK的类库,很多童鞋都会说,JDK我懂,但是懂还不足够,知其然还要知其所以然,JDK的源代码写的非常好,要经常查看,对使用频繁的类,比如String,集合类(List,Map,Set)等数据结构要知道它们的实现,不同的集合类有什么区别,然后才能知道在一个具体的场合下使用哪个集合类更适合、更高效,这些内容直接看源代码就OK了。2. 其他一些有名的用的比较多的开源框架和包,Netty网络框架,Apache common的N多包,Google的Guava等等,也可以经常去Github上找一些代码看看。3. .多线程并发编程,现在并发几乎是写服务端程序必须的技术,那对Java中的多线程就要有足够的熟悉,包括对象锁机制、synchronized关键字,concurrent包都要非常熟悉。4. JVM的一些知识,不需要熟悉,但是需要了解,这是Java的本质,可以说是Java的母体, 了解之后眼界会更宽阔,比如Java内存模型(会对理解Java锁、多线程有帮助)、字节码、JVM的模型、各种垃圾收集器以及选择、JVM的执行参数(优化JVM)等等。5. 一些常用的设计模式,比如单例、模板方法、代理、适配器等等,以及在Java SE和一些Java框架里的具体场景的实现,这个可能需要慢慢积累,先了解有哪些使用场景,见得多了,自己就自然而然会去用。6.I/O,Socket编程,首先要熟悉Java中Socket编程,以及I/O包,再深入下去就是Java NIO,再深入下去是操作系统底层的Socket实现,了解Windows和Linux中是怎么实现socket的。7. Javaweb开发的框架,比如Spring、iBatis等框架,同样他们的原理才是最重要的,至少要知道他们的大致原理。8. 常用数据库(Oracle、MySQL等)、SQL语句以及一般的优化。项目经验:(Demo)项目经历:项目一:2017.02-至今 ****湖北网上营业厅软件环境: Struts2+Spring + Mybatis + duboo + zookeeper + nginx + weblogic开发工具: Eclipse + Oracle+ Tomcat8.0 + JDK1.8 + SVN + Ant责任描述: 主要参与湖北移动天猫对账重构;网厅在线号卡销售流程技术方案选型与设计开发,订单管理,数据库优化以及相关文档编写;融合家庭宽带充值缴费重构优化;京东物流系统开发对接;带领新人等项目描述: 本项目为一个网上购物平台,包含前台购物平台,我的移动平台,后台管理系统。前端网站主要是一个形成订单的过程,涉及了选号,套餐,流量专区,宽带专区,增值业务,手机以及智能硬件,其中选号与宽带专区为移动首推重点业务;前台购物平台主要是一个形成订单的过程,涵盖首页的产品导航展示,充值缴费,产品的订购。我的移动平台主要包括个人信息,花费账单,套餐使用量,增值业务,上网日志,历史记录,我的宽带等;后台管理模块主要包括权限模块,产品配置,问题处理中心,订单管理模块(派单,审批,流转等功能)等  
文章
NoSQL  ·  Java  ·  关系型数据库  ·  MySQL  ·  应用服务中间件  ·  数据库连接  ·  数据库  ·  Redis  ·  Spring  ·  mybatis
2022-01-13
如何写好简历呢
简历该如何写好,也是很关键的,下面是一个模版,也不知道怎么样,在智联招聘上看到的,拿来参考一下。   简历模板:Java工程师 智联招聘      姓名   性别 | 婚姻状况 | 出生日期 | 户口 | 现居住地*年工作经验 | 政治面貌 | 身份证: 152**************通讯地址 158010*****(手机) | *********(座机)E-mail: ****@**.com   求职意向 期望工作性质: 全职 期望从事职业:   期望从事行业:   期望工作地区: 北京 期望月薪: 4001-6000元/月 目前状况: 我目前处于离职状态,可立即上岗 批注:建议将期望从事职业或者行业等填选信息填写完整,这样HR在搜索简历时才会更容易搜索到与招聘职位匹配度较高的你的简历。 自我评价 无 批注:这里应该有一个自我评价,让HR对求职者有一个初步印象。 工作经历 项目经验:   项目名称:xxxx有限公司生产管理信息系统   开发环境:struts2+hibernate+spring   开发工具:sql server 2000,MyEclipse、ireport、tomcat   项目描述:公司内部软件,实现了整个化工厂的生产流程操作、员工的管理、报表的导出、文件的上传下载、用户权限控制,提高了工作效率。   责任描述:参与部分模块的设计、报表设计、编码工作和用户手册的编写   1.工艺员模块:实现了增删查改等功能和文件上传、下载、报表导出   2.下游客户模块:实现了增删查改、报表导出等功能   3.对外函件汇总:实现了增删查改等功能和文件上传、下载、报表导出   4.设备管理:实现了配件储备定额一览表中的增删查改、报表导出   5.质检管理:实现了中控分析报告单中的增删查改、报表导出   6.还有就是其他模块中的一些后期修改   项目总结:通过这个项目的开发,对S2SH有了更深一层的认识。同时也学习了部分Ajax的应用,增强了团队意识和协调能力。也认识到学习的重要性,软件行业技术更新的很快,每天都要去努力的学习新知识。 个人经历:   2009学年-至今作为09届计科2班班主任助理,帮助班主任与班级学生交流。   2008-2009学年担任班长,帮助班主任与班级同学交流,组织了班里同学XX地出游和XX地的出游,个人组织能力、团队意识和沟通能力得到很大提升。   2008-2009学年在学生处助学信贷科勤工俭学,负责学生贷款材料和申请奖助学金材料的核查,整理分析数据和分发材料,有责任心和吃苦耐劳精神。   2008-2009学年组队参加了xxxx大学第一届编程大赛,并进入决赛。   批注:   1.工作描述细化不是指篇幅长,内容多,而是细化到求职者的具体工作内容和绩效,目前简历中描述的各个模块的功能是个人完成的还是团队工作成果不清楚。   2.“个人经历”就不是简历中一个合适的模块名称,因为简历其实就是个人经历的一个另外说法,怎么会在简历中再存在一个个人经历呢?应该是“社会实践”之类的名称更合适。   3.第一、二条中“帮助班主任与班级学生交流”“组织了班里同学XX地出游和XX地出游”语法存在错误,“帮助……交流”本身就不是一个正确的搭配,第二句也有不通顺的地方,简历中语言虽然不需要华丽,但是也不能有明显语法错误,毕竟是母语简历,这样有些说不过去。 教育经历 2007/09—至今: xxxx大学信息学院 计算机科学与技术   将于2011年6月获工科学士学位 语言能力 英语: 读写能力好 专业技能   IT技能   熟练掌握JAVA面向对象编程语言,有良好的编码习惯;   熟练使用HTML,并了解Ajax   熟练使用jsp、servlet、JavaBean进行web应用开发;   熟练掌握Struts2、Hibernate、Spring等开源框架技术,并能够用Struts2.0+Hibernate+Spring进行大型项目的开发;   熟练操作MS SQL SERVER、MySQL数据库,了解Oracle数据库,熟悉SQL语句;   能够熟练运用Eclipse和myEclipse等开发工具   英语技能四级2008.12通过六级2009.06通过   批注:   1.专业技能中最好能按照熟练的程度降序排列,把最擅长的放到最前面,这样方便HR了解你的技能方向,与职位要求做对比。   2.英语技能中通过了六级就不需要说明四级了。
文章
SQL  ·  Java  ·  BI
2013-04-14
SSH框架结构分析
    分类: 工作问题2012-03-29 18:10 1511人阅读 评论(0) 收藏 举报 框架sshhibernatespringstrutsdao 最近在弄j2ee,发现还是学到了很多东西,心情happy啊!昨天看到了一个文章是关于ssh的,就弄下来了,后面加点自己的东西,很感谢网上的各位前辈的总结。一个spring2.5+hibernate3.2+struts2.0组合框架,使用spring的IoC来管理应用的所有bean,包括struts2的action,充分发挥了spring轻量级框架的优势。 摘 要:针对当前Web应用程序开发面临的问题,结合目前比较流行的开源框架Spring、Struts和Hibernate,提出了一种开发J2EE Web应用的轻量级解决方案,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。并且,通过案例具体说明了如何将这一方案应用到实际项目中。关键词:J2EE  MVC  Struts  Spring  Hibernate     大型企业级Web应用系统的开发通常要求有一个良好的软件架构、便于协作开发和扩展升级,而传统的开发模式不能很好地满足这些要求。本文针对当前Web应用程序开发面临的问题,结合目前比较流行的开源框架SSH(Spring、Struts、Hibernate),提出一种开发J2EE 企业级Web应用的轻量级解决方案,并通过案例具体说明如何将这一方案应用到实际项目中。1 框架技术    著名的软件大师Ralph Johnson对框架(Framework)进行了如下的定义: 框架是整个系统或系统的一部分的可重用设计,由一组抽象的类及其实例间的相互作用方式组成[1]。    框架一般具有即插即用的可重用性、成熟的稳定性以及良好的团队协作性。J2EE复杂的多层结构决定了大型的J2EE项目需要运用框架和设计模式来控制软件质量。目前,市场上出现了一些商业的、开源的基于J2EE的应用框架,其中主流的框架技术有:基于MVC模式的Struts框架和基于IoC模式的Spring框架以及对象/关系映射框架Hibernate等。1.1  表示层框架Struts     Struts是一个在JSP Model2基础上实现的MVC框架,主要分为模型(Model)、视图(Viewer)和控制器(Controller)三部分,其主要的设计理念是通过控制器将表现逻辑和业务逻辑解耦,以提高系统的可维护性、可扩展性和可重用性[2]。Struts框架的体系结构如图1所示。      图一   下面就图1所示的体系结构图分析Struts框架中的MVC组件。    (1)视图:视图部分主要由JSP页面组成,其中没有流程逻辑、业务逻辑和模型信息,只有标记。Struts自身包含了一组标记库(TagLib),这也是Struts的精华之一,灵活运用它们可以简化JSP页面的代码,提高开发效率。    (2)控制器:Struts中的Controller主要是其自身提供的ActionServlet。ActionServlet接收所有来自客户端的请求并根据配置文件(struts-config.xml)中的定义将控制转移到适当的Action对象。    (3)模型:Struts没有定义具体Model层的实现,Model层通常是和业务逻辑紧密相关的,有持续化的要求。目前在商业领域和开源世界,都有一些优秀的工具可以为Model层的开发提供便利。1.2  业务逻辑层框架Spring    Spring是一个解决了许多J2EE开发中常见问题并能够替代EJB技术的强大的轻量级框架。这里所说的轻量级指的是Spring框架本身,而不是指Spring只能用于轻量级的应用开发。Spring的轻盈体现在其框架本身的基础结构以及对其他应用工具的支持和装配能力。与EJB这种庞然大物相比,Spring可使程序研发人员把各个技术层次之间的风险降低。    Spring框架的核心是控制翻转IoC(Inversion of Control)/依赖注入DI(Dependence Injection)机制。IoC是指由容器中控制组件之间的关系(这里,容器是指为组件提供特定服务和技术支持的一个标准化的运行时的环境)而非传统实现中由程序代码直接操控,这种将控制权由程序代码到外部容器的转移,称为“翻转”[3]。DI是对IoC更形象的解释,即由容器在运行期间动态地将依赖关系(如构造参数、构造对象或接口)注入到组件之中[3]。Spring采用设值注入(使用Setter方法实现依赖)和构造子注入(在构造方法中实现依赖)的机制,通过配置文件管理组建的协作对象,创建可以构造组件的IoC容器。这样,不需要编写工厂模式、单例模式或者其他构造的方法,就可以通过容器直接获取所需的业务组件。Spring框架的结构如图2所示。           图2   Spring框架由七个定义明确的模块组成,且每个模块或组件都可以单独存在,或者与其他一个或多个模块联合实现。Spring Core Container是一个用来管理业务组件的IoC容器,是Spring应用的核心;Spring DAO和Spring ORM不仅提供数据访问的抽象模块,还集成了对Hibernate、JDO和iBatis等流行的对象关系映射框架的支持模块,并且提供了缓冲连接池、事务处理等重要的服务功能,保证了系统的性能和数据的完整性;Sprnig Web模块提供了Web应用的一些抽象封装,可以将Struts、Webwork等Web框架与Spring整合成为适用于自己的解决方案。    Spring框架可以成为企业级应用程序一站式的解决方案,同时它也是模块化的框架,允许开发人员自由地挑选适合自己应用的模块进行开发。Spring框架式是一个松耦合的框架,框架的部分耦合度被设计为最小,在各个层次上具体选用哪个框架取决于开发者的需要。1.3 数据持久层框架Hibernate    O/R mapping技术是为了解决关系型数据库和面向对象的程序设计之间不匹配的矛盾而产生的。Hibernate是目前最为流行的O/R mapping框架,它在关系型数据库和Java对象之间做了一个自动映射,使得程序员可以以非常简单的方式实现对数据库的操作。Hibernate工作原理如图3所示。                          图3   Hibernate通过对JDBC的封装,向程序员屏蔽了底层的数据库操作,使程序员专注于OO程序的开发,有助于提高开发效率。程序员访问数据库所需要做的就是为持久化对象编制xml映射文件[4]。    底层数据库的改变只需要简单地更改初始化配置文件(hibernate.cfg.xml或者hibernate.properties)即可,不会对应用程序产生影响。     Hibernate有自己的面向对象的查询语言HQL,HQL功能强大,支持目前大部分主流的数据库,如Oracle、DB2、MySQL、Microsoft SQL Server等,是目前应用最广泛的O/R映射工具。Hibernate为快速开发应用程序提供了底层的支持。2 基于SSH组合框架的Web应用模型设计与实现2.1 集成SSH的新型J2EE框架  前面分析了基于J2EE的三种框架技术,下面通过集成以上三种框架技术来对传统的J2EE Web开发模型加以改进,以形成一种新的、轻量型的J2EE架构。  集成SSH框架的系统框架图如图4所示,系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,利用Hibernate框架对持久层提供支持,业务层用Spring支持。具体做法是:用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的Java对象,然后编写基本的DAO接口,并给出Hibernate的DAO实现,采用Hibernate架构实现的DAO类来实现Java类与数据库之间的转换和访问,最后由Spring完成业务逻辑。       图四   系统的基本业务流程是: 在表示层中,首先通过JSP页面实现交互界面,负责传送请求(Request)和接收响应(Response),然后Struts根据配置文件(struts-config.xml)将ActionServlet接收到的Request委派给相应的Action处理。在业务层中,管理服务组件的Spring IoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。而在持久层中,则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。  采用上述开发模型,不仅实现了视图、控制器与模型的彻底分离,而且还实现了业务逻辑层与持久层的分离。这样无论前端如何变化,模型层只需很少的改动,并且数据库的变化也不会对前端有所影响,大大提高了系统的可复用性。而且由于不同层之间耦合度小,有利于团队成员并行工作,大大提高了开发效率。2.2 基于SSH框架的Web应用系统的实现  下面将通过一个实际的系统来展示如何进行基于SSH框架的Web应用开发。该系统是为某通信公司运营部开发的一个问答式系统,功能类似于百度知道和新浪爱问。由于系统的模块较多,下面就以一个用户管理模块为例来说明系统的开发实现过程,并将按照数据持久层、业务逻辑层、表示层的顺序说明系统构建过程。  (1)数据持久层  数据持久层由Java对象持久化类和数据访问对象(DAO)组成。每个数据库表都对应着一个持久化对象,这样就给予了开发者使用OO思想设计和开发的便利,同时也屏蔽了具体的数据库和具体的数据表、字段,消除了对数据库操作的硬编码在重用性上的弊端。用户信息表的部分结构如表1所   Hibernate通过映射(Mapping)文件将对象(Object)与关系型数据(Relational)相关联,因此需要编写和数据库表相对应的Java持久化类以及对应的映射文件。有了Java持久化类后就可以在此基础上实现数据访问类。在Spring框架中,数据访问类可以从辅助类HibernateDaoSupport继承,这极大地方便了Hibernate框架在Spring中的使用,相应的部分代码如下:      public class UserDao           extends HibernateDaoSupport {      public int add(User user) {        return Integer.ParseInt(this.getHibernateTemplate().save(user).toString());      }      public List findAll() {        return this.getHibernateTemplate().loadAll(User.class);      }      }  具体的Hibernate数据源、session工厂、事务管理、缓冲连接池等功能都由业务层的Spring容器提供。  (2)业务逻辑层  业务逻辑层由Spring框架支持,提供了处理业务逻辑的服务组件。开发者需要对业务对象建模,抽象出业务模型并封装在Model组件中。由于数据持久层实现了Java持久化类并且封装了数据访问对象(DAO),因此可以在Model组件中方便地调用DAO组件来存取数据。Spring的IoC容器负责统一管理Model组件和DAO组件以及Spring所提供的事务处理、缓冲连接池等服务组件。  在用户管理模块中,通过业务建模创建了用户模型UserService类,封装了对用户的权限管理以及积分管理等功能。UserService类通过调用数据访问类UserDao实现对用户数据的操作。这些组件的关系将通过配置Spring框架的applicationContext.xml联系起来,配置文件的主要内容如下:     (3)表示层     表示层结合JSP和Struts的TagLib库处理显示功能,利用ActionServlet将请求(*.do)映射到相应的Action,并由Action调用业务逻辑的服务组件,然后根据处理结果跳转到Forword对象指定的响应页面。     业务流程的部署由struts-config.xml完成。下面以一个显示所有用户信息的请求(ListUser.do)为例来说明配置文件的使用。    基于J2EE的Web应用以其层次性、平台无关性的优势已经逐渐成为了电子商务、电子政务主要的解决方案。本文针对传统的J2EE Web应用开发的弊端,提出了一种利用轻量级框架来快速搭建Web应用的解决方案,并且通过其在实际项目中的应用,证明了采用此方案可以帮助开发人员在短时间内建立结构清晰、可重用性好、维护扩展方便的Web应用程序。   参考文献[1]  GAMMA E, HELM R, JOHNSON R, et al. Design patterns:Elements of reusable object-oriented software[M]. Addison  Wesley, 1994.[2]  孙卫琴.精通Struts:基于MVC的Java Web设计与开发[M]. 北京:电子工业出版社,2004.[3]  JOHNSON R, HOELLER J, ARENDSEN A, et al. Java/J2EE application framework reference document. V1.1.2004.[4]  徐长盛,戴超.一种快速开发Web应用程序方法的研究[J]. 计算机工程与设计,2004,(12):2237-2239.[5]  夏昕,曹晓钢,唐勇.深入浅出Hibernate[M]. 北京:电子工业出版社,2005.[6]  JOHNSON R.Expert one-on-one J2EE design and development[M]. 魏海萍译.北京:电子工业出版社,2003. 在用ssh开发web应用时,需要对生成的各个类文件进行组织,下面就对一个可行的目录方案进行介绍: 譬如应用中有一个用户管理模块,则在公共包下建立一个user包,如该公共包可以为com.simon.oa, 在user包下包括如下子包 1、controler包 该包放置各种struts的action。 2、dao包 该包放置各类dao(data access object),也就是放置对数据库访问的实现类,在用myeclipse中的“Hibernate Reverse Engineering”进行反向操作时在某一个目录中就会生成对应某个表的DAO,生成后可将该DAO拖到dao包中。在某些应用中将DAO作为接口,在该接口中包括所有对数据库的操作方法,然后在dao包建立一个hibernate包,在hibernate包中放置对DAO接口的实现,譬如:UserDAO接口有一个实现类为UserDaoImpl,将该类放置到hibernate包中,实际的开发倾向于后一种方式,因为对这个DAO接口可以实现spring的IoC操作。(不知道myeclipse对此是怎么考虑的,这个问题让我纠缠了很久,误将DAO理解成一个能够进行实际操作的类,而不是一个接口,以后开发要注意) 3、model包 该包中放置hibernate反向工程生成的bean和该bean对应的.hbm.xml文件。 4、service包 该包放置业务操作类,譬如用户服务类,一般情况将该用户操作类提取一个接口,然后在service包下生成一个impl包,在impl包中才放置用户操作接口的实现类。该用户接口实现类中调用DAO接口对数据库进行操作,而调用该实现类的方法在struts的action中。 5、vo包(value object) vo包中的中包括struts中使用的POJO及actionform等信息。 VO:  Value ObjectDTO: Data Transfer Object个人理解VO和DTO是类似的东西,原则上VO和DTO只有Public Fields,主要用于进程之间数据传递的问题,VO和DTO不会传递到表示层,在业务层就会被吸收。但看到很多人在建立VO和DTO时,也含有Setter,Getter属性和一些其它的辅助方法,这也无可厚非,我自己也不能确定这对不对。
文章
Java  ·  数据库  ·  容器  ·  Spring  ·  数据库连接  ·  开发框架  ·  网络安全  ·  前端开发  ·  关系型数据库  ·  程序员
2014-12-17
跳转至:
开发与运维
5252 人关注 | 125986 讨论 | 203955 内容
+ 订阅
  • ECS使用体验
  • ESC使用体验
  • 接口测试平台代码实现106:登录态接口-2
查看更多 >
数据库
249377 人关注 | 44651 讨论 | 63138 内容
+ 订阅
  • 接口测试平台代码实现105:登录态接口
  • 大数据平台后端一些开发规范
  • ECS使用体验
查看更多 >
大数据
184564 人关注 | 23199 讨论 | 57462 内容
+ 订阅
  • 大数据平台后端一些开发规范
  • 从0到1搭建大数据平台之数据存储
  • 双链笔记软件 Roam Edit 的优点、缺点、评价及学习资源
查看更多 >
微服务
22837 人关注 | 9967 讨论 | 22152 内容
+ 订阅
  • ECS使用体验
  • 07HandlerMapping中用到的RequestMappingInfo和RequestCondition
  • 05DispatcherServlet的初始化策略
查看更多 >
安全
1063 人关注 | 23293 讨论 | 56608 内容
+ 订阅
  • 云服务器的体验过程和感受
  • 接口测试平台代码实现105:登录态接口
  • ECS使用体验
查看更多 >