java – 在FreeMarker模板中有什么不同的处理错误的方法?

前端之家收集整理的这篇文章主要介绍了java – 在FreeMarker模板中有什么不同的处理错误的方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何抑制FreeMarker模板错误
我在寻找: http://freemarker.sourceforge.net/docs/pgui_config_errorhandling.html
但我不明白如何“TemplateExceptionHandler.IGNORE_HANDLER”.我正在使用Struts2以及如何显示另一个ftl页面,而不是显示堆栈跟踪?
  1. class MyTemplateExceptionHandler implements TemplateExceptionHandler {
  2. public void handleTemplateException(TemplateException te,Environment env,java.io.Writer out)
  3. throws TemplateException {
  4. try {
  5. out.write("[ERROR: " + te.getMessage() + "]");
  6. } catch (IOException e) {
  7. throw new TemplateException("Failed to print error message. Cause: " + e,env);
  8. }
  9. }
  10. }
  11.  
  12. ...
  13.  
  14. cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler());

发现上面的零件在http://freemarker.sourceforge.net/docs/pgui_config_errorhandling.html
我该如何使用?最后一行,cfg来自哪里?

“进入FreeMarker API的主要入口点”… @L_502_2@

所以,那是主要的入门点,我猜这个cfg来自这个类.我仍然看不到控制器如何进入我的类MyTemplateExceptionHandler.

以下行需要去哪里?

  1. cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler());

这只是把这条线放在正确的地方吗?

这是我现在的班级的样子:

  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.Writer;
  5. import java.util.Properties;
  6.  
  7. import freemarker.cache.FileTemplateLoader;
  8. import freemarker.cache.MultiTemplateLoader;
  9. import freemarker.cache.TemplateLoader;
  10. import freemarker.cache.WebappTemplateLoader;
  11. import freemarker.core.Environment;
  12. import freemarker.ext.beans.BeansWrapper;
  13. import freemarker.ext.jsp.TaglibFactory;
  14. import freemarker.ext.servlet.HttpRequestHashModel;
  15. import freemarker.ext.servlet.HttpRequestParametersHashModel;
  16. import freemarker.ext.servlet.HttpSessionHashModel;
  17. import freemarker.ext.servlet.ServletContextHashModel;
  18. import freemarker.template.ObjectWrapper;
  19. import freemarker.template.TemplateException;
  20. import freemarker.template.TemplateExceptionHandler;
  21. import freemarker.template.TemplateModel;
  22.  
  23. import javax.servlet.GenericServlet;
  24. import javax.servlet.ServletContext;
  25. import javax.servlet.http.HttpServletRequest;
  26. import javax.servlet.http.HttpServletResponse;
  27. import javax.servlet.http.HttpSession;
  28.  
  29. import org.apache.struts2.views.JspSupportServlet;
  30. import org.apache.struts2.views.freemarker.FreemarkerManager;
  31. import org.apache.struts2.views.freemarker.ScopesHashModel;
  32. import org.apache.struts2.views.freemarker.StrutsBeanWrapper;
  33. import org.apache.struts2.views.freemarker.StrutsClassTemplateLoader;
  34. import org.omg.CORBA.PUBLIC_MEMBER;
  35.  
  36. import com.opensymphony.xwork2.ActionInvocation;
  37. import com.opensymphony.xwork2.util.FileManager;
  38. import com.opensymphony.xwork2.util.ValueStack;
  39.  
  40. public class MyTemplateExceptionHandler extends org.apache.struts2.views.freemarker.FreemarkerManager {
  41.  
  42. freemarker.template.Configuration configuration = new freemarker.template.Configuration();
  43.  
  44. public MyTemplateExceptionHandler() {
  45. System.out.println("MyTemplateExceptionHandler constructor()");
  46. configuration.setTemplateExceptionHandler(new Test1());
  47. }
  48.  
  49. class Test1 implements TemplateExceptionHandler {
  50.  
  51. @Override
  52. public void handleTemplateException(TemplateException te,java.io.Writer out) throws TemplateException {
  53. System.out.println("MyTemplateExceptionHandler1 handleTemplateException()");
  54. try {
  55. out.write("[ERROR TEST TEST: " + te.getMessage() + "]");
  56. } catch (IOException e) {
  57. throw new TemplateException("Failed to print error message. Cause: " + e,env);
  58. }
  59. }
  60. }
  61. }

我的代码进入MyTemplateExceptionHandler构造函数().但不进入MyTemplateExceptionHandler1 handleTemplateException().我需要做什么?

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

在这个博客上指出了同样的事情:http://blog.cherouvim.com/freemarker-exception-handling/哪里可以配置我的freemarker和如何?我仍然坚持要去哪里.

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

解决方法

如果要在Struts2中将TemplateExceptionHandler.IGNORE_HANDLER设置为TemplateExceptionHandler,则需要扩展org.apache.struts2.views.freemarker.FreemarkerManager类,覆盖init和createConfiguration方法,并在struts.properties文件中配置自定义管理器.
  1. struts.freemarker.manager.classname = your.package.YourFreeMarkerManager

UPDATE

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

  1. public class MyFreemarkerManager extends
  2. org.apache.struts2.views.freemarker.FreemarkerManager {
  3.  
  4. private static final Logger LOG = LoggerFactory
  5. .getLogger(MyFreemarkerManager.class);
  6.  
  7. @Override
  8. public void init(ServletContext servletContext) throws TemplateException {
  9. config = createConfiguration(servletContext);
  10.  
  11. // Set defaults:
  12. config.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
  13. contentType = DEFAULT_CONTENT_TYPE;
  14.  
  15. // Process object_wrapper init-param out of order:
  16. wrapper = createObjectWrapper(servletContext);
  17. if(LOG.isDebugEnabled()) {
  18. LOG.debug("Using object wrapper of class " + wrapper.getClass().getName());
  19. }
  20. config.setObjectWrapper(wrapper);
  21.  
  22. // Process TemplatePath init-param out of order:
  23. templatePath = servletContext.getInitParameter(INITPARAM_TEMPLATE_PATH);
  24. if(templatePath == null) {
  25. templatePath = servletContext.getInitParameter("templatePath");
  26. }
  27.  
  28. config
  29. .setTemplateLoader(createTemplateLoader(servletContext,templatePath));
  30.  
  31. loadSettings(servletContext);
  32. }
  33.  
  34. @Override
  35. protected Configuration createConfiguration(ServletContext servletContext)
  36. throws TemplateException {
  37. Configuration configuration = new Configuration();
  38.  
  39. configuration
  40. .setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
  41.  
  42. if(mruMaxStrongSize > 0) {
  43. configuration.setSetting(Configuration.CACHE_STORAGE_KEY,"strong:"
  44. + mruMaxStrongSize);
  45. }
  46. if(templateUpdateDelay != null) {
  47. configuration.setSetting(Configuration.TEMPLATE_UPDATE_DELAY_KEY,templateUpdateDelay);
  48. }
  49. if(encoding != null) {
  50. configuration.setDefaultEncoding(encoding);
  51. }
  52.  
  53. configuration.setWhitespaceStripping(true);
  54.  
  55. return configuration;
  56. }
  57. }

把这个常量放在你的struts.xml文件中:

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

猜你在找的Java相关文章