Java 使用HttpSession时,变量不能从一个JSP转换到另一个JSP

Java 使用HttpSession时,变量不能从一个JSP转换到另一个JSP,java,jsp,servlets,Java,Jsp,Servlets,使用doPost,以及我的方法为post的表单,从一个jsp页面检索到另一个jsp页面时遇到问题。下面的注释是一个简单的例子 首先,我有两页: 这里是search.jsp: <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <!DOCTYPE html> <html> <head> <title>search</title>

使用
doPost
,以及我的方法为
post
的表单,从一个jsp页面检索到另一个jsp页面时遇到问题。下面的注释是一个简单的例子

首先,我有两页:

这里是
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>
现在我有了一个名为
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)总是为空,因此我在
search\u results.jsp上得到
world
。为什么我的参数没有被传递到
search\u results.jsp

如果绕过servlet,就不会发生这种情况

看看你的动作形式

<form name="search" method="post" action="search_results.jsp">
然后,您应该从servlet将请求转发到
搜索结果.jsp
,您实际上是这样做的

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

<input type="text" class="inputTitle" name="inputTitle" value="${fn:escapeXml(param.inputTitle)}">
当您检索属性时,点符号表示您正在访问名为movie的对象中的字段

<p>Title: ${movie.title}</p>  <!-- you are accessing the title property of a movie object !-->
标题:${movie.Title}

但你没有…你有一部电影,大概是一根弦。将属性名更改为movietitle(不带点),并以相同的方式在jsp中检索它。上述行将变为:

session.setAttribute("movietitle", searchTitle);

<p>Title: ${movietitle}</p>
session.setAttribute(“movietitle”,searchTitle);
标题:${movietitle}


这应该可以解决问题。

如果绕过servlet,就不会发生这种情况

看看你的动作形式

<form name="search" method="post" action="search_results.jsp">
然后,您应该从servlet将请求转发到
搜索结果.jsp
,您实际上是这样做的

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

<input type="text" class="inputTitle" name="inputTitle" value="${fn:escapeXml(param.inputTitle)}">
当您检索属性时,点符号表示您正在访问名为movie的对象中的字段

<p>Title: ${movie.title}</p>  <!-- you are accessing the title property of a movie object !-->
标题:${movie.Title}

但你没有…你有一部电影,大概是一根弦。将属性名更改为movietitle(不带点),并以相同的方式在jsp中检索它。上述行将变为:

session.setAttribute("movietitle", searchTitle);

<p>Title: ${movietitle}</p>
session.setAttribute(“movietitle”,searchTitle);
标题:${movietitle}


这应该可以解决问题。

您可能希望提醒/打印“${fn:escapeXml(param.inputTitle)}”,看看它实际提供了什么。@Roshith当我使用console.log(${fn:escapeXml(param.inputTitle)}”)并在标题中加上“hello”时,我从console.log得到一个空字符串。您可能希望提醒/打印“${fn:escapeXml(param.inputTitle)}”要查看它实际提供了什么。@当我使用console.log(${fn:escapeXml(param.inputTitle)})并在标题中添加“hello”时,我从console.logHmm中得到一个空白字符串。。这在某种意义上有效吗?不管出于什么原因,传入的值仍然为null。因此,没有字符串被传递到我的servlet中,或者至少被转发到搜索结果页面。request.getParameter依赖于name属性而不是IDA。在将名称更改为属性(inputTitle)后,我仍然以传入null结束。更奇怪的是,使用apache commons字符串Util库,检查
如果(StringUtils.isNotBlank(title)){searchTitle=“hello”}否则{searchTitle=“world”}
抛出一个空指针,但要去掉输入标记中的value属性(设置为param.inputtle的属性)。我认为当您将请求发送到Servlet时,参数将被捕获。非常感谢!你肯定为我澄清了很多事情:DHmm。。这在某种意义上有效吗?不管出于什么原因,传入的值仍然为null。因此,没有字符串被传递到我的servlet中,或者至少被转发到搜索结果页面。request.getParameter依赖于name属性而不是IDA。在将名称更改为属性(inputTitle)后,我仍然以传入null结束。更奇怪的是,使用apache commons字符串Util库,检查
如果(StringUtils.isNotBlank(title)){searchTitle=“hello”}否则{searchTitle=“world”}
抛出一个空指针,但要去掉输入标记中的value属性(设置为param.inputtle的属性)。我认为当您将请求发送到Servlet时,参数将被捕获。非常感谢!你肯定为我澄清了很多:D