NutzCN Logo
问答 请教nutz集成velocity之后如何使用layout功能呢
发布于 2760天前 作者 LIZQing 2994 次浏览 复制 上一个帖子 下一个帖子
标签:

想使用velocity的layout功能,自己尝试了下不太成功麻烦能帮我看下吗,我的模板文件layout.vm是下面

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>集成velocity</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="IE=9" >
	<link href="assets/css/bootstrap.css" rel="stylesheet" media="screen">
</head>
<body>
<div class="wrapper" style="position:relative;">
<!-- 页面头 -->
#include("common/header.vm")
<!-- content -->
$screen_content
<!-- 页面尾 -->
 #include("common/footer.vm")
</body>
</html>

然后下面的展示页面hello.vm是下面

#set($layout = "common/layout.vm")
Hello Layout!

配置文件velocity.properties是下面

input.encoding=UTF-8
output.encoding=UTF-8
resource.loader=webapp
webapp.resource.loader.class=com.wonders.common.velocity.tools.WebappResourceLoader
webapp.resource.loader.path=/WEB-INF/cms/

#  relative to web application root directory
tools.view.servlet.layout.directory = /WEB-INF/cms/common/
 
#  relative to the layout directory 
#  NOT relative to the root directory of the webapp!
tools.view.servlet.layout.default.template = layout.vm

在web.xml里面配置了

<servlet>  
    <servlet-name>velocity</servlet-name>  
    <servlet-class>org.apache.velocity.tools.view.servlet.VelocityLayoutServlet</servlet-class>  
  </servlet>  
  <servlet-mapping>  
	 <servlet-name>velocity</servlet-name>  
	 <url-pattern>/*</url-pattern>  
  </servlet-mapping>

请问这样为什么跳转到hello.vm为什么不能装载模板文件呢,能请教下还需要怎么配置吗
ps.访问上面的hello.vm在浏览器只显示Hello Layout!,如果改成下面这样

#set($layout = "common/layout.vm")
$layout  Hello Layout!

在浏览器输出common/layout.vm Hello Layout!

22 回复

不应该是入口方法里面写ok然后渲染的吗?在web.xml加那坨东西的用意是啥

来自炫酷的 NutzCN

@wendal 我看网上他们使用的时候有web.xml那些配置就加上了,我在入口方法里是这么写的

@At("/hello")
@Ok("vm:hello") 
public void hello(){}

这里访问到了hello.vm,但是没有加载到layout.vm模板,nutz集成了velocity要使用layout模板还需要配置什么吗

哦, 这个得 @wizzer

VelocityLayoutServlet 才能渲染layout? 那么, 如果经过入口方法, 那么反而不会进入VelocityLayoutServlet了

@wendal 嗯嗯,好的,我试试单独用VelocityLayoutServlet,看看是不是这个问题

@Wizzercn 请问有什么办法使用nutz入口方法的时候能加载layout模板吗

@lizqing 我折腾了好久 觉得不方便就用beetl了

  • 使用快照版本
  • 根据https://github.com/nutzam/nutzmore/tree/master/nutz-plugins-views的说明进行集成

@kerbores 但是在主模块添加

@Views({ VelocityLayoutView.class })

会报下面的错,VelocityLayoutView这个类的类型不匹配吧

Type mismatch: cannot convert from Class<VelocityLayoutView> to Class<? extends ViewMaker>

写错了应该是
```java
@Views({ VelocityViewMaker.class })

```

@Views({ VelocityViewMaker.class })

@kerbores 按照介绍里面设置下来,启动时报下面的错

2016-09-07 17:06:47,855 org.nutz.mvc.impl.NutActionChainMaker.eval(NutActionChainMaker.java:51) DEBUG - Eval FAIL!! : public void com.wonders.front.IndexAt.hello()
java.lang.RuntimeException: Can not eval vel:hello("vel:hello") View for public void com.wonders.front.IndexAt.hello()
	at org.nutz.lang.Lang.makeThrow(Lang.java:104)
	at org.nutz.mvc.view.ViewZone.makeView(ViewZone.java:90)
	at org.nutz.mvc.impl.processor.ViewProcessor.evalView(ViewProcessor.java:89)
	at org.nutz.mvc.impl.processor.ViewProcessor.init(ViewProcessor.java:31)
	at org.nutz.mvc.impl.NutActionChainMaker.eval(NutActionChainMaker.java:38)
	at org.nutz.mvc.impl.UrlMappingImpl.add(UrlMappingImpl.java:47)
	at org.nutz.mvc.impl.NutLoading.evalUrlMapping(NutLoading.java:203)
	at org.nutz.mvc.impl.NutLoading.load(NutLoading.java:107)
	at org.nutz.mvc.ActionHandler.<init>(ActionHandler.java:19)
	at org.nutz.mvc.NutFilter._init(NutFilter.java:87)
	at org.nutz.mvc.NutFilter.init(NutFilter.java:65)
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4939)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5633)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
2016-09-07 17:06:47,865 org.nutz.mvc.impl.NutLoading.load(NutLoading.java:124) ERROR - Error happend during start serivce!

这应该是哪里出问题了?

文档写错了吧? 直接用回原本的就行.

@Views({ VelocityViewMaker.class })

文档已修改,等会儿回家在onekey里面加个测试页

@kerbores onekey里面好像用的是beetl模板,没发现有velocity

你的这个就只需要改vel为vm即运了

@kerbores 入口方法返回的hello.vm文件一直不能套用layout.vm模板,生生搞了一天,jar包从nutz到nutzmore按照刚才的说明配置下来也无效

更新最新版本的 nutz-onekey 即可看到集成示例

@kerbores 好的,这么晚了,谢谢啦

@kerbores 请问是不是1.r.58版本的nutz-plugins-views才支持啊,我用onekey里面的nutz-plugins-views版本的Java文件替代原来的VelocityViewMaker能够使用layout模板了,非常感谢

这个版本过几天就发布了

添加回复
请先登陆
回到顶部