VBScript 반복문

동일한 코드 블록을 지정된 횟수만큼 실행.

VBScript에는 4개의 반복문이 있음.

  • for ... next : 지정된 횟수만큼 코드 실행
  • for each ... next : 컬렉션 각 항목 또는 배열의 각 요소에 대한 코드 실행
  • do ... loop : 조건이 true 일 때까지 반복
  • while ... w end : 비추

 

for ... next

for ... next문을 이용해서 코드 블럭을 지정된 횐수만큼 수행한다.
for문의 i라는 카운터 값은 시작부터 종료를 세고, next문은 i를 1씩 증가시킨다.

  <% @CODEPAGE="65001" language="vbscript" %>
  <% Response.CharSet = "utf-8" %>
  <!DOCTYPE html>
  <html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <%
      for i = 0 to 5
        response.write( "i : <strong>" & i & "</strong><br/>" )
      next
    %>
  </body>
  </html>

 

 

step 키워드

step 키워드를 사용하면 특정한 값으로 값을 증감 시킬 수 있음.

  for i = 0 to 10 step 2
    response.write( "i : <strong>" & i & "</strong><br/>" )
  next
  for i = 10 to 2 step -2
    response.write( "i : <strong>" & i & "</strong><br/>" )
  next

 

 

exit a for ... next

exit for 키워드를 사용해서 for ... next 문을 종료할 수 있음.

  for i = 0 to 10
    if i = 5 then exit for
    response.write( "i : <strong>" & i & "</strong><br/>" )
  next

 

 


for each ... next loop

for each ... next loop 반복문은 콜렉션의 각 아이템이나, 배열의 각 요소에 대한 코드를 반복한다.

  dim cars(2)
  cars(0) = "Volvo"
  cars(1) = "SAAB"
  cars(2) = "BMW"

  for each e in cars
    response.write( e & "<br/>" )
  next

 

 


do ... loop

원하는 반복 횟수를 모르는 경우 do ... loop문을 사용함.
do ... loop문은 조건이 참인 동안 또는 조건이 참이 될 때까지 코드를 반복함.

조건이 참인 동안 반복

while 키워드를 이용하여 do ... loop 문의 조건을 확인함

  do while i < 10
    response.write( "i : " & i )
    i = i + 1
  loop

i가 9 라면 반복문은 실행되지 않는다.

  do
    response.write( "i : " & i )
    i = i + 1
  loop while i < 10

i가 10보다 작더라도 한번은 실행하고 본다.

 

 

조건이 참이 될때까지 반복

until 키워드를 사용하면 do ... loop 문의 조건을 확인함

  i = 0
  do until i = 10
    response.write( "i : <strong>" & i & "</strong><br/>" )
    i = i + 1
  loop

i가 10이면 코드가 실행되지 않음

  i = 0
  do
    response.write( "i : <strong>" & i & "</strong><br/>" )
    i = i + 1
  loop until i = 10

 

 


do ... loop 문 종료

exit do 키워드를 사용하면 do ... loop 문 종료 가능

  i = 20
  do until i = 10
    i = i - 1
    if i < 10 then exit do
    response.write( "i : <strong>" & i & "</strong><br/>" )
  loop

i가 10과 다르고, 10보다 크면 실행

 

 


728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP] 쿠키  (0) 2021.08.26
[ASP] form  (0) 2021.08.26
[ASP] 조건문  (0) 2021.08.26
[ASP] Procedure  (0) 2021.08.26
[ASP] 변수  (0) 2021.08.26

VBScript 조건문

조건문

VBScript에는 4개의 조건문이 있음.

  • if 문
  • if then else 문
  • if then elseif 문
  • select case 문

... 생략

if .. the .. elseif

  i = hour( time )
  response.write( "i : " & i & "<br/>" )

  if i = 8 then
    response.write( "Just started..!" )
  elseif i = 11 then
    response.write( "Hungry" )
  elseif i = 12 then
    response.write( "Lunch-time!" )
  elseif i = 17 then
    response.write( "Time to go home!" )
  else
    response.write( "Holy SHIT!" )
  end if

select case

switch 문과 같음.

  <% @CODEPAGE="65001" language="vbscript" %>
  <% Response.CharSet = "utf-8" %>
  <!DOCTYPE html>
  <html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <%
      d = weekday( data )

      response.write( "weekday( data ) : " & d & "<br/>" )

      select case d
        case 1
          response.write( "SUNDAY 아이스크림 먹고싶다" )
        case 2
          response.write( "MONDAY 출근 안 했으면 좋겠다" )
        case 3
          response.write( "TUESDAY 죽을 것 같다" )
        case 4
          response.write( "WEDNESDAY 점심이 길어서 그나마 참는다" )
        case 5
          response.write( "THURSDAY 피곤해 죽을 것 같다" )
        case 6
          response.write( "FRIDAY 주말 생각해서 참는다" )
        case else
          response.write( "SATURDAY 방전이다" )
      end select
    %>
  </body>
  </html>

728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP] form  (0) 2021.08.26
[ASP] 반복문  (0) 2021.08.26
[ASP] Procedure  (0) 2021.08.26
[ASP] 변수  (0) 2021.08.26
[ASP] 문법  (0) 2021.08.25

ASP Procedure

ASP에서는 VBScript와 JavaScript 간 프로시져를 상호 호출 가능함.

 

Procedure

다음과 같은 프로시져 기능이 있을 수 있음.

VBScript Procedure

  <!DOCTYPE html>
  <html>
  <head>
    <%
      sub vbproc( x, y )
        response.write( "x * y = " & x * y )
      end sub
    %>
  </head>
  <body>
    <p>Result : <%call vbproc( 3, 4 )%></p>
  </body>
  </html>

다른 스크립팅 언어로 프로시져 / 함수를 작성하려면 <html> 태그 위에 <%@ language="{사용할 언어}" %>를 넣어주면 됨.

js procedure

  <%@ language="javascript" %>
  <!DOCTYPE html>
  <html>
  <head>
    <%
      function jsproc( x, y ) {
        Response.Write( "x * y = " + x * y );
      }
    %>
  </head>
  <body>
    <p>Result : <% jsproc( 3, 4 ); %></p>
  </body>
  </html>

 


VBScript와 JS의 차이점

VBScript로 작성된 ASP 파일에서 VBScript 또는 JS 프로시져를 호출할 때 프로시져 이름 뒤에 call 키워드를 사용할 수 있음.
프로시져에 매개변수가 필요한 경우 call 키워드를 사용할 때 매개변수 목록을 괄호로 묶어야 함. call 키워드를 생략하는 경우 매개변수 목록을 괄호로 묶지 않아야 함.
프로시져에 매개변수가 없으면 괄호는 선택사항임.

JS로 작성된 ASP 파일에서 JS 또는 VBScript 프로시져를 호출할 때 항상 프로시져 이름 뒤에 괄호를 사용해야 함.

 


VBScript Procedure

VBScript에는 두가지 종류의 프로시져가 있음.

  • Sub Procedure
  • Function Procedure

VBScript Sub Procedure

  • sub, end sub 으로 묶인 일련의 문장임.
  • 작업을 하지만 값을 반환하지 않음.
  • 인수를 취할 수 있음.
  sub mysub() 
    some statements
  end sub
  sub mysub( arg1, arg2 ) 
    some statements
  end sub
  <!DOCTYPE html>
  <html>
  <body>
    <%
      sub mysub() 
        response.write( "written by a sub procedure.<br/>" )
      end sub

      response.write( "writtten by the script.<br/>" )
      call mysub()
      call mysub
      mysub()
      mysub
    %>
  </body>
  </html>

 

VBScript Function Procedure

  • function, end function으로 묶인 일련의 문장.
  • 작업을 하고 값을 반환함.
  • 이름에 값을 할당하여 값을 반환함.
  • 호출 프로시져에 의새 인수를 취할 수 있음.
  • 인수가 없으면 빈 괄호 ()를 포함 해야함.
  function func()
    some statements
    func = some value
  end function
  function func( arg1, arg2 )
    some statements
    func = some value
  end function

 

프로시져 호출

  <!DOCTYPE html>
  <html>
  <body>
    <%
      ' 인수 a, b를 받아서 그 합을 반환하는 func
      function func( a, b )
        func = a + b
      end function

      response.write( func( 5, 9 ) )
    %>
  </body>
  </html>

 

VBScript를 이용하여 프로시져 호출

ASP에서 javascript 와 VBScript 에서 만든 프로시져를 모두 호출하는 방법

  <!DOCTYPE html>
  <html>
  <head>
    <%
      sub vbproc( x, y )
        response.write( x * y )
      end sub
    %>
    <script language="javascript" runat="server">
      function jsproc( x, y ) {
        Response.Write( x * y );
      }
    </script>
  </head>
  <body>
    <p> call vbproc : <%call vbproc( 3, 4 )%></p>
    <p> call jsproc : <%call jsproc( 3, 4 )%></p>
  </body>
  </html>

 


728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP] 반복문  (0) 2021.08.26
[ASP] 조건문  (0) 2021.08.26
[ASP] 변수  (0) 2021.08.26
[ASP] 문법  (0) 2021.08.25
[ASP] Intro  (0) 2021.08.25

ASP 변수

변수의 기본 개념은 다르지 않음.


예제

변수 선언

변수를 선언하고 변수에 값을 할당하고 텍스트에서 값을 출력하는 방법

  <!DOCTYPE html>
  <html>
  <body>
    <%
      dim name
      name = "ASDF Stupid"
      response.write("My name is: " & name)
    %>
  </body>
  </html>

반복문

  <% @CODEPAGE="65001" language="vbscript" %>
  <!DOCTYPE html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <html>
  <body>
    <%
      dim i
      for i = 1 to 6
        response.write( "<h" & i & ">Heading " & i & "</h" & i & ">" )
      next
    %>
  </body>
  </html>

배열 생성

  <!DOCTYPE html>
  <html>
  <body>
    <%
      dim famname(5), i
      famname(0) = "Tov Lo"
      famname(1) = "Flume"
      famname(2) = "Heize"
      famname(3) = "쓰레기 같은"
      famname(4) = "ASP"
      famname(5) = "Borge"

      for i = 0 to 5
        response.write(famname(i) & "<br>")
      next
    %>
  </body>
  </html>

VBScript를 이용한 시간 출력

서버의 시간 출력

  <% @CODEPAGE="65001" language="vbscript" %>
  <!DOCTYPE html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <html>
  <body>
    <%
      dim h
      h = hour( now() )

      response.write( "<p>" & now() & "</p>" )

      if h < 12 then
        response.write( "Good Morning!" )
      else
        response.write( "Good Day!" )
      end if
    %>
  </body>
  </html>

JavaScript를 이용한 시간 출력

위의 예제와 같지만 JS를 이용함.
W3C예제를 따라한건데, javascript를 사용하는건지 JScript를 사용하는건지 솔직히 분간은 안됨.

  <%@ language="javascript" %>
  <!DOCTYPE html>
  <html>
  <body>
    <%
      var d = new Date();
      var h = d.getHours();

      Response.Write( "<p>" + d + "</p>" );

      if ( h < 12 ) {
        Response.Write("Good Morning!");
      } else {
        Response.Write("Good Day!");
      }
    %>
  </body>
  </html>

변수 생성 및 변경

  <!DOCTYPE html>
  <html>
  <body>
  <%
    dim asdf
    asdf = "Flume"

    response.write(asdf)

    response.write("<br>")

    asdf = "Tove Lo"
    response.write(asdf)
  %>
  </body>
  </html>

대수학

x = 5, y = 6, z = x + y
x와 y에 값을 저장할 수 있고, 이 정보를 이용하여 z의 값 11을 구할 수 있음.
이런 x, y, z를 변수라고 함.

VBScript 변수

VBScript의 변수는 값이나 표현식을 저장하는 데 사용됨.
변수는 x와 같은 짧은 이름이나 carname과 같이 더 명시적인 이름을 사용할 수 있음.

  • VBScript의 변수 작명 규칙
    • 문자로 시작해야 함
    • .를 포함할 수 없음
    • 255자를 넘길 수 없음

VBScript의 모든 변수는 타입이 지정되어 있지 않은 variant 유형임

VBScript 변수 선언

VBScript에서 변수를 생성하는 것은 선언 변수라고 함.
dim, public, private 키워드를 이용해서 VBScript 변수를 선언할 수 있음.

  dim x
  dim carname

두개의 변수 x와 carname을 만들었음.
스크립트에서 이름을 사용해서 변수를 선언 할 수 있음.

  carname = "Porsche"

변수에 값도 할당했음. 변수 이름은 carname, 값은 Porsche 임. 스크립트에서 변수 이름의 철자를 잘못 입력 할 수 있고, 코드가 실행될 때 의도하지 않은 결과를 초래할 수 있음.
carname 변수를 carnime으로 잘못 입력하면 스크립트는 carnime라는 새 변수를 자동으로 생성함.
스크립트가 이런 의도치 않은 변수 생성을 막으려면 Option Explicit 옵션을 넣을 수 있음.
스크립트 맨 위에 Option Explicit을 넣으면 됨.

  <%@ Language=VBScript %>
  <% Option Explicit %>
  <!DOCTYPE html>
  <html>
  <body>
    <%
      dim x
      dim carname

      carname = "Porsche"

      response.write( "carname : " & carname & "<br/>" )

      ' Option Explicit 설정이 있어서 아래 구문은 에러가 생김
      carnime = "carnime"


      public a
      a = "public"
      response.write( "a : " & a & "<br/>" )
      private c
      c = "private"
      response.write( "c : " & c & "<br/>" )
    %>
  </body>
  </html>
  carname : Porsche
  Microsoft VBScript 런타임 오류 오류 '800a01f4'

  변수가 정의되지 않았습니다.: 'carnime'

  /test/test/example.asp, 줄 15
  • public, private 차이는 알 수 없네

VBScript 배열 변수

배열 변수는 단일 변수에 여러 값을 저장하는데 사용함.

  <!DOCTYPE html>
  <html>
  <body>
    <%
      ' 2차원 배열 선언
      dim arr(2, 2)

      ' 할당
      arr( 0, 0 ) = "Volvo"
      arr( 0, 1 ) = "BMW"
      arr( 0, 2 ) = "Ford"

      arr( 1, 0 ) = "Apple"
      arr( 1, 1 ) = "Orange"
      arr( 1, 2 ) = "Banana"

      arr( 2, 0 ) = "Coke"
      arr( 2, 1 ) = "Pepsi"
      arr( 2, 2 ) = "Sprite"

      for i = 0 to 2
        response.write( "<p>" )
          for j = 0 to 2
            ' 배열에서 인덱스로 값 출력
            response.write( arr(i, j) & "<br />" )
          next
        response.write( "</br>" )
      next
    %>
  </body>
  </html>

변수의 수명

프로시져 외부에서 선언된 변수는 ASP 파일의 모든 스크립트에서 엑세스하고 변경 가능함.

프로시져 내부에서 선언된 변수는 프로시져가 실행될 때마다 생성되고 소멸함. 프로시져 외부의 어떤 스크립트도 변수에 엑세스하거나 변수를 변경할 수 없음.

둘 이상의 ASP 파일에 엑세스할 수 있는 변수를 선언하려면 세션 변수 또는 어플리케이션 변수로 선언해야 함.

세션변수

세션 변수는 단일 사용자에 대한 정보를 저장하는 데 사용되며 하나의 어플리케이션의 모든 페이지에서 사용할 수 있음.
일반적으로 세션 변수에 저장되는 정보는 이름, ID 및 기본 설정임.

어플리케이션 변수

어플리케이션 변수는 한 어플리케이션의 모든 페이지에서 사용 가능.
어플리케이션 변수는 하나의 특정 어플리케이션에 있는 모든 사용자에 대한 정보를 저장하는 데 사용함.


출처 : https://www.w3schools.com/asp/asp_variables.asp

728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP] 조건문  (0) 2021.08.26
[ASP] Procedure  (0) 2021.08.26
[ASP] 문법  (0) 2021.08.25
[ASP] Intro  (0) 2021.08.25
[ASP] Classic ASP 입문  (1) 2021.08.25

ASP Syntax

ASP는 VBScript를 사용함.

ASP의 기본 스크립팅 언어는 VBScript임.
스크립팅 언어는 경량 프로그래밍 언어임.
VBScript는 MS Visual Basic의 라이트 버젼임.

 

ASP 파일

ASP 파일은 일반적인 HTML 파일일 수 있음.
또한 ASP 파일에는 서버 스크립트도 포함될 수 있음.
<% %>로 둘러 싸인 스크립트는 서버에서 실행됨.
Response.Write() 메소드는 ASP에 의해 HTML로 출력됨.
다음 코드는 "Hello World"를 출력함.

  <!DOCTYPE html>
  <html>
  <head></head>
  <body>
    <%
      response.write("Hello World!")
    %>
  </body>
  </html>

VBScript는 대소문자를 구분하지 않음.
Response.Write()response.write()와 같음.

 

ASP에서 JavaScript 사용

JS를 웹페이지의 스크립팅 언어로 설정하려면 페이지 상단에 언어 사양을 삽입해야 함.

  <%@ language="javascript" %>
  <!DOCTYPE html>
  <html>
  <head></head>
  <body>
    <%
      Response.Write("Hello World!")
    %>
  </body>
  </html>

javascript는 Response.Write()의 대소문자를 구분함.
앞으로의 ASP 튜토리얼은 VBScript를 사용함.

 

그 외

EX 03

Response.Write()=로 대치될 수 있음.

  <%="reponse.write() can replaced by `=`"%>

EX 04

HTML 태그역시 출력 가능함.

  <%="<h2>Using HTML tags to format the TEXT is available, FUCK!</h2>"%>

EX 04

HTML 태그 속성역시 출력 가능.

  <%="<p style='color: #0000FF;'>This text is styled.</p>"%>

 

 


VBScript 예제와 레퍼런스

 


출처 : https://www.w3schools.com/asp/asp_syntax.asp

728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP] 조건문  (0) 2021.08.26
[ASP] Procedure  (0) 2021.08.26
[ASP] 변수  (0) 2021.08.26
[ASP] Intro  (0) 2021.08.25
[ASP] Classic ASP 입문  (1) 2021.08.25

ASP Intro

ASP는 동적 웹 페이지를 만들기 위한 오래된 기술임.
ASP는 PHP 처럼 웹 서버에서 script를 실행하기 위한 기술임.

Show Example

  • ex :
      <!DOCTYPE html>
      <html>
      <body>
        <%
          response.write("My First ASP Script!")
        %>
      </body>
      </html>

ASP 란

  • Active Server Pages의 약자
  • MS의 기술
  • 웹 서버 내부에서 실행되는 프로그램

ASP 파일이란

  • .asp 확장자를 갖는 파일
  • HTML 파일과 비슷
  • HTML 외에 서버 스크립트를 포함하고 있음.
  • ASP 파일의 서버 스크립트는 서버에서 실행 됨.

ASP가 할 수 있는 것

  • 웹 페이지 편집, 변경, 콘텐츠 추가 또는 사용자 지정
  • HTML form에서 제출된 사용자 쿼리 또는 데이터에 응답
  • DB 또는 기타 서버 데이터에 엑세스하고 결과를 응답
  • 브라우져에서 ASP 코드를 볼 수 없으므로 웹 보안 제공
  • 빠르고 단순함

작동 원리

일반 HTML 파일을 요청하면 서버는 파일을 변환,
브라우져가 ASP 파일을 요청하면 ASP 파일을 읽고 파일에서 서버 스크립트를 실행하는 ASP 엔진에 요청을 전달.
ASP파일은 HTML로 응답됨.

reference and example

W3School에서 ASP의 기본 제공 개체 및 구성요소, 해당 속성 및 메소드에 대한 ASP reference를 제공함.
ASP 스크립트는 서버에서 실행되기 때문에 브라우져에서 ASP 코드를 볼 수 없음.
W3School에서 ASP 예제를 살펴볼 수 있음.

 

 

출처 : https://www.w3schools.com/asp/asp_introduction.asp

 

728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP] 조건문  (0) 2021.08.26
[ASP] Procedure  (0) 2021.08.26
[ASP] 변수  (0) 2021.08.26
[ASP] 문법  (0) 2021.08.25
[ASP] Classic ASP 입문  (1) 2021.08.25

Classic ASP 입문

ASP -> Spring 프로젝트에 투입되게 되었다.
프로젝트 진행 전 대략적으로 classic asp를 학습한다.
w3school의 튜토리얼을 대충 살펴보며,
개발 환경 셋팅과 기초 문법, DB 연결 프로젝트 구조 그리고 간단한 게시판 까지만 만들어 보도록 한다.


ASP and ASP.NET Tutorials

ASP는 Active Server Pages의 약자.
ASP 는 웹페이지 구축하기 위한 개발 프레임워크임.

ASP는 다양한 개발 모델을 지원함 :

  • classic asp
  • ASP.NET Web Form
  • ASP.NET MVC
  • ASP.NET WebPage
  • ASP.NET API
  • ASP.NET Core

ASP 기술

ASP와 ASP.NET은 서버사이드 기술임.
두 기술 모두 인터넷 서버에서 컴퓨터 코드를 실행할 수 있도록 함.
브라우져가 ASP / ASP.NET 파일을 요청하면 ASP 엔진은 파일을 읽고 파일의 코드를 실행한 다음 결과를 브라우져에 반환함.


classic ASP - Active Server Pages

ASP (Classic ASP 라고도 함)는 MS의 첫 서버사이트 스크립팅 언어로 도입됨.
클래식 ASP 페이지는 파일 확장자가 .asp 이고 일반적으로 VBScript로 작성됨.

 


기타 ASP 기술

  • ASP.NET :
    ASP.NET은 Classic ASP의 후속으로 2002년에 나옴.
    .aspx 확장자를 사용하며 일반적으로 C# 언어를 사용함.
    ASP.NET Core를 위해 ASP.NET 4 이후로 업데이트는 없음.
  • ASP.NET Web Pages :
    ASP.NET Web Pages는 SPA임.
    PHP와 Classic ASP와 매우 유사함.
    ASP.NET Core에 기본 스펙으로 들어가고 있음.
  • ASP.NET MVC :
    MVC 패턴의 ASP.NET
    ASP.NET Core에 기본 스펙으로 들어가고 있음.
  • ASP.NET Web API :
    API 어플리케이션 모델임.
    ASP.NET Core에 기본 스펙으로 들어가고 있음.
  • ASP.NET Web Form :
    이벤트 기반 응용 프로그램 모델임.
  • ASP.NET Core :
    2016년 출시.
    ASP.NET MVC, Web API, Web Pages를 하나의 프레임워크로 병합함.

출처 : https://www.w3schools.com/asp

728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP] 조건문  (0) 2021.08.26
[ASP] Procedure  (0) 2021.08.26
[ASP] 변수  (0) 2021.08.26
[ASP] 문법  (0) 2021.08.25
[ASP] Intro  (0) 2021.08.25

세션 유져 카운터 클래스

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SessionUserCounter implements HttpSessionListener {
  private static Logger logger = LoggerFactory.getLogger(SessionUserCounter.class);
  
  //  총 접속자 수
  public static int count;
  
  public static int getCount() {
    return count;
  }

  @Override
  public void sessionCreated(HttpSessionEvent event) {
    //  세션이 생성될 때 세션객체를 꺼내옴.
    HttpSession session = event.getSession();
    count ++;
    logger.error("\n\tSESSION CREATED : {}, TOTAL ACCESSER : {}", session.getId(), count);
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent event) {
    // 세션이 소멸될 때
    count--;
    if( count < 0 ) count = 0;
    
    HttpSession session = event.getSession();
    logger.error("\n\tSESSION DESTROYED : {}, TOTAL ACCESSER : {}", session.getId(), count);
  }
  
}

 

web.xml 설정

  <listener>
    <listener-class>{패키지 경로}.SessionUserCounter</listener-class>
  </listener>

 

Java 소스에서 클래스를 불러와서 사용해도 되고, JSP에서 class를 import 해서 사용해도 된다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" trimDirectiveWhitespaces="true"
	import ="{패키지 경로}.SessionUserCounter"
%>
현재 접속자 수 : <%=SessionUserCounter.getCount()%>

 

 

스프링 허접이라 Lazy-Init SingleTon Pattern을 사용해야 하는지, 아니면 Listener에 등록된 객체이기 때문에 필요 없는지는 잘 모르겠다.

728x90
반응형

egovframework의 EgovHttpSessionBindingListener 클래스와 EgovMultiLoginPreventor 클래스로 중복 로그인 방지를 구현하던 중,
java.lang.illegalargumentexception setattribute non-serializable attribute ***에러가 발생했다.

session에 저장하기 위해선 해당 클래스 Serializable 클래스를 상속해 줘야 하는데, VO는 이미 상속이 되어 있었다.

VO 말고도 EgovHttpSessionBindingListener, EgovMultiLoginPreventor역시 Serializable 클래스를 상속해줘야 한다.

egov도 버젼 코드에 실수가 존재하나보다.

 

EgovHttpSessionBindingListener.java

package egovframework.com.utl.slm;

import java.io.Serializable;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Class Name : EgovHttpSessionBindingListener.java
 * @Description : 중복 로그인 방지를 위해 사용자의 로그인 아이디와 세션을 제어하는 구현 클래스
 * @Modification Information
 *
 *               수정일 수정자 수정내용 ------- ------- ------------------- 2014.09.30 표준프레임워크 최초생성
 * @author YJ Kwon
 * @since 2014.09.30
 * @version 3.5
 */
public class EgovHttpSessionBindingListener implements HttpSessionBindingListener, Serializable {

  private static final long serialVersionUID = -6535453381287200501L;
  private static Logger logger = LoggerFactory.getLogger(EgovMultiLoginPreventor.class);

  /**
   * 사용자의 로그인 세션에 EgovHttpSessionBindingListener가 바인딩될 때 자동 호출되는 메소드로, 사용자 세션이 이미 존재하는지를 검사하여 하나의
   * 어플리케이션 내에서 하나의 세션만 유지되도록 한다
   */
  public void valueBound(HttpSessionBindingEvent event) {
    logger.error("\n\t!! VALUE BOUND !!");
    if (EgovMultiLoginPreventor.findByLoginId(event.getName())) {
      EgovMultiLoginPreventor.invalidateByLoginId(event.getName());
    }

    EgovMultiLoginPreventor.loginUsers.put(event.getName(), event.getSession());
  }


  /**
   * 
   * 로그아웃 혹은 세션타임아웃 설정에 따라 사용자 세션으로부터 EgovHttpSessionBindingListener가 제거될 때 자동 호출되는 메소드로, 사용자의 로그인
   * 아이디에 해당하는 세션을 ConcurrentHashMap에서 모두 제거한다
   */
  @Override
  public void valueUnbound(HttpSessionBindingEvent event) {
    logger.error("\n\t!! VALUE UNBOUND !!");
    EgovMultiLoginPreventor.loginUsers.remove(event.getName(), event.getSession());
  }

}

 

 

EgovMultiLoginPreventor.java

package egovframework.com.utl.slm;

import java.io.Serializable;
import java.util.Enumeration;
import java.util.concurrent.ConcurrentHashMap;

import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Class Name : EgovMultiLoginPreventor.java
 * @Description : 중복 로그인 방지를 위해 사용자의 로그인 아이디와 세션 아이디를 관리하는 구현 클래스
 * @Modification Information
 *
 *               수정일 수정자 수정내용 ------- ------- ------------------- 2014.09.30 표준프레임워크 최초생성
 * @author YJ Kwon
 * @since 2014.09.30
 * @version 3.5
 */
public class EgovMultiLoginPreventor implements Serializable {

  private static final long serialVersionUID = 4012190701164146206L;

  private static Logger logger = LoggerFactory.getLogger(EgovMultiLoginPreventor.class);

  public static ConcurrentHashMap<String, HttpSession> loginUsers =
      new ConcurrentHashMap<String, HttpSession>();

  /**
   * 사용자의 로그인 아이디로 생성된 세션이 있는지를 확인한다
   */
  public static boolean findByLoginId(String loginId) {
    logger.error("\n\t>> loginUsers id : {} <<", loginId);
    return loginUsers.containsKey(loginId);
  }


  /**
   * 사용자의 로그인 아이디로 이미 존재하는 세션을 무효화한다
   */
  public static void invalidateByLoginId(String loginId) {
    Enumeration<String> e = loginUsers.keys();

    while (e.hasMoreElements()) {
      String key = (String) e.nextElement();

      logger.error("\n\t>> session key : {} <<", e.toString());
      if (key.equals(loginId)) {
        logger.error("\n\t:: SESSION INVALIDATE {} <<", loginId);
        loginUsers.get(key).invalidate();
      }
    }
  }

}
728x90
반응형

화면을 수정했는데, 클라이언트의 브라우져에 캐시가 남아서 이전 화면이 나오는 경우가 있다.
직접 브라우져 설정 들어가서 캐시를 지워달라고 요청 할 수도 있지만, 그게 한두번이 아니게 되니 코드에서 캐시를 지울수 없는지 찾아보았다.
이럴수가...
크게 어렵지도 않지만, html한정으로 이게 꼭 필요한 화면이 아니면 아래 설정은 가급적 안 하는게 좋을 것 같다.

HTML 메타태그 이용하기

    <!-- 1990년 이후 이 페이지의 캐시를 만료시킴. -->
    <meta http-equiv="Expires" content="Mon, 06 Jan 1990 00:00:01 GMT" />

    <!-- 캐시를 바로 만료시킴. -->
    <meta http-equiv="Expires" content="-1" />

    <!-- 페이지 로드시마다 페이지를 캐싱하지 않음. (HTTP 1.0) -->
    <meta http-equiv="Pragma" content="no-cache" />

    <!-- 페이지 로드시마다 페이지를 캐싱하지 않음. (HTTP 1.1) -->
    <meta http-equiv="Cache-Control" content="no-cache" />

JSP, Java 사용시

자바 코드 지만 html과 같음.

    response.setHeader( "Pragma", "no-cache" );
    response.setDateHeader( "Expires", -1 );
    response.setHeader( "Cache-Control", "no-cache" );

JS, CSS 파일 캐시 사용 방지

js나 css등 정적파일도 종종 변경을 해도 캐시문제로 적용이 되지 않는 경우가 많다.
그럴 경우 파일의 url 뒤에 ?timestamp 형태를 넣어준다.

  <link rel="stylesheet" href="/css/common.css?20210512" />
  <script type="text/javascript" src="/js/common.js?20210512"></script>

728x90
반응형

'WEB > JSP, JSTL' 카테고리의 다른 글

[JSP, JSTL] fn function 정리 - 2  (0) 2020.12.11
[JSP, JSTL] fn function 정리  (0) 2020.11.30
[JSP, JSTL] forEach 잘 사용하기  (0) 2020.11.30

+ Recent posts