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()}”
请在下面找到我的更新答案。