我即将选择组织我的观点(使用spring-mvc,但这不应该太重要)
据我所知,有6个选项(尽管它们并不相互排斥):
<jsp:include>
<%@ include file="..">
Tiles和Sitemesh可以分组; 所以可以的Freemarker和速度.每个小组中使用哪一个不是这个讨论的问题,有足够的问题和讨论.
这是一个有趣的读物,但不能说服我使用瓷砖.
我的问题是 - 这些框架提供的内容 <@ include file="..">
与JSTL 无法正常完成.要点(一些来自文章):
包括部分页面,如页眉和页脚 - 之间没有区别:
<%@ include file="header.jsp" %>
Run Code Online (Sandbox Code Playgroud)
和
<tiles:insert page="header.jsp" />
Run Code Online (Sandbox Code Playgroud)在标题中定义参数 - 如标题,元标记等.这非常重要,尤其是从SEO的角度来看.使用模板选项,您只需定义每个页面应定义的占位符.但是你可以在jsp中使用JSTL,使用<c:set>
(在包含页面中)和<c:out>
(在包含的页面中)
布局重组 - 如果要在菜单上方移动面包屑,或在另一个侧面板上方移动登录框.如果页面包含(使用jsp)组织不当,则可能需要在这种情况下更改每个页面.但是如果你的布局不是太复杂,并且你把常见的东西放在页眉/页脚中,就没有什么可担心的了.
公共组件和特定内容之间的耦合 - 我没有发现这个问题.如果要重用某些片段,请将其移动到不包含任何页眉/页脚的页面,并在需要的地方包含它.
效率 - <%@ include file="file.jsp" %>
比其他任何东西都更有效,因为它被编译一次.所有其他选项都被解析/执行多次.
复杂性 - 所有非jsp解决方案都需要额外的xml文件,其他包括,预处理器配置等.这既是学习曲线又是引入更多潜在的失败点.此外,它使支持和更改变得更加乏味 - 您必须检查许多文件/配置以了解正在发生的事情.
占位符 - 速度/自由标记比JSTL更多吗?在JSTL中,您放置占位符,并使用模型(放置在请求或会话范围内,由控制器)来填充这些占位符.
所以,说服我除了普通的JSP之外我应该使用上面的任何框架而不是/.
String
Java中是否有任何替换机制,我可以使用文本传递对象,并在发生时替换字符串.
例如,文本是:
Hello ${user.name},
Welcome to ${site.name}.
Run Code Online (Sandbox Code Playgroud)
我拥有的对象是"user"
和"site"
.我想${}
用对象中的等价值替换内部给出的字符串.这与我们替换速度模板中的对象相同.
Velocity还是FreeMarker?
他们看起来几乎一样,甚至是语法?
用什么?还是什么时候用?
只是一个基于maven结构的简单速度独立应用程序.这是用Scala编写的代码片段,用于helloworld.vm
在${basedir}/src/main/resources
文件夹中呈现模板:
com.ggd543.velocitydemo
import org.apache.velocity.app.VelocityEngine
import org.apache.velocity.VelocityContext
import java.io.StringWriter
/**
* @author ${user.name}
*/
object App {
def main(args: Array[String]) {
//First , get and initialize an engine
val ve = new VelocityEngine();
ve.init();
//Second, get the template
val resUrl = getClass.getResource("/helloworld.vm")
val t = ve.getTemplate("helloworld.vm"); // not work
// val t = ve.getTemplate("/helloworld.vm"); // not work
// val t = ve.getTemplate(resUrl.toString); // not work yet
//Third, create a context and add data
val context = new …
Run Code Online (Sandbox Code Playgroud) 我想知道如何在速度中逃避#.反斜杠似乎逃脱了它,但它也打印出来
这个:
\#\#
Run Code Online (Sandbox Code Playgroud)
打印:
\#\#
Run Code Online (Sandbox Code Playgroud)
我想要:
##
Run Code Online (Sandbox Code Playgroud) 从String创建Velocity模板的最佳方法是什么?
我知道Velocity.evaluate方法,我可以传递String或StringReader,但我很好,有更好的方法(例如创建模板实例的任何优点).
我在Java应用程序中使用Struts + Velocity,但在提交表单后,确认页面(Velocity模板)显示变量名称而不是空标签,如下面的示例中的Age:
姓名:费尔南多
年龄:{person.age}
性别:男
我想知道如何隐藏它!
我有一个项目,我想加载一个速度模板来完成它与参数.整个应用程序打包为jar文件.我最初想到的是这样的:
VelocityEngine ve = new VelocityEngine();
URL url = this.getClass().getResource("/templates/");
File file = new File(url.getFile());
ve = new VelocityEngine();
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "file");
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, file.getAbsolutePath());
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, "true");
ve.init();
VelocityContext context = new VelocityContext();
if (properties != null) {
stringfyNulls(properties);
for (Map.Entry<String, Object> property : properties.entrySet()) {
context.put(property.getKey(), property.getValue());
}
}
final String templatePath = templateName + ".vm";
Template template = ve.getTemplate(templatePath, "UTF-8");
String outFileName = File.createTempFile("report", ".html").getAbsolutePath();
BufferedWriter writer = new BufferedWriter(new FileWriter(new File(outFileName)));
template.merge(context, writer);
writer.flush();
writer.close();
Run Code Online (Sandbox Code Playgroud)
当我在eclipse中运行时,这很好用.但是,一旦我打包程序并尝试使用命令行运行它,我得到一个错误,因为找不到该文件.
我想问题就在这一行:
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, file.getAbsolutePath()); …
Run Code Online (Sandbox Code Playgroud) 你能在速度模板中做这样的事情吗?
#set ($map = $myobject.getMap() )
#foreach ($mapEntry in $map.entrySet())
<name>$mapEntry.key()</name>
<value>$mapEntry.value()</value>
#end
Run Code Online (Sandbox Code Playgroud)
它会像这样输出空白标签:
<name></name>
Run Code Online (Sandbox Code Playgroud)
和
<value></value>
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我通过您更新的资源在速度1.6中使用$ null来了解空检查.资源:读取在Velocity模板中映射的模型对象 但是我面临着很多挑战,因为没有提供关于此的文档,因此没有$ null用于null检查速度.请向我提供说明$ null的文档,以便对null检查速度有效.
在此先感谢幸运