Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > проблема с передачей параметров сервлету


Автор: Hardworker 15.4.2006, 21:55
Здравствуйте. Я пишу первое своё приложение для работы пользователя с БД через интернет и язык Java начал использовать тоже недавно.

У меня возникли некоторые проблемы.
Приложение которое я хочу разработать соcтоит из html страниц и сервлета.

Работа с приложением начинается с процедуры ввода логина и пароля к БД. Появляется html страница которая имеет поля для ввода логина и пароля . Пользователь вводит их и жмет на кнопку . Эти параметры передаются сервлету(первый сервлет)методом POST он получив их создает соединение с БД (создает Connection), или выводит ошибку. Если все прошло нормально то происходит
Код

response.sendRedirect("http://127.0.0.1:8080/html/index.html");

То есть я переадресую вызов html странички которая обеспечивает пользователя возможностью сформировать запрос к БД и опять же методом POST я посылаю введенные параметры в другой сервлет, который и обеспечит выполнение этого запроса и выдаст результат.

Тут у меня возникают проблемы.
Я не могу передать второму сервлету объект Connection созданный в первом сервлете (или мне нужно проверить произошло ли подключение к БД первым сервлетом затем закрыть его и отослать параметры пароля и логина второму сервлету, а он потом и произведет подключение заново, но это как-то некрасиво по моему).
Или процедуру логина и бизнес логику мне нужно объединить в один сервлет, но тогда как быть с методом doPost в сервлете он получается вызывается несколько раз, а в нем будет происходить каждый раз еще и подключение к БД.

Другая проблема с этим методом.
На index.html будут ссылки на несколько html страниц на которых пользователь сможет организовывать разные типы запросов , и на каждой из этих страниц будут кнопки для посылки параметров в сервлет методом POST как мне разделить эти методы,ведь Я не могу написать несколько методов doPost в одном сервлете. Или как-то можно. Наверное мне надо писать на каждую кнопку по отсылке параметров свой сервлет для работы с этими параметрами, но тогда как все эти сервлеты подключить к одной БД?
Помогите разобраться

Автор: batigoal 15.4.2006, 22:40
Цитата(Hardworker @ 15.4.2006, 22:55 Найти цитируемый пост)
Я не могу передать второму сервлету объект Connection созданный в первом сервлете

Почему? Сохраняй connection как атрибут сессии/приложения.

Цитата(Hardworker @ 15.4.2006, 22:55 Найти цитируемый пост)
как мне разделить эти методы,

Как вариант - можно ввестий скрытое поле (hidden), и в него записывать тип запроса.

Цитата(Hardworker @ 15.4.2006, 22:55 Найти цитируемый пост)
но тогда как все эти сервлеты подключить к одной БД?

А в чем у тебя трудность? Почему ты не можешь их подключить к одной и той же базе?

Автор: Bulat 16.4.2006, 10:39
1.Объяви глобальную переменную: private Connection con;
И передавай ее как параметр другим классам. В чем проблема?

2.можешь в сервлет передавать вместе с ссылкой еще и id, с определенным значением. Получив его в сервлете, ты можешь сравнить что у тебя пришло и вызвать нужный метод для работы

Код

...action="http://.../MyServlet?id=EntLog"


в сервлете используешь request.getParameter("id") 

Автор: Hardworker 16.4.2006, 10:42
Здравствуйте LAmer George.
Я пытаюсь сохранить объект Connection как атрибут сессии, но почему-то у меня не получается вызватть его из второго сервлета. Хочу привести код, как Я это делаю.
Код

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName=request.getParameter("userName");
 String passwd=request.getParameter("password");
 String connect=""; //что бы сохранить как атрибут сессии мне нужно имя , Я его так обьявил
HttpSession session=request.getSession(true);

try {
            Class.forName("com.informix.jdbc.IfxDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

try {


            Connection con = DriverManager.getConnection("jdbc:informix-sqli://127.0.0.1:1526/statistic:informixserver=test_perl5",userName,passwd);
          session.setAttribute("connect",con);

}          catch (SQLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        
           out.println("Error while working with database:"+e);
        }



response.sendRedirect("http://127.0.0.1:8080/devserv/index.html");//перехожу на html странички позволяющие сформировать запросы
}



После этого пользователь заполняя поля формирует запрос и методом post отправляет их к другому сервлету который его выполняет и отсылает результат
Вот как Я пытаюсь получить обьект Connection  во втором сервлете.
Код

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  HttpSession session=request.getSession();

Connection connect1; 
connect1 = (Connection) session.getAttribute("connect");//эта строчка не срабатывает.
}


Помогите разобраться. как правильно сохранять и вызывать обьекты из дной сессии разными сервлетами???

Цитата

Как вариант можно ввести скрытое поле (hidden), и внего записывать тип запроса.

Можно по подробнее расказать про реализацию такого метода.
Тоесть мне что нужно организовать что то вроде case структуры и в зависимости что пришло запускать тот или иной блок в case соответствующий тому скрытому параметру, который получили.

 

Автор: batigoal 16.4.2006, 11:09
Строка
Код

String connect="";

не нужна. Но ты вроде все делаешь правильно. Что именно ты получаешь во втором сервлете - ошибку, null, еще что-нибудь?..

В первом сервлете соединение устанавливается без ошибок?

Цитата

Тоесть мне что нужно организовать что то вроде case структуры и в зависимости что пришло запускать тот или иной блок в case соответствующий тому скрытому параметру, который получили.

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

Автор: Hardworker 16.4.2006, 18:47
У меня connect1 содержит null, Я не пойму почему. Причем Я решил передать еще несколько параметров из первого сервлета, это логин и пароль пользователя
Код

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         String userName=request.getParameter("userName");
         String passwd=request.getParameter("password");  
            session.setAttribute("user",userName);
            session.setAttribute("pass",passwd);
 HttpSession session=request.getSession(true);
        try {
            Class.forName("com.informix.jdbc.IfxDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace(); 
        }
try {


          Connection con = DriverManager.getConnection("jdbc:informix-sqli://127.0.0.1:1526/statistic:informixserver=test_perl5",userName,passwd);
             session.setAttribute("connect",con);
             session.setAttribute("user",userName);
             session.setAttribute("pass",passwd);
       response.sendRedirect("http://127.0.0.1:8080/new/index.htm");
} catch (SQLException e) {
            e.printStackTrace();  
        
        out.println("Error while working with database:"+e);
        }
}



, но Я не могу получить во втором сервлете даже список параметров сессии.

А получаю Я его так
Код
 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      HttpSession session=request.getSession();
      Enumeration valueNames;
      String name,value;
     valueNames=session.getAttributeNames();
Connection connect1;
while (valueNames.hasMoreElements() ){

         name=valueNames.nextElement().toString();
         out.println(name);
         value=session.getAttribute(name).toString();
     out.println(name+"="+value);
    }
         connect1 = (Connection) session.getAttribute("connect");//это значение равно null почемуто
}

В результате ничего не выводится в цикле. 
Выводится только вторым сервлетом connect1=null.

Подскажите как решить проблему?? 

Автор: batigoal 16.4.2006, 19:29
А как ты попадаешь во второй сервлет? Ты не уходишь с сайта между запросами к этим сервлетами? Т.е. не теряется ли сессия? 

Автор: Hardworker 16.4.2006, 20:01
Первый сервлет у меня создает обьект Connection и если подключение удачное то Я перехожу на index.html
Код


response.sendRedirect("http://127.0.0.1:8080/new/index.htm");


на этой странице Я формирую запрос заполняя поля . Там есть кнопка которая посылает эти параметры второму сервлету методом post.

<form name="form1" method="post" action="http://127.0.0.1:8080/devserv/servlet/devserv">
Вот так Я перехожу во второй сервлет. Может быть тут и теряется что то. Но я не понимаю что. Ведь Я так понял что сессия к серверу у пользователя создана или нет, тут две сессии получается? 

Автор: Goliath 16.4.2006, 22:55
HttpSession session=request.getSession(true); эта строка должна быть первой

Код

HttpSession session = request.getSession(true);
Connection con = DriverManager.getConnection("jdbc:informix-sqli://127.0.0.1:1526/statistic:informixserver=test_perl5",userName,passwd);
session.putAttribute("con", cart);


Код

HttpSession session = request.getSession(true);

Connection  con = (Connection )session.getAttribute("con");
 

Автор: Hardworker 16.4.2006, 23:20
Здравствуйте Goliaf.
У меня нет такого метода session.putAttribute(), что это за метод, может тут ошибка. 

Автор: Goliath 17.4.2006, 07:34
Я имел ввиду putValue:
Цитата

putValue 
 public abstract void putValue(String name,
                               Object value)

Binds the specified object into the session's application layer data with the given name. Any existing binding with the same name is replaced. New (or existing) values that implement the HttpSessionBindingListener interface will call its valueBound() method. 

Parameters: 
name - the name to which the data object will be bound. This parameter cannot be null. 
value - the data object to be bound. This parameter cannot be null. 
Throws: IllegalStateException 
if an attempt is made to access session data after the session has been invalidated 
 

Автор: batigoal 17.4.2006, 08:37
Цитата(Goliath @  17.4.2006,  08:34 Найти цитируемый пост)
Я имел ввиду putValue:

Хм. Я всегда использовал setAttribute, и не понял из доки, в чем вообще между ними разница.  

Автор: tux 17.4.2006, 11:55
Цитата(Lamer George @  17.4.2006,  13:37 Найти цитируемый пост)
Я всегда использовал setAttribute, и не понял из доки, в чем вообще между ними разница.  

putValue() - deprecated, может и не работать. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)