当前位置:编程学习 > JAVA >>

各位,我想请教一下,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 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,