各位,我想请教一下,struts2 结合 freemarker 的问题(自定义标签)

liaoyz1688 2009-11-09 11:30:11
我具体描述一下,麻烦各位给点意见。
执行URL: http://xxx.sss.*Action.do 后
服务器返回某路径下的 test.html 这个静态页面;
如果现在我想在这个页面里用freemarker自定义标签如:[@ TestList... 和 [#list test...
问题是:
我需要怎么配置才能在一个静态页面(*.html)里嵌入 freemarker 的自定义标签呢?
不知道小弟表述的够不够详细,如有不清楚的地方可以问,小弟常在线。
最好可以给个例子,小弟不胜感激。
...全文
930 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianfulove 2012-10-06
  • 打赏
  • 举报
回复
可以 实现 的,,我实现过类似的,不过这个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文件中的功能。不知道 能不能帮到你。
一杯酒 2011-07-19
  • 打赏
  • 举报
回复
楼主应该说的不是简单的应用freemarker模板,而是想利用freemarker的模板技术来做一个自定义的标签,就像继承TagSupport类写出的那种标签,我见过实例,搞不懂原理
忧云 2011-01-06
  • 打赏
  • 举报
回复
在struts.xml里面不是有result 和 type两个属性么,type里面加入freemarker就可以在静态页面了,要自定义方法的话就能够用标签调用方法。
coolboybest 2010-08-23
  • 打赏
  • 举报
回复
zheng真在学这块呢。关注/////
javafx 2010-04-14
  • 打赏
  • 举报
回复
楼主加下我的QQ:49862849
我也是向在freemarker中加入(自定义标签)
一起研究一下
sangshusen_1988 2009-11-10
  • 打赏
  • 举报
回复
<action name="test" class="com.acme.TestAction">
<result name="success" type="freemarker">test-success.ftl</result>
</action>
楼主是不是这个意思啊?文件后缀名只是一个符号,你叫什么都成,.ftl也成,.html也成,关键是得解析它不是
sangshusen_1988 2009-11-10
  • 打赏
  • 举报
回复
.html,.ftl都是一个符号,叫什么都一样,你嵌入freemarker表达式,肯定得去使用freemarker引擎去解析它吧
chaofeipz 2009-11-10
  • 打赏
  • 举报
回复
villagehead 说的很对 我顶一下
villagehead 2009-11-10
  • 打赏
  • 举报
回复
有点意思我就继续,

我的意思是把别的扩展名当作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
liaoyz1688 2009-11-10
  • 打赏
  • 举报
回复
”解决办法可能就是把html转给一个后台程序
(修改配置文件,让*.html走到一个后台的程序上去)
然后那个程序处理完成了再转到一个ftl或者什么视图上。
这样,显示的结果就是浏览器提交了一个html请求,然后输出了后台取得的数据。“

我感觉村长说的有点像是这样的意思,但是具体实现起来小弟就不清楚具体怎么做了。
希望高人指点下小弟,小弟感激不尽!
liaoyz1688 2009-11-10
  • 打赏
  • 举报
回复
<<文件后缀名只是一个符号,你叫什么都成,.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' />
这个贴的问题算是解决了,但是还有一个技术关键点被我忽略了;
一般我们这样来引用这些标签,不只是单纯的用来遍历服务器返回来的集合的。
如果要遍历集合不需要这么复杂的过程,这样封装;
其一,是为了在标签里再定义自己的逻辑,而这些逻辑可以继续访问后台程序来查询内容;
其二,就是表情可以嵌套着用,外层标签的内容可以给内层标签当参数用;
这样一来这些标签相对就比较灵活了;
现在的问题是,怎么让这些标签跑后台程序并且把相应参数传过去;

如果找到答案我我会再将解决办法与各位分享,感谢各位的热心支持和帮助!
我会继续努力找出答案,也希望各位可以一起来探讨,毕竟人多力量大。
先谢谢各位了!
liaoyz1688 2009-11-09
  • 打赏
  • 举报
回复
顶一下~哪位高人可以帮帮小弟呀?
villagehead 2009-11-09
  • 打赏
  • 举报
回复
我的意思是,lz的要求就不是一个真正的静态页面啊,
还是需要程序动态干预数据内容的一个页面。

lz所说的“看过相关程序”
我分析可能是
把.html也作为action来处理。
例如在struts2里面定义.action的地方定义成.html。

或者像2楼的例子,只是用freemarker加上动态数据和模板,
来输出一个“静态页面”

因为如果不配置一下,html是会/只会直接输出到浏览器的。

解决办法可能就是把html转给一个后台程序
(修改配置文件,让*.html走到一个后台的程序上去)
然后那个程序处理完成了再转到一个ftl或者什么视图上。
这样,显示的结果就是浏览器提交了一个html请求,然后输出了后台取得的数据。

PS:不过说到这里,我感觉还不是lz想要的答案。呵呵
就算bd了吧。嘿嘿

good luck
wgj830823 2009-11-09
  • 打赏
  • 举报
回复
学习一下 楼主尽快研究出来啊呵呵
liaoyz1688 2009-11-09
  • 打赏
  • 举报
回复
补充下,我本贴所说的技术都是客观存在的,本人也亲眼改过相关程序;
但是本人才疏学浅,未能另外当中所以然,希望高人指点迷津,在下在此先行谢过了!
liu_moyan 2009-11-09
  • 打赏
  • 举报
回复
期待答案中
liu_moyan 2009-11-09
  • 打赏
  • 举报
回复
说错了 是还有听说过可以直接在html页面里面用f的自定义标签
liaoyz1688 2009-11-09
  • 打赏
  • 举报
回复
”建议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我自己定义标签,
最好可以给一个例子..或者介绍一下文章。(我在网上找了很久了,没找到理想的例子);
liu_moyan 2009-11-09
  • 打赏
  • 举报
回复
额 还有听说过可以直接在html页面里面用f的自定义表情
hhj112 2009-11-09
  • 打赏
  • 举报
回复
自己编写代码支持
加载更多回复(3)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧