解決sitemesh3裝飾頁面不能使用freemarker標簽問題


如題,這個問題其實在sitemesh2中已經很好的解決了,不過在sitemesh3中可能沒有解決,所以要自己寫代碼解決了,下面我先講下sitemesh2是如何解決的:

  <servlet>
        <servlet-name>sitemesh-freemarker<rvlet-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>1</load-on-startup>
    <rvlet>

    <servlet-mapping>
        <servlet-name>sitemesh-freemarker<rvlet-name>
        <url-pattern>*.ftl</url-pattern>
    <rvlet-mapping>

如此解決了問題,那么sitemesh3是如何解決的呢?剛開始以為只要添加了sitemesh3和freemarker相關的配置就可以了,也許我太天真了,不過還好在網上搜索到了牛了已經解決了這個問題,只要按照他講的解決就可以了,不過好像就他一個人解決這個問題,其它人沒有遇到這個問題需要解決的嗎?難道你們項目中沒有用到sitemesh和freemarker?這篇文章是這樣做的:

<filter>
      <filter-name>freemarkerFilter</filter-name>
      <filter-class>org.adaikiss.kay.web.FreemarkerFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>freemarkerFilter</filter-name>
      <url-pattern>*.ftl</url-pattern>
      <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
  </filter-mapping>

然后再添加org.adaikiss.kay.web.FreemarkerFilter類

package org.adaikiss.kay.web;

import java.io.IOException;
import java.util.Locale;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.ApplicationContext;
import org.springframework.util.StringUtils;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;

/**
 * Application Lifecycle Listener implementation class FreemarkerFilter
 *
 */
public class FreemarkerFilter implements Filter {

    private Locale locale;

    private ApplicationContext ctx;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String localeStr = filterConfig.getInitParameter("locale");
        if(StringUtils.hasText(localeStr)){
            locale = new Locale(localeStr);
        }else {
            locale = Locale.getDefault();
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse res = (HttpServletResponse)response;
        if(ctx == null){
            ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(req.getSession().getServletContext());
            if(null == ctx){
                throw new ExceptionInInitializerError("spring context is not loaded!");
            }
        }
        try {
            String name = req.getRequestURI();
            name = name.substring(1, name.lastIndexOf(".ftl"));
            FreeMarkerViewResolver viewResolver = ctx.getBean(FreeMarkerViewResolver.class);
            System.out.println("zzz:"+name);
            System.out.println("zzz:"+locale);
            View view = viewResolver.resolveViewName(name, locale);
//            @SuppressWarnings("unchecked")
//            Map<String, Object> model = (Map<String, Object>) request.getAttribute(ViewRendererServlet.MODEL_ATTRIBUTE);
            view.render(null, req, res);
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }
    
}

他先是在web.xml里面添加這個類的servlet的配置,然后再新建這個類,至於這個類的作用你們還是自己看看吧,我也在學習。完整的下載地址在這,有需要的就下載看看吧,能夠幫助別人我很開心,畢竟這也是開源精神^_^。

總結:最后想講下,我在添加他的代碼時候遇到一個糾結的問題就是freemarker配置了模板地址,那么sitemesh3.xml文件里面引用的裝飾頁面地址必須是這個地址下的,不清楚我講的什么意思,那給你們看看就知道了:

<property name="templateLoaderPath" value="/WEB-INF/views/"/>

這個地址就是所有頁面請求的freemarker地址,這個沒什么好說了吧,下面就是sitemesh3.xml的配置了:

 <mapping path="/*" decorator="/template/template.ftl"/>

可能你們還不明白,那我再貼張圖片給你們看看:

看到/template/template.ftl了嗎,再想想剛才freemarker里面配置的地址,現在明白了吧,當時我也沒注意到在sitemesh3.xml裝飾頁面配置的地址是這樣:

<mapping path="/*" decorator="/WEB-INF/views/template/template.ftl"/>

導致頁面加載出錯如圖:

所以你們一定要注意這個問題,好了就說這么多,有問題q我:1576410833


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM