Как передать параметры в JSP с помощью response.sendRedirect?

#java #jsp #servlets

#java #jsp #сервлеты

Вопрос:

Мне действительно нужно использовать response.sendRedirect() метод, потому что моя страница JSP (search.jsp) на самом деле вызывает сервлет <jsp:include page="/searchServlet" /> , и в моем searchServlet , если я использую метод пересылки (на ту же страницу) Я получаю странную ошибку (возможно, потому, что я все время вызываю ее и пересылаю, я пока не нахожу причину ..) однако мне нужно прочитать атрибут на моей странице JSP (search.jsp) с простым сообщением типа «Пожалуйста, предоставьте действительные данные»

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

Итак, мой вопрос: есть способ использовать sendRedirect() и установить атрибут для моей страницы JSP вместе? Если нет, то как решить эту проблему?

Спасибо!

РЕДАКТИРОВАТЬ 1:

searchServlet:

 if (errorMessage != null) {
    /*sendError will generate an HTML error page using the message that you supplied and will override the content type to text/html.
    response.sendError(1, errorMessage);    
    */
    request.getSession().setAttribute("errorMessage",errorMessage);
    response.sendRedirect("charts/search.jsp");
}
  

search.JSP

 <jsp:include page="/searchServlet" /> 
<c:if test="${sessionScope.errorMessage != null}">
    <div id="error-Message">
        <c:out value="${sessionScope.errorMessage}" />
        <c:remove var="errorMessage" scope="session" />
    </div>
</c:if>
  

РЕДАКТИРОВАТЬ 2:
Ошибка, которую я получаю, если я использую forward() вместо sendRedirect, и я никогда не останавливаюсь, продолжаю цикл:

 at javax.servlet.ServletRequestWrapper.isAsyncStarted(ServletRequestWrapper.java:390)
// the error above repeats for more than a thousand times   

at javax.servlet.ServletRequestWrapper.isAsyncStarted(ServletRequestWrapper.java:390)
at org.apache.catalina.core.ApplicationDispatcher.unwrapRequest(ApplicationDispatcher.java:846)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:822)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:486)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:411)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338)
at control.SearchCriteriaServlet.doPost(SearchCriteriaServlet.java:99)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543)
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:954)
at org.apache.jsp.charts.searchChart_jsp._jspService(searchChart_jsp.java:183)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  

РЕДАКТИРОВАТЬ 3:

Мой метод doGet():

 ArrayList<Machine> foundMachines = MachineDB.getAllMachines();
request.setAttribute("foundMachineList", foundMachines);
RequestDispatcher rd = request.getRequestDispatcher("/searchServlet");
rd.forward(request, response);
  

Мой doPost(), который обрабатывает все записи и содержит в себе мой код из edit1:

Комментарии:

1. Можете ли вы показать написанный вами код forward()

2. forward() я не использую, но вот он RequestDispatcher rd = request.getRequestDispatcher("charts/chartView.jsp"); rd.forward(request, response);

3. С какой проблемой вы сталкиваетесь, если используете forward()?

4. Я только что опубликовал ошибку для вас

5. Почему ваша страница JSP содержит jsp:include в ваш сервлет — чего вы пытаетесь этим добиться?

Ответ №1:

Хорошо, я понял ПРИЧИНУ, по которой вы столкнулись с проблемой. Это потому, что бесконечный цикл вызовов. Посмотрите написанный вами код. В вашем JSP <jsp:include page="/searchServlet" /> эта строка вызывает вызов вашего сервлета searchServlet и снова в сервлете, на который вы отправляете запрос search.JSP . Итак, исправьте проблему сейчас.

Комментарии:

1. Вы можете добавить более одного ответа, но желательно удалить один перед отправкой другого. Это хорошая привычка! Кроме того, если вы ни в чем не уверены, пожалуйста, укажите подробности в комментарии.

2. Спасибо, я удалил старый.

3. но я включил этот код include, потому что у меня есть выпадающий список, который заполняется результатами БД, поэтому я поместил его туда, чтобы вызвать этот сервлет, а затем заполнить его

4. В вашем searchServlet извлеките список данных из базы данных и поместите в запрос запрос forward() для поиска. JSP, теперь вы можете заполнить список в JSP, вот и все

5. обратитесь к этому java-forums.org/javaserver-pages-jsp-jstl /…

Ответ №2:

Как вы обнаружили, вы не можете передать атрибут в запросе, если выполняете перенаправление, поскольку перенаправление заставляет браузер выдавать новый запрос. Таким образом, запрос (объект), который вы получите на своей странице JSP, будет новым, а не тем, в котором вы сохранили атрибут.

Вы можете хранить атрибуты в сеансе, но, как вы обнаружили, это может вызвать проблемы, если вы не сбрасываете / не удаляете их между запросами. Сохранение состояния в сеансе также может вызвать проблемы, если пользователь использует кнопку «назад» в своем браузере или одновременно открывает две или более вкладок.

Вы можете передавать информацию в параметре запроса с помощью перенаправления — например, путем создания URL-адреса, на который вы перенаправляете, так, чтобы он содержал параметры. Например, blahblah / search?message= что угодно

Однако это может показаться пользователю странным (они увидят параметры в адресной строке своего браузера), и вы можете столкнуться с проблемами, связанными с увеличением URL-адресов.

В вашем случае я бы посмотрел, почему пересылка не работает.

Ответ №3:

Как заявил Махеш, у вас общая проблема с дизайном :

  • search.jsp включает searchServlet (хм …)
  • searchServlet перенаправляет (или перенаправляет в качестве обходного пути) на search.jsp

Такой дизайн довольно необычен. Конечно, использование перенаправления вместо или переадресации в вашем сервлете приведет к разрыву бесконечного цикла, но ваш сервлет отправляет перенаправление в браузер, чтобы браузер вызывал представление … и, конечно, вы не можете передать что-либо в запросе между сервлетом и его представлением, поскольку представление будет вызвано в другом запросе… ИМХО, перенаправление здесь — всего лишь быстрый обходной путь.

Что было бы лучше (в соответствии с общепринятой практикой)

  • браузер изначально вызывает сервлет (т.е. Ссылка на страницу поиска указывает на URL, непосредственно обрабатываемый сервлетом)
  • сервлет выполняет тяжелую работу (запрограммирован на Java, проще писать и тестировать)
  • сервлет помещает все соответствующие параметры в запрос и пересылает в jsp
  • jsp просто форматирует все в хорошем html, который будет отображаться в браузере.

Комментарии:

1. но я попытался это сделать и получил эту ошибку, я хотел использовать один и тот же сервлет и страницу для выполнения всей работы, где doGet() только создает ArrayList и возвращает его на ту же страницу, чтобы заполнить мой выпадающий список и мой doPost() для обработки всех записей и их проверки

2. @migmig Из браузера вы не спрашиваете /.../charts/search.jsp , а напрямую /.../searchServlet , и вы не включаете searchServlet from search.jsp . Затем вы можете переслать форму сервлета в jsp.

3. Я удалил свой тег include и изменил свою страницу пересылки на свой сервлет, однако он продолжает цикл N раз, а затем ту же ошибку

4. Если сервлет вызывает jsp, а jsp не вызывает сервлет, он не может выполнять цикл. Пожалуйста, покажите ваш текущий код.

5. извините, я был недостаточно ясен, на моей индексной странице я также вызываю свой сервлет для заполнения этого выпадающего списка, если я просто вызову страницу search.jsp, она не будет зацикливаться, однако, если я вызову этот сервлет с помощью метода get, он будет

Ответ №4:

Вы можете сохранить параметры в сеансе.

 session.setAttribute("Att1","para1");
session.setAttribute("Att2","para2");
.
.
.
  

вот так.

Комментарии:

1. Я сделал это и работал, но поскольку браузер не был закрыт, я все еще получал то же сообщение об ошибке

Ответ №5:

вы можете использовать RequestDispatcher следующим образом:-

      RequestDispatcher rd=request.getRequestDispatcher("result.jsp");
     rd.forward(request,response);
  

если вы используете response.sendRedirect, вы можете добавить параметры в объект ServletRequest, и их можно использовать в jsp.вот так:-

       <% String st=(String)request.getParameter("uname"); %>