struts的iterator标签
与JSTL标准标签库的c:forEach类似的,struts也提供了一个s:iterator用于遍历一个集合中的数据
- web.xml
<web-app>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
- struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<package name="basicstruts" extends="struts-default">
<action name="listProduct" class="com.action.ProductAction"
method="list">
<result name="list">list.jsp</result>
</action>
</package>
</struts>
- ProductAction.java
package com.action;
import java.util.ArrayList;
import java.util.List;
import com.bean.Product;
public class ProductAction {
private Product product;
private List<Product> products;
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product> products) {
this.products = products;
}
//增加一个list()方法,为products添加3个product对象,并返回“list"
public String list() {
products=new ArrayList();
Product p1 = new Product();
p1.setId(1);
p1.setName("product1");
Product p2 = new Product();
p2.setId(2);
p2.setName("product2");
Product p3 = new Product();
p3.setId(3);
p3.setName("product3");
products.add(p1);
products.add(p2);
products.add(p3);
return "list";
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
}
- list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@page isELIgnored="false"%>
<style>
table {
border-collapse: collapse;
}
td {
border: 1px solid gray;
}
</style>
<table align="center">
<tr>
<td>id</td>
<td>name</td>
<td>st.index</td>
<td>st.count</td>
<td>st.first</td>
<td>st.last</td>
<td>st.odd</td>
<td>st.even</td>
</tr>
<s:iterator value="products" var="p" status="st">
<tr>
<td>${p.id}</td>
<td>${p.name}</td>
<td>${st.index}</td>
<td>${st.count}</td>
<td>${st.first}</td>
<td>${st.last}</td>
<td>${st.odd}</td>
<td>${st.even}</td>
</tr>
</s:iterator>
</table>
使用s:iterator标签进行遍历
value 表示集合
var 表示遍历出来的元素
st 表示遍历出来的元素状态
st.index 当前行号 基0
st.count 当前行号 基1
st.first 是否是第一个元素
st.last 是否是最后一个元素
st.odd 是否是奇数
st.even 是否是偶数
- Product.java(产品)
package com.bean;
public class Product {
int id;
String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- Category.java(购物车)
package com.bean;
import java.util.List;
public class Category {
int id;
String name;
List<Product> products;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product> products) {
this.products = products;
}
}
效果:
struts的check标签(多选)
遍历3个product成为checkbox
并且第2个和第3个是默认选中的
- ProductAction.java
除了前例中准备的products
再新增一个属性ListselectedProducts,用于存放哪些产品被选中了
注意: ListselectedProducts 里放的是id,而不是对象
package com.action;
import java.util.ArrayList;
import java.util.List;
import com.bean.Product;
public class ProductAction {
private Product product;
private List<Product> products;
private List<Integer> selectedProducts;
public List<Integer> getSelectedProducts() {
return selectedProducts;
}
public void setSelectedProducts(List<Integer> selectedProducts) {
this.selectedProducts = selectedProducts;
}
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product> products) {
this.products = products;
}
public String list() {
products=new ArrayList(); //存放所有产品
selectedProducts = new ArrayList(); //存放哪些产品被选中了
Product p1 = new Product();
p1.setId(1);
p1.setName("product1");
Product p2 = new Product();
p2.setId(2);
p2.setName("product2");
Product p3 = new Product();
p3.setId(3);
p3.setName("product3");
products.add(p1);
products.add(p2);
products.add(p3);
selectedProducts.add(2);
selectedProducts.add(3);
return "list";
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
}
- list.jsp
使用s:checkboxlist标签
value:哪些被选中
name:提交到服务端用的名称
list:用于遍历的集合
listValue:显示的checkbox的名称
listKey:checkbox的value
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@page isELIgnored="false"%>
<s:checkboxlist value="selectedProducts" name="product.id"
list="products" listValue="name" listKey="id" />
效果:
关于为什么使用框架?
同样的实现,用纯JSP要这么实现。。。
开发过程中谁看到这样的代码也都会骂娘吧。。。
struts的radio标签(单选)
遍历products成为radio,并选中第二个
在前例checkbox标签的基础上增加s:radio标签
value表示:哪项被选中
name表示:提交到服务端用的名称
list:用于遍历的集合
listValue:显示的radio的名称
listKey:radio的value
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@page isELIgnored="false"%>
<s:radio name="product.id" value="2" list="products" listValue="name"
listKey="id" />
效果:
struts的select标签
遍历products成为select标签
默认选中第2个和第3个
使用s:select标签
name表示:提交到服务端用的名称
list:用于遍历的集合
listKey:每个option的value
listValue:显示的名称
multiple:true表示可以选中多行
size="3"表示默认显示3行
value表示:哪些被选中
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@page isELIgnored="false"%>
<s:select label="products"
name="product.id"
list="products"
listKey="id"
listValue="name"
multiple="true"
size="3"
value="selectedProducts"
theme="simple" // theme="simple" 使得最后生成的最简单的风格的html,否则就会有一些奇奇怪怪的tr td
/>
效果:
struts的多重迭代
有部分业务需求需要遍历list中的list
比如当前页面需要显示多个category,每个分类下又对应多个product
- ProductAction.java
package com.action;
import java.util.ArrayList;
import java.util.List;
import com.bean.Category;
import com.bean.Product;
public class ProductAction {
private Product product;
private List<Category> categories =new ArrayList();
public List<Category> getCategories() {
return categories;
}
public void setCategories(List<Category> categories) {
this.categories = categories;
}
public String list() {
Category category1 =new Category();
category1.setId(1);
category1.setName("category1");
Category category2 =new Category();
category2.setId(2);
category2.setName("category2");
categories.add(category1); //将购物车1、2加入到categories列表当中
categories.add(category2);
List<Product> products1=new ArrayList();
Product p1 = new Product();
p1.setId(1);
p1.setName("product1");
Product p2 = new Product();
p2.setId(2);
p2.setName("product2");
Product p3 = new Product();
p3.setId(3);
p3.setName("product3");
products1.add(p1); //将3个产品加入产品列表products1当中
products1.add(p2);
products1.add(p3);
List<Product> products2=new ArrayList();
Product p4 = new Product();
p4.setId(4);
p4.setName("product4");
Product p5 = new Product();
p5.setId(5);
p5.setName("product5");
Product p6 = new Product();
p6.setId(6);
p6.setName("product6");
products2.add(p4); //将3个产品加入产品列表products2当中
products2.add(p5);
products2.add(p6);
category1.setProducts(products1); //将不同的产品列表分别加入到不同购物车当中
category2.setProducts(products2);
return "list";
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
}
- list.jsp
遍历每一个category,接着把每个category下对应的products也遍历出来
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@page isELIgnored="false"%>
<style>
table {
border-collapse: collapse;
}
td {
border: 1px solid gray;
}
</style>
<table border="1" cellspacing="0" align="center"> //cellpadding 是边框与其内容的间隙大小,border是边框大小,center是居中
<tr>
<td>id</td>
<td>name</td>
<td>products</td>
</tr>
<s:iterator value="categories" var="c">
<tr>
<td>${c.id}</td>
<td>${c.name}</td>
<td>
<s:iterator value="#c.products" var="p">
${p.name}<br/>
</s:iterator>
</td>
</tr>
</s:iterator>
</table>
效果:
喜欢的朋友可以关注我的个人公众号,后台回复java资料可免费领取资源。