【问题标题】:JSTL dropdown is empty in jspjsp中的JSTL下拉列表为空
【发布时间】:2015-07-09 06:22:13
【问题描述】:

我正在尝试使用 jstl 填充我的 jsp 下拉列表。我的jsp是这样映射的。

 <servlet>
    <jsp-file>/WEB-INF/views/dilini/newjsp.jsp</jsp-file>
    <servlet-name>newjsp</servlet-name>
</servlet>

<servlet-mapping>
    <servlet-name>newjsp</servlet-name>
    <url-pattern>/newjsp</url-pattern>
</servlet-mapping>

这也是我加载的 jstl 下拉菜单。

     <div class="dropdown">
        <button class="btn btn2 btn-default dropdown-toggle" type="button" id="menu2" data-toggle="dropdown">--Select--
            <span class="caret"></span></button>
        <ul class="dropdown-menu" role="menu" aria-labelledby="menu2">
               <c:forEach items="${personList}" var="person">
                <li role="presentation"><a data-myAttribute="${person.getId()}" class="list2" href="#">${person.getName()}</a></li>
                </c:forEach>
        </ul>
    </div>

这是我的控制器 servlet。

   protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try {
        CasualLeaveService service1 = new CasualLeaveServiceImpl();
        List<Person> personList = service1.searchName();
        if (personList.isEmpty()) {
            response.getWriter().write("EMPTY ");
        } else {
            response.getWriter().write("NOT EMPTY ");
            request.setAttribute("personList", personList);
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/newjsp");
            rd.forward(request, response);

        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

当我自己运行控制器时,它会显示类似这样的内容。

我真的不明白为什么 servlet 看不到下拉菜单。请帮我。谢谢。

添加了更多答案。希望这会有所帮助。
另外,当 jsp 调用“通过单击按钮或单击链接”时,我应该添加另一个,您应该首先到达控制器,然后控制器将重定向 jsp。这是缺少的部分。

再次感谢大家的支持。

【问题讨论】:

  • 嗯,你有什么问题?我觉得一切都很好。
  • 问题是当我加载的jsp列表是空的。该图像是我运行 servlet 时的图像。
  • 当然是空的! servlet 生成personList,没有 servlet 就没有可迭代的内容。
  • @JozefChocholacek 你能告诉我如何填充这个列表吗?
  • 好吧,您可以将相关代码从 servlet 复制到您的 JSP(作为 scriptlet),但我建议这样做。你做得对(除非你不应该在 servlet 中使用response.getWriter().write(...);),servlet 应该扮演控制器部分,JSP 应该只是视图。参见例如thejavageek.com/2013/08/11/… 了解有关 MVC 架构的更多详细信息。

标签: jsp servlets jstl


【解决方案1】:

将 cmets 总结为答案:

您当前的方法很好,继续使用 servlet 加载数据,而 JSP 仅用于显示它们(或错误消息)。 IE。避免在链接/表单操作中使用 JSP URL,始终使用 servlet 的 URL,servlet 应加载数据,然后将请求 转发 到适当的 JSP。这正是Model/View/Controller 模式/架构。

只需对您的代码进行一些建议的更改:

  • 从 web.xml 中删除 newjsp 映射,JSP 页面不应该直接可用,只能通过 servlet 访问。

JSP:处理空列表的情况

<div class="dropdown">
    <button class="btn btn2 btn-default dropdown-toggle" type="button" id="menu2" data-toggle="dropdown">--Select--<span class="caret"></span></button>
    <ul class="dropdown-menu" role="menu" aria-labelledby="menu2">
        <c:if test="${empty personList}">
            <li>No person available</li>
        </c:if>
        <c:forEach items="${personList}" var="person">
            <li role="presentation"><a data-myAttribute="${person.getId()}" class="list2" href="#">${person.getName()}</a></li>
        </c:forEach>
    </ul>
</div>

Servlet:不要处理响应,这是视图的任务;只需加载数据并转发到视图(JSP)

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        CasualLeaveService service1 = new CasualLeaveServiceImpl();
        List<Person> personList = service1.searchName();
        request.setAttribute("personList", personList);
        RequestDispatcher rd = getServletContext().getRequestDispatcher("/WEB-INF/views/dilini/newjsp.jsp");
        rd.forward(request, response);
    } catch (Exception e) {
        e.printStackTrace(); // bad practice, use some logger
        request.setAttribute("error", "Error loading person list: " + e.getMessage());
        RequestDispatcher rd = getServletContext().getRequestDispatcher("/WEB-INF/views/dilini/error.jsp"); // you have to create one
        rd.forward(request, response);
    }
}

【讨论】:

  • 你有一个完美的答案。谢谢你。 :) 另外,当 jsp 调用“通过单击按钮或单击链接”时,我应该添加另一个,您应该首先到达控制器,然后控制器将重定向 jsp。这是缺少的部分。你的回答还是很棒的。谢谢。
【解决方案2】:

您应该使用属性名称而不是现在的 getXXX() 方式访问属性。

<li role="presentation"><a data-myAttribute="${person.id}" class="list2" href="#">${person.name}</a></li>

【讨论】:

  • :( 仍然没有输出。我认为列表看不到控制器。
  • 感谢您的支持,
猜你喜欢
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多