Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > как открыть файл Spring MVC


Автор: Kirkh 20.9.2010, 22:33
Доброе время суток. 

Делаю простенькое web-приложение, для того чтобы познакомиться с Spring MVC. В классе одного из контроллеров мне нужно открыть файл all.xml. Положил  его в корень проекта, т.е. на одном уровне с директорией WEB-INF. Но столкнулся с проблемой как получить к нему доступ. Если обращаться по абсолютному пути то все хорошо все получается если просто File("all.xml") или File("/all.xml") то выпадает java.lang.NullPointerException.

Вот мой класс: 
Код

public class ViewController implements Controller {

    protected final Log logger = LogFactory.getLog(getClass());

    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

.
.
.
//        так работает
        File old = new File("/home/my-name/apache-tomcat-6.0.29/webapps/springII/all.xml");

//        так нет
//        File old = new File("http://localhost:8080/springII/all.xml");

//        и так нет, для корректности добавлял extends HttpServlet    
//        String allXMLFile = getServletContext().getRealPath( "/all.xml" );
//        File old = new File(allXMLFile);

//        и так нет        
//        File old = new File("/all.xml");

.
.
.

        return new ModelAndView("WEB-INF/jsp/view.jsp", "model", myModel);
    }

}


Как быть?.. Подскажите пожалуйста.

Автор: SlavaSemushin 21.9.2010, 07:24
Я бы попробовал new File(request.getContextPath() + "/all.xml")

Автор: Kirkh 21.9.2010, 09:03
Я бы попробовал new File(request.getContextPath() + "/all.xml") - нет тоже не получается...

В ходе очередных экспериментов обнаружил что к относительному пути указанному как параметр конструктора File(), если путь начинается не с "/", т.е. например так:

Код

File old = new File("all.xml");


добавляется контекст сервера т.е. /home/myName/programs and scripts/apache-tomcat-6.0.29/...
дальше немного еще проб и в итоге получилось все вот так: 

Код

File old = new File("webapps/springII/all.xml");


Всем Спасибо!

Автор: Kirkh 23.9.2010, 09:40
И все таки проблема осталась.

Если делать как посоветовал SlavaSemushin т.е.
Код

new File(request.getContextPath() + "/all.xml");

 то приложение пытается открыть файл /springII/all.xml, которого понятное дело нет.

Пробовал удалить первый символ "/" чтоб Linux не воспринимал этот путь абсолютным, тогда добавляется контекст сервера и естественно файла /home/myName/programs and scripts/apache-tomcat-6.0.29/springII/all.xml тоже нет.

Из добавления контекста сделал вывод и собрал строку как описывал выше... но злая система Виндовс отказывается добавлять контекст сервера... и опять все не работает... т.е. на моей Ubuntu все ок, в винде java.io.FileNotFoundException...

Помогайте о гуруsmile)

Автор: Kirkh 23.9.2010, 10:35
Придумал способ как сделать работающую версию для томката на любой операционке
Код

Properties props = System.getProperties();
String cat = (String) props.get("catalina.home");
File old = new File(cat + "/webapps" + request.getContextPath() + "/all.xml");



но.. это в принципе тоже костыль... 

Советы господа...

Автор: Skipy 23.9.2010, 15:36
Цитата
Советы господа...


Господи, посоветуй страждущим прочитать API!

Код

String pathToServletRoot = request.getSession(true).getServletContext().getRealPath("/");

Автор: Kirkh 24.9.2010, 13:15
Цитата

Господи, посоветуй страждущим прочитать API!


Строго Вы...

Читал. И даже решение нашел, именно то что вы посоветовали. Отписаться на форуме не успел.
Skipy Спасибо.

А в API не всегда сразу и и понятно с какой стороны читать:(. По крайней мере начинающим "читателям".

Автор: Skipy 24.9.2010, 14:06
Цитата

Строго Вы...


Вы бы знали, насколько было бы меньше вопросов, если бы этим советом пользовались все...

Цитата

Читал. И даже решение нашел, именно то что вы посоветовали.


И замечательно! А сколько дополнительно полезного узнали!

Цитата

А в API не всегда сразу и и понятно с какой стороны читать:(. По крайней мере начинающим "читателям".


Отталкиваясь от тех объектов, которые у Вас есть. HttpServletRequest/HttpServletResponse. Потом дойдете до сессии. Потом - до контекста сервлета. Заодно узнаете, что еще умеет сессия, что контекст. И это самое ценное, потому как вот эти дополнительные знания незаметно накапливаются. И в конце концов вместо того, чтобы лезть в API, Вы то, что нужно, просто вспомните.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)