【问题标题】:Passing a list from Servlet to Jsp giving null pointer exception将列表从 Servlet 传递给 Jsp 给出空指针异常
【发布时间】:2011-12-01 17:28:43
【问题描述】:

我正在尝试打印问题列表(questionList)。当表单加载时,列表的元素应打印为标签。

在我的 java 文件中,我返回了一个问题列表。

在我的 servlet 代码中:

ArrayList<String> questionList = qd.getFormLabels();
request.setAttribute("question", questionList);
System.out.println("Hello World " + questionList);
RequestDispatcher rd = getServletContext().getRequestDispatcher("/Home.Index.jsp");
if (rd != null){    
rd.forward(request, response);
return;

在我的 jsp 代码中,当我访问此列表时,它给了我一个空指针异常。

jsp代码:

<%

ArrayList<String> LabelList = (ArrayList)request.getAttribute("question");
out.println(LabelList.size());

if(LabelList.isEmpty()==false)
    {
        for( int i = 0; i< LabelList.size(); i++)
        {%>
            <tr><td><%out.println(LabelList.get(i)); %></td></tr>

当我尝试打印它给出 null 的大小时。 请告诉我的流程是否正确以及servlet是否正确触发

【问题讨论】:

  • 除了“呃?!”在几个层面上,只有少数可能性,比如列表为空、错误的 JSP 等。
  • 浏览器地址栏的网址是什么?它是 servlet 的 URL 还是转发的 JSP 之一? web.xml 有过滤器吗?顺便说一句,您应该使用来自ServletRequest 的请求调度程序,而不是ServletContextrequest.getRequestDispatcher(...)
  • @BalusC 寻找明确的请求修饰符的好点。
  • 当应用程序启动时,URL 是 /Home.Index.jsp。我将请求转发到此 URL,因为数据将显示在此 jsp 上。
  • 谢谢戴夫。但是当我在 servlet 中打印列表及其大小时,它会给我正确的大小和正确的输出。我认为请求没有正确转发到jsp。但我无法弄清楚。

标签: jsp servlets


【解决方案1】:

只有在您不通过其 URL 调用 servlet 时才会发生这种情况。根据 cmets,您似乎实际上是通过其 URL 直接调用 JSP,并且您似乎不了解 servlet 映射。

好吧,为了让 servlet 在将结果显示在 JSP 中之前预处理 HTTP 请求,您需要将 servlet 映射到 web.xml 中的 URL 模式隐藏 JSP在/WEB-INF 文件夹中,这样它就永远不会被直接调用,也不是偶然的,因此您始终可以确保 JSP 只能通过调用 servlet 来显示。

例如web.xml中的这个:

<servlet>
    <servlet-name>home</servlet-name>
    <servlet-class>com.example.controller.HomeServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>home</servlet-name>
    <url-pattern>/home</url-pattern>
</servlet-mapping>

请注意/home&lt;url-pattern&gt;。这需要注意 http://localhost:8080/contextname/home 可以调用 servlet,其中“/contextname”实际上是您的 web 应用程序的上下文名称。当您在浏览器地址栏中输入该 URL 或单击指向该 URL 的链接/书签时,将调用 servlet 的 doGet() 方法。您只需要更改那些RequestDispatcher

RequestDispatcher rd = getServletContext().getRequestDispatcher("/Home.Index.jsp");
if (rd != null){    
rd.forward(request, response);

转为以下更简单、更规范的形式

request.getRequestDispatcher("/WEB-INF/home.jsp").forward(request, response);

您还需要将 JSP 文件移动到该路径上的 /WEB-INF 文件夹。为了清楚起见,我重命名了 JSP 文件名。 Home.Index.jsp 是一个相当奇怪的名字。如果需要,您可以随时将其重命名,只要它位于 /WEB-INF 文件夹中即可。

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2015-01-18
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2014-07-19
    相关资源
    最近更新 更多