布布开罗发现动物公园布局做百度百科不付钱,当骗子?

使用SSH这类框架就真的很好么?该如何处理_读书人
使用SSH这类框架就真的很好么?该如何处理
&来源:读书人网&【读书人网():综合教育门户网站】
使用SSH这类框架就真的很好么??现在好像是个J2EE Web程序都要用到这种东东,不管什么样的系统设计都要用上S
使用SSH这类框架就真的很好么??现在好像是个J2EE Web程序都要用到这种东东,不管什么样的系统设计都要用上Struts+Spring+Hibernate好像成了标准的公式 -_-|||,我想问问大家,大家做了这么多年Web系统,真正可复用、需要解偶合的模块真的很多么??XML配置文件泛滥,界面没特点,不够灵活(受框架特点限制),反而我感觉用最普通的HTML(JSP)+JavaBean+jQuery开发要方便、简单的多,来的直接(可能我的项目太小),分工也明确美工直接设计界面,想怎么做就怎么做,怎么表现那是美工和客户的事设计人员根据务业要求,设计服务接口(都有那些服务,接收什么数据,抛出什么数据)java程序员实现对应接口javaScript程序员实现界面和接口服务的整合我说说我对框架的选择过程(可能我接触的项目小,我只说我的这种情况):一开始我用的是Struts,没用多常时间,太死板,发现JSF好像要比Struts要好一些,换了JSF,后来JSF也不灵活,太麻烦,后来发现yui-ext框架,发现很Cool,确定了html(yui-ext)+json+DWR+JavaBean这种开发模式,不过开发了一套系统后,感觉ext更麻烦!json数据格式要求太多,不通用,最后发现 html(jsp)+jQuery+json+JavaBean这种模式最好,最灵活这样的好处是:1.大家想用什么开发工具没有限制(现在我们组有用Netbean也有用Eclipse的还有用DW之类的);2.分工明确,成员要求学习掌握的东西最少,相互不冲突;3.以后的维护、二次开发对技术人员的要求也最少,可大大降低人力成本;4.学习了解系统结构最简单,不需要看配置文件等,清晰明了,培训成本低;5.界面可以做的很漂亮,表现形式不会千篇一律大家感觉呢,我感觉要比SSH这种类型的开发好很多?欢迎拍砖[解决办法]那种开发方法适合你那种就是最好了。&&5.界面可以做的很漂亮,表现形式不会千篇一律这个观点就是扯淡。完全一帮没有思想的人再垒代码。[解决办法]根据项目的情况来。SSh 轻量级开发,使用简单原始的 Java 对象(POJO)编程。在业务领域,轻量级开发节省时间和金钱。EJB 的重量级面向组件模型。& 各有各的的好处,不能一概而论。[解决办法]老实说 适应业务的需求最重要 至于框架你爱用不用, 反正辛苦的是后期维护。[解决办法]文盲路过……[解决办法]哪个也没有限制你用什么工具,想用什么就把那一堆jar包拷过去,你们组的这种方式,也就是开发时候玩玩,后期够你们受的[解决办法]这就和讨论java EE 开发为什么要分层一样。你把所有代码都写到JSP里不是更简单,用什么框架不重要,主要是看它能不能给你带来效益。[解决办法]分层啊~挺好的!挺方便的![解决办法]原来是95在谈JAVA....不管是STRUTS还是融汇了WEBWORK的STRUTS2, 我都没有在正式项目中用过..只属于那种没有吃过肉却看见跑那种...其实偶就不是JAVA程序员...偶本想说是路过打酱油地...[解决办法]从来没真正写过Web应用,就不发表意见了,仍然忍不住想说几句[解决办法]Spring的AOP是有价值的。[解决办法]存在即是理由哇~~~LZ会明白滴~~~[解决办法]9总 文员叫你回家吃饭[解决办法]到处都是SSH[解决办法]路过[解决办法]围观9总来J了,围观文员叫9总回去交粮食[解决办法]老实说,我也觉得SSH过于臃肿...[解决办法]SSH ....... 是啥 东东。。。。[解决办法]无所谓[解决办法]楼主的头像有点。。。[解决办法]...ssh是看情况的吧。。框架是为了简化工作提高效率你需要哪个就哪个没规定要全。。你也可以spring+javabean+jsp ,spring+struts+ibatisspring+jsp+javabean+ibatis,spring+webwork+ibatis我个人认为在项目spring 不可缺少。。其他的就看情况还有楼主说美工就做美工的。。。有些界面是在运行期才有数据显示的。。。美工做不了的
[解决办法]至少变简单了,招个新人两三天就能上手,虽然原理不懂,但能照做[解决办法]无所谓了,领导 让用啥咱就用,不会就学,学不会就淘汰,社会就这样[解决办法]如果是死记硬背那肯定是不行的关键是了解思想和原理那样你掌握什么都快的[解决办法]不懂,该学习了`[解决办法]自己去写,后期维护的成本要大很多,也不太容易扩展。万一扩展功能,郁闷死你。当然是用框架也不一定就是ssh了[解决办法]浮躁,追风[解决办法]。。。。[解决办法]up[解决办法]会的人多,降低了项目培训成本[解决办法]hehe 也有一些道理但不会确实不是很好找工作啊呵呵几乎每个公司都问到 会不会使用xxx框架[解决办法]大家都在用这个组合,不懂就不可以立足了。[解决办法]现在流行的就是这个,没办法啦,要想找到好工作,就得学啦。不过,每个人有每个人的想法,因人而异啦。[解决办法]说得好啊,领导叫用啥我就用啥,不会就去学,没学好项目做烂了就和领导一起辞职。[解决办法]用框架是对公司有利益,如果用 jsp + servlet + javabean 新人来后业务理解起来比较麻烦。 通过框架就比较方便了,为公司节省了成本。 同样也会节省后期的维护成本。[解决办法]个人觉的ssh用起来比较方便,特别是Spring中的IOC(依赖注入)及AOP做事务处理方便方便[解决办法]框架是虚无的,要回归本质![解决办法]up[解决办法]老实说我觉的ssh并不好!框架在一定程度上大大的限制了程序员的创新能力!而且ssh并不完整!有着太多的缺陷!对于错误处理这方面我觉得就是不行!远远没有net的容易理解!java开源,而ssh则违背了这点!所以我觉得ssh的推出有可能使java倒退!但是也许有高手可以全盘否定这些规定也未知的!所以我觉的struts可以用用,但是hibernate和spring如果用不好就不要用了!我自己个人想法。[解决办法]楼上我也一些同意的看法!其实我个人认为在3个框架中,做得最成功就是STRUTS!![解决办法]我并不喜欢用hibernate,hibernate是为大型项目量身订做的。这里所说的“大型”,本不是指模块多就叫大,而是数据量大,性能要求高,主要任务在端的项目。如果用hibernate去做多表查询,简直就是自己跟自己找麻烦,还不如用spring的jdbcTemplate。hibernate的优势就在于做简单查询。那有人要问,项目中确实有多表查询,或很复杂的查询怎么办?我刚才已经说了,hibernate并不适合做这些工作,而是在大型项目中,将这些操作都放在端完成了,我打个比方说明。比如做信用卡的系统,你先刷卡消费了200元,然后套现500元,刷卡是在20号以前,套现是在20以后,那么在你的总金额中就是700元,但本期还款只有200元,同时要计算出本期应还款多少,最低还款多少,同时在你总欠款中还要显示套现的手续费,利息。这时,如果用hibernate去直接查询,那简直是做恶梦,不要说做不出来,就是做出来了,性能上也叫人吐血。怎么办呢?通常是这样处理的,数据库在夜晚2点钟的时候会自动开启一个存储过程,来计算这一切数据,然后将结果写入另一张“结果表”中,为安全起见,在“结果表”上会加一个视图,这样hibernate只直操作这张视图就行了,这就纯粹多了。因此对hibernate,我的看法是慎用,否则你就是自己跟自己找麻烦。对用数据库不大,且多表查询很多的情况下,就用jdbcTemplate或原生jdbc API即可。[解决办法]框架的使用只有一个目的: 提高开发效率,节省成本,为资本家创造更大的剩余价值[解决办法]前台技术用的太多,项目后期维护会很糟糕的!------解决方案--------------------
顶下[解决办法]SSH是有缺点,不过,建议说SSH一无是处的人去把SSH的源码阅读一遍,再来发表观点。[解决办法]既然SSH大流行,那么自有它流行的道理。(优点太多,略)既然都流行到成为行业标准的话,用它们那么后来人就能在很短时间进入项目。不能光开发时风流快活,也要想想后来者的感受。[解决办法]一直学习,却实际项目中从来没用过,我有些怀疑SSH是不是真的那么流行?是不是只供学习?[解决办法]不想过多的评论& 只能说自己按照项目需求来订 成本来订 时间来订[解决办法]要始终相信社会是进步的,不会回到原始社会,感觉java东西太多了,不懂,就是不懂,还是不懂。[解决办法]java的东西确实很多,这可能就是开源的弊端,国外的企业为了自己的利益就不停的包装java然后推出新的技术,其实感觉这些东西根本就不是技术上的需要(即使需要也不能有这么多标准啊),而完全是商业上的恶性竞争所至,所以苦的只有开发人员而已啊[解决办法]路过,愤青还蛮多的~~~[解决办法]SSh有好多好处,就不再多说。但使用框架后,发觉也有点不习惯的地方。像通超链接转到一个新增记录的页面,其中包含一些下拉框,而数据是从DataBase出来的。在以前(先不考虑使用AJAX),则会用JavaBean,在页面使用EL和JSTL生成。而在使用SSH后,要么额外写一个JavaBean,但这样却得不到SSH的优点。要么就将超链接指向一个Action,由Action中向相应的ActionForm加入下拉框的数组,或者列表,再使用Struts的标签绑到相应的下拉框。的确有点麻烦和不习惯。但整体的MVC结构还是比较整洁,统一。不使用框架的好处自然是代码的写法比较自由,无拘无束,但后期要维护这部分也需要多一份心眼。当然,即使不使用框架,代码也可以写得很条理,而这本来就是程序员必需做的。但如果有得选择,使用SSH再加JQuery或者DWR也可以做到类似JavaBean+纯JSP的效果。这完全是项目的决择。如果一个公司不要求懂任何框架,这对程序找工作也是一件易事,值得提倡。嘎嘎~~[解决办法]SSH,后期维护很方便啊,而且界面方面可以使用ExtJS等等啊,并不需要美工![解决办法]根据个人需要吧!各有特点![解决办法]呵呵解决问题才是实际.邓小平说了,实践是检验真理的最好标准.我根本没有用哪行ssh框架,也没有用struct.我的模式也可以说是框架是自己造出来的. 我们公司的需求是这样的: 公司要求每天定期或不定期的要查询各项费用报表,或通道数据报表.我写了一个mailProxy后台服务 ;后台数据库我不管.是具体搞计费区分运营的同事维护.但我要把数据内容展现出来.且这些数据都是变得的.不同的需求对应不同的sql.我这样设计的. 我的后台服务一启动是一组java 程序作为开机服务启动不会停止. 他们一有需求,或通过job方式每天定时下方任务到我对应的tb_mp_mt表 我后台扫描到该表;每条记录作为一个任务对待. 记录中包含了to目标邮件列表或群组 ;还定义了一个dataSRC 字段 就是放他们要展示数据的sql 当然是job提前生成好的.我的模块会自动讲其翻译成Wap2格式作为邮件发送出去.且支撑wap2登陆查看.一个模块俩用.一个模块n用.对应n个需求.这就是我的模式.[解决办法]框架只是一个规范~~~~不要把这种东西看的太重要!!!![解决办法]灵活运用才是最重要的……[解决办法]我觉得不管用不用 SSH都是值得学习和掌握的 里面的一些思想 基本的方法 即使最后不用这个或者换用其他的框架甚至其他的语言都是可以用到的 特别对于我这种费专业的来说。。 感觉学了SSH以后 对这些东西的理解更进一步了以前做过PHP 如果习惯用JSP+JAVABEAN开发 不如转做PHP更好一点[解决办法]不要太依赖于框架了,现有的框架对于解决一些简单的问题还是比较有效的,但是我没有碰到过一个项目能够在现有的框架之内能够完全解决的,到了最后,框架反而成了制约,很多复杂的问题在框架之内都是无法解决的,往往只能绕开框架的限制来解决的了,这样下去,整个最后就变得四不像,因此对框架的使用,越是简单越好,而且只能适度的使用,比较只采用STRUTS1、2/Spring来实现servlet那一层的接口就足够了,后面的业务逻辑层、数据库层自己来实现,只要能够保证层次很清晰、减少层次之间的耦合性,那就是很好的设计了;反而,无论是Hibernate、EJB,在早期是能够解决不少的问题,但是到了后面就成了制约因素了,而且无论是Hibernate还是EJB都不是不可或缺的东西[解决办法]ssh 框架的整合很好,对于大一点的项目很好维护和开发,用这个框架来开发项目,思路也清晰[解决办法]ssh 框架开发也是为了项目开发的规范和标准[解决办法]SSh有好多好处,就不再多说。但使用框架后,发觉也有点不习惯的地方。像通超链接转到一个新增记录的页面,其中包含一些下拉框,而数据是从DataBase出来的。在以前(先不考虑使用AJAX),则会用JavaBean,在页面使用EL和JSTL生成。而在使用SSH后,要么额外写一个JavaBean,但这样却得不到SSH的优点。要么就将超链接指向一个Action,由Action中向相应的ActionForm加入下拉框的数组,或者列表,再使用Struts的标签绑到相应的下拉框。的确有点麻烦和不习惯。但整体的MVC结构还是比较整洁,统一。&
不使用框架的好处自然是代码的写法比较自由,无拘无束,但后期要维护这部分也需要多一份心眼。当然,即使不使用框架,代码也可以写得很条理,而这本来就是程序员必需做的。但如果有得选择,使用SSH再加JQuery或者DWR也可以做到类似JavaBean+纯JSP的效果。这完全是项目的决择。& 如果一个公司不要求懂任何框架,这对程序找工作也是一件易事,值得提倡。嘎嘎~~& [解决办法]ssh只是一种设计理念,不一定完全使用这个框架,成熟的设计者都是采用ssh中的部分功能,根据自己的项目需要,添加适合自己的应用。[解决办法]我认为楼主进入了一个误区。框架的主要作用并不是简化你的开发过程,虽然在有些时候它确实提高了开发的速度(这种提升多是因为框架的基本结构几乎在所有的应用里都差不多,节省了基础结构设计的时间,可以直接开始配置系统大环境;另外框架的管理层面已经是成熟的不需要再过多去考虑)。框架的应用和流行和MVC设计理念息息相关,而MVC本身不是为了简化什么,而是为了规范什么。如果对MVC都不认可那就更谈不上对框架的理解了。楼主说得没错,有很多方法都比使用框架要灵活方便简捷很多,但这样的结果是你放弃了高级系统设计理念,回到了MVC之前的老思想里。在MVC之前的日子里,系统的维护、扩展、安全以及稳定都是随时可以威胁系统生命的大问题;而在开发过程中,分层的设计理念大大提高了开发的效率和开发者的面向性,并且规避了不少危险和bug。MVC和框架的出现是程序开发领域的一个进步。尽管现在还没有一个完美的框架,但框架的出现的确使编程的思想上了一个台阶,这也是大家为之奋斗和需要学习的。这样的好处是:& ----1.大家想用什么开发工具没有限制(现在我们组有用Netbean也有用Eclipse的还有用DW之类的);在大型工程里,这并不是一件好事。& ----2.分工明确,成员要求学习掌握的东西最少,相互不冲突;& 没有对系统整体的认识是不可能做出好产品的,不要求完全懂,但知道局部流程,整体原理是开发大型的每个开发者都必须要做到的----3.以后的维护、二次开发对技术人员的要求也最少,可大大降低人力成本;& 没有规范的程序,后期维护难比登天。框架一大优势就是提高二次开发人员的效率和维护的简易性.& 对技术人员的要求少不见得是什么好的地方,MVC是一个先进的开发理念,没有这个理念的二次开发人员,我想应该挺初级的吧,最起码这样的人员效率上一定有问题----4.学习了解系统结构最简单,不需要看配置文件等,清晰明了,培训成本低;& 不看配置文件就简单了?如果没有规范,工程稍微大一点就让外人很难看懂。----5.界面可以做的很漂亮,表现形式不会千篇一律不知道界面和框架有什么关系,使用框架也不是必须要用struts啊!总结一下。我认为楼主对框架理解可能有些偏激,可能认为提及框架就是SSH,其实这只是一种比较流行的组合而已,但你可以单用其中任何一个,这也是框架的使用(个人认为Spring是最有用的)啊!使用框架不过是对MVC一个规范的体现,通过使用框架,你的工程自然而然就分离各层,达到了高效先进的设计理念。一点愚见,说错了请指正。[解决办法]楼主言必“几百个XML文件”,但我感觉楼主似乎还没有经历过大型的工程。如果真的有几百个XML来配置的工程,我想按照楼主自己想法来搭建出来的程序不知道会是什么样子。即便框架里使用了几百个XML文件,关键的就是那么2-3个,其余的基本是同样格式和同压根用途,可以忽略,真正需要的时候再细看。把话先放这吧,等楼主遇到大型课题时想必会有一个更清楚的认识。SSH并非适用任何情况的工具,也不必当神来供着,但我认为S,S, 还有H,比楼主自己的方法好。楼主开帖的时候让大家拍砖,那我就不客气轻拍以块,楼主的方法是一个倒退,对于楼上的几个问题的回答,让我感觉楼主对框架的认识有些问题,针对以上各点:1. 开发JS的和HTML的用不同的IDE能体现出什么优势??这两个属同类产品,这也要分配到不同开发者的手中,我除了觉得这个工程不是超乎想象的大就是严重浪费。在大型工程中,小组开发成员最好是使用同样的IDE,因为不同的IDE配置有差别,这些差别可能导致一个人的代码无法在另一个人的环境下运行。使用相同IDE是为了把这种不必要的麻烦降到最低。当你遇到一个光配置开发环境就需要大半天功夫的工程时,你就会痛恨那些特立独行使用不同IDE的人了。2. 程序开发不同于工厂生产。工厂生产是无需用脑的简单重复,而且各项指标有硬性规定,只要严格遵守规定就能生产出合格产品。不同,每一个步骤都是大脑思考的结果,没有标准可循,对系统理解得多透彻一分,就可能提高一分质量。还是那句话,一个HelloWorld般的程序当然不需要你去了解全局,但是在大型开发里,如果眼光过于局限,很难开发出高质量的产品。3. “....我这种架构是没有规范的么....”。 我认为您的那个不叫“规范”,顶多叫“规定”。有可能像你所说,一个学生都能理解你的架构,但当他真正要开始修改,添加或者维护什么的时候, 刚出校门就疯了你可要负责啊!4. 刚才我说过了,几百个配置文件的工程在你的结构里会成什么样子还是个未知数。况且你并不需要每次都去读几百个配置文件,需要看哪个才看哪个。5. 没什么可说的对于你的总结,我似乎能看到些问题。JQuery是一个Javascript库,和JAVA框架没有可比性啊!随后楼主推崇javabean+servlet,这是十年前的编程模式了,看来持久层楼主用JDBC?接着楼主又提及了几百个配置文件,说实话,我真的没有见过几百个配置文件的时候,SSH里主要的也就是那么几个啊,如果要说几百个,那应该是几百个表格所产生的xxxxxx.hbm.xml?然后楼主又说在客户那里实时修改的难题,如果是我,我必然不会在客户那里修改东西,一个大型工程,稍有不慎就能造成整个系统崩溃。况且网络应用程序,在家改完了上传升级就行了,在客户那又着急又紧张还没有测试时间,改个什么劲????哦,对了,如果你不带自己的电脑,服务器上的程序都是编译好了的(除了配置文件们),怎么修改????如果你带自己电脑到客户那的话,还说什么安不安装IDE的事?难道平时在自己电脑上就是notepad操作?所以最后我感觉,楼主可能是从网页开发转行的。没有任何恶意,如果有太过分的用词和语气,请楼主包涵则个,就事论事而已。[解决办法]探讨老实说我觉的ssh并不好!框架在一定程度上大大的限制了程序员的创新能力!而且ssh并不完整!有着太多的缺陷!对于错误处理这方面我觉得就是不行!远远没有net的容易理解!java开源,而ssh则违背了这点!所以我觉得ssh的推出有可能使java倒退!但是也许有高手可以全盘否定这些规定也未知的!所以我觉的struts可以用用,但是hibernate和spring如果用不好就不要用了!我自己个人想法。[解决办法]只能说楼主没见过大项目···楼主有机会去了解了解淘宝··就会让你知道你说的完全是错的[解决办法]dingding[解决办法]ssh有他的发挥舞台,但不是所有地方都用得上ssh。
[解决办法]对ssh没有在深的研究.(至少源码还没有去看过.[看过部份])不过.里面的设计思想,真的很有用.[解决办法]顶一个啊~~\(^o^)/~[解决办法]其实,当然是每个人用的多了就觉得好,但是也不一定,ssh框架的优点也有很多,比如分工明确,简单(掌握之后),需要的操作比较少,但就是配置文件比较繁琐,不如简单的jsp简单,但是很多是机器处理的,我们只需给它一个配置就可以了[解决办法]我觉得spring的思想很好,最喜欢spring[解决办法]对这方面不是很清楚![解决办法]刚开始学东西的话,还是先学基础的吧!等有底气了还是要多多去看看那些开源框架的。也是在学习啦。[解决办法]尝试过了就知道了[解决办法]学习下![解决办法]只能证明你还没体验到业务服务决定模块的阶段。SSH框架不是标准,很多公司都有自己的框架。自己企业的开发规范制定是很难的。即是html(yui-ext)+json+DWR+JavaBean写一套也至少一年半载。[解决办法]路过[解决办法]fdaffasdffsdafdsfdddddddddddddd[解决办法]做比较大的项目还是比较方便的[解决办法]都想抛开SSH,但是,很难!!![解决办法]有规范和标准才能做出稳定的东西,才能做大[解决办法]顶·~!~~~[解决办法]我觉得框架挺好的啊,做起来比较方便一些[解决办法]倾听。。。[解决办法]用了框架更简单了[解决办法]SSH是现在的主流,可以说是必备之技,否则在中国这样的国度里混不开,但是并不是所有项目都要以ssh来做,要结合实际。[解决办法]ssh很常用,别人都用它 肯定是有它的优点。如果能自己写出更好,性能更高的代码。就无所谓了[解决办法][解决办法]用ssh有利于后期维护啊 分层明了[解决办法]架构为开发模式,技术为生存之本[解决办法]关键不是ssh有多好,只是如果你连ssh这样的架构都不能理解掌握,那么也就不要谈什么进一步的深入开发,可以基本判断还属于小初层次,就是一个死扣代码,什么脑筋都不动的初级程序员。BTY,ssh集中了java中优秀的设计和实践,是经过事实证明的东西另外,本人仅仅在一个小项目用过这ssh,其他都是 自定义框架+JSON+IBATIS,但是,其中的自定义框架也大量借鉴了SSH的设计,也就是一个简集,为什么要多此一举,其实就是简化了一些SHH配置和不易懂的方面,让项目开发人员可以更高效的编码。但是,思想的源泉,主要来自ssh。当然也有其他的一些框架。也就是说,理不理解ssh,是判断一个程序员是初级还是初级以上的一个标准,所以面试时候,公司很喜欢问[解决办法]比如楼主,我很肯定他没有经过10个人月以上项目[解决办法]好处还是大大的有啊!自由、创新、研究、探索
Linux/Windows Mono/DotNet [ Open Source .NET Development/ 使用开源工具进行DotNet软件开发]锐意进取,志存高远.成就梦想,只争朝夕.从你开始,创新世界.【That I exist is a perpetual supprise which is life. Focus on eCommerce】
这个小应用使用到了node.js &bootstrap &express &以及数据库的操作 :使用mongoose对象模型来操作 mongodb
如果没了解过的可以先去基本了解一下相关概念~
首先注明一下版本,因为express因为版本的不同使用的方式也不同,我这算是目前最新的了吧
还没有装express的可以移步到&看看express框架的获取安装
1.简单地项目初始化
进入你的nodejs安装路径下边,如图,然后执行命令&&express -e test&&(这里把项目名设置为test)
出现如上图所示,看到install dependencies没有,它说如果你想安装依赖就先进入项目test目录,然后执行 npm install安装依赖模块。
那就开始吧,网络环境差的可能安装会出错..出现很长一大串一般就行了
如此一来,项目初始已经完成,可以运行一下项目 npm start 看是否正常。
ok 还算正常,下面先来基本分析一下生成的初始项目:
之前&&已经说过&
项目创建成功之后,生成四个文件夹,主文件app.js与配置信息文件packetage.json
bin是项目的启动文件,配置以什么方式启动项目,默认 npm start
public是项目的静态文件,放置js css img等文件
routes是项目的路由信息文件,控制地址路由
views是视图文件,放置模板文件ejs或jade等(其实就相当于html形式文件啦~)
express这样的MVC框架模式,是一个Web项目的基本构成。
先来看看文件信息package.json &一般项目的主要信息都会在这里产生
"name": "test",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
"dependencies": {
"body-parser": "~1.12.0",
"cookie-parser": "~1.3.4",
"debug": "~2.1.1",
"ejs": "~2.3.1",
"express": "~4.12.2",
"morgan": "~1.5.1",
"serve-favicon": "~2.2.0"
看看主文件 app.js & 这是它的初始形式,这个模块还要继续导出给 bin文件夹下的www文件使用
1 var express = require('express');
2 var path = require('path');
3 var favicon = require('serve-favicon');
4 var logger = require('morgan');
5 var cookieParser = require('cookie-parser');
6 var bodyParser = require('body-parser');
8 var routes = require('./routes/index');
9 var users = require('./routes/users');
11 var app = express();
13 // view engine setup
14 app.set('views', path.join(__dirname, 'views'));
15 app.set('view engine', 'ejs');
17 // uncomment after placing your favicon in /public
18 //app.use(favicon(__dirname + '/public/favicon.ico'));
19 app.use(logger('dev'));
20 app.use(bodyParser.json());
21 app.use(bodyParser.urlencoded({ extended: false }));
22 app.use(cookieParser());
23 app.use(express.static(path.join(__dirname, 'public')));
25 app.use('/', routes);
26 app.use('/users', users);
28 // catch 404 and forward to error handler
29 app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
35 // error handlers
37 // development error handler
38 // will print stacktrace
39 if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
49 // production error handler
50 // no stacktraces leaked to user
51 app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
60 module.exports =
www文件内容:这里拥有着http服务器的基本配置
&View Code
再来介绍一下项目使用到的ejs模板,比如看看这个view里边的index.ejs (我们待会可以直接把它转为html,差不多的)
&!DOCTYPE html&
&title&&%= title %&&/title&
&link rel='stylesheet' href='/stylesheets/style.css' /&
&h1&&%= title %&&/h1&
&p&Welcome to &%= title %&&/p&
&%= title %& 这就是ejs的使用范例,title的值通过路由routes文件夹下index.js代码传入(后面再谈)
好了,基本介绍了项目的初始情况
2.基于初始项目的改进-- 注册登录功能
设计如下:
一个初始界面(其实就是原始地址:比如 localhost:3000(index.html &路径为/ ) ,在初始界面选择登录或注册
跳进来之后会先跳进登录界面(login.html &路径为 /login),可以选择先注册(跳转 register.html &路径为/register)
跳进注册界面后就会跳进(register.html 路径为 /register),注册成功后就跳转登录界面(login.html &路径为 /login)
在登录界面登录成功后就跳转(home.html &路径为 /home). 在home这里还提供了注销的功能(无页面文件,它的路径为 /logout
如果浏览器直接输入localhost:3000/home &要先判断是否登录成功,未登录不允许进入
看到上诉,应该了解到:我们是通过一个路径,然后通过这个路径的解析,从而渲染出这个路径对应的模板文件,其中我们这里的模板文件为.html后缀的
首先展示一下基本界面形态:
然后先注册吧,点击注册
填入用户名密码,这里稍微设置了两次密码相同的判断,注册成功它会自动跳转登录界面
用mongoVUE看看数据的创建
那就登录吧,登录成功跳转home界面
注销吧,注销后清除session值,然后跳转到根路径
然后试一下浏览器直接进入 home路径? 浏览器地址输入 &localhost:3000/home &回车, ok 它自动跳转到登录界面
好现在开始解析如何构建这个小项目:
因为我们直接使用了后缀名 .html ,所以我们要先修改一下ejs模板 &,再把原来views目录下模板文件后缀改成 .html
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.engine("html",require("ejs").__express); // or
app.engine("html",require("ejs").renderFile);
//app.set("view engine","ejs");
app.set('view engine', 'html');
其实就是加一句再改一句。 __express 和renderFile都可以, 不用管它是什么,它能那样用就行了
然后我们知道需要这些模板文件,那就创建它们吧
index.html & &其中 &%= title %&使用到了模板 &连接&a& 直接使用了路由路径的方法
&!DOCTYPE html&
&title&&%= title %&&/title&
&link rel='stylesheet' href='/stylesheets/style.css' /&
&style type="text/css"&
a{margin-left: 20 text-decoration:}
a:hover{text-decoration:}
&h1&&%= title %&&/h1&
&p&Welcome to &%= title %&&/p&
&p&&a href="/login"&登录 &/a&
&a href="/register"&
register.html &注册方式主要是把原始 form表单 onsubmit="return false" 防止默认提交,然后在输入信息正确的情况下,通过ajax,把表单信息post到路径/register
然后我们就通过路由功能根据此路径来处理信息(这个跟ajax和php交互是同一个道理)
&!DOCTYPE html&
&html lang="en"&
&meta charset="utf-8"&
&meta name="viewport" content="width=device-width,initial-scale=1.0"&
&title&&%= title %&&/title&
&link rel="stylesheet" href="stylesheets/bootstrap.min.css" media="screen"&
&style type="text/css"&
.m15{ margin: 15}
.tc{ text-align:font-size: 18font-weight: 600;}
&body screen_capture_injected="true"&
&div class="container"&
&%- message %&
&form class="col-sm-offset-4 col-sm-4 form-horizontal" role="form" method="post" onsubmit="return false"&
&fieldset&
&legend&&/legend&
&div class="panel panel-default"&
&div class="panel-heading"&
&p class="tc"&注册信息&/p&
&div class="panel-body m15"&
&div class="form-group"&
&div class="input-group"&
&span class="input-group-addon"&
&span class="glyphicon glyphicon-user"&&/span&
&input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名" required&
&div class="form-group"&
&div class="input-group"&
&span class="input-group-addon"&
&span class="glyphicon glyphicon-lock"&&/span&
&input type="text" class="form-control" id="password" name="password" placeholder="请输入密码" required&
&div class="form-group"&
&div class="input-group"&
&span class="input-group-addon"&
&span class="glyphicon glyphicon-lock"&&/span&
&input type="text" class="form-control" id="password1" name="password1" placeholder="请再次输入密码" required&
&div class="form-group"&
&button type="submit" class="btn btn-primary btn-block" id="register1"&注册&/button&
&div class="form-group"&
&button type="button" class="btn btn-info col-sm-2 col-sm-offset-10" id="login1"&登录&/button&
&/fieldset&
&script type="text/javascript" src="javascripts/jquery.min.js"&&/script&
&script type="text/javascript" src="javascripts/bootstrap.min.js"&&/script&
&script type="text/javascript"&
$(function(){
$("#login1").click(function(){
location.href = 'login';
$("#register1").click(function(){
var username = $("#username").val();
var password = $("#password").val();
var password1 = $("#password1").val();
if(password !== password1){
$("#password").css("border","1px solid red");
$("#password1").css("border","1px solid red");
}else if(password === password1){
var data = {"uname":username,"upwd":password};
url: '/register',
type: 'post',
data: data,
success: function(data,status){
if(status == 'success'){
location.href = 'login';
error: function(data,err){
location.href = 'register';
login.html & 跟上面register.html原理差不多
&!DOCTYPE html&
&html lang="en"&
&meta charset="utf-8"&
&meta name="viewport" content="width=device-width,initial-scale=1.0"&
&title&&%= title %&&/title&
&link rel="stylesheet" href="stylesheets/bootstrap.min.css" media="screen"&
&style type="text/css"&
.m15{ margin: 15}
.tc{ text-align:font-size: 18font-weight: 600;}
&body screen_capture_injected="true"&
&div class="container"&
&%- message %&
&form class="col-sm-offset-4 col-sm-4 form-horizontal" role="form" method="post" onsubmit="return false"&
&fieldset&
&legend&&/legend&
&div class="panel panel-default"&
&div class="panel-heading"&
&p class="tc"&请先登录&/p&
&div class="panel-body m15"&
&div class="form-group"&
&div class="input-group"&
&span class="input-group-addon"&
&span class="glyphicon glyphicon-user"&&/span&
&input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名" required&
&div class="form-group"&
&div class="input-group"&
&span class="input-group-addon"&
&span class="glyphicon glyphicon-lock"&&/span&
&input type="text" class="form-control" id="password" name="password" placeholder="请输入密码" required&
&div class="form-group"&
&button type="submit" class="btn btn-primary btn-block" id="login0"&登录&/button&
&div class="form-group"&
&button type="button" class="btn btn-info col-sm-2 col-sm-offset-10" id="register0"&注册&/button&
&/fieldset&
&script type="text/javascript" src="javascripts/jquery.min.js"&&/script&
&script type="text/javascript" src="javascripts/bootstrap.min.js"&&/script&
&script type="text/javascript"&
$(function(){
$("#register0").click(function(){
location.href = 'register';
$("#login0").click(function(){
var username = $("#username").val();
var password = $("#password").val();
var data = {"uname":username,"upwd":password};
url:'/login',
type:'post',
data: data,
success: function(data,status){
if(status == 'success'){
location.href = 'home';
error: function(data,status){
if(status == 'error'){
location.href = 'login';
最后是 home.html & &里头的 user.name 就是使用ejs模板通过session.user来获取user对象,这里user有name和password的属性
&!DOCTYPE html&
&title&&%= title %&&/title&
&link rel='stylesheet' href='/stylesheets/style.css' /&
&style type="text/css"&
a{margin-left: 20 text-decoration:}
a:hover{text-decoration:}
&h1&Your name:
&%- user.name %&&/h1&
&p&Welcome to your home ~&/p&
&p&&a href="/logout"&我要注销 &/a&
模板文件就是这些,接下来给主文件 app.js增加路由配置,让浏览器访问到路径后得以被解析
app.use('/', routes);
// 即为为路径 / 设置路由
app.use('/users', users); // 即为为路径 /users 设置路由
app.use('/login',routes); // 即为为路径 /login 设置路由
app.use('/register',routes); // 即为为路径 /register 设置路由
app.use('/home',routes); // 即为为路径 /home 设置路由
app.use("/logout",routes); // 即为为路径 /logout 设置路由
app.use是一个中间件的用法,这里的routes看初始项目的那句代码,就是引用了routes文件夹下的index.js模块
var routes = require('./routes/index');
var users = require('./routes/users');
所以待会我们还得继续修改完善index.js(我这里是直接把所有路径的处理方法全部放到index.js中,实际做的时候可以考虑细分出模块)
这里先不说index.js,因为还有很多更宽泛的工作没弄
  1.注册登录,所以我们得需要数据库
这里使用到了mongodb . 据我所知mongodb主要有两种使用方法,这里使用了其中的一种:使用 mongoose
  Mongoose是MongoDB的一个对象模型工具,是基于node-mongodb-native开发的MongoDB nodejs驱动,可以在异步的环境下执行。
同时它也是针对MongoDB操作的一个对象模型库,封装了MongoDB对文档的的一些增删改查等常用方法,让NodeJS操作Mongodb数据库变得更加灵活简单。
我们通过Mongoose去创建一个&集合&并对其进行增删改查,就要用到它的三个属性:Schema(数据属性模型)、Model、Entity
  这里简单介绍一下,更详细的用法可以自行查阅~
Schema&&& 一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,也就是说它不具备对数据库的操作能力,仅仅只是数据库模型在程序片段中的一种表现,可以说是数据属性模型(传统意义的表结构),又或着是&集合&的模型骨架。
比如定义一个Schema:
var mongoose = require("mongoose");
var TestSchema = new mongoose.Schema({
name : { type:String },//属性name,类型为String
: { type:Number, default:0 },//属性age,类型为Number,默认为0
time : { type:Date, default:Date.now },
email: { type:String,default:''}
Model&&& 由Schema构造生成的模型,除了Schema定义的数据库骨架以外,还具有数据库操作的行为,类似于管理数据库属性、行为的类。
比如定义一个Model:
var db = mongoose.connect("mongodb://127.0.0.1:27017/test");
// 创建Model
var TestModel = db.model("test1", TestSchema);
Entity&&& 由Model创建的实体,使用save方法保存数据,Model和Entity都有能影响数据库的操作,但Model比Entity更具操作性。
比如定义一个Entity:
var TestEntity = new TestModel({
name : "Lenka",
console.log(TestEntity.name); // Lenka
console.log(TestEntity.age); // 36
基本就介绍到这里
因为我们要使用数据库,那就来创建它。使用的就是上述的方法
首先,在项目根目录下建立一个database文件夹,建立文件 models.js &然后建立model处理文件 dbHandel.js
写入文件 models.js &一个user集合,里面有name和password属性
module.exports = {
name:{type:String,required:true},
password:{type:String,required:true}
写入文件 dbHandel.js &里边主要是获取 Schema 然后处理获取 model ,最后就是返回一个model了(提供其他文件对model的操作 -- Entity是使用)
var mongoose = require('mongoose');
var Schema = mongoose.S
var models = require("./models");
for(var m in models){
mongoose.model(m,new Schema(models[m]));
module.exports = {
getModel: function(type){
return _getModel(type);
var _getModel = function(type){
return mongoose.model(type);
建立好基本文件后我们就在app.js中调用使用它:要使用multer和mongoose模块
项目没有,所以我们要安装
app.js中加上
var multer = require('multer');
var mongoose = require('mongoose');
global.dbHandel = require('./database/dbHandel');
global.db = mongoose.connect("mongodb://localhost:27017/nodedb");
// 下边这里也加上 use(multer())
app.use(bodyParser.urlencoded({ extended: true }));
app.use(multer());
app.use(cookieParser());
  2.因为我们使用到了session(比如进入home的时候判断session值是否为空),所以需要express-session 模块
然后在app.js中引用它并作初始设置:
var session = require('express-session');
var app = express();
app.use(session({
secret: 'secret',
app.use(function(req,res,next){
res.locals.user = req.session.
// 从session 获取 user对象
var err = req.session.
//获取错误信息
delete req.session.
res.locals.message = "";
// 展示的信息 message
res.locals.message = '&div class="alert alert-danger" style="margin-bottom:20color:"&'+err+'&/div&';
//中间件传递
好现在想想我们还剩下什么:
数据库已经提供出model接口给我们使用(给它填数据)
已经初始化了路径处理
初始化了session信息 数据库配置等
页面模板也已经做完
所以剩下的就是路径处理的部分:去routes目录下 修改index.js吧
/* GET index page. */
router.get('/', function(req, res,next) {
res.render('index', { title: 'Express' });
// 到达此路径则渲染index文件,并传出title值供 index.html使用
/login 路径
/* GET login page. */
router.route("/login").get(function(req,res){
// 到达此路径则渲染login文件,并传出title值供 login.html使用
res.render("login",{title:'User Login'});
}).post(function(req,res){
// 从此路径检测到post方式则进行post数据的处理操作
//get User info
//这里的User就是从model中获取user对象,通过global.dbHandel全局方法(这个方法在app.js中已经实现)
var User = global.dbHandel.getModel('user');
var uname = req.body.
//获取post上来的 data数据中 uname的值
User.findOne({name:uname},function(err,doc){
//通过此model以用户名的条件 查询数据库中的匹配信息
//错误就返回给原post处(login.html) 状态码为500的错误
res.send(500);
console.log(err);
}else if(!doc){
//查询不到用户名匹配信息,则用户名不存在
req.session.error = '用户名不存在';
res.send(404);
状态码返回404
res.redirect("/login");
if(req.body.upwd != doc.password){
//查询到匹配用户名的信息,但相应的password属性不匹配
req.session.error = "密码错误";
res.send(404);
res.redirect("/login");
//信息匹配成功,则将此对象(匹配到的user) 赋给session.user
并返回成功
req.session.user =
res.send(200);
res.redirect("/home");
/register 路径
/* GET register page. */
router.route("/register").get(function(req,res){
// 到达此路径则渲染register文件,并传出title值供 register.html使用
res.render("register",{title:'User register'});
}).post(function(req,res){
//这里的User就是从model中获取user对象,通过global.dbHandel全局方法(这个方法在app.js中已经实现)
var User = global.dbHandel.getModel('user');
var uname = req.body.
var upwd = req.body.
User.findOne({name: uname},function(err,doc){
// 同理 /login 路径的处理方式
res.send(500);
req.session.error =
'网络异常错误!';
console.log(err);
}else if(doc){
req.session.error = '用户名已存在!';
res.send(500);
User.create({
// 创建一组user对象置入model
name: uname,
password: upwd
},function(err,doc){
if (err) {
res.send(500);
console.log(err);
req.session.error = '用户名创建成功!';
res.send(200);
/home &路径
/* GET home page. */
router.get("/home",function(req,res){
if(!req.session.user){
//到达/home路径首先判断是否已经登录
req.session.error = "请先登录"
res.redirect("/login");
//未登录则重定向到 /login 路径
res.render("home",{title:'Home'});
//已登录则渲染home页面
/logout &路径
/* GET logout page. */
router.get("/logout",function(req,res){
// 到达 /logout 路径则登出, session中user,error对象置空,并重定向到根路径
req.session.user =
req.session.error =
res.redirect("/");
当然了,把所以路径的处理放在同一个index.js事实上有点糟糕,可以考虑分着写:(这里提供一种思路分出模块)
比如一个home.js模块里边:
module.exports = function ( app ) {
app.get('/logout', function(req, res){
req.session.user =
req.session.error =
res.redirect('/');
从而只需要在index.js模块里边引用即可
module.exports = function ( app ) {
require('./logout')(app);
在app.js模块中再引用一下就可以(routes目录下index.js是默认文件,所以可以省略index)
require('./routes')(app);
3.好了,一个简单的注册登录功能已经完成了,启动项目吧
(注意:因为要使用到mongodb数据库,所以要先开启数据库服务,不然无法访问,因为我们使用了nodedb 这个数据库,所以最后也要先在mongodb中创建它,不然也有可能出错 未安装数据库的可以看看 && ,检测数据库服务是否开启:浏览器打开localhost:27017 就能访问&,然后给数据库添加nodedb吧)
初始化nonedb可以类似这样
启动项目,npm start&
上面那个bson错误的不用管它..我也不知咋处理,听说可以直接&npm install bson 或者 npm update&就行
但我试了貌似没什么效果
好了,项目已经打开,浏览器输入 localhost:3000 访问吧 (期间可以自己查看mongodb数据库里边nodedb --& user 数据的改动,使用mongoVUE或者命令查看)
需要代码的可移步至Github: &/imwtr/nodejs_express_login_register
------------------------------ &原创作品,转载还请注明 &-------------------------------
小尾巴一摆就是一个季节!
阅读(...) 评论()
随笔 - 15783
评论 - 1268

我要回帖

更多关于 布布发现童装旗舰店 的文章

 

随机推荐