struts2的action中写了这样加载模板文件的代码,1 Configuration cfg=new Configuration();
2 cfg.setClassForTemplateLoading(NewsAction.class,"WEB-INF/templates");
3        try {
4            Template t = cfg.getTemplate("news.ftl");
5        } catch (IOException ex) {
6            ex.printStackTrace();
7        }在第4行处总是提示找不到news.ftl模板文件的错误,报错代码如下:
java.io.FileNotFoundException: Template news.ftl not found.请问这个该如何解决呢,之前放到系统根目录下读取就没有问题,因为涉及安全的问题,所以要放到WEB-INF目录下,换了目录后就读取不到了。

解决方案 »

  1.   

    这样呢?
    1 Configuration cfg=new Configuration(); 
    2 cfg.setClassForTemplateLoading(NewsAction.class,"/WEB-INF/templates"); 
    3        try { 
    4            Template t = cfg.getTemplate("news.ftl"); 
    5        } catch (IOException ex) { 
    6            ex.printStackTrace(); 
    7        } 
      

  2.   

    或者这样:
    1 Configuration cfg=new Configuration(); 
    2 cfg.setClassForTemplateLoading(NewsAction.class,ServletActionContext.getServletContext().getRealPath("/WEB-INF/templates")); 
    3        try { 
    4            Template t = cfg.getTemplate("news.ftl"); 
    5        } catch (IOException ex) { 
    6            ex.printStackTrace(); 
    7        } 
      

  3.   

    J2EE的标准就是禁止客户端访问到WEB-INF目录下的内容,这是出于安全考虑,任何不符合这个原则的服务器是不符合J2EE规范的。
    因此,除非你在服务端通过JSP或Servlet将这个目录下的文件读入并输出其内容到客户端,你在WEB-INF目录下的内容是不能被访问到的。建议你在应用根目录下建立一个新目录来解决你的问题.而不要在/WEB-INF下。
      

  4.   

    谢谢zou_wei_forever,但还是报同样的错误。
    还有,ganglong99,如果模板文件不放到web-inf下,那么在ie下就能访问到模板文件,这样是不安全的,所以才要放到那里。
      

  5.   

    你用的是setClassForTemplateLoading方法,那么将news.ftl放到跟NewsAction类同一个路径下试试!
      

  6.   

    加载时这样写:cfg.setClassForTemplateLoading(NewsAction.class,"/");
      

  7.   

    如果非得放到web-inf目录下的话,这样试试:
    cfg.setServletContextForTemplateLoading(ServletActionContext.getServletContext().getRealPath("/"), "/WEB-INF/templates");
      

  8.   

    上面有点错误,应该是这样:
    cfg.setServletContextForTemplateLoading(ServletActionContext.getServletContext(), "/WEB-INF/templates");