Доброго времени суток господа.
Дали задание разработать конвертер с веб-интерфейсом, реализовать необходимо на Java. С последней сталкиваюсь впервые, приходиться все хватать на лету.
Сервер: Tomcat v7.0
Платформа: JRE 7 (jdk1.7.0_21)
IDE: Eclipse (JavaEE IDE)
Проект к которому будет прикручен этот конвертер разрабатывается на базе IIS-сервера и работает в браузере IE(8+), поэтому все должно работать именно в IE.
Конвертер должен читать данные из *.DBF файлов и записывать в БД MSSQL по заданной логике.
С процессом конвертации разобрался, все прекрасно работает с библиотекой jdbf.jar.
Смысл такой, пользователь выбирает нужные файлы и запускает процесс кликом по кнопке "Начать конвертацию",
при выборе пользователем файлов я формирую строковый массив путей к этим файлам, потом в цикле перебираю его и подключаюсь к соответствующим файлам через jdbf.
Для выбора файлов я по незнанию иcпользовал явовский компонент jFileChooser,
вот код кнопки "Добавить файл" из xhtml файла:
1.
<p:commandButton value="Добавить файл" actionListener="#{GisConvert.upload}" immediate="true" ajax="false" />
а тут код самого метода:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public void upload() throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException
{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
fileopen = new JFileChooser();
fileopen.setMultiSelectionEnabled(true);
fileopen.setFileFilter(new ExtFileFilter("dbf", "*.dbf - DBF файлы выгрузки из ГИС TOPOL"));
int ret = fileopen.showDialog(null, "Открыть");
fileopen.setFocusable(true);
fileopen.setVisible(true);
if (ret == JFileChooser.APPROVE_OPTION) {
File[] file = fileopen.getSelectedFiles();
for(int i=0;i<file.length;i++)
{
files.add(file[i].getPath());
menuControlsPanel.getChildren().add(new UILiteralText(file[i].getPath()+"<br/>"));
}
}
}
Локально на на моей машине конвертер прекрасно отрабатывает, но когда развернул проект на сервере, то по нажатию кнопки "Добавить файл" ничего не происходит. И тут я понял, что совершил ошибку ведь библиотека данного компонента находится на сервере и при срабатывании он пытается вызваться просмотр файлов именно на сервере, а у клиента может и не быть на это прав.
Поэтому решил юзать компонент PrimeFaces
UploadFile .
Вот код компонента (xhtml):
1.
2.
<p:fileUpload fileUploadListener="#{GisConvert.handleFileUpload}" mode="advanced" dragDropSupport="false"
multiple="true" update="messages" sizeLimit="100000" allowTypes="/(\.|\/)(dbf)$/" />
Как только запускаю сервер (Tomcat) в консоль, с интервалом в одну секунду вылетает исключение:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
авг 22, 2013 2:17:43 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [AsusRKFaces] in context with path [/AsusRK] threw exception
java.lang.NullPointerException
at com.sun.faces.context.PartialViewContextImpl.createPartialResponseWriter(PartialViewContextImpl.java:439)
at com.sun.faces.context.PartialViewContextImpl.access$300(PartialViewContextImpl.java:72)
at com.sun.faces.context.PartialViewContextImpl$DelayedInitPartialResponseWriter.getWrapped(PartialViewContextImpl.java:573)
at javax.faces.context.PartialResponseWriter.startDocument(PartialResponseWriter.java:115)
at org.primefaces.context.PrimePartialResponseWriter.startDocument(PrimePartialResponseWriter.java:133)
at com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:199)
at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:124)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at common.NoCacheFilter.doFilter(NoCacheFilter.java:35)
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(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
При этом, все функционирует.
Как только убираю код компонента fileUpload из xhtml страницы и перезапускаю сервер, все нормально, исключений нет.
Но это побочный вопрос.
А вот основной:
Подскажите пожалуйста как именно работать с файлами через primefaces или подобный компонент. Т.е. юзер выбрал все файлы нажал кнопку UPLOAD и вот тут я уже вылавливаю файлы и начинаю с ними работать?