jsp 中的 JSTL 下拉列表为空
JSTL dropdown is empty in jsp
我正在尝试使用 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 调用 "by clicking button or clicking link" 时再添加一个,你应该首先到达控制器,然后控制器将重定向 jsp。这是缺失的部分。
再次感谢大家的支持。
您应该使用 属性 名称访问属性,而不是您现在使用的 getXXX() 方式。
<li role="presentation"><a data-myAttribute="${person.id}" class="list2" href="#">${person.name}</a></li>
将评论总结为答案:
您当前的方法很好,继续使用 servlet 加载数据,JSP 仅显示它们(或错误消息)。 IE。避免在 links/form 操作中使用 JSP URLs,始终使用 servlet 的 URL,servlet 应该加载数据然后 forward 请求到适当的 JSP。正是 Model/View/Controller pattern/architecture.
仅建议对您的代码进行一些更改:
- 从您的 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);
}
}
我正在尝试使用 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 调用 "by clicking button or clicking link" 时再添加一个,你应该首先到达控制器,然后控制器将重定向 jsp。这是缺失的部分。
再次感谢大家的支持。
您应该使用 属性 名称访问属性,而不是您现在使用的 getXXX() 方式。
<li role="presentation"><a data-myAttribute="${person.id}" class="list2" href="#">${person.name}</a></li>
将评论总结为答案:
您当前的方法很好,继续使用 servlet 加载数据,JSP 仅显示它们(或错误消息)。 IE。避免在 links/form 操作中使用 JSP URLs,始终使用 servlet 的 URL,servlet 应该加载数据然后 forward 请求到适当的 JSP。正是 Model/View/Controller pattern/architecture.
仅建议对您的代码进行一些更改:
- 从您的 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);
}
}