2013-12-10 4 views
0

Я хочу вызвать сервлет из ajax в Java WebApp, используя Tomcat7.Java Servlet на Tomcat, вызванный из AJAX

Я использовал аннотацию @WebServlet ("/ VServlet") для ее сопоставления в WebApp из-за поддержки Tomcat7 Servlet 3.0. Я вызываю сервлет с помощью команды jquery «$ .getJSON (« VServlet », функция (данные) {...}); но если я использую строку «VServlet», она не работает.

Только если я использую весь URL 'http: // localhost: 8080/WebAppName/VServlet', это работает, но только в моем компьютере. Однако я должен развернуть его на сервере с коммерческим доменным именем, явно отличным от «localhost».

Возможно, кто-нибудь скажет мне, есть ли способ обратиться к сервлету с относительным адресом? Потому что, если я использую строку типа «http://my.domain.it:8080/WebAppName/VServlet», она не работает на Tomcat7, которая находится на серверной машине.

Спасибо.

------------------ РЕДАКТИРОВАТЬ -----------------------

Я пытаюсь лучше объяснить свою проблему. У меня есть сервлет Java, который возвращает структуру json. Сервлет вызывается в файле javascript, который должен нарисовать график на веб-странице, создавая изображение SVG. Мне нужно развернуть это веб-приложение на коммерческом сервере Windows с установленным Tomcat7. Веб-приложение работает в целом. Любые ошибки отображаются с точки зрения пользователя. Просто изображение не появляется, если я использую эти строки, которые я написал выше, чтобы вызвать сервлет. Я полагаю, что сервлет не отвечает, потому что я использую неправильный адрес/именование. Если я использую абсолютный URL-адрес, сервлет отвечает на js-вызывающий, но мне нужна относительная строка, поэтому, если доменное имя сервера изменится, я тоже не изменю код js-файла.

+0

Это предложение, это не ответ. Вы слышали о DWR? URL: http://directwebremoting.org/dwr/index.html – Ascension

ответ

2

Когда вы звоните

$.getJSON('VServlet', ...); 

вы делаете запрос HTTP GET к URL относительно текущего URL. То есть, если вы находитесь в /webapp/users/user.xhtml, вы отправите запрос /webapp/users/VServlet, который явно не соответствует шаблону URL вашего сервлета, а не тому, что вы пытаетесь достичь.

Вы должны принять во внимание контекстного пути приложения JSF, которая доступна в виде, как #{request.contextPath}, чтобы построить надлежащий абсолютный URL:

$.getJSON('#{request.contextPath}/VServlet', ...); 

Это будет посылать запрос на http://localhost:8080/webapp/VServlet.

В случае, если вам необходимо отправить запрос на пути относительно корня, такой запроса URL-адрес начинается с косыми чертами, / и не представляет URL-адреса по отношению к корню, независимо от того, где вы находитесь прямо сейчас:

$.getJSON('/VServlet', ...); 

Это отправит запрос на номер http://localhost:8080/VServlet.

+0

Отправляет запрос на 'http: // localhost: 8080/VServlet', а не' http: // localhost: 8080/WebAppName/VServlet' как OP intented. – BalusC

+0

'/ VServlet' еще не работает :-( – user2042895

+0

@ user2042895 См. Ответ на вопрос. Как BalusC справедливо заявил в своем комментарии к этому вопросу, в ответ я забыл учитывать контекст вашего веб-приложения. – skuntsel

0

если ваш код JS внутри JSP-страницы вместо кода

$ .getJSON ('VServlet', функция (данные) {...});

написать

«$ .getJSON ('$ {request.contextPath}/VServlet', функция (данные) {...});

другим мудрым, если этот код в некоторых JS файл в функции что-то вроде

function someFunction(){ 
    $.getJSON('VServlet', function(data){ ... }); 
} 

и вы вызываете функцию SomeFunction() из JSP затем добавить параметр функции, как это -

function someFunction(url){ 
     $.getJSON('VServlet', function(data){ ... }); 
    } 

и теперь называют его из JSP, как это -

SomeFunction ('$ {request.contextPath}/VServlet')

, потому что $ {request.contextPath}/VServlet является тегом эль и получите составлен только на странице jsp

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

  • Нет связанных вопросов^_^