GVKun编程网logo

Thymeleaf表单与ArrayList对象一起提交(form表单提交list对象)

21

如果您对Thymeleaf表单与ArrayList对象一起提交和form表单提交list对象感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Thymeleaf表单与ArrayList对象一起提交

如果您对Thymeleaf表单与ArrayList对象一起提交form表单提交list对象感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Thymeleaf表单与ArrayList对象一起提交的各种细节,并对form表单提交list对象进行深入的分析,此外还有关于ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?、ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象、ArrayList, LinkedList, CopyOnWriteArrayList, Vector对比、ArrayList.clear、=null、new Arraylist 之间的对比区别的实用技巧。

本文目录一览:

Thymeleaf表单与ArrayList对象一起提交(form表单提交list对象)

Thymeleaf表单与ArrayList对象一起提交(form表单提交list对象)

我已经编写了一个简单的程序,用于使用data(ArrayList)进行表单提交,以便从表发送到控制器类。

提交表单时,数据始终为空,不确定我在这里做错了什么。

我几乎要花很多时间来确定问题,但运气不好:(

控制器类 (在Post方法中始终为null的地方)

public class AccountContoller {private ArrayList<AccountwithSelection> allAccountwithSelect = new ArrayList<AccountwithSelection>();public AccountContoller(){    //Written some test data in Array    AccountwithSelection accountwithSelection1 =  new AccountwithSelection();    accountwithSelection1.setAccountnumber("Acct1");    accountwithSelection1.setIlc("ILC1");    allAccountwithSelect.add(accountwithSelection1);    AccountwithSelection accountwithSelection2 =  new AccountwithSelection();    accountwithSelection2.setAccountnumber("Acct2");    accountwithSelection1.setIlc("ILC2");    allAccountwithSelect.add(accountwithSelection2);}@RequestMapping(value = "/accountload", method = RequestMethod.GET)   String accountload(Model model) {      AccountSelectionListWrapper wrapper = new AccountSelectionListWrapper();      wrapper.setAccountList(allAccountwithSelect);      model.addAttribute("accountload", wrapper);      return "accountload";   }@RequestMapping(value = "/accountload", method = RequestMethod.POST)public String addimeiPost(Model model,        @ModelAttribute("accountload") AccountSelectionListWrapper wrapper,        HttpServletRequest request) {     System.out.println(wrapper.getAccountList()); //Always getting null, why ?    return "accountload";}

}

类:AccountwithSelection

public class AccountwithSelection {public String accountnumber, ilc;public String getAccountnumber() {    return accountnumber;}public void setAccountnumber(String accountnumber) {    this.accountnumber = accountnumber;}public String getIlc() {    return ilc;}public void setIlc(String ilc) {    this.ilc = ilc;}}

WrapperClass- AccountSelectionListWrapper

public class AccountSelectionListWrapper {public ArrayList<AccountwithSelection> accountList;public ArrayList<AccountwithSelection> getAccountList() {    return accountList;}public void setAccountList(ArrayList<AccountwithSelection> accountList) {    this.accountList = accountList;}}

HTML表单: (accountload.html)

    <form action="#" th:action="accountload" th:object="${accountload}" method="post">    <div>        <div class=form-group-1>            <input type="submit" value="Send Data" name="action">        </div>    </div>    <table id="mytable">        <tbody>            <tr>                <th>ACCOUNT NUMBER</th>            </tr>            <tr>            <trth:each="account, stat : *{accountList}">                <tdth:text="${account.getAccountnumber()}"                    th:field="*{accountList[__${stat.index}__].accountnumber}"                    th:value="${account.getAccountnumber()}"></td>            </tr>        </tbody>    </table></form>

答案1

小编典典

<td />元素未与表单一起提交。您需要使用某种输入。它看起来应该像这样:

<td>  <input type="text" th:field="*{accountList[__${stat.index}__].accountnumber}" /></td>

或者,如果您要提交而没有将字段视为可编辑,则类似以下内容

<td>  <span th:text="${account.accountnumber}" />  <input type="hidden" th:field="*{accountList[__${stat.index}__].accountnumber}" /></td>

ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?

ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?

ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?

答案1

小编典典

如果您查看API,它将显示ArrayList()-构造一个初始容量为10的空列表。

ArrayList(int initialCapacity)-构造一个具有指定初始容量的空列表。

ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象

ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象

java面试要点---ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。

ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。 
1.刚刚看到的时候,也是很纳闷后来仔细看了下,java的反射机制;
2.这个可以通过java的反射机制来实现;
3.下面是一个例子:
 package com.credream.refelect;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class TestFile {
public static void main(String[] args) throws Exception {
List<Integer> list = new ArrayList<Integer>(); //定义Integer泛型
String str = "abc"; 
Method[] method=list.getClass().getMethods();//取得list的所有方法
System.out.println(method.length);
for(int i=0;i<method.length;i++){
System.out.println(method[i]);//遍历打印list的方法
}
method[0].invoke(list, str);//通过 反射来执行 list的第一个方法,第一个是list对象,代表该对象的方法,第二个是方法参数:  就是list.add(str);
System.out.println(list.size());
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
 ------------------------------------------------------------------------------------------------------------------
运行结果:
 35
public boolean java.util.ArrayList.add(java.lang.Object)
public void java.util.ArrayList.add(int,java.lang.Object)
public java.lang.Object java.util.ArrayList.get(int)
public java.lang.Object java.util.ArrayList.clone()
public int java.util.ArrayList.indexOf(java.lang.Object)
public void java.util.ArrayList.clear()
public boolean java.util.ArrayList.contains(java.lang.Object)
public boolean java.util.ArrayList.isEmpty()
public int java.util.ArrayList.lastIndexOf(java.lang.Object)
public boolean java.util.ArrayList.addAll(int,java.util.Collection)
public boolean java.util.ArrayList.addAll(java.util.Collection)
public int java.util.ArrayList.size()
public java.lang.Object[] java.util.ArrayList.toArray(java.lang.Object[])
public java.lang.Object[] java.util.ArrayList.toArray()
public boolean java.util.ArrayList.remove(java.lang.Object)
public java.lang.Object java.util.ArrayList.remove(int)
public java.lang.Object java.util.ArrayList.set(int,java.lang.Object)
public void java.util.ArrayList.ensureCapacity(int)
public void java.util.ArrayList.trimToSize()
public int java.util.AbstractList.hashCode()
public boolean java.util.AbstractList.equals(java.lang.Object)
public java.util.Iterator java.util.AbstractList.iterator()
public java.util.List java.util.AbstractList.subList(int,int)
public java.util.ListIterator java.util.AbstractList.listIterator(int)
public java.util.ListIterator java.util.AbstractList.listIterator()
public java.lang.String java.util.AbstractCollection.toString()
public boolean java.util.AbstractCollection.containsAll(java.util.Collection)
public boolean java.util.AbstractCollection.removeAll(java.util.Collection)
public boolean java.util.AbstractCollection.retainAll(java.util.Collection)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
1
abc

ArrayList, LinkedList, CopyOnWriteArrayList, Vector对比

ArrayList, LinkedList, CopyOnWriteArrayList, Vector对比

1. 列表划分为线程安全和线程非安全两类

线程安全:Vector,CopyOnWriteArrayList,Collections.synchronizedList()

线程非安全:ArrayList,LinkedList

2. 底层存储

数组:ArrayList, Vecotr, CopyOnWriteArrayList

双向链表:LinkedList

通过三个添加元素的过程图,来看数据结构

ArrayList,Vector: 底层存储为数组

 

LinkedList: 底层存储为双向链表

CopyArrayList:底层存储为数组

3. 使用场景和说明

ArrayList

  • 底层为数组,适合随机访问

  • 删除不会引起数组容量变小

  • 动态插入可能涉及到数组长度重新分配

  • 为避免频繁的数组扩容,可设置一个合适的初始容量

  • 不适用于频繁的在数组中间进行插入删除的场景

 LinkedList

  • 底层为双向链表,适合频繁删除新增的场景

  • 随机访问不友好,需要遍历

Vector

  • 线程安全

  • 所有的方法都加锁,导致性能较差

CopyOnWriteArrayList

  • 线程安全

  • 读方法不加锁;修改方法加锁,一次只能一个写线程访问

  • 修改时,会拷贝一份内容出来,对拷贝的结果进行操作,最后覆盖之前的内容;每次修改都会先上锁,然后进行数组拷贝,所以性能较ArrayList低;读取无锁,所以读的性能比Vector高(没有竞争);默认初始容量为0

  • 遍历和读取都是基于访问时刻列表中的数组进行的;在执行过程中,链表发生修改不会影响遍历和读取的结果(即此时访问的依然是原数组内容)

 4. 特性

1. List是有序的

2. ArrayList默认容量为10;

3. LinkedList,CopyOnWriteArrayList默认容量为0

4. new ArrayList<>()内部的数组实际上引用的是一个空数组

5. 需要线程安全的场景,使用CopyOnWriteArrayList(并发读性能好)或Collections.synchronizedList(并发写性能好)来替代Vector

6. ArrayList扩容规则

  • 增加原来空间大小的一半

  • 如果依然塞不下,则扩充到正好填充满的情况

7. 排序

  • Collections.sort(list, new Comparator(){xxx})

  • 若List中的元素,实现了Comparable接口后,可以直接调用Collections.sort(list);

ArrayList.clear、=null、new Arraylist 之间的对比区别

ArrayList.clear、=null、new Arraylist 之间的对比区别

参考博文

1. 使用 ArrayList 的对象方法 clear ()

1 List list = new ArrayList();
2 List list1 = list;
3 list.add(1);
4 list.add(2);
5 list.add(3);
6 list.clear();

 ArrayList 对象内部维护一个对象数组 elementData, 当执行 clear () 方法时, 会执行循环将 elementData 中每一个坐标都设置为为 null, 并设置数组的 size 为 0;我们还可以使用该 list 进行操作

clear 源码如下

public void clear() {
        modCount++;

        // clear to let GC do its work
        for (int i = 0; i < size; i++)
            elementData[i] = null;

        size = 0;
}

2. 使用 = null

ArrayList<String> list = new ArrayList<String>();
list.add("0");
list.add("1");
list.add("2");
list = null;

直接将变量 list 指向 null,通常当我们不需要再使用 ArrayList 对象时,可以将变量值设为 null,以便 GC 可以运作并回收这部分内存空间。

需要注意的是当仍有其他变量指向该对象时,即使讲变量 list 置为 null 垃圾回收器也无法回收该内存空间。如下:

ArrayList<String> list = new ArrayList<String>();
ArrayList<String> arraylist = list;
list.add("0");
list.add("1");
list.add("2");
list = null; // 此时list变量指向null,而arraylist变量仍然指向原内存空间,原内存空间得不到释放

3. 使用 = new ArrayList ()

方法 3 有点类似于方法 1,都是得到一个空的 ArrayList 对象。不过 new ArrayList () 会得到一个初始化内部数组 elementData 容量为 10 的 ArrayList 对象,而方法 1 得到的对象的容量与原对象一致。值得注意的是使用方法 3 需要进行如在内存中重新开辟内存空间等操作,开销较大,如果只是单纯的想要使用空的 ArrayList 对象,建议使用方法 1,相对来说可尽量避免堆内存溢出问题。

 

今天关于Thymeleaf表单与ArrayList对象一起提交form表单提交list对象的介绍到此结束,谢谢您的阅读,有关ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?、ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象、ArrayList, LinkedList, CopyOnWriteArrayList, Vector对比、ArrayList.clear、=null、new Arraylist 之间的对比区别等更多相关知识的信息可以在本站进行查询。

本文标签: