我怎样才能通过一个 HashMap 在jsp中?
HashMap
<% HashMap<String, String> countries = MainUtils.getCountries(l); %> <select name="country"> <% // Here I need to loop through countries. %> </select>
iecba09b1#
就像在普通java代码中一样。
for (Map.Entry<String, String> entry : countries.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); // ... }
但是,scriptlet(jsp文件中的原始java代码 <% %> 事情)被认为是一个糟糕的做法。我建议安装jstl(只需将jar文件放到 /WEB-INF/lib 并在jsp顶部声明所需的taglib)。它有一个 <c:forEach> 可以在其他标记之间迭代的标记 Map s。每次迭代都会给您一个 Map.Entry 反过来又有 getKey() 以及 getValue() 方法。下面是一个基本示例:
<% %>
/WEB-INF/lib
<c:forEach>
Map
Map.Entry
getKey()
getValue()
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:forEach items="${map}" var="entry"> Key = ${entry.key}, value = ${entry.value}<br> </c:forEach>
因此,您的特定问题可以通过以下方式解决:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <select name="country"> <c:forEach items="${countries}" var="country"> <option value="${country.key}">${country.value}</option> </c:forEach> </select>
你需要一个 Servlet 或者 ServletContextListener 放置 ${countries} 在所需范围内。如果此列表应基于请求,则使用 Servlet 的 doGet() :
Servlet
ServletContextListener
${countries}
doGet()
protected void doGet(HttpServletRequest request, HttpServletResponse response) { Map<String, String> countries = MainUtils.getCountries(); request.setAttribute("countries", countries); request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response); }
或者,如果此列表应该是应用程序范围内的常量,则使用 ServletContextListener 的 contextInitialized() 以便只加载一次并保存在内存中:
contextInitialized()
public void contextInitialized(ServletContextEvent event) { Map<String, String> countries = MainUtils.getCountries(); event.getServletContext().setAttribute("countries", countries); }
在这两种情况下 countries 将在el提供 ${countries} .希望这有帮助。
countries
使用jstl<c:foreach>标记迭代list和map的元素如何迭代<c:foreach>中的嵌套Map如何使用jstl在hashmap中迭代arraylist?使用特殊的自动启动servlet在启动时初始化并共享应用程序数据
rqcrx0a62#
下面的代码适用于我首先我定义了 partnerTypesMap 就像下面的服务器端一样,
partnerTypesMap
Map<String, String> partnerTypes = new HashMap<>();
添加值之后,我将对象添加到 model ,
model
model.addAttribute("partnerTypesMap", partnerTypes);
当呈现我在下面使用的页面时 foreach 一张一张地打印出来。
foreach
<c:forEach items="${partnerTypesMap}" var="partnerTypesMap"> <form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option> </c:forEach>
disbfnqx3#
根据您希望在循环中完成的内容,请迭代其中一个: countries.keySet() countries.entrySet() countries.values()
countries.keySet()
countries.values()
3条答案
按热度按时间iecba09b1#
就像在普通java代码中一样。
但是,scriptlet(jsp文件中的原始java代码
<% %>
事情)被认为是一个糟糕的做法。我建议安装jstl(只需将jar文件放到/WEB-INF/lib
并在jsp顶部声明所需的taglib)。它有一个<c:forEach>
可以在其他标记之间迭代的标记Map
s。每次迭代都会给您一个Map.Entry
反过来又有getKey()
以及getValue()
方法。下面是一个基本示例:
因此,您的特定问题可以通过以下方式解决:
你需要一个
Servlet
或者ServletContextListener
放置${countries}
在所需范围内。如果此列表应基于请求,则使用Servlet
的doGet()
:或者,如果此列表应该是应用程序范围内的常量,则使用
ServletContextListener
的contextInitialized()
以便只加载一次并保存在内存中:在这两种情况下
countries
将在el提供${countries}
.希望这有帮助。
另请参见:
使用jstl<c:foreach>标记迭代list和map的元素
如何迭代<c:foreach>中的嵌套Map
如何使用jstl在hashmap中迭代arraylist?
使用特殊的自动启动servlet在启动时初始化并共享应用程序数据
rqcrx0a62#
下面的代码适用于我
首先我定义了
partnerTypesMap
就像下面的服务器端一样,添加值之后,我将对象添加到
model
,当呈现我在下面使用的页面时
foreach
一张一张地打印出来。disbfnqx3#
根据您希望在循环中完成的内容,请迭代其中一个:
countries.keySet()
countries.entrySet()countries.values()