Пересылка запроса в JSP - PullRequest
       37

Пересылка запроса в JSP

4 голосов
/ 12 марта 2011

Я обнаружил Guice на прошлой неделе ... Я пытаюсь с ним справиться Тем не менее, в настоящее время я заблокирован ...

Я пытаюсь переслать запрос в JSP в сервлете, обслуживаемом URL-шаблоном, который содержит «*». Но я получаю "Ошибка 404" все время: (

Шаг за шагом:


ServletModule :
serve("/test/*").with(TestServlet.class);

TestServlet :
public void doGet(HttpServletRequest req, HttpServletResponse resp)  
{

    System.err.println("Start");
    try 
    {
        req.getRequestDispatcher("/WEB-INF/layout/test.jsp").forward(req, resp);
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }

}

Я получаю эту ошибку:

HTTP ОШИБКА 404
Проблема с доступом к /WEB-INF/layout/test.jsp. Причина:
/WEB-INF/layout/test.jsp

Я проверил с помощью «serve (» / test »). With (TestServlet.class);» и это сработало
Я тестировал без Guice (определив сервлет в web.xml), и это сработало ...

  • Что я сделал не так?

Спасибо за чтение!

Ответы [ 3 ]

7 голосов
/ 12 марта 2011

Клиент не может получить доступ к ресурсам из Web-INF напрямую (по URL).Таким образом, пересылка не работает в этом случае.Но ваши сервлеты могут.Так что просто используйте include вместо forward.

6 голосов
/ 02 сентября 2011

Есть хороший шанс, что ты не сделал ничего плохого. В Guice есть ошибка, связанная с неправильным обращением атрибутов Include и Forward со стандартами сервлетов, как описано здесь ... http://code.google.com/p/google-guice/issues/detail?id=647

В результате получаемый сервлет неверно информирует о пути, и, следовательно, запросы на загрузку ресурсов не находят правильную цель, даже если они указаны правильно и даже если тот же код работает при использовании web.xml (который интерпретируется вашим двигателем сервлета, а не Guice).

Я бесконечно озадачен, почему это не действует как тупик для многих проектов в Guice, так что, возможно, что-то есть в поведении других конфигураций движка сервлета, которое маскирует эту ошибку. Я использую Jetty, явно запущенную в Java, используя Server # start (); и это нарушает условия для многих логики сервера.

Однако команда Guice, похоже, долгое время старательно игнорировала ошибку, даже когда им был предоставлен патч для v2.0. Им нужен тестовый сценарий, написанный против их сборки SVN, но мне так и не удалось, учитывая всю работу, необходимую для создания заглушек, эмулирующих механизм сервлета и т. Д.

4 голосов
/ 21 апреля 2012

Проблема была частично исправлена ​​в guice и guice servlet 3.1.1, при этом одна проблема все еще имеет место:

При отображении сервлета с использованием шаблона звездочки '/ *', как показано ниже:

serve("/myservlet/*").with(MyServlet.class);

И если MyServlet.java перенаправит на страницу jsp, то forward () будет работать только в том случае, если на странице jsp нет подчеркивания (поэтому myservlet.jsp будет работать, my_servlet.jsp не будет работать).

// This WORKS
req.getRequestDispatcher("/myservlet.jsp").forward(req,resp);

// These DONT WORK (any file having _ or - characetsrs wont work)
req.getRequestDispatcher("/my_servlet.jsp").forward(req,resp); 
req.getRequestDispatcher("/my-servlet.jsp").forward(req,resp); 
req.getRequestDispatcher("/WEB-INF/myservlet.jsp").forward(req,resp);

Теперь это объясняет, почему пересылка WEB-INF не работает для сервлета, отображенного с / *. Причина в том, что WEB-INF содержит символ тире, который по какой-то причине создает проблему для сервлета guice. При попытке выполнить приведенный выше пример обязательно переименуйте файл myservlet.jsp в my_servlet.jsp, когда пытаетесь проверить случаи, описанные выше.

Я понятия не имею, почему происходит этот странный случай. ПРИМЕЧАНИЕ: я использую Tomcat 6.0.35

Чтобы Guice 3.1.1 добавил их в свой pom.xml

    <dependency>
        <groupId>org.sonatype.sisu</groupId>
        <artifactId>sisu-guice</artifactId>
        <version>3.1.1</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.sonatype.sisu.inject</groupId>
        <artifactId>guice-servlet</artifactId>
        <version>3.1.1</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.sonatype.sisu.inject</groupId>
        <artifactId>guice-assistedinject</artifactId>
        <version>3.1.1</version>
        <scope>compile</scope>
    </dependency>

Или вы можете скачать банки с:

Баночка с сервлетом

http://repo1.maven.org/maven2/org/sonatype/sisu/inject/guice-servlet/3.1.1/

Guice Jar

http://repo1.maven.org/maven2/org/sonatype/sisu/sisu-guice/3.1.1/

...