我必须做一个带有2个文本框的HTML页面,一个用于名称,另一个用于ammount,然后是一个小部件,让我选择创建,保存或检查的帐户类型,然后是一个发送按钮,这个信息将被发送到servlet。 servlet必须根据帐户类型创建一个对象,然后将其保存在Vector
上,然后servlet需要使用Vector
上的信息以及相同的小部件响应HTML textarea。在第一页中,您可以插入另一个帐户,当您插入另一个帐户时,您必须将信息发送到同一个servlet,然后执行相同的工作。但是在HTML文本区域中必须出现第一个帐户和我刚刚创建的帐户,依此类推。
问题是我可以做所有这些,但我不能做的是显示向量的所有信息由于某种原因我只是得到我刚刚在文本区域创建的帐户。
这是servlet代码。请注意,toString()
会返回Vector
上存储的所有信息,而addAccount()
会将该帐户添加到Vector
。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ServletPrincipal extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String nombre = request.getParameter("nom");
String monto = request.getParameter("mon");
String tipo = request.getParameter("fgcghch");
double montoi = Double.parseDouble(monto);
String a="ah";
String b="che";
AccountsLedger objeto = new AccountsLedger();
if(a.equals(tipo)){
SavingsAccount cnt1= new SavingsAccount(nombre, montoi, 2);
objeto.addAccount(cnt1);
objeto.toString();
out.println("<textarea rows='20' cols='20'>"+objeto.toString()+"</textarea>");
out.print("<form action='ServletPrincipal' method='post'><input type='text' name='nom'><input type='text' name='mon'>");
out.println("<select name='fgcghch'><option value='ah'>Ahorro</option><option value='che'>Cheque</option></select>");
out.println("<input type='submit' name='boton'></form>");
}
if(b.equals(tipo)){
CheckingAccount cnt= new CheckingAccount(nombre, montoi);
objeto.addAccount(cnt);
String y = objeto.toString();
out.println("<textarea rows='2' cols='20'>"+y+"</textarea>");
out.print("<form action='ServletPrincipal' method='post'><input type='text' name='nom'><input type='text' name='mon'>");
out.println("<select name='fgcghch'><option value='ah'>Ahorro</option><option value='che'>Cheque</option></select>");
out.println("<input type='submit' name='boton'></form>");
}
}
}
答案 0 :(得分:2)
首先,不要使用Vector,使用ArrayList。它的工作方式相同,但没有在方法上使用同步关键字,这实际上对性能是一件好事。确实很少有两个线程会访问一个数组,如果他们这样做了,那么对于一个集合类来说,synchronized关键字是无用的。
其次,考虑是否要在此处编写servlet或者JSP是否会更好。 JSP基本上是一个内部的servlet,所以如果HTML比Java多,那就有意义了。
第三,使用现代Java迭代ArrayList是微不足道的,所以如果想要创建一个插入HTML的字符串,那么就可以这样做:
ArrayList<String> values = // ... built somewhere
StringBuilder sb = new StringBuilder();
for (String v : values) {
sb.append(v);
}
out.println(sb.toString());
答案 1 :(得分:1)
如果我理解您的问题,您需要保留objeto
以获取多个请求。现在,您为每个请求创建一个新的。 不使用servlet的成员(servlet需要无状态),但是你可以使用会话。
而不是
AccountsLedger objeto = new AccountsLedger();
使用
HttpSession session = request.getSession();
AccountsLedger objeto = (AccountsLedger)session.getAttribute("objeto");
if (objeto == null) {
objeto = new AccountsLedger();
session.setAttribute("objeto", objeto);
}
答案 2 :(得分:-1)
您所要做的就是在doPost方法之前创建对象accountledget