1、由于solo的maven目录结构比较奇怪,无法直接呈现出标准的web目录结果,使得直接热部署开发有点困难,导致很多时间浪费在重启上。虽然我本人觉得热部署不重启服务器的开发方式并非是正确的开发流程(我们需要用完整单元测试进行底层代码的校验而并非是直接开游览器看结果),但是现实中过多的注意单元测试会极大的拖累开发效率,既然存在即合理,所以大家还是需要这样的方式去开发,在这篇文档的进行简单的说明。开发环境:eclipse和插件eclipse版本:示例使用eclipse jee(eclipse-jee-indigo-SR2-win32-x86_64)版,主要用到wtp的server模块, 你也可以装个
2、eclipse classic版本,安装下wtp模块,因为eclipse classic版本自带git和maven插件。插件:eclipse的git插件Egit和maven插件m2e,Help-Marketpalce可以搜到。准备eclipse下Dynamic Web Project的说明:新建Dynamic Web Project工程:1 配置你自己需要的服务器,按照new Runtime的对话框新建2 web module version 应该就是servlet的版本3 关于这个web module的相关体系模块配置,点击Modify:这里有一些eclipse提供的常用模块的插件选择,一般
3、默认即可。最后生成出来的项目结果如下:点击项目属性里的Web Deployment Assembly:这块的配置非常的重要:它配置了我们的项目资源发布到标准web项目的位置(映射)。在标准的web容器下,项目的根目录: 我们工程的web资源的根目录(我们这里是WebContent目录)映 射到项目的根目录。项目的class文件: 我们这里的源码包是src,于是我们生成的classes文件会映射到WEB-INF/classes 目录下,eclipse插件 对这块产出的class可以进行热替换(在不破坏class类结构的前提下,我理解为不是修改类结构,方法结构之类的修改)。项目的lib文件,这里没
4、有列出,我们可以指定相关的lib,它会被映射到WEB-INF/lib目录中。以上知识其实是非常基础的J2ee web项目的搭建过程,对于工程目录和项目目录不理解为什么会这样的同学请仔细再去学习下J2ee项目,鉴于篇幅,会省去很多基础的东西。Winodw-open view中打开Servers视图:把刚才我们的项目添加进Modules里然后切记把Auto Reload改成false,点击Edit去改。Server的一些其他配置在OverView里面,个人建议需要修改的地方1 Sever Locations 选择第二个,完全控制Tomcat。2 TimeOuts 里面的start 的时间写长一点,
5、有时候需要断定调试启动。右键可以选择start,debug等,默认资源会自动publish过去。solo的目录说明:从git上clone solo代码,然后import Existing Maven Projects,选择拉下来的solo代码位 置的根目录即可,team-share project里关联下git , 然后你会看到以下的代码结构:虽然会产生的项目很多,但我们主要关心solo-core和solo-war。Solo项目 : 可以无视,elipse已经根据子pom建立了相关的子项目映射,不要去动它。但你可以选择在它这里进行git控制。Solo-core: solo的后台逻辑代码Sole
6、-war:sole的web资源代码四个子项目,每个子项目有不同的依赖,至少目前没有包含代码。注意:1. eclipse四个子项目前会有红叉,无视即可,没搞清楚怎么消掉。 2. 可以在solo项目上进行git控制,那些多余的eclipse配置文件还没完全忽略,有时候会出现莫名其妙的,可以同步看下是哪些多余的文件,我会尽快消除哪些可以忽略的文件。 整合 最后,我们将solo整合到前面所建立的Dynamic Web Project工程中!(激动吧)1 solo后台代码关联,在前面的Dynamic Web Project b3log的src中,建立link文件夹,关联solo-core的代码。ecli
7、pse这种link应该是硬链接,改动文件所有映射过的都会生效。注意到solo-core资源文件资源文件夹下还有一个repository.json,方便起见直接把它复制到b3log下的src里(当然你也可以直接映射solo-core的resource文件夹,然后做成源码包)。然后在你的b3log下会看到solo-core的代码和它的资源。2 sole的web资源代码,在solo下的webapp里,我们仍旧在b3log项目下进行文件夹映射:这样可以把原来的WebContent那个目录给删了,注意到solo-war的webapp同级还有一个resource目录,那个目录也需要一起link过来。于是,
8、你看到b3log目录,如下:3 有了src和wabapp,那么最后需要的就是lib了,关联lib这一步比较不自动化,也没有想出来比较自动化的方法。首先,在想要你开发的本地版本的项目名上,进行install,比如我要在本地开发H2版本,那我先点击solo-h2,右键run asinstall,然后经过漫长的等待,去solo-h2找到这个lib中的依赖就是你这个h2项目所依赖所有lib,把这个lib的下所有jar(除了solo-coreXX.jar,我们已经在src导入了它的代码),全部复制到b3log的wabapp的WEB-INF下的lib(新建下lib文件夹)在b3log的项目属性里,把这些j
9、ar添加到build path里。然后你会发现项目的红叉叉都没了。4 然后,调整下我们的发布映射,还是在项目属性的Web Deployment Assembly里配置:然后你会发现在b3log项目目录里resources隐藏了。 5 最后 就是项目的用户配置文件了,把你需要本地开发的那个版本的项目配置文件复制一份到b3log的src下,比如solo-h2的三个用户配置文件在:这三个文件复制一份到b3log的src下去:然后根据你本地开发的实际情况,修改用户配置文件,数据库配置,路径配置,特别注意latke.properties中的contextPath和taticPath 需要和您的Serve
10、r的发布路径一样!整个过程就算是完成了! 当你在Server视图里启动容器后,修改src下的java文件(非结构性的大改动)和webapp下的文件,插件会自动进行热部署,不用重启容器可以提高开发效率。同时这个结构又保持eclipse的git支持,可以直接在solo项目里进行git的提交和同步。这文档只是提供一个思路,方便大家进行开发,只要大家明白这样的做法的思想,如果你要修改其他的项目,比如latke,比如想用gae的eclipse plugin去开发solo,都可以按照这样的想法完成!也希望可以提供给大家一个思路,对大家的日常的开发工作也起到一定的帮助。By mainlove 2013.1.
11、17附录资料:web前端面试题1. W3C标准有哪些?W3C推行的主要规范有HTML,CSS,XML,XHTML和DOM(Document Object Model)。2. 谈谈Js的内存泄露问题。3. 谈谈对Html 5的了解。4. 谈谈对CSS 3的了解。5. 用js实现随即选取10-100之间的10个数字,存入一个数组,并排序。var iArray = ;funtion getRandom(istart, iend) var iChoice = istart - iend +1; return Math.floor(Math.random() * iChoice + istart;for
12、(var i=0; i10; i+) iArray.push(getRandom(10,100);iArray.sort();6. 把两个数组合并,并删除第二个元素。var array1 = a,b,c;var bArray = d,e,f;var cArray = array1.concat(bArray);cArray.splice(1,1);7. Js面向对象的几种方式。8. 请谈谈原型方式构造对象的特点。9. 在Css中那个属性会影响dom读取文档流的顺序。答: float属性。10. 请介绍几种用div实现两列布局的方案(兼容),另外要考虑文档流的加载。11. 谈谈css在浏览器中的
13、兼容问题,详细谈谈IE6的一些bug,以及解决方案。12. 谈谈你对闭包的理解。以及如何实现js方法的重写。HTML & CSS1.Doctype? 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义? 首先我讲讲如何触发两种模式: 加入xml头部声明可以触发IE浏览器的Quirks mode,触发之后,浏览器解析方式就和IE5.5一样,拥有IE5.5一样的bug和其他问题,行为(Javascript)也是如此。 IE6的触发 在XHTML的DOCTYPE前加入XML声明 IE7的触发 在XML声明和XHTML的DOCTYPE之间加入HTML注释 IE6和IE7都可以触发的 在HTML4
14、.01的DOCTYPE文档头部加入HTML注释 其次是这样的意义 各个浏览器的混杂模式,基本就是各个浏览器的私有模式,不相互兼容。所以,除非是为了兼容的问题,比如你不想修改很久很久以前做的IE ONLY的网页,否则刻意触发混杂模式没有任何意义。2:行内元素有哪些?块级元素有哪些?CSS的盒模型?一.行内元素和块级元素有哪些?块级元素information on authorlong quotationpush buttontable captiondefinition descriptiondeleted textgeneric language/style containerdefiniti
15、on listdefinition termform control groupinteractive formheadingheadingheadingheadingheadingheadinghorizontal ruleinline subwindowinserted textfieldset legendlist itemclient-side image mapalternate content container for non frame-based renderingalternate content container for non script-based renderi
16、nggeneric embedded objectordered listparagraphpreformatted texttabletable bodytable data celltable footertable header celltable headertable rowunordered list行内元素anchorabbreviated formacronymbold text styleI18N BiDi over-ridelarge text styleforced line breakpush buttoncitationcomputer code fragmentde
17、leted textinstance definitionemphasisitalic text styleinline subwindowEmbedded imageform controlinserted texttext to be entered by the userform field label textclient-side image mapgeneric embedded objectshort inline quotationsample program output, scripts, etc.option selectorsmall text stylegeneric
18、 language/style containerstrong emphasissubscriptsuperscriptmulti-line text fieldteletype or monospaced text styleinstance of a variable or program argument二.行内元素与块级元素有什么不同?1.尺寸-块级元素和行内元素之间的一个重要的不同点行内元素和widthW3C CSS2 标准规定行内元素、非置换元素不会应用width属性。以下例子中,对行内元素应用了width:200px,你可以看到,根本就没有什么效果。行内元素和heightW3C
19、CSS2 标准规定行内元素、非置换元素不会应用height属性,但是盒子高度可以通过line-height来指定。以下例子,对行内元素应用了height:50px,你可以看到什么效果都没。行内元素和padding你可以给行内元素设置padding,但只有padding-left和padding-right生效。以下例子,行内元素应用了padding:50px。你可以看到对左右的内容有影响,但是对上下没影响。行内元素和margingmargin属性也是和padding属性一样,对行内元素左右有效,上下无效。下面的例子,对应用了margin:50px,你可以看到左右边缘是生效了但是内容上下却没有。
20、记住对行内元素设置宽度width 无效。设置高度height 无效,可以通过line-height来设置。设置margin 只有左右margin有效,上下无效。设置padding 只有左右padding有效,上下则无效。注意元素范围是增大了,但是对元素周围的内容是没影响的,看图上效果就知道了 盒子模型W3C 组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落、列表、标题、图片以及层。盒模型主 要定义四个区域:内容(content)、边框距(padding)、边界(border)和边距(margin)。对于初学者,经常会搞不清楚 mar
21、gin,background-color,background- image,padding,content,border之间的层次、关系和相互影响。这里提供一张盒模型的3D示意图,希望便于你的理解和记忆。每个HTML元素都可以看作一个装了东西的盒子,盒子里面的内容到盒子的边框之间的距离即填充(padding),盒子本身有边框(border),而盒子边框外和其他盒子之间,还有边界(margin)。盒模型的实际宽度关于盒模型,还有以下几点需要注意:对于块级元素(display:block),未浮动的垂直相邻元素的上边界和下边界会被压缩,例如:有上下2个元素,上元素的下边界为5px,下面元素的上边
22、界为20px,则实际2个元素的间距为20px(2个边界值中较大的值)。如图所示。注1. 块级元素(display: block)每个块级元素都从一个新行开始,而且其后的元素也需另起一行开始,标题、段落、表格、层、body等都是块级元素。块级元素只能作为其他块级元素的子元素,而且需要一定的条件。内联元素,例如、等,定义上下边界不会影响到行高(line-height),内联元素距离上一行元素的距离由行高决定,而不是填充或边界。注2. 内联元素(display:inline)内联元素不需要在新行内显示,而且也不强迫其后的元素换行,如a、em、span等都为内联元素。内联元素可以为任何其他元素的子元素
23、。浮动元素(无论左或者右浮动)边界不压缩,且若浮动元素不声明宽度,则其宽度趋向于0,即压缩到其内容能承受的最小宽度。如果盒中没有内容,则即使定义了宽度和高度都为100%,实际上只占0%,因此不会被显示,此点在采取层布局的时候需特别注意。边界值可为负,其显示效果各浏览器可能不相同。填充值不可为负。边框默认的样式(border-style)为不显示(none)。3.CSS引入的方式有哪些? link和import的区别是?本质上,这两种方式都是为了加载CSS文件,但还是存在着细微的差别。差别1:老祖宗的差别。link属于XHTML标签,而import完全是CSS提供的一种方式。link标签除了可以
24、加载CSS外,还可以做很多其它的事情,比如定义RSS,定义rel连接属性等,import就只能加载CSS了。差别2:加载顺序的差别。当一个页面被加载的时候(就是被浏览者浏览的时候),link引用的CSS会同时被加载,而import引用的CSS会等到页面全部被下载完再被加载。所以有时候浏览import加载CSS的页面时开始会没有样式(就是闪烁),网速慢的时候还挺明显(梦之都加载CSS的方式就是使用import,我一边下载一边浏览梦之都网页时,就会出现上述问题)。差别3:兼容性的差别。由于import是CSS2.1提出的所以老的浏览器不支持,import只有在IE5以上的才能识别,而link标签无
25、此问题。差别4:使用dom控制样式时的差别。当使用javascript控制dom去改变样式的时候,只能使用link标签,因为import不是dom可以控制的。大致就这几种差别了(如果还有什么差别,大家告诉我,我再补充上去),其它的都一样,从上面的分析来看,还是使用link标签比较好。标准网页制作加载CSS文件时,还应该选定要加载的媒体(media),比如screen,print,或者全部all等。这个我到CSS高级教程中再给大家介绍。注:1,网友comehope在留言中提出了另一种区别。差别5:import可以在css中再次引入其他样式表,比如可以创建一个主样式表,在主样式表中再引入其他的样式
26、表,如:main.css-import “sub1.css”;import “sub2.css”;sub1.css-p color:red;sub2.css-.myclass color:blue这样更利于修改和扩展猴 子提示:这样做有一个缺点,会对网站服务器产生过多的HTTP请求,以前是一个文件,而现在却是两个或更多文件了,服务器的压力增大,浏览量大的网站还是 谨慎使用。有兴趣的可以观察一下像新浪等网站的首页或栏目首页代码,他们总会把css或js直接写在html里,而不用外部文件。4.CSS选择符有哪些?哪些属性可以继承?优先级算法如何计算?内联和important哪个优先级高?5:前端页面
27、有哪三层构成,分别是什么?作用是什么?最准确的网页设计思路是把网页分成三个层次,即:结构层、表示层、行为层。网页的结构层(structural layer)由 HTML 或 XHTML 之类的标记语言负责创建。标签,也就是那些出现在尖括号里的单词,对网页内容的语义含义做出了描述,但这些标签不包含任何关于如何显示有关内容的信息。例如,P 标签表达了这样一种语义:“这是一个文本段。”网页的表示层(presentation layer) 由 CSS 负责创建。 CSS 对“如何显示有关内容”的问题做出了回答。网页的行为层(behavior layer)负责回答“内容应该如何对事件做出反应”这一问题。
28、这是 Javascript 语言和 DOM 主宰的领域。8:你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么?经常遇到的浏览器的兼容性有哪些?怎么会出现?解决方法是什么?点评:css的兼容性也是大家关注的热点。大家一定要注意多测试。Javascript 多浏览器兼容性问题及解决方案兼容性处理要点 1、DOCTYPE 影响 CSS 处理 2、FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width 3、FF: 支持 !important, IE 则忽略, 可用 !impor
29、tant 为 FF 特别设置样式 4、div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行 5、在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法: divmargin:30px!important;margin:28px; 注意这两个margin的顺序一定不能写反,!important这个属性IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样: divmaring:30px;margin:28px 重复定义
30、的话按照最后一个来执行,所以不可以只写margin:XXpx!important; 浏览器差异 1、ul和ol列表缩进问题 消除ul、ol等列表的缩进时,样式应写成:list-style:none;margin:0px;padding:0px; 其中margin属性对IE有效,padding属性对FireFox有效。 注 经验证,在IE中,设置margin:0px可以去除列表的上下左右缩进、空白以及列表编号或圆点,设置padding对样式没有影响;在 Firefox 中,设置margin:0px仅仅可以去除上下的空白,设置padding:0px后仅仅可以去掉左右缩进,还必须设置list- st
31、yle:none才 能去除列表编号或圆点。也就是说,在IE中仅仅设置margin:0px即可达到最终效果,而在Firefox中必须同时设置margin:0px、 padding:0px以及list-style:none三项才能达到最终效果。 2、CSS透明问题 IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。 FF:opacity:0.6。 注 最好两个都写,并将opacity属性放在下面。 3、CSS圆角问题 IE:ie7以下版本不支持圆角。 FF: -moz-border-radius:4px,或者
32、-moz-border-radius-topleft:4px;-moz- border- radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz- border- radius- bottomright:4px;。 注 圆角问题是CSS中的经典问题,建议使用JQuery框架集来设置圆角,让这些复杂的问题留给别人去想吧。不过jQuery的圆角只看到支持整个区域的圆角,没有支持边框的圆角,不过这个边框的圆角可以通过一些简单的手段来实现,下次有机会介绍下。 4、cursor:hand VS cursor:pointer 问题说明:fire
33、fox不支持hand,但ie支持pointer ,两者都是手形指示。 解决方法:统一使用pointer。 5、字体大小定义不同 对字体大小small的定义不同,Firefox中为13px,而IE中为16px,差别挺大。 解决方法:使用指定的字体大小如14px。 并列排列的多个元素(图片或者链接)的div和div之间,代码中的空格和回车在firefox中都会被忽略,而IE中却默认显示为空格(约3px)。 6、CSS双线凹凸边框 IE:border:2px outset;。 FF: -moz-border-top-colors: #d4d0c8 white;-moz-border-left-col
34、ors: #d4d0c8 white;-moz-border-right-colors:#404040 #808080;-moz-border-bottom-colors:#404040 #808080; 浏览器bug 1、IE的双边距bug 设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。 解决方案:在这个div里面加上display:inline; 例如: 相应的css为 以下为引用的内容: 复制代码代码如下:#IamFloat float:left; margin:5px;/*IE下理解为10px*/ display:inline;/*IE下再理解
35、为5px*/ #IamFloat float:left; margin:5px;/*IE下理解为10px*/ display:inline;/*IE下再理解为5px*/ 关 于CSS中的问题实在太多了,甚至同样的CSS定义在不同的页面标准中的显示效果都是不一样的。一个合乎发展的建议是,页面采用标准XHTML标准编写, 较少使用table,CSS定义尽量依照标准DOM,同时兼顾IE、Firefox、Opera等主流浏览器。很多情况下,FF和 Opera的CSS解释标准更贴近CSS标准,也更具有规范性。 2、IE选择符空格BUG 今天在给博客的段落样式设置首字符样式的时候发现,原来一个空格也可以使
36、样式失效。 请看以下代码: 复制代码代码如下: 对于世界而言,你是一个人;但是对于某个人,你是他的整个世界。纵然伤心,也不要愁眉不展,因为你不知是谁会爱上你的笑容。 /code 复制代码代码如下: 对于世界而言,你是一个人;但是对于某个人,你是他的整个世界。纵然伤心,也不要愁眉不展,因为你不知是谁会爱上你的笑容。 这 段代码对的首字符样式定义在IE6上看是没有效果的(IE7没测试),而在p:first-letter和font- size:300%加上空格,也就是p:first-letter font-size:300%后,显示就正常了。但是同样的代码,在FireFox下看是正常的。按道理说,p
37、:first- letterfont-size:300%的写法是没错的。那么问题出在哪里呢?答案是伪类中的连字符”-”。IE有个BUG,在处理伪类时,如果伪 类的名称中带有连字符”-”,伪类名称后面就得跟一个空格,不然样式的定义就无效。而在FF中,加不加空格都可以正常处理。对css缩写的支持问题:不论是ie 还是ff对css的缩写都有一小点问题比如border: 0xp solid #fff;两个浏览器支持都没有问题但对于四个边的magin不同情况下,就不能用这种缩写了,无论是ie还是ff又会出现边界解释错误,而导致页面变形正确缩写:border-width:0px 1px 2px 3px;b
38、order-style:solid;border-color:#fff;第二点是ie对于css的magin padding 等默认值为0px,但ff却不一样,为了保持外观的统一性,即使padding为0你也要写上,以免ff在浏览中的错位。IE与Firefox的CSS兼容大全1.DOCTYPE 影响 CSS 处理2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行3.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中4.
39、FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width5.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式,值得注意的是,一定要将xxxx !important 这句放置在另一句之上6.div 的垂直居中问题: vertical-align:middle;将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行7.cursor: pointer 可以同时在
40、IE FF 中显示游标手指状, hand 仅 IE 可以8.FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。9.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法:divmargin:30px!important;margin:28px;注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样:divmaring:30px;margin:28px重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important;10.IE5 和IE6的BOX解释不一致IE5下divwidth:300px;margin:0 10px 0 10px;div 的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在