解决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

时间: 2024-09-23 23:21:46

解决sitemesh3装饰页面不能使用freemarker标签问题的相关文章

Freemarker标签使用

A 概念 最常用的 3 个概念  sequence 序列,对应java 里的list .数组等非键值对的集合  hash      键值对的集合  namespace 对一个ftl 文件的引用, 利用这个名字可以访问到该ftl 文件的资源  B 指令  if, else, elseif  语法  Java代码  <#if condition>     ...   <#elseif condition2>     ...   <#elseif condition3>   

JSP页面中的自定义标签2

js|页面 JSP页面中的自定义标签2 带属性的标签 在标签handler中定义属性对于每一个标签属性,都必须在标签handler中定义一个属性以及符合JavaBean结构规范的get和set方法.例如,logic:present标签的标签handler <logic:present parameter="Clear"> 包含下列声明和方法: protected String parameter = null;public String getParameter() { r

我想在html页面中引用freemarker但不知道该怎么配置,求各位高手帮帮忙

问题描述 我想在html页面中引用freemarker但不知道该怎么配置,求各位高手帮帮忙 我想在html页面中引用freemarker但不知道该怎么配置,求各位高手帮帮忙 解决方案 纯html中无法使用.在动态项目中才能使用,如jsp,asp 你要想使用freemarker标签,必须能够被FreemarkerServlet拦截到,然后解析处理成html 所以你直接用ftl页面就行了,为什么要静态网页和动态模版混着用呢 如果真想用..web.xml 中freemarker拦截器(制定拦截*.ht

FreeMarker标签与使用

模板技术在现代的软件开发中有着重要的地位,而目前最流行的两种模板技术恐怕要算freemarker和velocity了,webwork2.2对两者都有不错的支持,也就是说在webwork2中你可以随意选择使用freemarker或velocity作为view,模板技术作为view的好处是很多,尤其和jsp比较起来优点更大,众所周知jsp需要在第一次被执行的时候编译成servlet,那么这个过程是很慢的,当然很多应用服务器都提供预编译的功能,但是在开发的时候仍然给我们程序员带来了很多痛苦,每次修改都

图片-jsp页面如何实现tag标签自动插入的特效?(前端小白)

问题描述 jsp页面如何实现tag标签自动插入的特效?(前端小白) RT: 这个特效怎么做?有没有类似的特效 解决方案 已经解决 用的是tag-it 解决方案二: 当选中了某个类型时,调用个方法创建一段html代码append到那个容器内,加个css效果就好了,

Firefox浏览器扩展插件解决了保存页面难的问题

在网络搜索之后很多用户由于后期参考方面的考虑往往希望能够将感兴趣的有用的页面保存下来,但是由于用户使用的浏览器采用了各种"保存为"功能,导致在和 其他好友进行分享的时候存在障碍,甚至还不如直接分享原页面来的实在.为此Firefox上Mozilla Archive Format扩展能够非常方便的解决这个问题,能够对日常所用到"保存页面为"功能进行扩展.      Mozilla Archive Format能够对当前页面,可选的标签页面或者点击指定的任何物体进行保存,

JSP页面中的自定义标签

js|页面 JSP页面中的自定义标签 JSP页面中的自定义标签 Stephanie Bodoff 用于调用Javaean组件中的操作和执行请求分派的标准JSP标签简化了JSP页面的开发和维护.JSP技术还提供了在自定义标签中封装其他动态功能的机制,这种自定标签是JSP语言的扩展.自定义标签通常是以标签库的形式出现的,它定义了一组相关的自定义标签,并包含实现这些标签的对象. 可以由自定义标签执行的任务包括对隐式对象的操作.处理表单.访问数据库和其他企业级服务,如电子邮件和目录.以及执行流程控制.J

用脚本解决ASP.NET页面刷新问题

asp.net|脚本|解决|刷新|问题|页面     用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! Not在此把Not在做一个项目时的解决方法拿出来与大家共享. Not的思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新带来的不便. 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置. 写段脚本的事情Not用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName

如何解决火狐浏览器页面字体不一样

我们首先打开Firefox菜单,依次点击选项-选项. 在选项中切换到"内容",点击"字体和颜色"中的"高级"按钮. 然后将"允许页面选择显示字体二无需使用上面的设置"选项取消勾选,然后确定退出即可解决火狐浏览器页面字体不一样的问题. 完.