【发布时间】:2024-01-11 16:01:01
【问题描述】:
我正在 Stripes 中创建一个表单。表单中有两个文本字段(名称和代码),应由用户填写。用户输入数据后,通过单击添加按钮,我希望数据显示在同一页面上(假设在添加按钮下),并且用户可以输入另一个数据,以便下次单击按钮时他可以看到所有在同一页面上从头开始输入的数据,仍然可以输入更多数据。 我使用 arraylist 将用户输入保存在列表中,并在 jstl 中通过 c:forEach 对其进行迭代。 问题是arraylist不保存数据,当我输入新数据时,它会覆盖以前的数据。我不知道如何/在哪里保存数据,以便每次用户可以添加更多数据并同时在页面中看到它们。
ClassActionBean.java
package com.example.action;
public class ClassActionBean implements ActionBean {
private ActionBeanContext context;
private String name;
private String code;
private ArrayList<String> list = new ArrayList<String>();
@DefaultHandler
public Resolution showData() {
list.add(getName());
list.add(getCode());
return new ForwardResolution("/WEB-INF/jsp/import.jsp");
//return new RedirectResolution("/Class.action");
}
public ActionBeanContext getContext() {
return context;
}
public void setContext(ActionBeanContext context) {
this.context = context;
}
public ArrayList<String> getList() {
return list;
}
public void setList(ArrayList<String> list) {
this.list = list;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
import.jsp
<%@page contentType="text/html;charset=ISO-8859-1" language="java" %>
<%@taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" >
<html>
<head><title>Test</title></head>
<body>
<stripes:form beanclass="com.example.action.ClassActionBean">
<table>
<tr>
<td>Name:</td>
<td><stripes:text name="name"/></td>
</tr>
<tr>
<td>Code:</td>
<td><stripes:text name="code"/></td>
</tr>
<tr>
<td>
<stripes:submit name="showData" value="Add"/>
</td>
</tr>
<c:forEach var="current" items="${actionBean.list }">
<tr>
<td><c:out value="${current}"/></td>
</tr>
</c:forEach>
</table>
</stripes:form>
</body>
</html>
【问题讨论】:
-
arraylist 仅在 servlet 请求执行时存在,因此每个请求都有不同的列表。所以,使用数据库。
-
您也可以将该 bean 放在会话范围而不是请求范围内。但随后它将仅对该一个用户可用,并且仅在该会话期间可用。同样,数据库就是答案。
-
我实际上有一个数据库,但我想先向用户显示数据,然后会有一个提交按钮,所以用户可以先添加和编辑,最后提交到数据库。除了arraylist,有什么方法可以在提交到数据库之前保存数据?
-
你可以将arraylist临时放在会话对象中,或者类似的东西。 SessionScope (Stripes 1.5.7 API Documentation)
-
@developerwjk,我将 arraylist 放在范围会话中,它起作用了!非常感谢!