Можем ли мы как-то изменить URL в адресной строке после отправки запроса из сервлета в jsp - PullRequest
2 голосов
/ 10 июня 2011

У меня здесь странная проблема, и я действительно застрял, мне нужно плохо работать.

так что у меня есть страница с именем index.jsp со ссылкой "a href = servlet? Id = 10". когда я нажимаю на эту ссылку, она переходит к doGet () в моем сервлете, и вот код в моем сервлете.

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
                 String action = request.getParameter("id");
                  // search database and create an arraylist
                        if(//user logged in)
                        address = "s/results.jsp";
                        else   
                        address = "results.jsp";
                   // set arraylist in session object
                RequestDispatcher dispatcher = request.getRequestDispatcher(address);
                dispatcher.forward(request,response);
     }

Таким образом, приведенный выше код работает нормально, но после пересылки запроса мой браузер отображает URL-адрес как

http://localhost/project/servlet?id=10.

Мне не нужен указанный выше URL, поскольку я пересылаю два разных jsp в зависимости от состояния входа пользователя: один находится в папке 's', а другой - вне этого. если пользователь вошел в систему, то я пересылаю в «s / results.jsp», а если пользователь не вошел в систему, я пересылаю в «results.jsp».

в случае s / results.jsp я получаю доступ к ресурсам, таким как изображения и скрипты, из папки 's', используя ../ в results.jsp.

, поскольку URL-адрес не изменяется на s / results.jsp, я не могу получить доступ к ресурсам с помощью "../" и так как я использую пагинацию jsp, когда я нажимаю дальше, URL-адрес меняется на s / results.jsp и в этом случае я могу получить доступ к ресурсам, используя ../

Единственное решение, которое я думаю, - скопировать все ресурсы в папку s, но это увеличит избыточность.

Еще одно решение в моем уме - создать два разных сервлета для двух jsp. но я не знаю, куда поместить сервлет, чтобы он мог обращаться к ресурсам вне папки s с помощью ../

это любой другой хороший способ, которым я могу выполнить задачу.

Я пытался найти информацию об этом, но не смог ее выяснить.

Любая помощь будет очень признательна.

Ответы [ 2 ]

8 голосов
/ 10 июня 2011

Вы в основном указали своему веб-браузеру отправлять запрос именно на этот URL-адрес.Форвард не меняет URL.Это полностью серверная сторона.Помимо использования response.sendRedirect() вместо этого - который будет отбрасывать текущий запрос, включая все его атрибуты, и создавать новый запрос по заданному URL-адресу - вы также можете просто изменить свою ссылку на <a href="results?id=10"> или когда пользовательавторизовался, до <a href="s/results?id=10">.

<a href="${user.loggedin ? 's/' : ''}results?id=10">

Наконец, соответствующим образом измените отображение сервлета, чтобы он вызывался по этим URL-адресам.

<url-pattern>/results</url-pattern>
<url-pattern>/s/results</url-pattern>

Вы пропустите только расширение JSP.Но JSP, которые должны использоваться диспетчером, в любом случае принадлежат папке /WEB-INF, поэтому конечный пользователь не может просматривать их напрямую, не вызвав сначала сервлет.Вы также получите хорошие URL.

1 голос
/ 25 октября 2016
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getParameter("id");
// search database and create an arraylist
    if(//user logged in)
        address = "s/results.jsp";
    else   
        address = "results.jsp";
    // set arraylist in session object
    RequestDispatcher dispatcher = request.getRequestDispatcher(address);
    dispatcher.forward(request,response);
 }

в приведенном выше коде вместо использования диспетчера запросов,

RequestDispatcher dispatcher = request.getRequestDispatcher(address);
            dispatcher.forward(request,response);

мы можем попробовать с

response.sendRedirect(request.getContextPath()+"/address");
...