Чат на ASP: от простого к сложному. Часть 1

Автор: Олег Яцура

Ну что ж, чат у нас, можно сказать, уже работает. Существует окно ввода и окно с фразами, можно писать в первом, что душа пожелает, и наблюдать начертанное во втором. Ну просто верх творения ума человеческого. Но что-то как-то не совсем...

Для начала создадим "неполную" авторизацию пользователя. Для этого создаем стартовую страницу чата (если таковой еще нет) примерно следующим образом:

<html>
<body>
<form method=post action=chat.asp name="mForm"
target="_top"> имя (Login): <input type=text name="userName" size=12> <input type=submit value=" Ok "> </form> </body> </html>

Далее мастерим сам chat.asp:

<frameset rows="*,68">
  <frame src="chatbody.asp" name=bod scrolling="yes">
  <frame src="chatinput.asp" name=menu scrolling="no">
</frameset> 

Здесь мы, соответственно, создали два фрейма : chatbody.asp - фрейм с фразами, chatinput.asp - фрейм с полем ввода.

Теперь добавим немного кода в chat.asp и создадим ту самую "неполную" авторизацию:

  <%
  Session("Login")=request("userName")
   if Session("Login") = "" then
    Session("Login") = "некто"
   end if 
  
   if  Session("dooropen")=0 then
     Session("dooropen")=1
       
     dim NewMess()
     Redim NewMess(20)

     messArray=Application("MessageArray")

      for i=0 to 19
       NewMess(i+1) = messArray(i) 
      next

    NewMess(0)=Session("Login") & "снова с нами..."
     Application.Lock
     Application("MessageArray")=NewMess
     Application.UnLock 
    
    end if     

  %>

И что же мы сделали? Всего навсего зверски выпытали у входящего пользователя его имя и решили его запомнить хорошенько, заодно предупредив находящихся уже в чате о его прибытии:

  • получили данные из формы и сразу же занесли ее в Session-переменную Login
  • на тот случай, если пользователь поленился вводить что-либо и просто жмакнул кнопкой, обозвали его нектой (будет в будущем умнее)
  • проверили посредством Session-переменной dooropen, зашел ли уже этот пользователь. Если нет, то отмечаем сей факт опять же в Session-переменной dooropen присваивая ей значение 1 и...
  • уже по известной нам методике передачи новой фразы в общий массив данных (Application("MessageArray")) производим в нем сдвиг вниз и записывем самой первой фразой извещение о прибытии нового пользователя с сообщением его имени.

Для чего здесь служит Session-переменная dooropen? А вы попробуйте ее не использовать? И тогда при каждом обновлении родительского окна, тоесть chat.asp будете получать событие входа нового пользователя. Пока вся система еще только лишь во всеуслышанье извещает о сим факте - ничего ужастного в этом, в принципе, и нет, а что будет дальше? А вот при таком простом подходе один раз занесем значение единицы в Session-переменную и, пока не будет уничтожена сессия, dooropen будет его хранить, не давая тем самым ложных входов.

Стоит заметить, что в файле global.asa следует все же создать процедуру Session_OnStart и указать в ней Session("dooropen") = 0, я бы еще посоветовал тут же конкретизировать таймауты сессии ( Session.Timeout = 10 ), но сие не к спеху.

Ну, пожайлуй, для начала хватит. Разве что свериться кодами с chatinput.asp (chatbody.asp, отвечающего за вывод фраз на экран пользователя) мы не планировали изменять. У вас в chatinput.asp должно быть примерно следующее:

 
  <form method=post action=chatinput.asp
target=_self name=mForm> <Select Name=Type> <Option Value=Phrase>сказать</option> <Option Value=Action>сделать</option> </Select> <input type=text size=39 maxlength=255 name=mess> <input type=submit value=" Ok "> </form> <% If (Request("mess") <>"" then Messa = Session("Login") & ": " & Request("mess") if Request("Type")="Action" then Messa="<i>" & Messa & "</i>" end if dim NewMess() Redim NewMess(20) messArray=Application("MessageArray") for i=0 to 19 NewMess(i+1) = messArray(i) next NewMess(0)= Messa Application.Lock Application("MessageArray")=NewMess Application.UnLock end if %>

Надеюсь, что данный код не столь уж и непонятен :-).

Продолжение

Информация взята с сайта www.relib.com


© журнал принадлежит Web Creation
по всем вопросам обращаться А. Кузьмин