вектор возврата из сервлета - PullRequest
0 голосов
/ 20 августа 2010

Мне нужно сделать HTML-страницу с двумя текстовыми полями, одно для имени и другое для суммы, затем есть виджет, который позволяет мне выбрать тип создаваемой учетной записи, сбережения или проверки, а затем кнопку отправки, это информация будет отправлена ​​сервлету. Сервлет должен создать объект в зависимости от типа учетной записи, затем сохранить его на Vector, затем сервлет должен ответить на текстовую область HTML с информацией, которая на Vector, и теми же виджетами, которые были в Первая страница, чтобы вы могли вставить другую учетную запись, при вставке другой вы должны отправить информацию в тот же сервлет, а затем выполнить ту же работу. Но в текстовой области HTML должен появиться первый аккаунт и тот, который я только что создал, и т. Д. И т. П.

Дело в том, что я могу делать все это, но я не могу показать всю информацию о векторе, по какой-то причине я просто получаю учетную запись, которую я только что создал в текстовой области.

Вот код сервлета. Обратите внимание, что 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>");


}




    }
}

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

Во-первых, не используйте Vector, используйте ArrayList.Он работает так же, но не использует синхронизированные ключевые слова в методах, что на самом деле хорошо для производительности.Действительно, очень редко два потока будут обращаться к массиву, и если они сделали ключевое слово synchronized, то в любом случае для класса коллекции все равно бесполезно.

Во-вторых, подумайте, хотите ли вы написать здесь сервлет или JSP будетбудь лучше.JSP - это, по сути, сервлет наизнанку, поэтому, если HTML больше, чем Java, имеет смысл.

В-третьих, итерация ArrayList с современной Java тривиальна, поэтому, если целью является создание строки для вставки вHTML, тогда это можно сделать так:

ArrayList<String> values = // ... built somewhere
StringBuilder sb = new StringBuilder();
for (String v : values) {
  sb.append(v);
}
out.println(sb.toString());
1 голос
/ 20 августа 2010

Если я правильно понимаю вашу проблему, вам нужно удерживать objeto для более чем одного запроса. Теперь вы создаете новый для каждого запроса. не используйте для этого члена сервлета (сервлеты должны быть без состояний), но вы можете использовать сеанс.

Вместо

AccountsLedger objeto = new AccountsLedger();

использование

HttpSession session = request.getSession();
AccountsLedger objeto = (AccountsLedger)session.getAttribute("objeto");
if (objeto == null) {
  objeto = new AccountsLedger();
  session.setAttribute("objeto", objeto);
}
0 голосов
/ 20 августа 2010

Все, что вам нужно было сделать, это создать объект accountledget перед методом doPost

...