Struts2(二)

struts的iterator标签

与JSTL标准标签库的c:forEach类似的,struts也提供了一个s:iterator用于遍历一个集合中的数据

  1. 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>
  1. 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>
  1. 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;
    }
}
  1. 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 是否是偶数

  1. 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;
	}
}
  1. 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个是默认选中的

  1. 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;
    }
}
  1. 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

  1. 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;
    }
}
  1. 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资料可免费领取资源。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值