我不明白为什么servlet不会将值传递给.jsp文件。如果有人可以解释我的观点,那为什么只有在调用request.getSession.setAtribute()方法时才能起作用。我应该怎么做才能避免创建会话。
Servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
moviesList(request, response);
if (request.getParameter("command").equals("ADD"))
addMovie(request, response);
if (request.getParameter("command").equals("DELETE"))
deleteMovie(request, response);
if (request.getParameter("command").equals("SEARCH_IN_TMDB"))
searchInTmdb(request, response);
} catch (Exception e) {
e.getMessage();
}
}
private void searchInTmdb(HttpServletRequest request, HttpServletResponse response) throws Exception {
List<MovieDb> movieDbs;
String title = request.getParameter("title_themoviedb");
String year = request.getParameter("year_themoviedb");
System.out.println("title " + title + " year " + year);
int year_int = Integer.parseInt(year);
movieDbs = TheMovieDbApiUtil.getInstance().getListFoundMovies(title, year_int);
request.getSession().setAttribute("TMDB_LIST", movieDbs);
RequestDispatcher dispatcher = request.getRequestDispatcher("/movie-list.jsp");
dispatcher.forward(request, response);
}
JSP文件:
<div class="row top-buffer">
<form action="ServletMovieController" method="get">
<input type="hidden" name="command" value="SEARCH_IN_TMDB">
<div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
</div>
<div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">
<button type="submit">Szukaj...</button>
<input type="text" name="title_themoviedb" title="title_themoviedb" class="form-control">
<input type="text" name="year_themoviedb" title="year_themoviedb" class="form-control">
<ul class="list-group" id="myList">
<c:forEach var="tempMovieTmdb" items="${TMDB_LIST}">
<li class="list-group-item">${tempMovieTmdb.getTitle()}</li>
</c:forEach>
</ul>
</input>
</div>
<div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
</div>
</form>
</div>
正如我之前提到的,当我使用requset.getSession()时,它可以正常工作,但是传递的值是null。
答案 0 :(得分:1)
我认为我已经理解了出了什么问题,这是人们在开始使用servlet / jsp请求流时经常犯的一个错误。
由于有人已经提到您需要换出
request.getSession().setAttribute("TMDB_LIST", movieDbs);
具有:
request.setAttribute("TMDB_LIST", movieDbs);
现在之所以成为null的原因是因为您没有运行servlet。您正在尝试直接访问jsp,并期望request变量在那里。 servlet / jsp请求流不是这样工作的。 Servlet设置请求变量“ TMDB_LIST”,并将该变量转发到jsp页面(“ /movie-list.jsp”)。转到其他页面后,变量将过期并且为空。如果尝试直接访问jsp,则它将为null,因为您需要servlet将变量传递给jsp。我猜这是您在做什么,或者您在到达jsp之后进行了重定向。
会话变量的不同之处在于,只要服务器指定,您设置的变量就会在整个应用程序/网站中持久存在(直到您删除或更改它们)。
请求变量仅在第一个请求之后可用。 (即servlet将请求变量传递给jsp或jsp将请求变量传递给servlet)
答案 1 :(得分:0)
如果要避免使用Session,请在servlet中使用
request.setAttribute("TMDB_LIST", movieDbs);