Переадресация RequestDispatcher перенаправляется обратно на тот же сервлет

У меня есть сервлет с именем User.java. Сопоставляется с шаблоном URL

    <servlet-mapping>
        <servlet-name>User</servlet-name>
        <url-pattern>/user/*</url-pattern>
    </servlet-mapping>

Внутри сервлета анализируется путь после косой черты в user/, данные об этом пользователе извлекаются из базы данных, задаются в атрибутах, а затем должна отображаться страница user_home.jsp. Код для этого:

            User user = UserManager.getUserInfoById(userPath);  
            request.getSession().setAttribute("user", user);
            request.getRequestDispatcher("resources/jsp/user_home.jsp").forward(request, response);

Проблема в том, что вместо открытия этого user_home.jsp запрос еще раз сопоставляется с тем же сервлетом User.java. Это ничего не делает.

Я поместил операторы вывода в начало метода doGet, поэтому я вижу, что URL-адрес

http://localhost:8080/myproj/user/resources/jsp/user_home.jsp

поэтому кажется очевидной проблемой то, что он отображается прямо на шаблон user/*.

Как мне заставить сервлет отображать эту страницу без сопоставления URL-адресов и правильно отображать jsp, что мне нужно?


person CodyBugstein    schedule 05.09.2014    source источник
comment
forward() не меняет URL. Вы уверены, что вас перенаправляют с user_home.jsp на User.java? если да, то возможно стоит почистить запрос от определенных параметров.   -  person Nir Alfasi    schedule 05.09.2014


Ответы (2)


Если путь, переданный request.getRequestDispatcher(), не начинается с "/", он интерпретируется как относительный к текущему пути. Поскольку путь вашего сервлета — /user/<something>, он пытается перенаправить запрос на /user/resources/jsp/user_home.jsp, что соответствует вашему отображению сервлета и, следовательно, рекурсивно перенаправляет на тот же сервлет.

С другой стороны, если путь, переданный request.getRequestDispatcher(), начинается с "/", он интерпретируется как относительный к текущему корневому контексту. Итак, если предположить, что каталог resources находится в корне вашего веб-приложения, попробуйте добавить «/» в начале пути, например:

request.getRequestDispatcher("/resources/jsp/user_home.jsp").forward(request, response);
person David Levesque    schedule 05.09.2014

вы не хотите использовать * в сопоставлении сервлета. просто потому, что каждый раз, когда у вас есть /user/ в вашем URL, он будет перенаправлять обратно на сервлет.

звездочка принимает каждый URL, у которого есть /user/, и перенаправляет его на основе отображения сервлета, поэтому вы можете сделать это

<servlet-mapping>
        <servlet-name>User</servlet-name>
        <url-pattern>/user/User</url-pattern>
    </servlet-mapping>

и используйте его в своем action как action = user/User

person Ker p pag    schedule 05.09.2014
comment
Что вы имеете в виду под action? - person CodyBugstein; 05.09.2014
comment
‹действие формы = пользователь/пользователь ›‹/форма› - person Ker p pag; 05.09.2014
comment
Ах хорошо. Но на странице есть форма - person CodyBugstein; 05.09.2014
comment
я имею в виду, поэтому отправьте форму сервлету, вы можете использовать следующее user/User - person Ker p pag; 05.09.2014