你还在使用JavaServerPages(俗称JSP)吗?我以前也是,但几年前我放弃了它们,再也没有使用过JSP。JSP是一个伟大的概念,但它剥夺了Web开发的乐趣。对我来说,这些都是小事,例如无法在页面模板上使用单独的文件header.jsp和footer.jsp,无法调用表达式语言方法,无法在运行时合并,重新排列页面的各个部分。所以我切换到FreeMarker模板。FreeMarker已经存在了一段时间,如果您最近没有关注FreeMarker,这里有一些建议供您考虑在下一个Web应用程序中使用FreeMarker。1.没有PermGen问题的类加载如果您开发JavaWeb应用程序已有一段时间,您可能熟悉JVM的PermGen问题。由于FreeMarker模板没有被编译成类,它们不占用PermGen空间,也不需要新的类加载器来加载。2.模板加载器直接从数据源加载页面和模板不是很好吗?也许来自CMS或数据库。也许您只是想将它们保存在一个地方并在不重新部署整个应用程序的情况下更新它们。好吧,你很难在JSP中做到这一点,但FreeMarker提供的模板加载器就是为了这个目的。您可以使用内置类或创建自己的实现。ClassTemplateLoader:从类路径加载模板。FileTemplateLoader:从文件系统中的指定文件夹加载模板。StringTemplateLoader:从StringMap加载模板。URLTemplateLoader:从URL加载模板。您必须实施getURL方法,但这应该很容易做到。WebappTemplateLoader:从servlet上下文加载模板。FreeMarker还可以将多个加载器链接在一起以形成一系列模板加载器。我通常使用WebappTemplateLoader指向WEB-INF下一个内容文件夹。Configuration配置=newConfiguration();configuration.setTemplateLoader(newWebappTemplateLoader(servletContext,"WEB-INF/content"));3.模板可以在运行时嵌入FreeMarker允许您创建真正的模板,而不仅仅是片段,还记得JSP页眉和页脚吗?FreeMarker允许您采用一个模板(在本例中为head.ftl)
${title}并将其添加到另一个模板(site.ftl正文区域)。${body}可以编程方式选择哪个模板进入正文区域。您还可以将多个模板一起添加到同一区域。甚至可以将字符串值或计算值放入正文区域。尝试在JSP中执行此操作。4.JSP的导入不需要你导入每一个你需要使用的类,就像普通的Java类一样。FreeMarker模板只是模板。可以包含在另一个模板中,但目前不需要导入该类。5、使用Jsp支持JSP标签的一个原因是有一个易用性好的标签库。好消息是FreeMarker支持JSP标签。坏消息是它们使用FreeMarker的语法,而不是JSP语法。6.表达式语言中的方法调用除非你的目标是Servlet3.0/El2.2标准容器,否则表达式语言中的方法调用是不可用的。并不是每个人都同意EL表达式中的方法调用是一件好事,但是当您需要它们时,使用JSP真的很痛苦。但是FreeMarker平等对待这些引用中的每一个。${customer.address.country}${customer.getAddress().country}7.内置空字符串处理FreeMarker和Jsp都可以处理表达式语言中的空值,但FreeMarker在易用性上更高级。InvoiceDate:${(customer.invoice.date)!}感叹号告诉FreeMarker自动检查表达式上的空值和空字符串。如果客户、发票或日期中的一个是空值或空字符串,您只会得到标签:InvoiceDate:另一种选择是在感叹号之后包含您的默认值。InvoiceDate:${(customer.invoice.date)!'NoInvoiceAvailable'}如果所有值都缺失,您将得到:InvoiceDate:NoInvoiceAvailable更多详细信息请参见处理缺失值。8.共享变量FreeMarker的共享变量是我最喜欢的“隐藏”特性之一。此功能可让您设置自动添加到所有模板的值。例如,您可以将应用程序的名称设置为共享变量。配置=newConfiguration();configuration.setSharedVariable("app","StackHunter");然后像访问任何其他变量一样访问它。App:${app}以前一般都是用共享变量来引用资源包,然后用${i18n.resourceBundle.key}这样的表达式来取值。${i18n.countries.CA}${i18n.countries['CA']}${i18n.countries[countryCode]}以上这些行都是指与countries_en.properties资源包中的键“CA”对应的值.您需要实现自己的TemplateHashModel,然后将其添加为共享变量以实现此目的。9.支持JSONFreeMarker内置的JSON支持。假设您将以下JSON作为字符串存储到名为user的变量中。{'firstName':'John','lastName':'Smith','age':25,'address':{'streetAddress':'212ndStreet','city':'NewYork','state':'NY','postalCode':10021}}使用?eval将字符串转换为JSON对象,然后可以像任何其他数据一样在表达式中使用它。<#assignuser=user?eval>User:${user.firstName},${user.address.city}10.不只是用于Web开发***,与JSP不同,FreeMarker模板可以在servlet容器之外使用。它们可用于生成电子邮件、配置文件、XML映射等。您甚至可以使用它们生成网页并将它们存储在服务器端缓存中。请在您的下一个Web项目中尝试使用FreeMarker,以带回Web开发的乐趣。原文链接:stackhunter翻译:ImportNew.com-光头打酱油翻译链接:http://www.importnew.com/16944.html