关于< s:iterator >和< c:foreach >的一些小用法
在做毕设的过程中,前端jsp需要对数据库查询结果的List集合进行打印输出。使用struts2标签库提供的<s:iterator>和c标签库所提供的<c:foreach>在jsp页面进行输出,在这里对两中标签的使用以及今天所遇到的问题做一个简单的归纳和梳理。
使用环境
1.使用<s:iterator>需要搭建struts2框架,由于网上有许多struts2的搭建教程,这里对struts2的搭建不做进一步介绍。但是记得在jsp页面导入标签库:<%@ taglib prefix=“s” uri="/struts-tags" %>。
2.使用<c:foreach>需要导入jstl.jar和standard.jar的两个jar包。下面附上两个jar包的下载链接,同时需要在jsp页面导入标签库。值得注意的是JSTL1.0的导入是:<%@ taglib prefix=“c” uri="http://java.sun.com/jstl/core " %>、而JSTL1.1及以后的导入是: <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%> 。根据所下载的jar包选用不同的导入,否则会进行报错。
下载地址:
jstl.jar: http://repo2.maven.org/maven2/javax/servlet/jstl/
standard.jar: http://repo2.maven.org/maven2/taglibs/standard/
基本用法介绍
< s:iterator>的基本使用
<s:iterator>作为一个迭代器,能将所获取的List列表进行迭代输出。
ActionContext.getContext().put("userList", userList);
<s:iterator value="userList" id="userList">
<s:property value= "userid"/><br>
<s:property value= "username"/><br>
</s:iterator>
List集合中有多少个对象,就会迭代多少次。在使用<s:iterator>的过程中,一定得主要<s:iterator>的作用域,选择合适的作用域才能输出理想的结果。
< c:foreach>的基本使用
<c:foreach>起到循环输出的作用,依次输出所获取到的List集合。
request.setAttribute("userList", userList);
<c:forEach var="user" items="${userList}">
${user.userid}<br>
${user.username}<br>
</c:forEach>
这里需要对<c:foreach>的各项属性进行介绍:
属性 | 含义 |
---|---|
items | 需要被循环的内容 |
var | 被循环的对象的定义名 |
begin | 开始循环的元素 |
end | 循环的最后一个元素 |
step | 步长(每隔几个元素) |
varStatus | 循环状态的变量名称 |
实际所遇到的问题
如上边两张图所示,数据库中有广告表以及广告类别表两张数据库表,且广告类别表在系统使用过程中会随着使用不断增加类别。因此不能简单的在界面根据根据value的值输出对应的类别。
但在实际使用过程中,需要在jsp界面输出如下图格式的表单。如何将广告类别编号转换成广告类别名便显得不那么容易。
在尝试过程中,首先使用了两次<s:iterator>,第一个是在表单(< table >)开始对adsList迭代输出,第二个是在类别输出列(< td >)对typeList迭代输出,这样导致的结果是adsList第一个对象迭代时成功进行了3次typeList的输出(即对广告类别对象(1,电脑办公)、(2,图书文娱)、(3,美妆护理)进行输出),而adsList的后3个对象迭代时,typeList只输出了(3,美妆护理)。
所以不得不借助<c:foreach>对typeList进行循环输出。并且通过<c:if>标签对adver.adstype和advertype.adstypename进行判断输出。
下面简要介绍一下<s:if>和<c:if>的格式。
<s:if test="adstypeid==1">电脑办公</s:if>
<s:elseif test="adtsypeid==2">图书文娱</s:elseif >
<s:elseif test="adtsypeid==3">图书美妆护理</s:elseif >
<c:if test="${type.adstypeid == adstype}">
${type.adstypename}
</c:if>
也没有什么需要解释的,就是注意一下两种不同的判断中test属性里值的格式就OK了。都是一些细节上的问题,准确进行字段的输出就行了。
最后附上jsp页面的全部代码:
<%@page import="com.recommend.adver.AdverTypeAction"%>
<%@page import="com.recommend.adver.AdverTypePojo"%>
<%@page import="com.opensymphony.xwork2.ActionContext"%>
<%@page import="com.recommend.adver.AdverAction"%>
<%@page import="com.recommend.adver.AdverPojo"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@page import="com.recommend.action.ParameterAction"%>
<%@page import="com.recommend.dao.pojo.Parameter"%>
<%@page import="java.util.List"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<title>广告管理</title>
</head>
<body>
<%
List<AdverTypePojo> typeList = new AdverTypeAction().findAllAdverType();
request.setAttribute("typeList", typeList);
List<AdverPojo> adsList = new AdverAction().findAllAdver();
ActionContext.getContext().put("adsList", adsList);
%>
<fieldset>
<legend>广告列表</legend>
<div align="left" style="width:80%;margin-left:20px;">
<br>
<table border="1" cellspacing="0">
<tr>
<th width="20%" style="text-align:center;" height="50px">编号</th>
<th width="50%" style="text-align:center;">标题</th>
<th width="30%" style="text-align:center;">类别</th>
</tr>
<s:iterator value="adsList" id="adsList">
<tr>
<td align="center" height="30"><s:property value= "adsid" /></td>
<td><div style="margin-left:25px;margin-right:25px"><s:property value= "adsname"/></div></td>
<td align="center">
<c:forEach var="type" items="${typeList}">
<c:if test="${type.adstypeid == adstype}">
${type.adstypename}
</c:if>
</c:forEach>
</td>
</tr>
</s:iterator>
</table>
<br>
</div>
</fieldset>
<br>
</body>
</html>
第一次码文,如有问题还请包涵~