У меня есть папка в моей папке военных проектов, поэтому она отлично работает в режиме разработки. Но когда я пытаюсь запустить одно и то же приложение на моем localHost. Он говорит "FileNotFound".
Я использую этот путь, который работает в режиме разработки: String filePath = "mydata/";
Теперь, какой путь я буду использовать при работе на tomcat?
Я также попытался поместить папку в папку Tomcat Bin Folder и использовать тот же файл, но не повезло!
Пожалуйста, направляйте.
Код:
@SuppressWarnings ("serial") открытый класс GreetingServiceImpl расширяет RemoteServiceServlet реализует GreetingService {
String filePath = "./cdata/";
public CountryDTO getCountryDataFromFile (String selectedCountry) {
Gson mydata = new Gson();
CountryDTO dto = null;
System.out.println("test");
try
{
String line;
File f = new File(filePath + selectedCountry + ".txt");
BufferedReader jsonReader = new BufferedReader(new FileReader(f));
///вызов RPC
void getJSONDataFromFile (String mAdministrativeArea, AsyncCallback asyncCallback);
//Сторона клиента, откуда вызывается мой код
mAdministrativeAreaA.addValueChangeHandler (новый ValueChangeHandler() {
@Override
public void onValueChange(ValueChangeEvent<String> changedSubRegion) {
mAdministrativeArea= changedSubRegion.getValue();
System.out.println("going to rpc");
addrService.getJSONDataFromFile(mAdministrativeArea, new AsyncCallback<CountryDTO>() {
@Override
public void onSuccess(CountryDTO json) {
json.setFmt( selectedCountry.getFmt() );
GUIfromFormat(json, ResultType.STATE_OR_PROVINCE);
}
Когда вы запускаете ваш webapp в режиме разработки, скорее всего, ваша текущая папка является корнем проекта.
Когда вы запускаете свой webapp в прямом эфире (то есть не из вашей IDE), вы не можете угадать текущую папку, поскольку она может отличаться от ОС к ОС, от сервера к серверу и т.д.
Вы можете использовать ServletContext.getRealPath(), чтобы узнать путь/местоположение к базовому файлу пути.
Если вы звоните:
String path = ServletContext.getRealPath("/");
Это вернет корневую папку вашего веб-приложения, папку, которая содержит специальную папку "WEB-INF"
(и, возможно, папку "META-INF"
). Знание этой папки является хорошей отправной точкой, вы можете перейти отсюда (вверху - родительская или папка вниз - дочерняя).
Конечно, если файл/ресурс, к которому вы пытаетесь получить доступ, находится за пределами веб-папки, он не будет доступен во время производства, вы должны поместить его под свою веб-папку, чтобы он был развернут вместе с кодом вашего веб-приложения.
ServletContext
Вы сказали, что это серверная сторона асинхронного вызова. Тогда это сервлет. Я не вижу весь ваш код, возможно, это RemoteServiceServlet
?
В любом случае, если есть основной Servlet
, вы можете получить из него ServletContext
(через HttpServletRequest.getServletContext()
), тогда у вас есть ServletContext.getRealPath()
.
Также вы можете получить ServletContext
с помощью ServletContextListener
. Вот как это сделать: Получение ServletContext
при запуске webapp
Если вы поместите свои файлы/ресурсы в свою исходную папку, вы можете получить к ним доступ ClassName.getResource()
и ClassName.getResourceAsStream()
. Эти методы всегда вернут вам правильный ресурс независимо от того, исходит ли код (класс Java) из файла .class
или из файла jar и т.д.
Помещение ваших ресурсов рядом с вашими файлами классов также имеет то преимущество, что ваши ресурсы будут автоматически перемещаться с кодом (они будут автоматически развернуты при повторном развертывании вашего кода).
String filePath = "./mydata/";
?