struts2前台传递List、Set、Map集合数据到后台

31 篇文章 0 订阅
8 篇文章 0 订阅

struts2前台传递List、Set、Map集合数据到后台

         对应数据在前台与后天中的交互,struts2框架替我们做了很大部分的数据封装工作,这里就关于一些常见类型数据传递的格式和配置注意事项做简单的记录。

         主要有简单类,List集合,Set集合,Map集合数据的在前台与后天间的传递与展示

数据准备:基础类Student.class

package com.supre.idisk.model;

import java.io.Serializable;

public class Student {

	private int stuId;
	private String stuNo;
	private String stuName;
	private String stuAge;
	public Student(int stuId, String stuNo, String stuName, String stuAge) {
		super();
		this.stuId = stuId;
		this.stuNo = stuNo;
		this.stuName = stuName;
		this.stuAge = stuAge;
	}
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public int getStuId() {
		return stuId;
	}
	public void setStuId(int stuId) {
		this.stuId = stuId;
	}
	public String getStuNo() {
		return stuNo;
	}
	public void setStuNo(String stuNo) {
		this.stuNo = stuNo;
	}
	public String getStuName() {
		return stuName;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
	public String getStuAge() {
		return stuAge;
	}
	public void setStuAge(String stuAge) {
		this.stuAge = stuAge;
	}
	@Override
	public String toString() {
		return "Student [stuId=" + stuId + ", stuNo=" + stuNo + ", stuName="
				+ stuName + ", stuAge=" + stuAge + "]";
	}
	
}

为了测试方便就将各种形式数据放在了一起

前台录入数据的jsp代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>简单对象</h3>
<form method="post" action="user_addStudent">
编号:<input type="text" name="student.stuNo" /><br/>
姓名:<input type="text" name="student.stuName" /><br/>
年龄:<input type="text" name="student.stuAge" /><br/>
<input type="submit" value="提交" />
</form>
<hr>
<h3>List集合</h3>
<form method="post" action="user_addStuList">
学生1 
编号:<input type="text" name="stuList[0].stuNo" />
姓名:<input type="text" name="stuList[0].stuName" />
年龄:<input type="text" name="stuList[0].stuAge" /><br/>
学生2 
编号:<input type="text" name="stuList[1].stuNo" />
姓名:<input type="text" name="stuList[1].stuName" />
年龄:<input type="text" name="stuList[1].stuAge" /><br/>
学生3 
编号:<input type="text" name="stuList[2].stuNo" />
姓名:<input type="text" name="stuList[2].stuName" />
年龄:<input type="text" name="stuList[2].stuAge" /><br/>
<input type="submit" value="提交" />
</form>
<hr>
<h3>Set集合</h3>
<form method="post" action="user_addStuSet">
学生1 
编号:<input type="text" name="stuSet.makeNew[0].stuNo" />
姓名:<input type="text" name="stuSet.makeNew[0].stuName" />
年龄:<input type="text" name="stuSet.makeNew[0].stuAge" /><br/>
学生2 
编号:<input type="text" name="stuSet.makeNew[1].stuNo" />
姓名:<input type="text" name="stuSet.makeNew[1].stuName" />
年龄:<input type="text" name="stuSet.makeNew[1].stuAge" /><br/>
学生3 
编号:<input type="text" name="stuSet.makeNew[2].stuNo" />
姓名:<input type="text" name="stuSet.makeNew[2].stuName" />
年龄:<input type="text" name="stuSet.makeNew[2].stuAge" /><br/>
<input type="submit" value="提交" />
</form>
<hr>

<h3>Map集合</h3>
<form method="post" action="user_addStuMap">
学生1 
编号:<input type="text" name="stuMap['stu1'].stuNo" />
姓名:<input type="text" name="stuMap['stu1'].stuName" />
年龄:<input type="text" name="stuMap['stu1'].stuAge" /><br/>
学生2 
编号:<input type="text" name="stuMap.stu2.stuNo" />
姓名:<input type="text" name="stuMap.stu2.stuName" />
年龄:<input type="text" name="stuMap.stu2.stuAge" /><br/>
学生3 
编号:<input type="text" name="stuMap['stu3'].stuNo" />
姓名:<input type="text" name="stuMap['stu3'].stuName" />
年龄:<input type="text" name="stuMap['stu3'].stuAge" /><br/>
<input type="submit" value="提交" />
</form>
<hr>
</body>
</html>

说明:主要是name属性的书写格式

1.简单类直接使用‘变量名.属性’的形式

2. List集合使用‘变量名[索引].属性’的形式

3. Set集合比较特殊,必须使用到OGNL中makeNew的运算符来表示

       格式:‘变量名.makeNew[索引].属性’

4.Map集合使用的是‘变量名.key名.属性’ 也可以是‘变量名['key'].属性’

    这里key使用是String类型,上面两种形式都可以,其他类型的key就需要自己亲测了

后台接收数据的Action类代码:

package com.supre.idisk.action;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.Element;
import com.opensymphony.xwork2.util.Key;
import com.opensymphony.xwork2.util.KeyProperty;
import com.supre.idisk.model.Student;

public class UserAction extends ActionSupport {
	
	private Student student;
    @Element(Student.class)
	private List<Student> stuList;
	@KeyProperty("stuId")  //Student中的标识字段,该字段需要get方法,该配置不可少
	@Element(Student.class)  
	private Set<Student> stuSet = new HashSet<>();
	@Key(String.class)
	@Element(Student.class)
	private Map<String, Student> stuMap = new HashMap<>();
	
	public String addStudent(){
		System.out.println("-------简单对象");
		System.out.println(student);
		return SUCCESS;
	}
	
	public String addStuList(){
		System.out.println("-------List集合");
		for (Student stu : stuList) {
			System.out.println(stu);
		}
		return SUCCESS;
	}
	
	public String addStuSet(){
		System.out.println("-------Set集合");
		System.out.println(stuSet);
		for (Student stu : stuSet) {
			System.out.println(stu);
		}
		return SUCCESS;
	}	
	
	public String addStuMap(){
		System.out.println("-------Map集合");
		for (String key : stuMap.keySet()) {
			System.out.println(key + "----" + stuMap.get(key));
		}
		return SUCCESS;
	}
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	public List<Student> getStuList() {
		return stuList;
	}
	public void setStuList(List<Student> stuList) {
		this.stuList = stuList;
	}
	public Set<Student> getStuSet() {
		return stuSet;
	}
	public void setStuSet(Set<Student> stuSet) {
		this.stuSet = stuSet;
	}
	public Map<String, Student> getStuMap() {
		return stuMap;
	}
	public void setStuMap(Map<String, Student> stuMap) {
		this.stuMap = stuMap;
	}
	
	
}

注意:

1.其中的变量必须提供标准的get和set方法

2.Set集合和Map集合必须初始化,即在定义的时候就赋上对象

3. Set集合上的KeyProperty注解必须配上,其他注解配置均可以省略。

4.这里的配置也可以使用配置文件实现,想了解的可以搜索:struts2类型转换配置

前台对相关数据的展示jsp代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>简单对象</h3>
编号:${student.stuNo}<br/>
姓名:${student.stuName}<br/>
年龄:${student.stuAge}<br/>
<hr>
<h3>List集合</h3>
<s:iterator value="stuList" var="bean" status="state">
	学生${state.index+1}:
	编号:${bean.stuNo}
	姓名:${bean.stuName}
	年龄:${bean.stuAge}<br/>
</s:iterator>
<hr>
<h3>Set集合</h3>
<s:iterator value="stuSet" var="bean" status="state">
	学生${state.index+1}:
	编号:${bean.stuNo}
	姓名:${bean.stuName}
	年龄:${bean.stuAge}<br/>
</s:iterator>
<hr>
<h3>Map集合</h3>
<s:iterator value="stuMap" var="bean" status="state">
	学生${bean.key}:
	编号:${bean.value.stuNo}
	姓名:${bean.value.stuName}
	年龄:${bean.value.stuAge}<br/>
</s:iterator>
<hr>
</body>
</html>

说明:关于展示主要还是使用el表达式,这里Map的展示是需要使用到'key'和'value'

总结:

List集合和Map集合传到后台比较简单,只需要提供get和set方法,同时Map初始化,在前台jsp中安指定格式传递,后台就能收到数据。

Set比较特殊

1先前台jsp必须使用makeNew,即格式‘变量名.makeNew[索引].属性’

2 后台set必须配置@KeyProperty,同时需要提供get和set方法,以及初始化

 

Set集合注意:这里如果属性中是一个对象,即采用‘变量名.makeNew[索引].属性.属性’的形式传递数据的时候,在后台接到Set集合中的数据都一样的。

例如:假如Student中有一个属性为Group对象

使用<input type='text'name='stuSet.makeNew[0].group.groupId'> //这里输入 1

<input type='text'name='stuSet.makeNew[1].group.groupId'>   //这里输入2

<input type='text'name='stuSet.makeNew[2].group.groupId'>   //这里输入3

假如后台遍历打印groupId即

for (Student stu : stuList) {

         System.out.println(stu.group.groupId);

}

时,发现打印的数据全部一样的。

这个初步估计应该是跟Set集合的特性有关,暂时未去深究原因以及解决办法,后续中再抽时间去探讨这个现象


补充:

         如果后台用Map<String,Object>map接前台的数据,前台还是以map.key的形式传值,则后台拿到的数据中,map.get(key)取到的数据为String[]类型,可以通过debug查看,则值前台传递来的值会按前台map.key的存放在map.get(key)中。当然后台如果还是Map<String String> 接值的话就不存在String[],如果前台出现同名,也只会以“, ”拼接在一起放入value中。

例如

前台有:这里其他标签就加上了

<input type="text" name="map.userNo" value="admin">
<input type="text" name="map.userNo" value="zhangsan">
<input type="text" name="map.userNo" value="lisi">
<input type="text" name="map.userName" value="管理员">

1后台:Map<String,Object>map接值

Set<String> keys=map.keySet()
for(String key:keys){
	//String  value =  (String) map.get(key);  会报错
	String[]  value =  (String[]) map.get(key);
	System.out.println("key:"+key);
	for(String val:value){
	System.out.println("value:"+val);
	}
}

打印结果:

key:userNo

value:admin

value:zhangsan

value:lisi

key:userName

value:管理员

2后台:Map<String,String>map接值

Set<String> keys=map.keySet()
for(String key:keys){
	String value = map.get(key);  		
	System.out.println("key:"+key);
	System.out.println("value:"+value);
}

打印结果:

key:userNo

value:admin, zhangsan, lisi

key:userName

value:管理员

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Struts2中,接收参数时被限制为最大只接收256长度的原因是因为Struts2默认使用的是ArrayList类型的TypeConverter进行参数类型转换,而该TypeConverter默认的最大为256。 要解决这个问题,可以自定义一个TypeConverter,并替换掉Struts2默认的ArrayList类型的TypeConverter。具体步骤如下: 1. 自定义一个TypeConverter,继承自StrutsTypeConverter类,并重写convertFromString方法,如下所示: ```java import java.util.ArrayList; import java.util.Map; import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; public class MyArrayListConverter extends DefaultTypeConverter { @Override public Object convertFromString(Map context, String[] values, Class toClass) { if (values == null || values.length == 0) { return null; } ArrayList<Object> list = new ArrayList<Object>(); for (String value : values) { list.add(value); } return list; } } ``` 2. 在struts.xml文件中注册该TypeConverter,并指定需要转换的参数类型,如下所示: ```xml <bean type="org.apache.struts2.util.StrutsTypeConverter" name="myArrayListConverter" class="com.example.MyArrayListConverter"/> <constant name="struts.conversion.array.maxSize" value="1000" /> <constant name="struts.conversion.array.allowNonList" value="true" /> <constant name="struts.conversion.collection.maxSize" value="1000" /> <constant name="struts.conversion.map.maxSize" value="1000" /> <constant name="struts.conversion.object.maxSize" value="1000" /> <constant name="struts.conversion.properties.maxSize" value="1000" /> <constant name="struts.conversion.date" value="false" /> <constant name="struts.conversion.number" value="false" /> <constant name="struts.conversion.boolean" value="false" /> <constant name="struts.conversion.class" value="false" /> <constant name="struts.conversion.fileUpload" value="false" /> <constant name="struts.conversion.patternMatcher" value="false" /> <constant name="struts.conversion.locale" value="false" /> <constant name="struts.conversion.classloader" value="false" /> <constant name="struts.conversion.enum" value="false" /> <constant name="struts.conversion.i18n" value="false" /> <constant name="struts.conversion.numberLocale" value="false" /> <constant name="struts.conversion.dateLocale" value="false" /> <constant name="struts.conversion.string" value="false" /> <constant name="struts.conversion.classArray" value="false" /> <constant name="struts.conversion.dateArray" value="false" /> <constant name="struts.conversion.numberArray" value="false" /> <constant name="struts.conversion.booleanArray" value="false" /> <constant name="struts.conversion.enumArray" value="false" /> <constant name="struts.conversion.i18nArray" value="false" /> <constant name="struts.conversion.patternMatcherArray" value="false" /> <constant name="struts.conversion.fileUploadArray" value="false" /> <constant name="struts.conversion.propertiesArray" value="false" /> <constant name="struts.conversion.collectionArray" value="false" /> ``` 在上述代码中,我们使用了常量struts.conversion.array.maxSize来指定了最大为1000,这个可以根据具体情况进行修改。同时,我们也可以通过其他常量来指定其他类型的最大。 3. 在action中将需要转换的参数指定为该TypeConverter,如下所示: ```java public class MyAction extends ActionSupport { private ArrayList<Object> list; public ArrayList<Object> getList() { return list; } public void setList(ArrayList<Object> list) { this.list = list; } @Override public String execute() throws Exception { // do something return SUCCESS; } @Override public void validate() { if (list != null && list.size() > 1000) { addFieldError("list", "列表长度不能超过1000"); } } @Override public void prepare() throws Exception { // 注册TypeConverter ConvertUtils.register(new MyArrayListConverter(), ArrayList.class); } } ``` 在上述代码中,我们将需要转换的参数list指定为自定义的TypeConverter,在prepare方法中注册TypeConverter。同时,在validate方法中可以对list的大小进行验证,以避免超过指定的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值