最近小弟对Struts2.1.6中的Freemaker做了个初步的研究.在此和大家分享一下.
Struts2.1.6与Freemarker的整合方式有两种,即通过Freemarker中的模板技术和在struts2.1.6配置文件中的配置有关,两都的区别是比较大的,但是它们各有千秋,本人体会到了设计者的巧妙.
1,通过Freemarker中的模板(Template)来整合.
Struts2.1.6的Action与前台的整合,无非是通过Action(基于Servlet)和struts2.1.6中的XML配置文件.该方法就是通过Action进行整合.
相关的例子代码如下:
一般情况下Action中的方法需要返回一个字符串来和配置文件中相对应找到相关的页面.但是这种结合方式脱离了配置文件的导航,因为在 Template的构造函数里面已经指定了模板文件的位置.因此不需要通过配置文件来指定页面的去处.所以返回值一定要返回Null.
模板文件已在代码指定了.
2,在struts2.1.6配置文件中进行相关的配置
相关的代码如下:
关键是在FTL的模板文件中要指定标签所在的位置,具体的代码如下:
注意:
这种方式的配置有可能会出现乱码,往往乱码问题是最令人头疼的.如果用标签取国际化中文件中的内容是没有问题的.但是在模板文件中的中文会出现乱码.
应该分为到下几步去查找原因:
1,看一下Spring2.0的编码过滤器配置.(Web.xml),并且要放在struts2.1.6的过滤器前面.(过滤器的顺序相当重要.可参见本人的其它文章)
2,struts2.1.6配置文件中的有没有配置相关的编码设置(可要可不要,)
3,看一下IDE开发工具中的模板文件的编码是不是和以上两步指定的编码是否一致,这一步是比较关键的.因为Ftl模板文件不在我们经常开发的文件名之内(.java,.properies,.jsp等),如果不一致,在该文件上右击,设置一下编码即可(本人就是因为这个问题郁闷了好久.呵呵,看来编码问题这个才是最重要的)
Struts2.1.6与Freemarker的整合方式有两种,即通过Freemarker中的模板技术和在struts2.1.6配置文件中的配置有关,两都的区别是比较大的,但是它们各有千秋,本人体会到了设计者的巧妙.
1,通过Freemarker中的模板(Template)来整合.
Struts2.1.6的Action与前台的整合,无非是通过Action(基于Servlet)和struts2.1.6中的XML配置文件.该方法就是通过Action进行整合.
相关的例子代码如下:
1.Configuration cfg = new Configuration();
2. cfg.setServletContextForTemplateLoading(ServletActionContext
3. .getServletContext(), "WEB-INF/template");
4. Map<String, Object> params = new HashMap<String, Object>();
5. params.put("title", "Freemaker模板生成的JSP页面");
6. params.put("cont", "Cont内容啊");
7. params.put("lastUpdated", new Date());
8. HttpServletResponse response = ServletActionContext.getResponse();
9. Template tem = cfg.getTemplate("jsp.ftl");
10. response.setContentType("text/html;charset=UTF-8");
11. Writer out = response.getWriter();
12. try
13. {
14. tem.process(params, out);
15. } catch (TemplateException e)
16. {
17. System.out.println("=======出错了!!=====");
18. e.printStackTrace();
19. }
20. log.info("=====freemarker Servlet测试============");
21. //return "freemaker";
22. return null;
一般情况下Action中的方法需要返回一个字符串来和配置文件中相对应找到相关的页面.但是这种结合方式脱离了配置文件的导航,因为在 Template的构造函数里面已经指定了模板文件的位置.因此不需要通过配置文件来指定页面的去处.所以返回值一定要返回Null.
模板文件已在代码指定了.
2,在struts2.1.6配置文件中进行相关的配置
相关的代码如下:
1.<action name="findMem_*" class="memberAction" method="{1}">
2. <result name="freemaker" type="freemarker">
3. /WEB-INF/template/jsp1.ftl
4. </result>
5. <result name="input">/regsiter.jsp</result>
6. <result name="success">
7. /WEB-INF/jsp/member/regsucced.jsp
8. </result>
9. </action>
关键是在FTL的模板文件中要指定标签所在的位置,具体的代码如下:
1.<#assign s=JspTaglibs["/WEB-INF/tlds/struts-tags.tld"]>
2.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
3.<html>
4. <head>
5. <title></title>
6. <meta http-equiv="pragma" content="no-cache">
7. <meta http-equiv="cache-control" content="no-cache">
8. <meta http-equiv="expires" content="0">
9. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
10. <meta http-equiv="description" content="This is my page">
11. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
12. <!--
13. <link rel="stylesheet" type="text/css" href="styles.css">
14. -->
15. </head>
16. <body>
17. <h1>
18. </h1>
19. <@s.text name="member.mname"/>
20. XML配置文件
21. </body>
22.</html>
注意:
这种方式的配置有可能会出现乱码,往往乱码问题是最令人头疼的.如果用标签取国际化中文件中的内容是没有问题的.但是在模板文件中的中文会出现乱码.
应该分为到下几步去查找原因:
1,看一下Spring2.0的编码过滤器配置.(Web.xml),并且要放在struts2.1.6的过滤器前面.(过滤器的顺序相当重要.可参见本人的其它文章)
2,struts2.1.6配置文件中的有没有配置相关的编码设置(可要可不要,)
3,看一下IDE开发工具中的模板文件的编码是不是和以上两步指定的编码是否一致,这一步是比较关键的.因为Ftl模板文件不在我们经常开发的文件名之内(.java,.properies,.jsp等),如果不一致,在该文件上右击,设置一下编码即可(本人就是因为这个问题郁闷了好久.呵呵,看来编码问题这个才是最重要的)