springMvc sitemesh freemarker 整合总结

前言

  • 由于个人喜欢springmvc对restful支持的完美,再加上配置简单和与spring的天然集成,故项目打算用springMvc;
  • freemarker 尽管网上有众多评测,言之性能不挤,但对于我们项目的的环境而言是足够的,再加上其丰富的内建函数与指令,亦十分的方便;
  • 至于sitemesh,简单的配置,对于中小型项目亦足够;

配置

先说web.xml,配置如下:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/spring/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
        <async-supported>true</async-supported>
    </filter>

    <!-- 编码-->
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!—sitemesh--> 
    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!—springmvc -->
    <servlet>
        <servlet-name>springServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/spring/springMvc/spring_mvc_base.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
   <!—freemarker 配置--> 
    <servlet>
        <servlet-name>sitemesh-freemarker</servlet-name>
        <servlet-class>com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet</servlet-class>
        <init-param>
            <param-name>TemplatePath</param-name>
            <param-value>/</param-value>
        </init-param>
        <init-param>
            <param-name>default_encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
     </servlet>

    <servlet-mapping>
       <servlet-name>springServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
   <!—freemarker 页面配置 --> 
    <servlet-mapping>
        <servlet-name>sitemesh-freemarker</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>

spring mvc 以及spring配置无需多讲;

在这里,有两个地方;

  1. sitemesh filter 的配置;
    由于sitemesh 的主要原理为对mvc或是servlet等web框架渲染后的结果进行再包装;即利用filter对request 和 response 先交给mvc框架处理,处理完后,再对处理完的结果,进行包装,比如加上html头,尾等信息。

    其官方流程图如下,也就是从1到2这个过程是mvc框架做了:

    而在处理加上html头和尾的时候,如果是第三方模板引挚如freemarker/velocity之类,还会交给相应servlet用于组装最后的页面。所以上面会出现针对于freemarker的配置,而jsp/jstl是不用的。

    sitemesh filter的代码如下:

    HttpServletRequest request = (HttpServletRequest) rq;
            HttpServletResponse response = (HttpServletResponse) rs;
            ServletContext servletContext = filterConfig.getServletContext();
    
            SiteMeshWebAppContext webAppContext = new SiteMeshWebAppContext(request, response, servletContext);
    
           // ....省略很多..
            try {
    
               // 得到由mvc框架等渲染完成的页面
                Content content = obtainContent(contentProcessor, webAppContext, request, response, chain);
    
                if (content == null) {
                    request.setAttribute(ALREADY_APPLIED_KEY, null);
                    return;
                }
                // 进行装饰
                Decorator decorator = decoratorSelector.selectDecorator(content, webAppContext);
                decorator.render(content, webAppContext);
  2. freemarker配置
    在FreemarkerDecoratorServlet 配置中,很多参数其实就是freemarker的参数,翻看源码也容易发现sitemesh也是继承至freemarker本身的类FreemarkerServlet,比如编码路径,所以freemarker所有配置是都可以在

    这配置的; 这里的路径必须与springMvc配置视图解析的路径相结合。而servlet-mapping之中,的*.htm为装饰器的文件扩展名,并不是mvc框架返回视图的扩展名。这里的装饰器的扩展名是可以跟mvc视扩展名不一致的。

    用htm是因为myeclipse可以方便的有html代码提示。

    问题恰恰出现在这里,springmvc的一般配置如下:

    <bean id="freemarkerConfig"
            class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
            <property name="configLocation" value="/WEB-INF/freemarker.properties" /> <!-- 使用freemarker自动导入功能,主要包含一些基础的配置,如时间格工等 -->
            <property name="templateLoaderPath" value="/WEB-INF/" />
        </bean>
        <bean id="viewResolver"
            class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
            <property name="cache" value="false" />
            <property name="prefix" value="" />
            <property name="contentType" value="text/html;charset=UTF-8" />
            <property name="suffix" value=".htm" />
        </bean>

    在springmvc的配置中,freemarkerconfig的配置其实与上面FreemarkerDecoratorServlet 是类似的,但又有区别;
    springMvc配置中的freemarker是用于spring mvc页面渲染页面所有,而由于在sitemesh的filter中后期,这个渲染是结束了的。故在装饰器中,springmvc里面配置的freemarker不起做用。起作用是web.xml配置

    FreemarkerDecoratorServlet 。

    而且这个问题在struts 是不会出现的。

    <filter>
        <filter-name>struts-prepare</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
    </filter>
    
    <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
    </filter>
    
    <filter>
        <filter-name>struts-execute</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>
    </filter>

    我个人目前简单觉得,struts 基于filter,分离出prepare 和 execute两个场景,形分而意不分,使插件十分容易扩展且又充分的解藕。这点springmvc的确比不上。再加上struts官方有sitemesh插件支持,
    且sitemesh执行完之后,简单从filter来看,仍是处理struts的执行链中,却没有脱离。

    因为这一点,我在装饰器犯了非常多的错。主要便是一些宏没法使用,但又明明自动引入了。

  3. 其它配置

    其它有如sitemesh的decorate.xml等配置就比较简单了,注意路径便好;

    在使用springmvc与spring时,应注意context:component-scan注解的黑白名单,否则最直接的影响就是由于父子容器的存在,事务失效、参考http://jinnianshilongnian.iteye.com/blog/1762632

总结

最后,发现碰到问题,要多思考,多想,多debug,了解清楚,一步一个脚印。

时间: 2024-07-29 02:27:00

springMvc sitemesh freemarker 整合总结的相关文章

SpringMVC与freemarker整合

FreeMark FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP.它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等. 特性 通用 能够生成各种文本:HTML.XML.RTF.Java源代码等等. 易于嵌入到产品中:轻量级:不需要Servlet环境. 插件式模板载入器:可以从任何源载入模板,如本地文件.数据库等等. 可以按所需生成文本:保存到本

SpringMVC和Freemarker整合,带自定义标签的使用方法

SpringMVC和Freemarker整合,带自定义标签的使用方法. [参考来源:http://www.360doc.com/content/14/1225/14/1007797_435663342.shtml] SpringMVC现在是比较热门的一种框架了,使用起来感觉还是很不错的,现在我分享一下集体的配置和使用,希望对学习SpringMVC的朋友有用.一.首先我们做准备工作,下载Spring包,下载Freemarker包.二.配置web.xml. 1 2 3 4 5 6 7 8 9 10

MAVEN_SPRING+SPRINGMVC+MYBATIS+FREEMARKER 整合

在公司实习的时候 公司用的是  MAVEN_SPRING+SPRINGMVC+MYBATIS+FREEMARKER 框架: 用了2个月:就想自己来整合一下框架: 一: 在整合的时候我也参考了很多博文:但是都不一样,比如配置文件,我就不知道怎么样子分才好:有人分2个,有人分3个之类的:这里我分了两个配置文件 一个是:spring-mvc.xml   这个就专门用来配置springmvc的:  一个是spring-mybatis.xml:用来整合spring和mybatis: 整体如下: 二,mav

SpringMvc 与 freemarker整合

1:在pom.xml文件中引入freemarker的jar包 <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version&g

SpringMVC注解和Freemarker整合使用全步骤

SpringMVC现在是比较热门的一种框架了,使用起来感觉还是很不错的,现在我分享一下集体的配置和使用,希望对学习SpringMVC的朋友有用.一.首先我们做准备工作,下载Spring包,下载Freemarker包.二.配置web.xml. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

sonne_game网站开发03 spring-mvc+freemarker整合

这是从零独立开发网站(名为sonne_game)系列的第三篇了. 先简单做个往期回顾~ 第一篇,是简明讲了些自己对这个网站的构思和计划.http://www.cnblogs.com/rixiang/p/6259097.html 第二篇,开始搭建框架,完成了spring+mybatis+springmvc框架搭建.http://www.cnblogs.com/rixiang/p/6260433.html 而今天的任务就是在spring+mybatis+springmvc的基础上,将freemark

springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题

解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640人阅读 评论(1) 收藏 举报 用的是 SSM3的框架 Spring MVC 3.1 + Spring 3.1 + Mybatis3.1第一种情况:Spring MVC 和 Spring 整合的时候,SpringMVC的springmvc.xml文件中 配置扫描包,不要包含 service的注解,S

SpringMVC与Freemarker的集成以及多视图解析器配置

一.Spring MVC视图解析器 视图解析器的工作流程大致是这样的:Controller的某个方法执行完成以后,返回一个视图(比如:listUser),视图解析器要做的工作就是找到某个对象 来完成视图的渲染,或者跳转到其他的逻辑视图.这里的渲染对象通常就是我们的jsp文件或者我们下面用的Freemarker(例如listUser.jsp或者 listUser.ftl).渲染完成以后,将解析结果发送到客户端浏览器. 下面介绍一下本文需要用到的解析器(更多解析器资料,请参考 http://e-fr

Spring MVC 环境搭建(maven+SpringMVC+mybatis+Freemarker) ----DawnHeaven

Spring MVC 环境搭建(maven+SpringMVC+mybatis+Freemarker)       ------DawnHeaven 一.准备工作 1.Eclipse Java EE IDE(4.4.1) 2.JDK 3.Tomcat 4.Maven  maven安装指南 二.构建工程 1.file->new->Project 2.next 3. next 4.next 5.finish 工程目录如下 三.完善项目 首先,完善目录,增加重要的source Folder,这个不是