各位,我想请教一下,struts2 结合 freemarker 的问题(自定义标签)
我具体描述一下,麻烦各位给点意见。执行URL: http://xxx.sss.*Action.do 后
服务器返回某路径下的 test.html 这个静态页面;
如果现在我想在这个页面里用freemarker自定义标签如:[@ TestList... 和 [#list test...
问题是:
我需要怎么配置才能在一个静态页面(*.html)里嵌入 freemarker 的自定义标签呢?
不知道小弟表述的够不够详细,如有不清楚的地方可以问,小弟常在线。
最好可以给个例子,小弟不胜感激。
--------------------编程问答-------------------- 顶一下~哪位高人可以帮帮小弟呀? --------------------编程问答-------------------- test.ftl:
<html>
<body>
<img src="http://www.google.cn/intl/zh-CN/images/logo_cn.gif" width=276 height=110 border=0 />
<table>
<#list list as l>
<tr>
<td>姓名 :</td><td>${l.name}</td>
</tr>
<tr>
<td>年龄 :</td><td>${l.age}</td>
</tr>
<tr>
<td>性别</td><td>${l.sex}</td>
</tr>
</#list>
</table>
</body>
</html>
action:
public String execute() {
StaticFreemarker sf= new StaticFreemarker();
List<Person> person = new ArrayList<Person>();
Person p = new Person();
p.setAge("23");
p.setName("lifeispig");
p.setSex("男");
Person p2= new Person();
p2.setAge("25");
p2.setName("小胖");
p2.setSex("男");
person.add(p);
person.add(p2);
Map map = new HashMap();
map.put("list", person);
String htmlfile="test.html";
try {
sf.init("test.ftl", htmlfile, map, "ftl");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TemplateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.msg=htmlfile;
return this.SUCCESS;
}
即可 --------------------编程问答-------------------- 楼上的test.ftl 不是我需要的内容哦,
小弟需要的是在
test.html 页面里用 <#list list as l> 标签,
也就是说:怎么才能让静态页面支持 freemarker自定义标签
[@ TestList... 和 [#list testList as ... --------------------编程问答-------------------- 建议lz首先搞清楚什么是真正的“静态页面”
db
good luck --------------------编程问答-------------------- 自己编写代码支持 --------------------编程问答-------------------- --------------------编程问答-------------------- 额 还有听说过可以直接在html页面里面用f的自定义表情 --------------------编程问答-------------------- ”建议lz首先搞清楚什么是真正的“静态页面” “
我很清楚我自己需要的是什么样的效果呀,问题已经解决了一半,
只要在web.xml文件里配置一下静态页面也编译freemarker标签就解决了,看表述。
以下是我的静态页面:
test.html
<html>
<head>
<title>test</title>
</head>
<body>
<p><b>stt:</b>${stt}
<#list alist as al>
<p><b>list:</b>${al.name}
<p><b>list:</b>${al.email}
<p><b>list:</b>${al.message}
</#list>
<p><b>map:</b>${amap.name}
</body>
</html>
但是自定义标签的话还没完全理直,希望各位大虾帮帮忙;
我需要的是,在这个页面里用freemarker我自己定义标签,
最好可以给一个例子..或者介绍一下文章。(我在网上找了很久了,没找到理想的例子); --------------------编程问答-------------------- 说错了 是还有听说过可以直接在html页面里面用f的自定义标签 --------------------编程问答-------------------- 期待答案中 --------------------编程问答-------------------- 补充下,我本贴所说的技术都是客观存在的,本人也亲眼改过相关程序;
但是本人才疏学浅,未能另外当中所以然,希望高人指点迷津,在下在此先行谢过了! --------------------编程问答-------------------- 学习一下 楼主尽快研究出来啊呵呵
--------------------编程问答-------------------- 我的意思是,lz的要求就不是一个真正的静态页面啊,
还是需要程序动态干预数据内容的一个页面。
lz所说的“看过相关程序”
我分析可能是
把.html也作为action来处理。
例如在struts2里面定义.action的地方定义成.html。
或者像2楼的例子,只是用freemarker加上动态数据和模板,
来输出一个“静态页面”
因为如果不配置一下,html是会/只会直接输出到浏览器的。
解决办法可能就是把html转给一个后台程序
(修改配置文件,让*.html走到一个后台的程序上去)
然后那个程序处理完成了再转到一个ftl或者什么视图上。
这样,显示的结果就是浏览器提交了一个html请求,然后输出了后台取得的数据。
PS:不过说到这里,我感觉还不是lz想要的答案。呵呵
就算bd了吧。嘿嘿
good luck --------------------编程问答-------------------- ”解决办法可能就是把html转给一个后台程序
(修改配置文件,让*.html走到一个后台的程序上去)
然后那个程序处理完成了再转到一个ftl或者什么视图上。
这样,显示的结果就是浏览器提交了一个html请求,然后输出了后台取得的数据。“
我感觉村长说的有点像是这样的意思,但是具体实现起来小弟就不清楚具体怎么做了。
希望高人指点下小弟,小弟感激不尽!
--------------------编程问答-------------------- 有点意思我就继续,
我的意思是把别的扩展名当作servlet的请求进行处理,
比如最基础的struts1应用中,
在web.xml里面有这样的内容:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
这段话的意思就是说,
当(servlet容器)接收到的url里面有任何(*)以.do结尾的请求,
就把请求发送到名叫action的servlet去执行。(struts怎么按照配置文件分发执行不在讨论范围内)
所以,如果lz是要我说的那样改,
就可以把*.do改成*.html
这样就是说把所有以.html结尾的url分发给action去执行。
如果是struts2的,也有相应内容的配置,
只不过是struts1默认的*.do变成了struts2的*.action
不知道说清楚没有,具体的lz去网上转转就全明白了。
good luck
--------------------编程问答-------------------- villagehead 说的很对 我顶一下 --------------------编程问答-------------------- .html,.ftl都是一个符号,叫什么都一样,你嵌入freemarker表达式,肯定得去使用freemarker引擎去解析它吧 --------------------编程问答-------------------- <action name="test" class="com.acme.TestAction">
<result name="success" type="freemarker">test-success.ftl</result>
</action>
楼主是不是这个意思啊?文件后缀名只是一个符号,你叫什么都成,.ftl也成,.html也成,关键是得解析它不是 --------------------编程问答-------------------- <<文件后缀名只是一个符号,你叫什么都成,.ftl也成,.html也成,关键是得解析它不是>>
说的是呀,后缀名只是个符合关键是得解析它。
需要要.html文件里解析freemarker标签只要在web.xml里加上一些代码就解决了;
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
但是,如果需要解析自定义标签还需要在.html里引入.ftl文件,看下面的程序;
<#import "/WEB-INF/ftl_lib/online/index.ftl" as p>
把index.ftl里自定义好的表情引入当前页面,然后就能用这个标签了;看下面程序
<@p.TestList id='2' name='testName' orderBy='1' />
这个贴的问题算是解决了,但是还有一个技术关键点被我忽略了;
一般我们这样来引用这些标签,不只是单纯的用来遍历服务器返回来的集合的。
如果要遍历集合不需要这么复杂的过程,这样封装;
其一,是为了在标签里再定义自己的逻辑,而这些逻辑可以继续访问后台程序来查询内容;
其二,就是表情可以嵌套着用,外层标签的内容可以给内层标签当参数用;
这样一来这些标签相对就比较灵活了;
现在的问题是,怎么让这些标签跑后台程序并且把相应参数传过去;
如果找到答案我我会再将解决办法与各位分享,感谢各位的热心支持和帮助!
我会继续努力找出答案,也希望各位可以一起来探讨,毕竟人多力量大。
先谢谢各位了! --------------------编程问答-------------------- 楼主加下我的QQ:49862849
我也是向在freemarker中加入(自定义标签)
一起研究一下
--------------------编程问答-------------------- zheng真在学这块呢。关注///// --------------------编程问答-------------------- 在struts.xml里面不是有result 和 type两个属性么,type里面加入freemarker就可以在静态页面了,要自定义方法的话就能够用标签调用方法。 --------------------编程问答-------------------- 楼主应该说的不是简单的应用freemarker模板,而是想利用freemarker的模板技术来做一个自定义的标签,就像继承TagSupport类写出的那种标签,我见过实例,搞不懂原理 --------------------编程问答-------------------- 可以 实现 的,,我实现过类似的,不过这个list就不是freemarker提供的了,你自己要用上freemarker提供的自标签了。
public class ChannelDirective implements TemplateDirectiveModel
/* */ {
/* 48 */ private ChannelService channelService = (ChannelService)SpringBean.getBean("channelServiceImpl");
/* */
/* */ public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
/* */ throws TemplateException, IOException
/* */ {
/* 53 */ String var = TemplateDirectiveModelUtil.getString("var", params);
/* 54 */ this.id = TemplateDirectiveModelUtil.getLong("id", params);
/* */
/* 56 */ if (var == null) {
/* 57 */ var = "channel";
/* */ }
/* */
/* 60 */ Writer out = env.getOut();
/* */
/* 62 */ Channel channel = (Channel)this.channelService.findById(this.id);
/* 63 */ if (channel != null) {
/* 64 */ env.setVariable(var, BeansWrapper.BEANS_WRAPPER.wrap(channel));
/* */ }
/* */
/* 68 */ if ((body != null) &&
/* 69 */ (channel != null))
/* 70 */ body.render(env.getOut());
/* */ }
/* */ }
然后再注册标签上面自定义标签类。
public class FreemarkerManngerExtension extends FreemarkerManager
{
protected Configuration createConfiguration(ServletContext servletContext)
throws TemplateException
{
Configuration configuration = super.createConfiguration(servletContext);
servletContext.setAttribute("configuration", configuration);
configuration.setSharedVariable("chan",new ChannelDirective() );
configuration.setTemplateExceptionHandler(new FreemarkerExceptionHandler());
return configuration;
}
}
最后,你在.html文件中可以使用<@chan id=1> </@chan>指令。你可以类似的改变下。实现你那个list标签在.html文件中的功能。不知道 能不能帮到你。
补充:Java , Web 开发