重复堆栈问题
运行报错如下:
前端jsp代码如下
<form action="FlightSearchServlet" method="post">
<div>
<label for="airline">Airline:label>
<input type="text" id="airline" name="airline">
div>
<div>
<label for="start_city">Start From:label>
<input type="text" id="start_city" name="start_city">
div>
<div>
<label for="end_city">To:label>
<input type="text" id="end_city" name="end_city">
div>
<div>
<button type="submit">Searchbutton>
div>
form>
<div id="searchResult">
<%-- Here to show the searchResult --%>
<c:forEach items="${flights}" var="flight">
<div class="flight">
<div>Airline: ${flights.Airline}div>
<div>Flight Number:${flight.FlightNo}div>
<div>Departure:${flight.DepartureTime}div>
<div>Arrival:${flight.ArrivalTime}div>
<div>Start From:${flight.StartCity}div>
<div>To:${flight.EndCity}div>
div>
c:forEach>
div>
servlet代码如下
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String airline = request.getParameter("airline");
String StartCity = request.getParameter("start_city");
String EndCity = request.getParameter("end_city");
List flights = FlightDao.search(airline, StartCity , EndCity);
request.setAttribute("flights", flights);
RequestDispatcher dispatcher = request.getRequestDispatcher("FlightSearchServlet");
dispatcher.forward(request,response);
response.setHeader("refresh","URL=FlightSearchServlet");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/flightQuery.jsp").forward(req,resp);
}
如果把这句代码删了就没问题,但是我不知道为什么这句会重复执行并且报堆栈错误
RequestDispatcher dispatcher = request.getRequestDispatcher("FlightSearchServlet");
dispatcher.forward(request,response);
问题的原因是在servlet中使用了RequestDispatcher来转发请求,但是转发的目标是当前的servlet,而不是jsp页面。所以在转发后又会再次执行servlet,导致重复执行。
解决方法是将转发的目标改为jsp页面,即修改以下代码:
RequestDispatcher dispatcher = request.getRequestDispatcher("FlightSearchServlet");
dispatcher.forward(request,response);
response.setHeader("refresh","URL=FlightSearchServlet");
改为:
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/flightQuery.jsp");
dispatcher.forward(request,response);
这样就可以避免重复执行了。
栈溢出,无限递归了,陷入死循环了,仔细排查一下
通俗的说jsp是嵌套java代码的html,servlet是嵌套html的java代码,两者在实质上是相同的,任何.jsp文件都回被翻译成java代码然后在机器上执行,但是由于两者在配置和编写方式上的不同。
jsp一般被用在view层上,用来显示数据
servlet一般做后台的逻辑上的业务处理用