使用HttpSession时,变量不是从一个JSP到另一个JSP

时间:2016-04-22 06:02:48

标签: java jsp servlets

我无法使用doPost从一个jsp页面检索任何类型的参数,以及我的方法为post的表单。下面的注释是一个最小的例子。

首先,我有两页:

以下是search.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!DOCTYPE html>
<html>
<head>
  <title>search</title>
  <body>
    <form name="search" method="post" action="search_results.jsp">
    <p>
        <input type="text" class="inputTitle" id="inputTitle" value="${fn:escapeXml(param.inputTitle)}">
        <button type="submit">Search</button>
    <p>
    </form>
  </body>
</html>

我的search_results.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
  <title>search results</title>
  <body>
    <p>Title: ${movie.title}</p>
  </body>
</html>

现在我有一个名为SearchServlet.java的课程:

@WebServlet("/search")
public class SearchServlet extends HttpServlet {
  @Override 
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
  throws IOException, ServletException {
    HttpSession session = request.getSession();
    request.getRequestDispatcher("search.jsp").forward(request,response);
  }

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
  throws IOException, ServletException {
    HttpSession session = request.getSession();
    String title = request.getParameter("inputTitle");
    String searchTitle;
    try {
    if(title != null && !title.isEmpty()) {
        searchTitle = "hello";
    } else {
        searchTitle = "world";
    }
    session.setAttribute("movie.title", searchTitle);
    request.getRequestDispatcher("search_results.jsp").forward(request, response);
    } catch(ServletException e) { e.printStackTrace(); }
  }  
}

无论我输入什么,结果(movie.title)总是空着,所以我world上的search_results.jsp。为什么我的参数没有传递给search_results.jsp

1 个答案:

答案 0 :(得分:2)

如果绕过servlet

,则不会发生这种情况

查看表单操作

<form name="search" method="post" action="search_results.jsp">

您将发布请求直接发送到search_results.jsp:您应该将其发送到servlet(映射@ /搜索)

<form name="search" method="post" action="search">

然后,您应该从servlet将请求转发给search_result.jsp,这是您实际执行的操作。

除此之外,当您调用request.getParameter时,您必须记住,重要的是输入字段的名称,而不是id。您应该将id属性更改为name

<input type="text" class="inputTitle" name="inputTitle" value="${fn:escapeXml(param.inputTitle)}">

最后,希望:)&#39;。&#39; (点)可能会导致问题:

session.setAttribute("movie.title", searchTitle);

检索属性时,点符号表示您正在访问名为movie

的对象中的字段
<p>Title: ${movie.title}</p>  <!-- you are accessing the title property of a movie object !-->

但是你没有那个......你有一个movietitle,一个字符串。将属性名称更改为不带点的movietitle,并以相同的方式在jsp中检索它。以上几行将成为:

session.setAttribute("movietitle", searchTitle);

<p>Title: ${movietitle}</p>

这应该可以解决问题。