Java 如何从JSP文件中的对象提取每个字段?

Java 如何从JSP文件中的对象提取每个字段?,java,jsp,servlets,jstl,Java,Jsp,Servlets,Jstl,我有一个包含三个列表字符串的类,如下所述- public class Response { private List<String> hash = new LinkedList<String>(); private List<String> name = new LinkedList<String>(); private List<Integer> count = new LinkedList<Integer>(); /

我有一个包含三个列表字符串的类,如下所述-

public class Response {

private List<String> hash = new LinkedList<String>();
private List<String> name = new LinkedList<String>();
private List<Integer> count = new LinkedList<Integer>();

// getters and setters
}
req.setAttribute("data", rr);
final RequestDispatcher dispatcher = req.getRequestDispatcher("/admin/testing.jsp");
dispatcher.forward(req, resp);
现在,我只从同一个servlet将上述对象值传递到我的JSP页面,如下所述-

public class Response {

private List<String> hash = new LinkedList<String>();
private List<String> name = new LinkedList<String>();
private List<Integer> count = new LinkedList<Integer>();

// getters and setters
}
req.setAttribute("data", rr);
final RequestDispatcher dispatcher = req.getRequestDispatcher("/admin/testing.jsp");
dispatcher.forward(req, resp);
下面是我的JSP页面,在其中我成功地获得了相同对象的值。在下面的JSP页面中,我试图提取每个字段的值,并将其放入表中相应的列中-

也就是说,我的JSP在下表中有三列,第一列是
Hash
,第二列是
Name
,第三列是
Count
。现在我需要在hash列中从该对象提取hash的所有值,同样地,在name列中从该对象提取name的所有值,等等

<p>The data from servlet: ${data}</p>

<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="1">
<TR>
<TH>Hash</TH>
<TH>Name</TH>
<TH>Count</TH>
</TR>
<% for (int i = 0; i < 3; i++) { %>
<TR>
<TD>
${data.getHash().get(<%=i%>)}
</TD>
<TD>
${data.getName().get(<%=i%>)}
</TD>
<TD>
${data.getCount().get(<%=i%>)}
</TD>
</TR>
<% } %>
</TABLE>
来自servlet的数据:${data}

搞砸 名称 计数 ${data.getHash().get()} ${data.getName().get()} ${data.getCount().get()}
但每次,它都给了我一个例外-

interpolated runtime values are forbidden by
the JSP spec at '${data.getHash().get(<%=i%>)}'
插值运行时值被
位于“${data.getHash().get()}”的JSP规范
知道我做错了什么吗?如何从表中的对象提取所有字段值

目前,响应类中的所有三个列表将只有3个元素

最终输出将类似于-


在表中,哈希列将包含三个数据,名称列将包含三个数据,计数列将包含三个数据。

在表示层中使用
JSTL

我建议你改变你的结构如下:

public class Response {

private String hash;
private String name;
private Integer count;

// getters and setters
}
在servlet中

List<Response> list = new ArrayList<Response>();
Response rr = new Response();
rr.setHash("hash1");
rr.setName("name1");
rr.setCount(1);
list.add(rr);
Response rr2 = new Response();
rr2.setHash("hash2");
rr2.setName("name2");
rr2.setCount(2);
list.add(rr2);
req.setAttribute("data", list);
List List=new ArrayList();
响应rr=新响应();
rr.setHash(“hash1”);
rr.设置名称(“名称1”);
rr.setCount(1);
列表。添加(rr);
响应rr2=新响应();
rr2.setHash(“hash2”);
rr2.设置名称(“名称2”);
rr2.setCount(2);
列表。添加(rr2);
请求设置属性(“数据”,列表);
在JSP中

<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="1">
<TR>
   <TH>Hash</TH>
   <TH>Name</TH>
   <TH>Count</TH>
</TR>
<c:forEach var="rr" items="${data}">
<TR>
   <TD>${rr.hash}</TD>
   <TD>${rr.name}</TD>
   <TD>${rr.count}</TD>
</TR>
</c:forEach>
</TABLE>

搞砸
名称
计数
${rr.hash}
${rr.name}
${rr.count}

您在jsp中混合了
el
和scriplets。建议使用
JSTL
el
而不是scriplets

 <c:forEach var="i" begin="0" end="3">
    <TR>
     <TD>
        ${data.getHash().get(i)}
     </TD>
     <TD>
       ${data.getName().get(i)}
     </TD>
     <TD>
       ${data.getCount().get(i)}
     </TD>
   </TR>
</c:forEach>

${data.getHash().get(i)}
${data.getName().get(i)}
${data.getCount().get(i)}
当非字符串标记属性是JSP表达式的结果时,JSP语法中存在一种奇怪且令人困惑的不一致性。假设我们要将一个类examples.Values(一种列表)的对象传递给标记扩展。语法:

 <wrox:list values=”<%=values%>”

或者作为

<%for (int i = 0; i < 3; i++){ %>
<TR>
    <TD>
        <%=data.getHash().get(i) %>
    </TD>
    <TD>
        <%=data.getName().get(i) %>
    </TD>
    <TD>
        <%=data.getCount().get(i) %>
    </TD>
</TR>
<%} %>

或者使用JSTL作为

<c:forEach var="i" begin="0" end="3">
<TR>
 <TD>
    ${data.getHash().get(i)}
 </TD>
 <TD>
   ${data.getName().get(i)}
 </TD>
 <TD>
   ${data.getCount().get(i)}
 </TD>
</TR>
</c:forEach>

${data.getHash().get(i)}
${data.getName().get(i)}
${data.getCount().get(i)}

但是不要把它们混在一起。

谢谢Alex,你能提供一个关于我的exmaple的例子吗?这将帮助我更好地理解。@akiiddweeber请在上面找到一个例子。谢谢Parkash。还有一件事,这里是我硬编码的end的值,对吗?现在我想从列表大小中获取end的值,而不是硬编码。。现在,我可以得到列表大小的值,如下所示:${data.getHash().size()}

现在如何将其插入
end
,这样我就不需要硬编码了?有什么想法吗?如果您将单个列表作为值传递给迭代器,则不需要设置开始和结束;谢谢迪帕克。还有一件事,这里是我硬编码的end的值,对吗?现在我想从列表大小中获取end的值,而不是硬编码。。现在,我可以得到列表大小的值,因为列表的大小:${data.getHash().size()}

现在如何将这个大小插入到end变量中,这样我就不需要硬编码了?有什么想法吗?你可以在集合本身上迭代,无需插入到末尾@akiiddweeber@akiiddweeber如果您想使用
end=“${data.getHash().size()}”
请在下面找到我的更新答案。