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


Автор: Klio 7.2.2013, 11:46
Здравствуйте господа программисты!
У меня такая загвоздка...
--- Есть servlet - Index.java  ----  @WebServlet({"/*"})
 а значит все запросы идут через него... 
(Знаю что изобретаю свой велосипед типа FrontController, но всёже)
И здесь два вопроса:
1) запрос к ресурсам типа рисунки, стили, скрипты из соответствующих папок (/images/*,/style/*.css и /js/*.js) воспринимаются как запросы ( к примеру "/images/logo.jpg") к этому же сервлету, что можно сделать чтобы данные запросы шли на прямую,а не через сервлет, или же шли но возвращали при этом, указанный в запросе, ресурс?
2) после обработки запроса используется:
Код

RequestDispatcher dispatcher = getServletContext()
                   .getRequestDispatcher("/WEB-INF/jsp/error.jsp?");
    dispatcher.forward(request, response);
или request.getRequestDispatcher(/WEB-INF/jsp/error.jsp?").forward(request,response);

На этой процедуре он зацикливается... так как обращение идёт на этот же сервлет с новым параметром который естевственно неправильный при его разборе, и приводит к вызову страницы error.jsp

Что нужно исправить?
Заранее спасибо...

Автор: mbasil 7.2.2013, 16:50
В Struts для этого используется суффикс.
Строка, начинающаяся с префикса *. и последующим суффиксом используется  для отображения в данный сервлет любого URL, содержащего указанный суффикс. 
Например, если  <servlet-mapping>  будет описан так:

Код

<servlet-mapping> 
    <servlet-name>myServControkker</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping>


то URL  http://localhost:8089/u61/ka-ka.do, отпраит на контроллер,
а без суффикса по другому адресу.

Автор: Pawl 7.2.2013, 19:54
Цитата(mbasil @  7.2.2013,  16:50 Найти цитируемый пост)
В Struts для этого используется суффикс.

Несколько противоречит желанию автора - он же дал понять, что хочет сделать фронт-контроллер. По сабжу.
1) Попробуйте (я так делал для css) сделать такой маппинг по дефолту в web.xml:
Код

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>

а на нужной странице в заголовок (head) добавить код:
Код

<link rel="stylesheet" href="myStyle.css" type="text/css"/>
 где myStyle.css - собственно css-файл (он у меня был в той же папке, что и jsp)
2) на error.jsp я направлял из сервлета запросы так:
Код

    private void jump(String url, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RequestDispatcher rd = getServletContext().getRequestDispatcher(url);
        rd.forward(request, response);
    }

    private void jumpError(Throwable error, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("error", error);
        jump("/error.jsp", request, response);
    }

при этом error.jsp у меня находилась не в WEB-INF, a в корневой папке приложения

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