#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
fromsearch.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"); %>