• Struts2 结合 Freemarker 实例


       Freemarker 是一个不依赖 web 容器的模板引擎,一个基于模板生成文本输出的工具。其工作的原理如下图:

      freemarker 不是一个 web 应用的框架,而适合作为 web 应用的一个组件。使用 freemarker ,可以用已经定义好的模板,生成各种想要的文件,在某些方面使用起来还是挺快捷的,例如使用 freemarker 编写一个代码生成器。本文就是一个结合 Struts2 web 应用框架的使用 Freemarker 的例子。具体的理论方面的知识,就不在此赘述了。

      这个例子是结合 Struts2 2.3.15版本,freemarker 2.3.19。主要的配置文件及代码如下:

      (1)首先是配置 Struts2

      

    复制代码
      <!-- 配置 Struts2  -->
      <filter>
          <filter-name>struts2AFreemarker</filter-name>
          <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>struts2AFreemarker</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
    复制代码

      (2)其次是配置 Freemarker

    复制代码
      <!-- 配置 Freemarker    (不需要配置,只需要配置 JspSupportServlet 即可使用 Freemarker 组件,但是配置了,也不会有什么错误!)-->
      <servlet>
          <servlet-name>freemarker</servlet-name>
          <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
          <!-- 配置模板的路径 -->
          <init-param>
              <!-- 配置模板存放的位置(我这里放在了主目录下面) -->
              <param-name>TemplatePath</param-name>
              <param-value>/</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>freemarker</servlet-name>
          <url-pattern>*.ftl</url-pattern>
      </servlet-mapping>
    复制代码

      (3)然后就是配置 Struts.xml 文件,基本上和单独使用 Struts 没什么大的变动,就是在 result 的返回页面时,type 类型要设为 freemarker ,这样,响应的信息就可以交给 Freemarker 组件处理了。

    复制代码
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
    
        <constant name="struts.enable.DynamicMethodInvocation" value="false" />
        <constant name="struts.devMode" value="true" />
    
        <package name="default" namespace="/" extends="struts-default">
    
            <default-action-ref name="index" />
    
            <global-results>
                <result name="error">/error.jsp</result>
            </global-results>
    
            <global-exception-mappings>
                <exception-mapping exception="java.lang.Exception" result="error"/>
            </global-exception-mappings>
            
            <action name="freemarker" class="com.struts2freemarker.test.action.FreemarkerAction">
                <result name="success" type="freemarker">
                   /index.ftl
                </result>
            </action>
        </package>
    
        <include file="example.xml"/>
    
        <!-- Add packages here -->
    
    </struts>
    复制代码

      (4)在 Action 中,使用正常的方法,如果想要将某个值传到 Freemarker 的模板中时,只要将这个值绑定到相应的属性中,就行了。我是将变量 freemarker 传到 index.ftl 中,部分 action 代码如下:

    复制代码
        /**
         * 序列编号
         */
        private static final long serialVersionUID = 1L;
        
        private String freemarker = "free";
    
        /**
         * 构造方法
         */
        public FreemarkerAction() {
            
        }
        
        public String execute(){
            
            log.info("execute 方法执行了!");
            
            return SUCCESS;
        }
    
        /**
         * @return the freemarker
         */
        public String getFreemarker() {
            return freemarker;
        }
    
        /**
         * @param freemarker the freemarker to set
         */
        public void setFreemarker(String freemarker) {
            this.freemarker = freemarker;
        }
    复制代码

      (5)具体的模板文件(index.ftl)如下:

    复制代码
    <#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /> <#--这一句是为了让Freemarker识别struts2的标签 -->

                <#--struts-tags.tld ,如果没有此文件,则在模板中,就不能使用 Struts2 的标签了,但可以使用 Freemarker 的语言下的标签 -->
    <!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>测试 Freemarker 的页面</title> </head> <body> this is the testing Freemarker's page! <h1>${freemarker}</h1> <@s.form action="reg" > <@s.textfield label="用户名" name="uname" /> <@s.submit /> </@s.form> </body> </html>
    复制代码

    如上面所写的,如果要想使用 Struts2 的标签,还需要将 struts2-core-2.3.15.jar 的在 MATA-INF 下的 struts-tags.tld 文件复制出来,放到想要放置的位置。这里,我是放在了项目目录下的 WEB-INF/struts-tags.tld 下,然后再在 web.xml 文件中,配置标签的 Servlet ,如下:

    复制代码
    <!-- 配置使用标签时的标签支持配置 --> 
     <servlet>
      <!-- define a JspSupportServlet Object -->
      <servlet-name>JspSupportServlet</servlet-name>
      <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
      <!-- setting JspSupportServlet auto start -->
      <load-on-startup>1</load-on-startup>
     </servlet> 
    复制代码

    这样,就可以在 index.ftl 模板中,使用 Struts2 的标签了。

      这样,就完成了一个简单的 Struts2 和 Freemarker 的整合了,使用起来还是挺容易的,适合模块化开发,只要前台人员将页面组织好,后台人员只需要将数据塞到指定的页面中的位置就行了。

  • 相关阅读:
    Linux下的sleep()和sched_yield()(转)
    各种字符串Hash函数(转)
    linux 实时监控网速脚本(转)
    linux安装chrome及chromedriver(转)
    Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 解决办法(转)
    linux 运行时限制CPU核数、内存、读写速度
    C语言函数sscanf()的用法-从字符串中读取与指定格式相符的数据(转)
    golang在线学习与编译网站
    电子书转换网站推荐
    入门级网站经典 w3cschool
  • 原文地址:https://www.cnblogs.com/wnlja/p/4345365.html
Copyright © 2020-2023  润新知