- 浏览: 12164 次
最新评论
-
walle1027:
关于marco和taglib的争论
<pre name= ...
FreeMarker和Jsp的应用范围 -
dingyaodanv1:
<div class="quote_title ...
FreeMarker和Jsp的应用范围 -
javaonejcy:
无意中看到这个贴,freemarker我倒是没用过,但也看过书 ...
FreeMarker和Jsp的应用范围 -
lijie250:
struts2的freemarker调试页面的时候不方便啊,f ...
FreeMarker和Jsp的应用范围 -
zhoujian1027:
看了这么多 受教了~~
FreeMarker和Jsp的应用范围
最近要做新项目,想了解一下新的技术看看有没有可以改进的地方。于是学习了一下Struts2(之前一直用Struts1),接触到了FreeMarker,做了一些实验之后,对其功能很是疑惑。
从我自己测试以及看网上大家的评论可以得出FreeMarker具备以下优点:
1、逻辑分离好,View层不出现逻辑代码,可维护性好
2、美工和技术的工作分离
3、速度快,省去了Jsp编译过程
4、可以在IDE中运行,换句话说是可以进行单元测试
5、可以制作Macro
看完大量FreeMarker的资料以及大家对它的评论之后,依旧无法打消我心中的疑惑,针对以上5点我可以讲:
1、逻辑分离,无非是FreeMarker模版无法直接运行Java代码,强制要求所有数据必须预处理才能将结果传入View层做最终展现。我个人对这种过于纯粹的东西报以怀疑,实际工作中很多时候这种纯粹的逻辑分离很难实现。当一个长期维护的项目,不断增加显示逻辑之后,为了保持View层的这种强制的干净,而在Action层增加大量处理逻辑,我不觉得维护性会好(也许我理解错了,毕竟没有长期使用过)。就像前些年流行XML配置文件,分离了逻辑,后来发现太麻烦,又产生了Annotation消灭XML配置文件,无论分离还是聚合,逻辑是无法消灭的,总是要有一个地方放。所以到底是多写一些代码来保证View层看上去很美,还是把显示逻辑全写到View层,谁又能真正说清楚哪个更好。
我们到今天很多项目还在用最传统的Jsp,也还在用<%%>,也会有比较多的Java代码出现在Jsp页面上的情况,但是页面上的代码全都是显示相关的逻辑,都是最简单的Java代码,会Java的就能维护,学习成本基本为0,维护岂不是更好?更符合KISS原则。
2、美工和技术工作分离,我一直觉得这只是一个神话。到今天为止,我们公司美工和开发的合作方式基本是美工做界面原型图,把需要的图片切割出来,把需要的效果制作成CSS交给技术,技术按照需要的效果进行编码制作HTML静态原型界面。因为,对于稍微复杂一点的页面,我相信没有哪个技术能忍受美工直接用DreamWeaver生成出来的代码。
3、速度快,算个优点吧,但是没有那么重要吧,对于现在的机器一般的Jsp编译也就一两秒钟的事情。多数的时间还是花在编写和测试上的。
4、可以在IDE中运行,这个也算个小优点,但是界面开发更多时候还是以最终显示效果来进行测试的,毕竟比较直观。直接从生成的HTML找需要的信息和刷新一下浏览器看结果哪个更高效?
5、Macro,这个没有太多使用经验,就不做评论了,但是可以确定Jsp一定也能实现。
就以上的这些问题,我无法看到在大范围Web开发中FreeMarker相对于Jsp的优势。
我认为FreeMarker可以应用在以下场景:
1、AJAX请求的局部内容的生成,例如某个实时刷新的消息栏。可以称之为View层组件,干净,和主系统功能分离,可重用。
2、Javascript数据生成,甚至Javascript程序的生成。举例如Javascript中提示信息要做多语言处理,那么可以由FreeMarker动态生成,或生成多个静态Javascript文件。
3、后台动态文档生成,如群发邮件模板生成个性邮件。
任何技术都有他的适用范围,抛砖引玉,希望FreeMarker有丰富经验的兄弟多说说自己是如何使用FreeMarker的,以及使用中的一些优点和问题。
评论
<#-- | 画面共用头部部分 | 创建者:杨涛 | 创建时间:2009-05-05 | 版本:1.0 --> <#macro head> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <script type="text/javascript" src="${path}/js/jquery-1.4.2.min.gzjs"></script> <script type="text/javascript" src="${path}/js/jquery-easyui/easyloader.js"></script> <script type="text/javascript" src="${path}/js/My97DatePicker/WdatePicker.js"></script> <script type="text/javascript" src="${path}/js/util.js"></script> <link rel="stylesheet" type="text/css" href="${path}/js/jquery-easyui/themes/icon.css" /> <link rel="stylesheet" type="text/css" href="${path}/js/jquery-easyui/themes/default/pagination.css" /> <link rel="stylesheet" type="text/css" href="${path}/css/yangtao.css" /> <title>运输管理系统</title> </head> <script type="text/javascript"> using('linkbutton'); $(document).ready(function(){ $.ajaxSetup({ cache:false, dateType:'json' }); $(document).bind('contextmenu',function(){return false;}) }) </script> </#macro> <#-- | 通用的HTML模板宏,加入常用的js引用和公用的部分 | 作者: 杨涛 | 日期: 2010-06-09 --> <#macro html> <html> <@head/> <body> <#nested> </body> <@footer/> </html> </#macro> <#macro footer> <P id=copyRight align=center> <TABLE> <TBODY> <TR align=middle> <TD>版权所有</TD> </TR> <TR align=middle> <TD><A target=_blank>联系我们</A></TD> </TR> </TBODY> </TABLE> </#macro>
关于页面
<#include "/common/common.html"> <@html> <TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0> <tr> <td width="15%" valign="top"> <table width="100%" class=queryTable> <tr> <th> 常量列表 </th> </tr> <tr> <td> <@select id="constantList" list=constantList size="30" style="width:220px;" onclick="changeSelection()"/> </td> </tr> </table> </td> <td width="85%" valign="top"> <TABLE cellSpacing=0 cellPadding=0 height="100%" width="100%" align=center border=0> <tr> <td> <div id="context"></div> </td> </tr> <tr> <td align="right"> <a class="easyui-linkbutton" icon="icon-add" id="btnAdd" onclick="addNew()">新增</a> </td> </tr> <tr> <td height="200" width="100%"> <iframe id="updateifm" frameborder="0" width="100%" height="100%"> </iframe> </td> </tr> </TABLE> </td> </tr> </TABLE> </@html> <script language="javascript" type="text/javascript"> function changeSelection() { var selectedValue = $("#constantList").val(); $.ajax( { url :'constant.selectByType.do', data : { "type" :selectedValue }, dataType :'html', success : function(html) { $('#context').html(html); } }) } function addNew() { var i = document.getElementById('constantList').selectedIndex; var type = "", typeName = ""; if (i >= 0) { type = document.getElementById('constantList').options[i].value; typeName = document.getElementById('constantList').options[i].text; } $('#updateifm').attr( 'src', 'constant.execute.do?target=ConstantAdd&type=' + encodeURI(type) + '&typeName=' + encodeURI(typeName)); } function update(id) { $('#updateifm').attr('src', 'constant.execute.do?target=ConstantUpdate&id=' + id); } function deleteRow(id, version) { $.post('constant.delete.do?id=' + id + "&version=" + version, showMsg, 'json') } </script>
去掉CSS,几乎可以让美工直接view
还有freemarker的function
<#-- | 取得时间的function,省去了各种判断 --> <#function getTime time=""> <#if time?is_date> <#return time?string("yyyy-MM-dd HH:mm:ss")> <#else> <#return time> </#if> </#function> <#-- | 取得日期的function,省去了各种判断 --> <#function getDate time=""> <#if time?is_date> <#return time?string("yyyy-MM-dd")> <#else> <#return time> </#if> </#function>
保持controller的纯洁。
我不相信有谁能完全把页面剥得没有逻辑。
比如假如我要输出一个客户列表,假如这个客户是90后,需要输出非主流
你把逻辑写在controller里?从hibernate拿到客户List,你再遍历这个List,遇到90后,在客户的某个域里写上非主流?
那你这个客户的Model是不是不纯粹了?多了一个字段叫 是否非主流?还多遍历了一次List
这种逻辑是不是只能在视图层面上做?
这个例子很简单,但是以此类推,肯定会有逻辑在视图上做。
不是所有的逻辑都放在controller里才是好的
为什么不用jstl标签库呢,非要用<%%>?
jstl一样可以做判断。只不过不让java在前台美工的眼里出现。
我感觉JSTL比在页面上写java代码好看的多。而且也方便,如果不会java的看到你写的页面会头疼的```
2,Data可以缓存
这个算scripty ??
无所谓了,萝卜白菜各有所爱,讨论讨论而已
最近用个groovy + freemarker做**还是挺不错的,jsp忘记了不少,尤其是taglib,jstl标准的都不会用了,555
=以后用到了再拾起来。
lz莫非要结贴?
一般情况下重用性只和设计有关,和技术无关。
这句话我觉得还是推荐老兄去用用macro为好,同是nested,
原始的include(page层面)和taglib(控件层面)的nested,不如tm的nested来的直接和明了
而且fm的配置相对简单,不需要<%@page 等,再者,做单元测试,不需要web容器,
还有就上有个老兄说的,错误提示更细,一看便知
tiles比这个强得多
感兴趣的去看看
如果是一个单独的页面,我经常把东西全放在里面,甚至连个action都不跳,直接拿service。
老兄…………没说taglib无法啊……
只是说taglib没有macro重用性高——别PS我自以为了(多数血人家的,好不容自己思考了下,变成自己的观点了,又不让拿出来晒,郁闷啊)
well,随便来个例子吧,要不然光有论点,没论据,汗
就像你想不明白为什么,jsp中为什么不能放java代码,我同样也想不明白为什么还有这么多人不能理解在jsp不要放java代码的好处。
你提到页面显示逻辑,我想js和tag能不能解决你这方面的问题呢?jstl和struts的tag都不够的话,你自己不知道写自定义tag吗?
每层干每层的事情,不要以现行项目中的做法就认为,view层中写java代码就是合理的事。
国内的项目很多都是完全为了实现而实现的,很少有考虑到什么耦合性,维护性,可复用性等等
经历过很多电信级的项目也都是这样,但不是说这样做是合理的,只能说我们国内的实际使用技术太落后了
如果你觉得这个话题对你来说不是问题,你可以不参与,或者偷偷点下隐藏贴或者新手贴。轻易去judge别人没任何意义。
我们讨论不要总停留在不是对就是错的程度上。就像我帖子的主题说明的,我希望探讨的是FreeMarker和JSP的“应用范围”。任何技术都有他合适做的事情。也就是说,现在有一架天平,一边是FreeMarker,另一边是JSP,我们把自己的观点放在两边,最终可以看出他们各自的长处,以及在什么情况下适合用哪一个。
另外,View层历来是最麻烦的,情况最复杂。我的确对一刀切强制要求view层不能出现Java代码的方式表示质疑,干净的只是教程中的那几个简单例子。实际项目中情况要复杂得多。追求View层强制干净的结果可能是带来很多不必要的麻烦。这中间需要有一个尺度的把握。
最后,电信项目碰巧我也做过。这类项目的核心难度通常不在View层。甚至说,它的View层是相对简单的。
一般情况下重用性只和设计有关,和技术无关。
这句话我觉得还是推荐老兄去用用macro为好,同是nested,
原始的include(page层面)和taglib(控件层面)的nested,不如tm的nested来的直接和明了
而且fm的配置相对简单,不需要<%@page 等,再者,做单元测试,不需要web容器,
还有就上有个老兄说的,错误提示更细,一看便知
Macro的确是相对方便,那和重用性有何关系?用taglib无法重用吗?
用FreeMarker做view层的单元测试,有几个人能做到?想想就是个不靠谱的事。更何况现在ajax大行其道,很多显示逻辑已经提前到了客户端。
咱们探讨的应用情况不是纯学术应用,而是对于一个真正的项目,一个view层足够复杂,而且需要长期维护,有着种种实际问题的项目。
技术上再屏蔽html/js/css,比如**bean,**taglib,结果那些web uier只会增加更多的学习成本,如果做个改动?还要修改jsp tag source?多麻烦啊
又如何?所谓的第一位不第一位又解决了什么核心问题?
另,说句题外话。讨论的时候如果老是吐血容易晕倒。
<div class="quote_div">
<p>最近要做新项目,想了解一下新的技术看看有没有可以改进的地方。于是学习了一下Struts2(之前一直用Struts1),接触到了FreeMarker,做了一些实验之后,对其功能很是疑惑。</p>
<p> </p>
<p><strong>从我自己测试以及看网上大家的评论可以得出FreeMarker具备以下优点:</strong><br><span style="color: #0000ff;">1、逻辑分离好,View层不出现逻辑代码,可维护性好<br>2、美工和技术的工作分离<br>3、速度快,省去了Jsp编译过程<br>4、可以在IDE中运行,换句话说是可以进行单元测试<br>5、可以制作Macro</span><br><br><strong>看完大量FreeMarker的资料以及大家对它的评论之后,依旧无法打消我心中的疑惑,针对以上5点我可以讲:</strong><br><br><span style="color: #993366;"><span style="color: #0000ff;"><strong>1、逻辑分离</strong></span><span style="color: #ff6600;">,无非是FreeMarker模版无法直接运行Java代码,强制要求所有数据必须预处理才能将结果传入View层做最终展现。我个人对这种过于纯粹的东西报以怀疑,实际工作中很多时候这种纯粹的逻辑分离很难实现。当一个长期维护的项目,不断增加显示逻辑之后,为了保持View层的这种强制的干净,而在Action层增加大量处理逻辑,我不觉得维护性会好(也许我理解错了,毕竟没有长期使用过)。就像前些年流行XML配置文件,分离了逻辑,后来发现太麻烦,又产生了Annotation消灭XML配置文件,无论分离还是聚合,逻辑是无法消灭的,总是要有一个地方放。所以到底是多写一些代码来保证View层看上去很美,还是把显示逻辑全写到View层,谁又能真正说清楚哪个更好。<br><br>我们到今天很多项目还在用最传统的Jsp,也还在用<%%>,也会有比较多的Java代码出现在Jsp页面上的情况,但是页面上的代码全都是显示相关的逻辑,都是最简单的Java代码,会Java的就能维护,学习成本基本为0,维护岂不是更好?更符合KISS原则。</span><br><br><span style="color: #0000ff;"><strong>2、美工和技术工作分离</strong></span><span style="color: #ff6600;">,我一直觉得这只是一个神话。到今天为止,我们公司美工和开发的合作方式基本是美工做界面原型图,把需要的图片切割出来,把需要的效果制作成CSS</span></span><span style="color: #ff6600;">交给技术</span><span style="color: #993366;"><span style="color: #ff6600;">,技术按照需要的效果进行编码制作HTML静态原型界面。因为,对于稍微复杂一点的页面,我相信没有哪个技术能忍受美工直接用DreamWeaver生成出来的代码。</span><br><br><span style="color: #0000ff;"><strong>3、速度快</strong></span><span style="color: #ff6600;">,算个优点吧,但是没有那么重要吧,对于现在的机器一般的Jsp编译也就一两秒钟的事情。多数的时间还是花在编写和测试上的。</span><br><span style="color: #0000ff;"><br><strong>4、可以在IDE中运行</strong></span><span style="color: #ff6600;">,这个也算个小优点,但是界面开发更多时候还是以最终显示效果来进行测试的,毕竟比较直观。直接从生成的HTML找需要的信息和刷新一下浏览器看结果哪个更高效?</span><br><br><span style="color: #0000ff;"><strong>5、Macro</strong></span><span style="color: #ff6600;">,这个没有太多使用经验,就不做评论了,但是可以确定Jsp一定也能实现。</span></span><br><br>就以上的这些问题,我无法看到在大范围Web开发中FreeMarker相对于Jsp的优势。</p>
<p> </p>
<p><strong>我认为FreeMarker可以应用在以下场景:</strong><br><br><span style="color: #339966;">1、AJAX请求的局部内容的生成,例如某个实时刷新的消息栏。可以称之为View层组件,干净,和主系统功能分离,可重用。<br><br>2、Javascript数据生成,甚至Javascript程序的生成。举例如Javascript中提示信息要做多语言处理,那么可以由FreeMarker动态生成,或生成多个静态Javascript文件。</span></p>
<p><span style="color: #339966;"><br></span></p>
<p><span style="color: #339966;">3、后台动态文档生成,如群发邮件模板生成个性邮件。</span></p>
<p> </p>
<p>任何技术都有他的适用范围,抛砖引玉,希望FreeMarker有丰富经验的兄弟多说说自己是如何使用FreeMarker的,以及使用中的一些优点和问题。</p>
<p> </p>
</div>
<p><br>个人的看法:</p>
<p>1.业务层分离的问题:Action层不见得很增加太多的代码,因为基本大部分的逻辑代码都提取出来到逻辑层里了,我使用FM比较依赖于Struts2,所以有时候会将Struts2得标签引入再配合FM制定义方法的特性,感觉的确带来了不少的方便,代码复用性很强。相对于JSP代码更容易阅读,因为页面都是简单的${}占位与标签。学习成本上,个人觉得FM半天就能学会,根本不存在学习成本的问题</p>
<p>2.美工和技术分离:关于这点我也比较认同分离的确是实现了,我自己本人平时就擅长DIV+CSS静态页面设计,使用Freemarker可以自由改变页面的设计,首先JSP里大量的<%%>是需要有一个处理J业务的位置来放置JAVA代码,这样在静态页面上就会占据一个大空间,撑坏了页面布局。而FM的标签与占位符小而易看,对整个页面布局不会造成影响</p>
<p>3.速度:FM速度不见得快,反射调用太多</p>
<p>4.在IDE执行测试:这一点,我也不认同FM,像Struts2-test之类的可以脱离容器启动测试,但是太慢,而且不好判断结果是否是自己想要的,不如使用浏览器直接看直观。</p>
<p>5.Macro ,优势不多说。。。。</p>
<p>附加:静态页面动态生成。。。而且可以直接作为CSS,JS以前文件的模板。。。。</p>
freemarker剥夺了写java代码的权利??汗,freemarker只怎么不能直接调用java对象的方法了?
就像你想不明白为什么,jsp中为什么不能放java代码,我同样也想不明白为什么还有这么多人不能理解在jsp不要放java代码的好处。
你提到页面显示逻辑,我想js和tag能不能解决你这方面的问题呢?jstl和struts的tag都不够的话,你自己不知道写自定义tag吗?
每层干每层的事情,不要以现行项目中的做法就认为,view层中写java代码就是合理的事。
国内的项目很多都是完全为了实现而实现的,很少有考虑到什么耦合性,维护性,可复用性等等
经历过很多电信级的项目也都是这样,但不是说这样做是合理的,只能说我们国内的实际使用技术太落后了
如果你的需求变成:把中文变成拼音显示。你觉得应该怎么样实现呢?
ruby里面有个概念叫helper,如果要实现拼音转换,我在helper里写一个方法页面上马上就可以用。
推到jsp里,简单点,我就直接写个工具类,再引用进来,页面调用这个工具类的方法就是了,假如你用freemarker来做,你怎么做?你是不是必须写在controller里?多了一次遍历是吧?
我的观点就是,页面里写一些程序那是完全没有问题的事情,而freemarker把我们这种权利剥夺了。
一般情况下重用性只和设计有关,和技术无关。
这句话我觉得还是推荐老兄去用用macro为好,同是nested,
原始的include(page层面)和taglib(控件层面)的nested,不如tm的nested来的直接和明了
而且fm的配置相对简单,不需要<%@page 等,再者,做单元测试,不需要web容器,
还有就上有个老兄说的,错误提示更细,一看便知
相关推荐
#### 三、FreeMarker的适用范围 1. **Web开发**: FreeMarker非常适合与MVC架构的Web应用框架(如Struts)结合使用,作为视图组件。 2. **非Web应用**: 由于FreeMarker与容器无关,它可以被轻松地应用于桌面应用或...
- **架构兼容性**:Freemarker 与容器无关,这意味着它不仅可以在 Web 环境下运行,还可以在任何 Java 应用环境中使用,这极大地增强了它的灵活性和适用范围。 - **成本优势**:Freemarker 是开源且免费的,这使得它...
- **适用场景**:虽然最初设计用于生成HTML网页,尤其是配合MVC架构的应用程序,但其应用范围广泛,不仅限于Web开发领域。 - **特点**: - **与容器无关**:FreeMarker不依赖于任何特定的Web容器,如Tomcat或Jetty...
### FreeMarker概述 FreeMarker是一种基于模板的引擎技术,它主要负责将...综上所述,FreeMarker作为一个强大的模板引擎,在Web开发和其他应用场景中都表现出色,其丰富的特性和灵活性使其成为一个不可或缺的工具。
在这个"JSP应用开发详解"的主题中,我们将深入探讨JSP的核心概念、工作原理以及实际应用。 1. JSP核心概念 - JSP页面:JSP页面由HTML或XML标记和嵌入的Java代码组成,服务器负责解析并执行这些Java代码。 - JSP...
同时,它的应用范围不仅限于Web环境,也适用于非Web场景,如桌面应用或命令行工具中的文本生成任务。 #### 二、Freemarker的关键特性 1. **通用性与灵活性**:Freemarker的设计理念之一是高度通用,能适应多种文本...
例如FreeMarker、Velocity和Thymeleaf。 2. **使用模板引擎的优势**: - 更好的前后端分离:模板引擎处理动态内容,HTML设计师无需关心Java代码。 - 提高开发效率:模板语法简洁,易于理解和编写。 - 优化性能:...
2. **模板引擎**:为了更有效地管理JSP页面,开发者经常使用模板引擎,如FreeMarker或Velocity。这些模板引擎允许开发者将HTML结构与Java代码分离,便于转换。转换时,模板引擎会解析JSP文件,执行Java表达式,并...
- **适用范围**:FreeMarker不仅仅是一个Web应用框架,更适合作为其组成部分,例如作为Model2框架(如Struts)中的视图组件。同时,它还支持在非Web环境中应用,比如用于桌面应用或其他非Web项目。 #### 二、核心...
EL提供了一种简洁的方式来访问页面范围内的对象和其属性,简化了JSP中的数据绑定。 6. **JSTL(JavaServer Pages Standard Tag Library)** JSTL是一组标准标签库,用于增强JSP的功能,例如处理XML、查询数据库、...
4. **application**:全局应用程序范围的对象,适用于所有用户共享数据。 5. **pageContext**:提供对当前页面所有作用域的访问。 6. **out**:用于向客户端输出内容。 7. **exception**:捕获并处理页面中的异常。 ...
- **适用范围**: - 不是 Web 应用框架,但可以作为 Web 应用框架的一个组成部分使用,如 Model2 架构中的视图组件。 - 与容器无关,因此既适用于 Web 应用程序环境,也适用于非 Web 的应用程序环境。 - **许可证*...
而JSP(JavaServer Pages)作为传统的动态网页技术,虽然在现代Web应用中逐渐被更先进的视图技术如Thymeleaf、Freemarker等取代,但在很多项目中仍有其应用场景。本篇文章将深入探讨如何在Spring Boot项目中整合JSP...
- **适用范围**: 不仅仅用于 Web 开发,也可以应用于非 Web 的应用程序环境中。 - **与其他框架的关系**: 可以作为 Model2 架构(例如 Struts)的视图组件。此外,尽管 Freemarker 是一个独立的组件,但也可以与 JSP...
除了JSP和Struts,项目可能还涉及到了其他技术,如Servlet、JDBC用于数据库连接,以及可能的模板引擎如FreeMarker或Velocity来生成更复杂的动态视图。此外,为了提高用户体验,可能还应用了AJAX进行异步通信,以及...
随着Web开发的进步,虽然JSP仍被广泛使用,但很多现代Web框架如Spring MVC、Struts2等已经提供了更高级的视图技术,如Thymeleaf和FreeMarker。这些技术在复杂应用中提供了更好的性能和灵活性。 综上所述,"JSP...
JSP技术大全(PDG)涵盖的范围广泛,包括JSP的基础概念、语法、生命周期、内置对象、指令、表达式、脚本元素、EL(Expression Language)、JSTL(JSP Standard Tag Library)以及MVC设计模式在JSP中的应用等。...
《JSP博客系统》 本项目是一篇关于JSP博客系统的详细论文,涵盖了从系统设计到实现的全过程,旨在探讨如何运用Java...通过学习和理解这篇论文,读者不仅可以掌握JSP的实战技巧,还能对Web应用开发流程有更深入的理解。