FreeMarker模板中处理错误的不同方法有哪些?

如何抑制FreeMarker模板错误?我在这里寻找:http

:

//freemarker.sourceforge.net/docs/pgui_config_errorhandling.html

但我不知道如何“

TemplateExceptionHandler.IGNORE_HANDLER”。我正在使用Struts2,还如何显示另一个ftl页面而不显示堆栈跟踪?

class MyTemplateExceptionHandler implements TemplateExceptionHandler {

public void handleTemplateException(TemplateException te, Environment env, java.io.Writer out)

throws TemplateException {

try {

out.write("[ERROR: " + te.getMessage() + "]");

} catch (IOException e) {

throw new TemplateException("Failed to print error message. Cause: " + e, env);

}

}

}

...

cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler());

在http://freemarker.sourceforge.net/docs/pgui_config_errorhandling.html找到了上面的文章,

该如何使用?最后一行,cfg来自哪里?

“ FreeMarker API的主要入口点” …

http://massapi.com/source/freemarker-2.3.18/src/freemarker/template/Configuration.java.html

因此,这是主要的切入点,我想cfg来自此类。我仍然看不到控制器将如何进入我的类MyTemplateExceptionHandler。

下一行需要去哪里?

cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler());

仅仅是将这条线放置在正确的位置上吗?

这是我当前班级的样子:

    import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import java.io.Writer;

import java.util.Properties;

import freemarker.cache.FileTemplateLoader;

import freemarker.cache.MultiTemplateLoader;

import freemarker.cache.TemplateLoader;

import freemarker.cache.WebappTemplateLoader;

import freemarker.core.Environment;

import freemarker.ext.beans.BeansWrapper;

import freemarker.ext.jsp.TaglibFactory;

import freemarker.ext.servlet.HttpRequestHashModel;

import freemarker.ext.servlet.HttpRequestParametersHashModel;

import freemarker.ext.servlet.HttpSessionHashModel;

import freemarker.ext.servlet.ServletContextHashModel;

import freemarker.template.ObjectWrapper;

import freemarker.template.TemplateException;

import freemarker.template.TemplateExceptionHandler;

import freemarker.template.TemplateModel;

import javax.servlet.GenericServlet;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.apache.struts2.views.JspSupportServlet;

import org.apache.struts2.views.freemarker.FreemarkerManager;

import org.apache.struts2.views.freemarker.ScopesHashModel;

import org.apache.struts2.views.freemarker.StrutsBeanWrapper;

import org.apache.struts2.views.freemarker.StrutsClassTemplateLoader;

import org.omg.CORBA.PUBLIC_MEMBER;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.util.FileManager;

import com.opensymphony.xwork2.util.ValueStack;

public class MyTemplateExceptionHandler extends org.apache.struts2.views.freemarker.FreemarkerManager {

freemarker.template.Configuration configuration = new freemarker.template.Configuration();

public MyTemplateExceptionHandler() {

System.out.println("MyTemplateExceptionHandler constructor()");

configuration.setTemplateExceptionHandler(new Test1());

}

class Test1 implements TemplateExceptionHandler {

@Override

public void handleTemplateException(TemplateException te, Environment env, java.io.Writer out) throws TemplateException {

System.out.println("MyTemplateExceptionHandler1 handleTemplateException()");

try {

out.write("[ERROR TEST TEST: " + te.getMessage() + "]");

} catch (IOException e) {

throw new TemplateException("Failed to print error message. Cause: " + e, env);

}

}

}

}

我的代码将进入MyTemplateExceptionHandler构造函数()。但不要放入MyTemplateExceptionHandler1

handleTemplateException()。我需要做什么?

我仍然看到黄色的FTL堆栈跟踪。

在此博客上指出了同样的事情:http

//blog.cherouvim.com/freemarker-exception-

handling/在哪里可以配置我的freemarker,如何配置?我仍然对那条线需要去的地方感到困惑。

我的另一个问题是,博客上发布的类似乎是内部类,我只是将内部类放入任何类中还是外部类?

回答:

如果要在Struts2中设置TemplateExceptionHandlerTemplateExceptionHandler.IGNORE_HANDLER,则需要扩展org.apache.struts2.views.freemarker.FreemarkerManager类,重写initcreateConfiguration方法,并在struts.properties文件中配置自定义管理器。

struts.freemarker.manager.classname = your.package.YourFreeMarkerManager

您的自定义FreemarkerManager应该如下所示:

public class MyFreemarkerManager extends

org.apache.struts2.views.freemarker.FreemarkerManager {

private static final Logger LOG = LoggerFactory

.getLogger(MyFreemarkerManager.class);

@Override

public void init(ServletContext servletContext) throws TemplateException {

config = createConfiguration(servletContext);

// Set defaults:

config.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);

contentType = DEFAULT_CONTENT_TYPE;

// Process object_wrapper init-param out of order:

wrapper = createObjectWrapper(servletContext);

if(LOG.isDebugEnabled()) {

LOG.debug("Using object wrapper of class " + wrapper.getClass().getName());

}

config.setObjectWrapper(wrapper);

// Process TemplatePath init-param out of order:

templatePath = servletContext.getInitParameter(INITPARAM_TEMPLATE_PATH);

if(templatePath == null) {

templatePath = servletContext.getInitParameter("templatePath");

}

config

.setTemplateLoader(createTemplateLoader(servletContext, templatePath));

loadSettings(servletContext);

}

@Override

protected Configuration createConfiguration(ServletContext servletContext)

throws TemplateException {

Configuration configuration = new Configuration();

configuration

.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);

if(mruMaxStrongSize > 0) {

configuration.setSetting(Configuration.CACHE_STORAGE_KEY, "span:"

+ mruMaxStrongSize);

}

if(templateUpdateDelay != null) {

configuration.setSetting(Configuration.TEMPLATE_UPDATE_DELAY_KEY,

templateUpdateDelay);

}

if(encoding != null) {

configuration.setDefaultEncoding(encoding);

}

configuration.setWhitespaceStripping(true);

return configuration;

}

}

将该常量放入您的struts.xml文件中:

<constant name="struts.freemarker.manager.classname" value="your_package.MyFreemarkerManager" />

以上是 FreeMarker模板中处理错误的不同方法有哪些? 的全部内容, 来源链接: utcz.com/qa/402077.html

回到顶部