2013-05-30 4 views
0

Я разрабатываю веб-приложение, использующее сервлеты, в которых я хочу использовать шаблоны Velocity. Для этого я сохранил свои шаблоны в каталоге WEB-INF/templates.Невозможно прочитать файл в веб-приложении Java

У меня есть еще один простой Java-класс, который генерирует код из этого шаблона и требует прочитать этот файл.

Мой сервлет вызывает метод из этого простого класса Java, чтобы получить сгенерированный код.

Я попытался использовать реальный путь, чтобы прочитать шаблон, но я получаю ResourceNotFoundException каждый раз, когда я обращаюсь к сервлету.

Ниже приводится код, который я использую в sevlet

TemplateParser parser = new TemplateParser(getServletContext().getRealPath("/WEB-INF/templates/index.vm")); 
     String html = parser.parser(); 
     out.println(html); 

TemplateParser мой простой класс Java.

Я использую его в проекте Netbeans и сгенерирована строка пути C:\Users\Sushil Kumar\Documents\NetBeansProjects\ALTTC\build\web\WEB-INF\templates\index.vm. Этот файл выходит из заданного пути, но все же получает исключение.

StackTrace за исключением

org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'C:\Users\Sushil Kumar\Documents\NetBeansProjects\ALTTC\build\web\WEB-INF\templates\index.vm' 
at org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:452) 
at org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:335) 
at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1102) 
at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1077) 
at org.apache.velocity.app.VelocityEngine.getTemplate(VelocityEngine.java:528) 
at me.uni.sushilkumar.alttc.TemplateParser.parser(TemplateParser.java:52) 
at me.uni.sushilkumar.alttc.TemplateController.processRequest(TemplateController.java:38) 
at me.uni.sushilkumar.alttc.TemplateController.doGet(TemplateController.java:57) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
at java.lang.Thread.run(Thread.java:722) 

EDIT как предложено TheNewIdiot в комментариях.

Properties p = new Properties(); 
    p.setProperty("resource.loader", "file"); 
    p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader"); 
    p.setProperty("file.resource.loader.path", path); <== path = getServletContext().getRealPath("/WEB-INF/templates") 
    p.setProperty("file.resource.loader.cache", "false"); 
    p.setProperty("file.resource.loader.modificationCheckInterval", "0"); 
+0

Можете ли вы вставить стопку? – NINCOMPOOP

+0

@TheNewIdiot Я добавил stacktrace. – kaysush

+0

Возможный дубликат [Невозможно найти ресурсы шаблона скорости] (http://stackoverflow.com/questions/9051413/unable-to-find-velocity-template-resources) – NINCOMPOOP

ответ

4

Не использовать FileResourceLoader. Посмотрите на documentation:

Самый простой заменой FileResourceLoader в веб-приложении фактически является частью проекта VelocityTools. Это WebappResourceLoader. Эта реализация ResourceLoader - это , специально разработанная для работы подобно FileResourceLoader, но знает о контексте сервлета и позволяет настраивать пути ресурсов относительно корня сервлета, а не локальную файловую систему.

Если вы используете VelocityViewServlet, то автоматически настроен и готов к использованию WebappResourceLoader.Так что если вы хотите изменить настроенный путь (ы), вам нужно только добавить строку в следуя своим velocity.properties:

webapp.resource.loader.path=/WEB-INF/mytemplates/ 

Если вам нужно установить WebappResourceLoader на свой собственный, то вы можете сделать свои свойства что-то вроде этого:

resource.loader=webapp 
webapp.resource.loader.class=org.apache.velocity.tools.view.WebappResourceLoader 
webapp.resource.loader.path=/WEB-INF/mytemplates/ 

Или:

Properties props = new Properties(); 
props.setProperty("resource.loader", "webapp"); 
props.setProperty("webapp.resource.loader.class", "org.apache.velocity.tools.view.WebappResourceLoader"); 
props.setProperty("webapp.resource.loader.path", "/WEB-INF/mytemplates/"); 
VelocityEngine engine = new VelocityEngine(props); 

Перед инициализацией этого модуля вам также необходимо поместить ServletContext в свои приложения VelocityEngine . Так как WebappResourceLoader знает, как найти шаблоны.

myVelocityEngine.setApplicationAttribute("javax.servlet.ServletContext", servletContext); 
+0

Он работал как шарм. Спасибо. – kaysush

1

Прежде всего, вы не получаете FileNotFoundException. Как ясно говорит stacktrace, вы получаете ResourceNotFoundException, исключающее скорость исключение, указывающее, что ресурс (в вашем случае шаблон) не может быть найден.

Velocity использует объекты типа ResourceLoaders для загрузки ресурсов. IIRC, deafult - ClasspathResourceLoader, который будет искать ресурсы в пути к классам, и если папка ваших шаблонов не находится в пути к классам, вам не повезло. Вы можете переключить ResourceLoader и вместо этого использовать FileResourceLoader, который будет загружать файлы из файловой системы.

Чтобы изменить ResourceLoader, я бы предложил прочитать документацию, поскольку есть много способов сделать это, которые подходят для разных сценариев. Один из способов заключается в следующем:

Properties props = new Properties(); 
props.setProperty("resource.loader", "myapp"); 
props.setProperty("myapp.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader"); 
VelocityEngine engine = new VelocityEngine(props); 
+0

Я отредактировал часть исключения. Более того, я попытался изменить загрузчик ресурсов, но бесполезен. – kaysush

Смежные вопросы