首页 > 解决方案 > JSP doesn't pass values on request

问题描述

I'don't understand why servlet doesn't pass values to .jsp file. If somebody could explain my, why it works only when a call request.getSession.setAtribute() method. What should i do to avoid creating session.

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 file:

 <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>

As I mentioned before it works when I use requset.getSession(), but whitout it passed value is null.

标签: javahttpjspservlets

解决方案


我想我已经明白出了什么问题,这是人们第一次开始使用 servlet/jsp 请求流时常犯的错误。

正如有人已经提到的那样,您需要换掉

request.getSession().setAttribute("TMDB_LIST", movieDbs);

和:

request.setAttribute("TMDB_LIST", movieDbs);

现在你得到 null 的原因是因为你没有运行 servlet。您正在尝试直接访问 jsp 并期望请求变量在那里。这不是 servlet/jsp 请求流的工作方式。servlet 设置请求变量“TMDB_LIST”并将该变量转发到 jsp 页面(“/movie-list.jsp”)。一旦您转到不同的页面,该变量就会过期并且将为空。如果您尝试直接访问 jsp,它将只是 null,因为您需要 servlet 将变量传递给 jsp。我猜这就是你正在做的事情,或者你在到达 jsp 后有一个重定向。

会话变量的不同之处在于,只要服务器指定,您设置的变量就会在整个应用程序/网站中持续存在(直到您删除或更改它们)。

请求变量仅在第一次请求后可用。(即servlet将请求变量传递给jsp或jsp将请求变量传递给servlet)


推荐阅读