login register Sysop! about ME  
qrcode
    최초 작성일 :    2001년 05월 28일
  최종 수정일 :    2001년 07월 20일
  작성자 :    taeyo
  편집자 :    Taeyo(김 태영)
  읽음수 :    119,836

강좌 목록으로 돌아가기

필자의 잡담~

아무리 친한 친구사이일지라도 서로에게 비밀은 있는데,
그 비밀중 가장 큰 비밀은 두 친구가 왜 서로를 좋아하는지 그 이유를 서로 모르고 있다는 것이다....
어느 엘리베이터에 붙여져 있던 격언이었습니다....

이번에 같이 할 내용은.. 기존의 게시판에 있는 특수문자의 문제를 해결하구요... [페이지 바로가기] 기능을 추가하는 것 입니다.  ^^

특수문자?  갑작스런 특수문자라는 이야기에...  의구심이 드는 분이 있겠죠? 음하하...   분명히 몇몇 분은 있을 수 있다는 생각이 파바박 드네요.... 그렇다면, 우리의 게시판에 어떤 문제가 있는지 봅시다....

이 문제는 장난을 좋아하는 몇몇 친구들에 의해서 발생할 수 있는 문제인데요.. 사실, 보는 시각에 따라서 문제(?)라고 표현할 수도 있고, 아닐 수도 있기는 합니다. 자.. 그럼 확인해 봅시다..  다음 그림처럼 게시판에 글을 한번 적어보세요..  ^^ 일단, 현재 제가 작성한 게시판에는 다음과 같은 글들이 있었습니다. 확인하시구요...

여기에 새롭게 다음과 같은 글을 작성해 봅니다...  ^^ 이 글은 게시판 관리자라면 누구나 짜증을 내는 사기성 광고의 하나이지요..  ^^ 이 글을 올리는 사람은 자신의 글을 강조해서 나타나게 하기 위해서..제목에 <h4> 태그를 사용하고 있습니다. <h4> 태그는 이미 여러분이 아시는대로 글을 조금은 크고 굵게 나타나게 해주는 역할을 하는 태그입니다.

이렇게 누군가가 글을 적었다고 해보세요.... 그러면, 결과가 어떻게 나올까요? 분명 다음과 같이 나오게 될 것입니다.

오오... 사기성 글이 무척이나 굵게 강조되어져서 나왔네요... 하지만, 보기에는 짜증이 나지만, 게시물들이 깨지거나 하지는 않았습니다. 이것을 문제라고까지 이야기하기에는 무리가 있어보일 수도 있지요? 하지만, 다음 글은 어떨까요? 어떤 사람이 다음과 같은 글을 썼다고 해봅시다..

 

이번에는 과연 우리의 게시판이 어떻게 변해있을까요? 아마도 다음처럼 깨진 모습으로 등장하게 될 것입니다..  ^^

보기만 안 좋은 것이 아닙니다... 첫번째 글을 클릭도 되지 않습니다... 이것은 문제라고 볼 수 있겠지요?

이러한 문제가 발생한...이유는 무엇일까요? 그것은 사용자가 입력한 태그때문입니다..

브라우저는 태그에 의존해서 화면을 구성해서 만들어주지요? <table> 이라는 태그가 있다면 닫는 </table> 태그가 반드시 존재해야 합니다. 하지만, 사용자는 글중에 <table>라는 태그만을 만들어 두었구요... 닫는 태그는 기입하지 않았습니다. 이로인해.. 브라우저는 사용자가 입력한  <table>라는 태그이후에.. 나오는 <table> 태그를 찾기 시작하겠고, 원래 우리가 게시판에 알맞게 만들어 두었던 </table> 태그를사용자가 입력한 <table>태그의 끝이라고 생각하고 화면을 만들게 됩니다.

결국 그런식으로 짝을 맞추다보면.. 결국 이 HTML은 </table> 태그가 마지막에는 하나가 모자르겠지요? 그러다보니 화면이 깨져나오게 되고 브라우저도 이 태그들을 대충 꾸며서 화면을 보여주게 됩니다. 바로 이러한 점이 문제가 되는 것이지요...

그렇다면, 이러한 태그의 사용의 문제를 막기 위해서는 어떻게 해주어야 할까요? 방안은 두가지가 있을 것입니다.  하나는... 사용자가 태그를 사용할 경우, 상당히 주의를 요하게 해야한다는 것이지요.. 다른 하나는 사용자가 입력한 태그를 그 모습 그대로 화면에 뿌려주게 하는 것입니다.

즉, 사용자가 입력한 태그는 태그로써 브라우저에 적용되게 하지 않고... 입력한 모습인 "<TABLE>으하하...   게시판을 망가뜨릴테야" 란 글자를 그모습 그대로 나타나게 해준다는 것이지요.... 하지만, 사용자들이 믿을 수 있는 사람들이고, 언제나 바른 태그만을 사용할 것이라고는 아무도 장담할 수 없기에...  우리는 이러한 태그의 사용을 막는 쪽으로 만들어 나가고자 합니다.

그렇다면, 어떻게 해야 할까요?

사용자가 입력한 내용을 뿌려줄 경우, 태그와 관련된 특수문자들은 <, >, & 등등을... 그에 상응하는 escape 문자로 바꾸어서 보여주는 것입니다...  무슨 말인지 잘 모르겠다?

만일, 여러분이 브라우저에 "<h1>나는 나야</h1>" 이라는 글자를 출력하고 싶다면.. 어떻게 코딩을 해야할까요? 그냥 HTML에 <h1>나는 나야</h1>라고 치면 그렇게 나오나요? 아닙니다.. 만일, 여러분이 그렇게 코딩했다면 브라우저는 태그가 적용된 다음 모습으로 화면을 보여줄 겁니다.

그렇다면, 이 화면을 진짜로 우리가 원하는 모습으로 나오게 하려면 어떻게 해야할까요? "<h1>나는 나야</h1>" 라는 문자열이 그모습 그대로 나오게 하고 싶다면 말이지요... 그렇다면, 다음처럼 코딩해야 할 것입니다. (이미 여러분이 HTML 서적에서 배웠듯이 말이지요)

즉, < 란 문자를 나타내기 위해선, &lt; 라는 문자를 사용하면 되구요 > 란 문자를 위해선 &gt; 를 사용하면 됩니다.... 그리고, & 란 문자을 사용하기 위해서는 &amp; 를 사용하면 되지요... (이것들을 escape 시퀀스라고 부릅니다. 이유는? 모르겠습니다.  ^^ 히히...)

그 외에도 몇 가지가 더 있습니다만, 이 정도면 충분하답니다..  ^^ 그렇다면, 이제 어떻게 우리의 소스를 바꾸면 될까요? 사용자가 입력한 내용중에 & 나 <, > 가 있다면 이것을 각각의 익스케이프 문자에 해당하는 것으로 replace 를 해주면 되는 것이지요...  ^^

해서 우리의 list.asp 의 중간 부분중.... 각각의 제목과 글쓴이의 값을 가져오는 부분을 다음처럼 바꾸어 주면 될 것입니다...  ^^

수정된 list.asp

....
.... 상단 생략
....
<table cellpadding="1" cellspacing="0" width="600" style="border:1px solid #cfcfdf">
   <tr bgcolor="#cfcfdf" height="25">
      <td width="340" align="center">제&nbsp; 목</td>
      <td width="20" align="center"><img src="images/clipw.gif" WIDTH="13" HEIGHT="13"></td>
      <td width="60" align="center">글쓴이</td>
      <td width="50" align="center">읽음수</td>
      <td width="130" align="center">날짜</td>
   </tr>
<%
   Dim board_idx, name, mail, title, yymmdd, strNew
   Dim yy, mm, dd, h, mi, re_level, readnum
   Do until Rs.EOF

   board_idx = rs("board_idx")
   name = rs("b_name")
   mail = rs("b_email")

   If Len(name) > 4 Then name = Mid(name,1,4) & ".."
   if name="" then name="無名"

   name = replace(name, "&", "&amp;")
   name = replace(name, "<", "&lt;")
   name = replace(name, ">", "&gt;")


   title = rs("b_title")
   If Len(title) > 22 Then title = Mid(title,1,23) & "..."
   If Trim(title) = "" then title = "[제목없음]"

   title = replace(title, "&", "&amp;")
   title = replace(title, "<", "&lt;")
   title = replace(title, ">", "&gt;")


   yymmdd = rs("b_date")

....
....이하 생략
....

이렇게 바꾸면...  ^^  사용자가 어떤 글을 입력했는지 간에.. 모든 태그들은 그 모습 그대로 화면에 나타나게 될 것입니다. 다음 그림처럼 말이지요...  ^^

이것으로 멋지게 해결이 된 듯 합니다만.... 우리는 더이상 초급이 아니니.. 위처럼 뭔가 같은 코드가 여러번 반복되는 모습이 맘에 안들수 있습니다. replace 함수가 여러번 반복되어져서 코드길이가 길어지는 것이 별루 보기 나쁘다는 이야기이지여.. 해서, 저는 다음과 같이 태그들을 일반 텍스트로 나타나게 하는 3번의 replace 를 따로 함수로 만들어서 사용할 것을 추천한답니다...  ^^   다음처럼 말이지요...  ^^

수정된 list.asp

   ....
   .... 상단 생략
   ....

<table cellpadding="1" cellspacing="0" width="600" style="border:1px solid #cfcfdf">
   <tr bgcolor="#cfcfdf" height="25">
      <td width="340" align="center">제&nbsp; 목</td>
      <td width="20" align="center"><img src="images/clipw.gif" WIDTH="13" HEIGHT="13"></td>
      <td width="60" align="center">글쓴이</td>
      <td width="50" align="center">읽음수</td>
      <td width="130" align="center">날짜</td>
   </tr>
<%

   function ReplaceTag2Text(str)
      Dim text
      text = replace(str, "&", "&amp;")
      text = replace(text, "<", "&lt;")
      text = replace(text, ">", "&gt;")
      ReplaceTag2Text = text
   End Function


   Dim board_idx, name, mail, title, yymmdd, strNew
   Dim yy, mm, dd, h, mi, re_level, readnum
   Do until Rs.EOF

      board_idx = rs("board_idx")
      name = rs("b_name")
      mail = rs("b_email")

      If Len(name) > 4 Then name = Mid(name,1,4) & ".."
      if name="" then name="無名"

      name = ReplaceTag2Text(name)

      title = rs("b_title")
      If Len(title) > 22 Then title = Mid(title,1,23) & "..."
      If Trim(title) = "" then title = "[제목없음]"

      title = ReplaceTag2Text(title)

      yymmdd = rs("b_date")

   ....
   ....이하 생략
   ....

저는 소스중에서... ReplaceTag2Text 라는 펑션을 하나 만들어 보았습니다. 이 함수의 역할은 특정 문자열에 있는 &, <, > 를 모두 각각의 익스케이프 문자로 바꾸어주는 역할을 하는 것이지요. 그러므로, 이름이나 제목에 들어있을 수 있는 &, < , >를 모두 익스케이프 문자로 바꾸고 싶다면... 이제는 단지,  name = ReplaceTag2Text(name)  처럼만 하면 모두 해결이 가능하게 된 것이랍니다.

어때요?  기존의 소스보다는 조금 말씀이 정리가 된 것 같지 않나요? 그러나, 함수의 위치가 list.asp 안쪽에 위치하다보니.. 소스를 보기가 그리 깔끔해 보이지는 않네요. 뭔가 가독성도 떨어져 보이구요..  ^^ 해서, 이 함수를 따로 빼내어서 따로 asp 페이지를 하나 만들어 보도록 하겠습니다. 그리고, 그 페이지를 list.asp 로 인클루드하면 조금 페이지의 구성이 나아보일 것이라는 생각이 드네요

해서, 저는 functions.asp 라는 ASP 페이지를 하나 더 만들어 보았습니다. 물론, 현재 list.asp 가 존재하는 같은 폴더에 말이지요..  ^^..  다음처럼요

Functions.asp

<%
function ReplaceTag2Text(str)
   Dim text
      text = replace(str, "&", "&amp;")
      text = replace(text, "<", "&lt;")
      text = replace(text, ">", "&gt;")
      ReplaceTag2Text = text
End Function
%>

그리고, list.asp 에서는 ReplaceTag2Text 라는 함수는 삭제해 버렸습니다. 대신에 위의 functions.asp 라는 파일을 list.asp에 include 했지요..  ^^   다음처럼 말입니다...

다시 수정된 list.asp

<!--METADATA TYPE="typelib" NAME="ADODB Type Library"
   File="C:\Program Files\Common Files\System\ado\msado15.dll" -->
<% Option Explicit %>
<% Response.Expires=-1 %>
<!--#include file="config.asp"-->
<!--#include file="functions.asp"-->
<html>
<head> <title>게시판 리스트</title>
<style type="text/css">
   A {text-decoration: none; color:navy }
   A:hover {text-decoration: underline; color:orange}
   td { font-family:돋움; font-size:12 }
</style>
...
... 이하 생략
...

다음 버튼을 누르시면 위의 변경된 소스가 적용된 list.asp를 보실 수 있을 것입니다... 

list.asp

<!--METADATA TYPE="typelib" NAME="ADODB Type Library"
   File="C:\Program Files\Common Files\System\ado\msado15.dll" -->
<% Option Explicit %>
<% Response.Expires=-1 %>
<!--#include file="config.asp"-->
<!--#include file="functions.asp"-->
<html>
<head>   <title>게시판 리스트</title>
<style type="text/css">
   A {text-decoration: none; color:navy }
   A:hover {text-decoration: underline; color:#ff4500}
   td {   font-family:돋움;   font-size:12 }
</style>
</head>
<%
   Dim Gotopage
   Dim Dbcon, Rs
   Dim pagecount, recordCount
   Dim SQL

   GotoPage = Request("GotoPage")
   if GotoPage = "" then GotoPage = 1

   Set Dbcon = Server.CreateObject("ADODB.Connection")
   Dbcon.Open strConnect

   SQL = "select count(board_idx) as recCount from MyBoard"
   Set Rs = Dbcon.Execute(SQL)

   recordCount = Rs(0)
   pagecount = int((recordCount-1)/pagesize) +1
   
   SQL = "SELECT TOP " & pagesize & " * FROM MyBoard "
   SQL = SQL & " WHERE board_idx not in "
   SQL = SQL & "(SELECT TOP " & ((GotoPage - 1) * pagesize) & " board_idx FROM MyBoard"
   SQL = SQL & " ORDER BY board_idx DESC) order by board_idx desc"
            
   Set Rs = Dbcon.Execute(SQL)
%>
<body topmargin="5" leftmargin="20">
<br>
<table cellpadding="0" cellspacing="0" border="0" width="600">
   <tr>
      <td bgcolor="white" height="30" width="400" style="padding-top:5px;">
         글의 갯수 : <%=recordCount%> &nbsp;&nbsp;
         [<a href="write.htm">글쓰기</a>] &nbsp;
         <% if int(gotopage) > 1 then %>
            [<a href="list.asp?gotopage=<%=gotopage-1%>">이전</a>]
         <% else %>
            <font color="gray">[이전]</font>
         <% end if %>
         &nbsp;
         <% if int(gotopage) < int(pagecount) then %>
            [<a href="list.asp?gotopage=<%=gotopage+1%>">다음</a>]
         <% else %>
            <font color="gray">[다음]</font>
         <% end if %>
      </td>
      <td width="200" align="right">
         page ( <%=gotopage%> / <%=pagecount%> )
      </td>
   </tr>
</table>
<table cellpadding="1" cellspacing="0" width="600" style="border:1px solid #cfcfdf">
   <tr bgcolor="#cfcfdf" height="25">
      <td width="340" align="center">제&nbsp; 목</td>
      <td width="20" align="center"><img src="images/clipw.gif" WIDTH="13" HEIGHT="13"></td>
      <td width="60" align="center">글쓴이</td>
      <td width="50" align="center">읽음수</td>
      <td width="130" align="center">날짜</td>
   </tr>
<%
      Dim board_idx, name, mail, title, yymmdd, strNew
      Dim yy, mm, dd, h, mi, re_level, readnum

      Do until Rs.EOF

         board_idx = rs("board_idx")
         name = rs("b_name")
         mail = rs("b_email")

         If Len(name) > 4 Then name = Mid(name,1,4) & ".."
         if name="" then name="無名"

         name = ReplaceTag2Text(name)

         title = rs("b_title")
         If Len(title) > 22 Then title = Mid(title,1,23) & "..."
         If Trim(title) = "" then title = "[제목없음]"

         title = ReplaceTag2Text(title)

         yymmdd = rs("b_date")
         strNew = ""
         if datediff ("h",yymmdd,Now()) < 24 then
            strNew = " <img src='images/new.gif' border=0>"
         end if

         yy=year(yymmdd)
         mm = right("0" & month(yymmdd),2)
         dd = right("0" & day(yymmdd),2)
         h = right("0" & hour(yymmdd),2)
         mi = right("0" & minute(yymmdd),2)
         yymmdd = yy & "/" & mm & "/" & dd & " (" & h & ":" & mi & ")"

         readnum = rs("b_readnum")
%>
   <tr bgcolor="white">
      <td height="20" style="padding-left:10px;">
         <a href="list2content.asp?board_idx=<%=board_idx%>&GotoPage=<%=GotoPage%>">
         <%=title%> <%=strNew%></td>
      <td align="center">&nbsp;</td>
      <td align="center">
         <% if mail <>"" then %>
            <a href="mailto:<%= mail%>"><%=name%></a>
         <%else%>
            <%=name%>
         <%end if%>
      </td>
      <td align="center"><%=readnum%></td>
      <td align="center"><%=yymmdd%></td>
   </tr>
<%
      Rs.Movenext
      Loop

      Rs.close
      Dbcon.close
      Set Rs = Nothing
      Set Dbcon = Nothing
%>
</table>
</body>
</html>

그럼. 이제 문제는 해결된 것인가요?  ^^ 그렇습니다. 문제는 해결되었습니다. 적어도 list.asp 에서는 말이지요.. 하지만, 문제가 될만한 페이지가 하나 더 있지요? 그것은 content.asp 입니다...  ^^ 장난꾸러기가 쓴  "<TABLE>으하하...   게시판을 망가뜨릴테야" 란 글의 본문을 읽기위해서... content.asp 로 들어가면 본문의 내용이 어떻게 나오나요?  IE 5.5 를 기준으로 보면 다음처럼 나올 것이랍니다.

호오...  그렇죠? 그렇기 때문에....  content.asp 에서도...  이 함수는 사용해야 할 것이라는 생각이 빠박... 드는 겁니다. 그렇다면, content.asp 는 어떻게 바뀌어야 할까요? 여러분이 나름대로 구상해 보시구요.. 제가 바꾼 소스도 한번 확인해 보시기 바랍니다.

Content.asp

<% Option Explicit %>
<!--#include file="config.asp"-->
<!--#include file="functions.asp"-->
<%
  Dim Gotopage
  GoTopage= request("GotoPage")

  Dim adoDb, SQL, Rs
  Set adoDb = Server.CreateObject("ADODB.Connection")
  adoDb.Open strConnect

  SQL = "SELECT board_idx,b_name,b_title,b_date,b_email,b_ipaddr,b_readnum,b_pwd,b_content from MyBoard "
  SQL = SQL & " where board_idx=" & request.Querystring("board_idx")

  Set Rs = adoDb.execute(SQL)

  Dim board_idx, name, title, mail, writeday
  Dim ipaddr, readnum, pwd, content
  Dim prev_idx, next_idx

  board_idx = Rs("board_idx")
  name = Rs("b_name")
  name = ReplaceTag2Text(name)
  title = Rs("b_title")
  title = ReplaceTag2Text(title)
  writeday = Rs("b_date")
  mail = Rs("b_email")
  mail = ReplaceTag2Text(mail)
  ipaddr = Rs("b_ipaddr")
  readnum = Rs("b_readnum")
  pwd = rs("b_pwd")
  content = Rs("b_content")
  content = ReplaceTag2Text(content)
  content = replace(content,vblf,"<br>")

  Rs.close

  '이전 글의 board_idx 값을 구하는 부분
  SQL = "Select Min(board_idx) from MyBoard where board_idx > " & board_idx
  Set Rs = adoDb.Execute(SQL)
  if Not Rs.EOF then
    prev_idx = Rs(0)
  end if
  Rs.close

  '다음 글의 board_idx 값을 구하는 부분
  SQL = "Select Max(board_idx) from MyBoard where board_idx < " & board_idx
  Set Rs = adoDb.Execute(SQL)
  if Not Rs.EOF then
    next_idx = Rs(0)
  end if
  Rs.close

  adoDb.close
  Set Rs = Nothing
  Set adoDb = nothing
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ks_c_5601-1987">
<style type="text/css">
  A {text-decoration: none; color:navy }
  A:hover {text-decoration: none; color:orange}
  td {padding:7; font-family:돋움; font-size:12 }
  input {border: 1 solid silver; font-family:dotum; font-size:9pt;}
</style>
<script language="javascript">
<!--
  function Del()
  {
    var pwd = document.myform.pwd.value;
    if (CheckStr(pwd, " ", "")==0) {
      alert("비밀번호를 입력해 주세요");
      return;
    }
    document.myform.action = "del_ok.asp";
    document.myform.submit();
  }

  function Edit()
  {
    var pwd = document.myform.pwd.value;
    if (CheckStr(pwd, " ", "")==0) {
      alert("비밀번호를 입력해 주세요");
      return;
    }
    document.myform.action = "Edit.asp";
    document.myform.submit();
  }

  function addComment()
  {
    document.myform.action = "Comment.asp";
    document.myform.submit();
  }

  function CheckStr(strOriginal, strFind, strChange){
    var position, strOri_Length;
    position = strOriginal.indexOf(strFind);

    while (position != -1){
      strOriginal = strOriginal.replace(strFind, strChange);
      position = strOriginal.indexOf(strFind);
    }

    strOri_Length = strOriginal.length;
    return strOri_Length;
  }
//-->
</script>
</head>
<body>
<form method="POST" action="Write.asp" name="myform">
<input type="hidden" name= "board_idx"value="<%=board_idx%>">
  <table cellpadding="0" cellspacing="0" border="0" width="540">
    <tr>
      <td bgcolor="white" valign= "top"style="padding:2px;"width="400">
        <a HREF="list.asp?gotopage=<%=gotopage%>">[ 리스트로 ]</a>
      </td>
      <td bgcolor="white" valign="top" align="right" width="140">
        조회수 : <%=readnum%>
      </td>
    </tr>
    <tr>
      <td bgcolor="#aaaaaa" style="padding:2px;" colspan="2">
        <table cellpadding="0" cellspacing="1" border="0" width="540">
          <tr>
            <td width="100" bgcolor="#EFEFEF" align="center" height="20">게시자</td>
            <td width="44" bgcolor="white">
              <% if mail<>""then%>
                <a href="mailto:<%=mail%>"><%=name%></a>
              <% else %>
                <%=name%>
              <% end if%>
            </td>
          </tr>
          <tr>
            <td BGCOLOR="#EFEFEF" align="center" valign="middle" height="25">날짜</td>
            <td bgcolor="white"><%=writeday%></td>
          </tr>
          <tr>
            <td BGCOLOR="#EFEFEF" align="center" valign="middle" height="25">제목</td>
              <td bgcolor="white"><%=title%></td>
          </tr>
          <tr VALIGN="top">
            <td BGCOLOR="#EFEFEF" align="center" valign="middle">내용</td>
            <td bgcolor= "white"class="content"><%=content%></td>
          </tr>
        </table>
      </td>
    </tr>
    <tr>
      <td style="padding-top:3px;" align="right" colspan="2">
        <table cellpadding="0" cellspacing="0" border="0" width="340">
          <tr>
            <td align="right" width= "200"style="padding=0">
              비밀번호 <input type="password" name="pwd" size="10" class="pwd"></td>
            <td align="right" width= "70"style="padding=0">
              <a href="javascript:Edit();">[수정하기]</a></td>
            <td align="right" width= "70"style="padding=0">
              <a href="javascript:Del();">[삭제하기]</a></td>
          </tr>
        </table>
      </td>
    </tr>
  </table>
  <table width="540">
    <tr>
      <td>
        <% if prev_idx <> "" then%>
          <a href="list2content.asp?board_idx=<%=prev_idx%>&Gotopage=<%=Gotopage%>">
          &lt; &lt; 이전 글 보기
          </a>
        <% end if%>
        |
        <% if next_idx <> "" then %>
          <a href="list2content.asp?board_idx=<%=next_idx%>&Gotopage=<%=Gotopage%>">
          다음 글 보기 &gt; &gt;
          </a>
        <% end if%>
      </td>
    </tr>
  </table>
</form>
</body>
</html>

^^ ..  함수를 따로 빼내서 SSI(서버 사이드 인클루드)파일로 만들어두니까 편하지요?  ^^ 흠...  그렇네요...

 

그리고...  이번에 이야기 드릴 부분은...  ^^ 페이지 바로가기 입니다. 다시 말하자면...

[이전 10개] 1  2  3  4  5  6  7  8  9  10  [다음 10개]  를 말하는 것이지요...

이것의 소스설명이나 알고리즘에 대해서는 여기서 이야기하기에는 상당히 복잡하고 어려울 것 같아요. 해서, 이에 대해서는 스스로 알고리즘을 분석해 보고자 노력해 보시기를 추천하구요...  저는 어느정도 잘 만들어진 함수를 여러분에게 제공해 보도록 하겠습니다. 이 함수는 제 사이트의 talk 게시판 시삽님이신 흑기사님이 알려주신 방법을 함수로 만들어 본 것이랍니다. 함수는 다음과 같아요...  ^^

gotoPageHTML 함수

'*********************************************************
'* # FUNCTION NAME : 페이지별 바로가기
'* # FUNCTION CONT. : 게시판에서 페이지별 바로가기를 생성해 준다.
'* # MODIFICATIONS :
'*1. 2000/02/ 진인식 프로그램 처음 작성
'*2. 2001/05/ 김태영 편집
'*
'* # 참고사항 : 흑기사님이 제공해주신 소스를 정리한 함수임
'*********************************************************


Sub gotoPageHTML(page, Pagecount)
   Dim blockpage, i
   blockpage=Int((page-1)/10)*10+1

   '********** 이전 10 개 구문 시작 **********
   if blockPage = 1 Then
      Response.Write "<font color= silver>[이전 10개]</font>["
   Else
      Response.Write"<a href='list.asp?gotopage=" & blockPage-10 & "'>[이전 10개]</a> ["
   End If
   '********** 이전 10 개 구문 끝**********

   i=1
   Do Until i > 10 or blockpage > Pagecount
      If blockpage=int(page) Then
         Response.Write " <font size=2 color= gray>" & blockpage & "</font>"
      Else
         Response.Write"<a href='list.asp?gotopage=" & blockpage & "'>" & blockpage & "</a> "
      End If

      blockpage=blockpage+1
      i = i + 1
   Loop

   '********** 다음 10 개 구문 시작**********
   if blockpage > Pagecount Then
      Response.Write "] <font color= silver>[다음 10개]</font>"
   Else
      Response.write"]<a href='list.asp?gotopage=" & blockpage & "'>[다음 10개]</a>"
   End If
   '********** 다음 10 개 구문 끝**********
End Sub

단점이 있다면 이 함수는... 페이지별로 이동시 10 페이지만으로 구분짓는다는데에 있습니다. 즉,  [이전 10개] 1  2  3  4  5  6  7  8  9  10  [다음 10개]    에 맞추어져 있다는 이야기이지요.. [이전 5개] 1  2  3  4  5 [다음 5개] 도 될런지는 장담할 수 없습니다.  어쩌면 약간의 수정이 필요할지도 모르겠어요.. ^^  하지만, 나름대로는 쓸만할 것입니다. (제가 테스트 해보니 10개가 아니어도 잘 동작하는 편이네요.. 어디선가 문제가 나타날지는 모르겠지만요 ^^)

단지 이 함수를 호출하는 것만으로도.. [이전 10개] 1  2  3  4  5  6  7  8  9  10  [다음 10개] 를 만들어 주니까요그러므로 여러분은 이 함수를 만들어 둔 뒤에... (물론, 이 함수는 Functions.asp 안에 기입하시면 되겠지요?) list.asp 에다가 여러분이 "[이전 10개] 1  2  3  4  5  6  7  8  9  10  [다음 10개]"가 출력되어지기를 원하는 페이지의 하단, 아무위치에나... 단지,  call gotoPageHTML(현재페이지번호, 총 페이지카운트)라고 코딩하시기만 하면 됩니다.

우리의 경우라면... 현재의 페이지 번호는 Gotopage 가 될 것이구요... 총 페이지 카운트의 값을 pagecount 가 되겠지요? 해서 여러분은 다음과 같이 코드를 작성하시면 그냥 바루.....  페이지 바로가기가 만들어질 것입니다.

<% call gotoPageHTML(GotoPage, Pagecount) %>

그러면, 확인해 봅시다.... 다음 각각의 버튼을 누르시면  gotoPageHTML가 추가되어진 functions.asp 파일과... 페이지 바로가기 기능이 추가된 list.asp 페이지를 만나보실 수 있을 것입니다.  ^^

Functions.asp

<%
function ReplaceTag2Text(str)
   Dim text
      text = replace(str, "&", "&amp;")
      text = replace(text, "<", "&lt;")
      text = replace(text, ">", "&gt;")
      ReplaceTag2Text = text
End Function


'*********************************************************
'* # FUNCTION NAME : 페이지별 바로가기
'* # FUNCTION CONT. : 게시판에서 페이지별 바로가기를 생성해 준다.
'* # MODIFICATIONS :
'*1. 2000/02/ 진인식 프로그램 처음 작성
'*2. 2001/05/ 김태영 편집
'*
'* # 참고사항 : 흑기사님이 제공해주신 소스를 정리한 함수임
*********************************************************


Sub gotoPageHTML(page, Pagecount)
   Dim blockpage, i
   blockpage=Int((page-1)/10)*10+1

....
... 이하 동일 ...
....
....

paging 추가된 list.asp


....
.. 상위 부분은 모두 이전 list.asp 소스와 일치
....

<%
      Rs.Movenext
      Loop

      Rs.close
      Dbcon.close
      Set Rs = Nothing
      Set Dbcon = Nothing
%>
   <tr height="30">
      <td align="center" colspan="5">
         <%call gotoPageHTML(GotoPage, Pagecount)%>
      </td>
   </tr>

</table>
</body>
</html>

그리고, 소스가 이렇게 바뀌어서...  결과가 적용된 우리의 list.asp의 화면은 다음과 같을 겁니다.

어떤가요??? 가벼운 몇줄의 코드로 이쁜 모습을 가지게 되었지요? 페이지 바로가기의 로직을 설명드리지 못함이 아쉽지만...  사실, 저도 넘 복잡해서(나이가 드니 단순, 심플한게 좋아져서리..) 어떻게 이해를 했었는지가 기억나지 않네요  -_-;

이렇게 해서.. 이번 강좌도 마무리가 되었습니다.... 


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})